Loopy Pro: Create music, your way.

What is Loopy Pro?Loopy Pro is a powerful, flexible, and intuitive live looper, sampler, clip launcher and DAW for iPhone and iPad. At its core, it allows you to record and layer sounds in real-time to create complex musical arrangements. But it doesn’t stop there—Loopy Pro offers advanced tools to customize your workflow, build dynamic performance setups, and create a seamless connection between instruments, effects, and external gear.

Use it for live looping, sequencing, arranging, mixing, and much more. Whether you're a live performer, a producer, or just experimenting with sound, Loopy Pro helps you take control of your creative process.

Download on the App Store

Loopy Pro is your all-in-one musical toolkit. Try it for free today.

Individual note filter?

I’m looking for an app or a script that will allow me to allow individual MIDI notes to pass through while blocking most others. Many hosts have range options but that’s not enough specificity for my use case. For example: I want to allow notes 42, 44, 46, 48, 49 but no others. Any options?

Comments

  • Streambyter, dRambo and Mozaic.

  • @Gravitas said:
    Streambyter, dRambo and Mozaic.

    Specific scripts in SB or Mosaic?

  • edited June 2022

    @lukesleepwalker said:

    @Gravitas said:
    Streambyter, dRambo and Mozaic.

    Specific scripts in SB or Mosaic?

    In Mozaic or Streambyter, roll your own. It would be very short. If you own either, you can probably figure out what you need from looking at the provided examples. Mozaic’s manual is particularly good.

  • If you have Drambo...

  • I believe Midiflow can do this also

  • @rs2000 said:
    If you have Drambo...

    Yep! Had not thought of this because it is still a range but a small number of modules could do it.

  • edited June 2022

    I sat down to write the script in Mozaic and recalled that @wim wrote this script for me that does a lot of what I want but the “thru = no” does block notes but ends up blocking even the notes I want to flow through.

    @Description
    The script checks for certain notes then looks up a note to translate it to. It then sends a note-ON for that note, and schedules a note-OFF after a configurable delay. If another note-ON for another one of the notes is received before the delay time then the note-OFF is sent immediately, a new note-ON is sent, and a new note-OFF is scheduled.

    ▫️ Configure the note-OFF delay with the first knob.
    ▫️ Edit variables in the @Settings section to change the notes to listen for, notes to translate to, the channel to listen on, and other settings. See the comments for details and ...be careful.😬
    @End

    @Settings
    // The midi channel to check for and send notes
    channel = 9

    // NotesIn holds the notes to check for.
    // NotesOut holds the notes to translate to
    // sendTime must only hold zeros

    // Make sure all these arrays have the same number of cells!

    notesIn = [30, 38, 64, 67]
    notesOut = [66, 68, 70, 72]
    sendTime = [0, 0, 0, 0]

    // If you change the number of notes in the arrays above,
    // set "lastNote" to 1 less than the number of notes!
    lastNote = 3

    // set this to NO if you want to block other MIDI
    thru = no

    // this is the delay in milliseconds on a new script load. Adjust to taste.
    default_delay = 5000

    @End

    @OnLoad
    Call @Settings

    // these are just some constants to make code more readable
    noteON = 0x90
    noteOFF = 0x80

    // this stuff happens only on a new load of the script
    if Unassigned init
    init = YES

    for knob = 0 to 21
      SetKnobValue knob,0
      LabelKnob knob,{ }
    endfor
    
    delay = default_delay
    SetKnobValue 0, (TranslateScale delay,0,10000,0,127)
    tmp = Div delay, 1000
    Call @RoundTime
    

    endif

    SetTimerInterval 10
    StartTimer

    LabelKnobs {Settings}
    ShowLayout 4
    @End

    @OnMidiInput
    if MIDICommand <> noteON and MIDICommand <> noteOFF
    if thru = YES
    SendMidiThru
    endif

    else
    onTime = SystemTime
    Call @CheckNote

    // noteIndex will be -1 if the note isn't in the noteIn array
    if (noteIndex = -1) and (thru = YES)
      SendMIDIThru 
    
    elseif (noteIndex <> -1) and (MIDICommand = noteON)
      // cancel any scheduled note-off
      for idx = 0 to lastNote
        if sendTime[idx] <> 0
          SendMidiNoteOff channel, notesOut[idx], 0
          sendTime[idx] = 0
        endif
      endfor
    
      // send the note-on with a tiny delay in case the host has 
      // problems processing simultaneous events
      SendMIDINoteOn channel, notesOut[noteIndex], MIDIVelocity, 2
    
      // schedule the new note-off
      sendTime[noteIndex] = onTime + delay
    endif
    

    endif
    @End

    @CheckNote
    noteIndex = -1

    if MIDIChannel = channel
    idx = 0
    while (noteIndex = -1) and (idx < lastNote+1)
    if MIDINote = notesIn[idx]
    noteIndex = idx
    else
    Inc idx
    endif
    endwhile
    endif

    // if no note match was found then noteIndex will still be -1
    @End

    @OnTimer
    time = SystemTime

    for sendIndex = 0 to LastNote
    if sendTime[sendIndex] > 0 and sendTime[sendIndex] <= time

      SendMidiNoteOff channel, notesOut[sendIndex], 0
      sendTime[sendIndex] = 0
    
    endif
    

    endfor
    @End

    ///////////////////////////////////////////
    // GUI Stuff //
    ///////////////////////////////////////////

    @OnKnobChange
    knob = LastKnob
    value = GetKnobValue knob

    if LastKnob = 0
    tmp = TranslateScale value,0,127,1,10
    Call @RoundTime
    endif

    @End

    @RoundTime
    seconds = RoundDown tmp
    // round to nearest 0.5 seconds
    decimal = 5 * (Div ((tmp - seconds) * 10), 5)
    // convert delay to milliseconds
    delay = 1000 * (seconds + (decimal/10))
    // label the knob this way to avoid zeros after the decimal
    LabelKnob 0, seconds, {.}, decimal, { sec.}
    @End

  • @rs2000 said:
    If you have Drambo...

    How do I filter multiple notes by having multiple modules? The problem is that I'm filtering out the other notes I want to pass through in "downstream modules".

  • @lukesleepwalker said:

    @rs2000 said:
    If you have Drambo...

    How do I filter multiple notes by having multiple modules? The problem is that I'm filtering out the other notes I want to pass through in "downstream modules".

    You could connect each note filter to the track MIDI input, send the outputs to a MIDI mixer, then to MIDI to CV.

  • @uncledave said:

    @lukesleepwalker said:

    @rs2000 said:
    If you have Drambo...

    How do I filter multiple notes by having multiple modules? The problem is that I'm filtering out the other notes I want to pass through in "downstream modules".

    You could connect each note filter to the track MIDI input, send the outputs to a MIDI mixer, then to MIDI to CV.

    MIDI to CV is not really necessary, right?

  • @lukesleepwalker In the script, which notes do you want to flow through? The SendMIDINoteOn should send the (mapped) notes selected by the @CheckNote function. Does that not work? Since the script transforms the notes, it generates Note Off messages, which might be confusing.

    That script may be a little too complicated for what you want. You just want to pass certain notes, both Note On and Note Off, and block other notes. You could keep @CheckNote and drop most of the rest, adding code that just does what I said.

  • @Grandbear said:

    @uncledave said:

    @lukesleepwalker said:

    @rs2000 said:
    If you have Drambo...

    How do I filter multiple notes by having multiple modules? The problem is that I'm filtering out the other notes I want to pass through in "downstream modules".

    You could connect each note filter to the track MIDI input, send the outputs to a MIDI mixer, then to MIDI to CV.

    MIDI to CV is not really necessary, right?

    Right. Only if you want to play a Drambo instrument. Not if you only want selected MIDI.

  • @lukesleepwalker : for your purpose, I don't think a nice u.i. for the Mozaic script is needed -- as the code you need to just do the filtering/pass-thru could be only a few lines -- and it would be easy to edit the code to change the notes.

    I would structure it something like this (this is pseudo-code that will need a little modding to make correct)

    This is all you need:

    onMidiNote

    if midiNote = noteToPass1
    sendMidiThru
    else if MidiNote = noteToPass
    sendMidiThru
    endif

    end //end onMidiNote

    add an else for each note you are looking for

  • edited June 2022

    I thought the Drambo MIDI mixer would work too, but it doesn't actually yield the expected results. Try it in AUM as suggested above. I can get the first module to work but never the second one. Which conceptually makes sense, right? The first module is filtering down to just the note I selected. The second module isn't getting all the other notes that I play, yes?

    Edit: forget it. I thought I had set each module to the track MIDI input but I whiffed on that. It works, thanks!

  • edited June 2022

    .

  • @espiegel123 said:
    @lukesleepwalker : for your purpose, I don't think a nice u.i. for the Mozaic script is needed -- as the code you need to just do the filtering/pass-thru could be only a few lines -- and it would be easy to edit the code to change the notes.

    I would structure it something like this (this is pseudo-code that will need a little modding to make correct)

    This is all you need:

    onMidiNote

    if midiNote = noteToPass1
    sendMidiThru
    else if MidiNote = noteToPass
    sendMidiThru
    endif

    end //end onMidiNote

    add an else for each note you are looking for

    Yep, thanks for mapping it out. This is easily doable but Drambo gives me convenient UI so I think I'll go with that.

  • @lukesleepwalker just to be pedantic, this is another Mozaic option ;):

    @OnLoad
      notes[noteToPass1] = YES
      notes[noteToPass2] = YES
      // more notes
    @End
    
    @OnMidiNote
      if notes[MIDINote]
        sendMidiThru
      endif
    @End
    
  • @Grandbear said:
    @lukesleepwalker just to be pedantic, this is another Mozaic option ;):

    @OnLoad
      notes[noteToPass1] = YES
      notes[noteToPass2] = YES
      // more notes
    @End
    
    @OnMidiNote
      if notes[MIDINote]
        sendMidiThru
      endif
    @End
    

    Ah yes, that's elegant! :smile:

    I still can't figure out why Wim's original script doesn't work--even though it's just an annoyance at this point rather than a blocker to progress. I've looked at the script closely and I can't see why it shouldn't do what it is supposed to do. That is, it should send the notesOut and nothing else with "thru = NO".

  • @Grandbear said:
    @lukesleepwalker just to be pedantic, this is another Mozaic option ;):

    @OnLoad
      notes[noteToPass1] = YES
      notes[noteToPass2] = YES
      // more notes
    @End
    
    @OnMidiNote
      if notes[MIDINote]
        sendMidiThru
      endif
    @End
    

    Nice and elegant!

  • .....

    I still can't figure out why Wim's original script doesn't work--even though it's just an annoyance at this point rather than a blocker to progress. I've looked at the script closely and I can't see why it shouldn't do what it is supposed to do. That is, it should send the notesOut and nothing else with "thru = NO".

    As an exercise, you can figure it out by putting some log statements in there to spit out diagnostics at various points in the program -- with particular attention to any branching points.

  • @lukesleepwalker said:
    ...

    I still can't figure out why Wim's original script doesn't work--even though it's just an annoyance at this point rather than a blocker to progress. I've looked at the script closely and I can't see why it shouldn't do what it is supposed to do. That is, it should send the notesOut and nothing else with "thru = NO".

    It "works for me". Remember that, as written, the accepted notes are on MIDI channel 10 (binary 9 in the script), and the notes are translated into the notesOut, so they're not the same as the inputs. Also, there's an automatic Note Off 5 seconds after the note, or immediately when another accepted note is input. That said, when I strike the allowed notes, the mapped notes are output. Other notes have no effect. I used the StreamByter monitor to verify this.

  • @lukesleepwalker is that Mozaic script on Patchstorage? If not be great to see it up there. Cheers!

  • @uncledave said:

    @lukesleepwalker said:
    ...

    I still can't figure out why Wim's original script doesn't work--even though it's just an annoyance at this point rather than a blocker to progress. I've looked at the script closely and I can't see why it shouldn't do what it is supposed to do. That is, it should send the notesOut and nothing else with "thru = NO".

    It "works for me". Remember that, as written, the accepted notes are on MIDI channel 10 (binary 9 in the script), and the notes are translated into the notesOut, so they're not the same as the inputs. Also, there's an automatic Note Off 5 seconds after the note, or immediately when another accepted note is input. That said, when I strike the allowed notes, the mapped notes are output. Other notes have no effect. I used the StreamByter monitor to verify this.

    Well, crap. I am having a very bad day with MIDI brain farts and you guys keep bailing me out. I had the MIDI channel set wrong on the AUM keyboard; when I change it from Channel 9 to Channel 10 it does indeed work. I appreciate the help, everyone who has weighed in. Despite my brain farts, I'm now in good shape to make some music. B)

  • @Poppadocrock said:
    @lukesleepwalker is that Mozaic script on Patchstorage? If not be great to see it up there. Cheers!

    It is not up there, per Wim's request. He thought it was a little too risky given the possibility for stuck notes and other mayhem due to the messing with note off's.

  • @lukesleepwalker said:
    I thought the Drambo MIDI mixer would work too, but it doesn't actually yield the expected results. Try it in AUM as suggested above. I can get the first module to work but never the second one. Which conceptually makes sense, right? The first module is filtering down to just the note I selected. The second module isn't getting all the other notes that I play, yes?

    Edit: forget it. I thought I had set each module to the track MIDI input but I whiffed on that. It works, thanks!

    Great! 😊

Sign In or Register to comment.