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.

MOZAIC - Create your own AU MIDI plugins - OUT NOW!

1102103104105107

Comments

  • @wim said:

    Indeed. And I'm extremely good looking too.

    :D

  • Indeed. And I'm extremely good looking too.

    That's what I assumed.
    But before we have a date I want to know a few things more ;)

    I have Tonality. Super sick app, but used only the Chord Pad feature....

    Ah... Latchmode would be great. Bring it to our date.

    Thanks man!

  • wimwim
    edited July 2025

    @Basscleff said:
    Ah... Latchmode would be great. Bring it to our date.

    Any thoughts on how the latch mode should work? I was thinking maybe something like just keeping whatever the last chord notes were input until more than one (two? three?) other notes are held down, then switching.

    Or, some kind of a manual release? You weren't up for sustain pedal, so I'm guessing not.
    [edit] oh. I already have a manual release in the script. Doh. 🙄

    I dunno, I'm not sure what's the most practical way to go about this. Maybe some ideas will come to me when I start looking at the code.

  • @Basscleff said:
    Hey Guys! Is there a script to filter out only the Midi Chord notes for noodling around with progressions to find melodies.

    Would be super cool if this would be possible in a keyboard split mode.

    Thanks!

    I don't know if it's already been mentioned in this thread but Drambo's MIDI Chance module does what you're looking for. From Drambo docs:

    Chance
    Add probability to an incoming midi Note. Enable Chord mode to add probability to each note of an incoming chord.

  • wimwim
    edited July 2025

    @reezygle said:

    @Basscleff said:
    Hey Guys! Is there a script to filter out only the Midi Chord notes for noodling around with progressions to find melodies.

    Would be super cool if this would be possible in a keyboard split mode.

    Thanks!

    I don't know if it's already been mentioned in this thread but Drambo's MIDI Chance module does what you're looking for. From Drambo docs:

    Chance
    Add probability to an incoming midi Note. Enable Chord mode to add probability to each note of an incoming chord.

    I don't think that's what's being asked for here.

  • @Basscleff - here's what I'm thinking:

    • Latch AUTO: Add notes as long as more than one note is held down. Don't remove the notes after release. Once the held note count reaches one or less, arm for a new chord. Replace the filter with new notes once more than one note is held down again.

    Does that make sense?

  • wimwim
    edited July 2025

    Hi @Basscleff - here's something to give a spin. I added an option to use either MIDI channel or a split point to set the filter. I also added an AUTO latch mode.

    In AUTO mode, notes (either below the split point or on the control channel) that are held down will be added to the filter until all notes have been released. After that they'll stay in the filter until a new note comes in. At that point the filter is cleared and ready to repeat the process.

    For instance, play a C-E-G chord and let go the notes. The filter will remain C-E-G until the next chord or note comes in. So, if you played a D-F-A chord, the filter would switch to that.

    Let me know what you think?

    @Description
    CHORD/SCALE QUANTIZE
    Set a scale filter on the fly. Notes will be quantized to the scale. The filter can be set either by sending notes on a specified channel, or by sending notes below a keyboard split point.
    
    • CTRL knob: set to SPLIT or to a MIDI channel. If set to SPLIT then the next knob sets the MIDI note below which will set the filter notes. If set to a MIDI channel then all notes on that channel will set the filter notes.
    • QUANTIZE/PASSTHRU:
      • Quantize: Force notes to the filter. If the filter is empty, notes are blocked.
      • Auto: Quantize notes to the filter. If the filter is empty then pass notes through un-quantized.
      • PassThru: Ignore the filter. Pass through all notes un-quantized
    • LATCH:
      • Latch OFF: Only held notes activate the filter.
      • Latch ON: Keep adding notes until Latch OFF is set.
      • AUTO: Add notes as long as more than one note is held down. Don't remove the notes after release. Once the held note count reaches zero, arm for a new chord. Replace the filter with new notes once one or more notes are held down again.
      • NOTE: Moving from Latch ON to Latch OFF clears the filter even if control notes are held down.
    • Tap the SHIFT button to send a MIDI Panic on all channels (See NOTE)
    
    NOTE: This script assumes proper Note-ON/OFF behavior of what is coming into it. There's only basic stuck note prevention. 
    NOTE: Tapping pads does not set notes, only playing notes on the control channel does this. See Simple Scaler on PatchStorage for screen-interactive custom scales.
    @End
    
    @OnLoad
      if Unassigned init
      // Actions to perform on new load only.
        init = YES
        Call @Constants
        _vMajor = 1
        _vMinor = 9
        scale_channel = 15
        action = _quantize
        latch = NO
        // held_notes is used for tracking when to reset the filter in AUTO Mode
        // if it drops to zero, the filter isn't cleared, but if it then goes back
        // to one or more, that signals to clear the filter and start again.
        held_notes = 0
        // this is the default note number for split keyboard control
        split_note = 48
        
      endif
      
      // Scale needs to be initialized every time or we won't know
      // what to do when the first chord starts playing.
      FillArray scale, NO, 12
      ResetNoteStates -1
    
      // Tracker for the number of notes held down on the control channel
      note_count = 0
      
      Call @SetAllKnobs
      Call @SetTitles
      Call @SetAllPads
      ShowLayout _initLayout
    @End
    
    @SetTitles
      LabelPads {CHORD SCALE QUANTIZE v},_vMajor,{.},_vMinor
      LabelKnobs {SHIFT = MIDI PANIC}
    @End
    
    @ClearFilter
      FillArray scale,NO,12
      note_count = 0
      Call @SetAllPads
      for pad = 0 to 15
        if scale[_padNote[pad]] = YES
          ColorPad pad, _cScaleNote
        else
          ColorPad pad, _cNormal
        endif
      endfor
    @End
    
    @OnMidiNoteOn
      if MIDIChannel = scale_channel or (scale_channel = NULL and MIDINote < split_note)
      // Update the scale filter
        Inc held_notes
        log held_notes
        if latch = AUTO and held_notes = 1
          // If there were no held notes before then this will be the start of a new filter in AUTO mode
          Call @ClearFilter
        endif
        scale[MIDINote % 12] = YES
        ColorPad _padPosition[MIDINote % 12],_cScaleNote
        Inc note_count
          
      elseif (action = _passthru) or (action = _auto and note_count = 0)
        SendMIDIThru
        SetNoteState MIDIChannel,MIDINote,NULL
      else
        Call @Quantize
        SetNoteState MIDIChannel,MIDINote,note
        if note <> NULL
          SendMIDINoteOn MIDIChannel,note,MIDIVelocity
          FlashPad _padPosition[note % 12]
        endif
      endif
    @End
    
    @OnMidiNoteOff
      if MIDIChannel = scale_channel or (scale_channel = NULL and MIDINote < split_note)
        Dec held_notes
        if latch = OFF
        // Only remove the note from the filter if latch is off.
          scale[MIDINote % 12] = NO
          ColorPad _padPosition[MIDINote % 12],_cNormal
          Dec note_count
        endif
        
      else
        note = GetNoteState MIDIChannel,MIDINote
        if note = NULL
        // Notestate wasn't set, so the note was never quantized. So send the note off through.
          SendMIDIThru
        else
        // Or, it was quantized, so quantize the note off as well.
          SendMIDINoteOff MIDIChannel,note,MIDIVelocity
          SetNoteState MIDIChannel,MIDINote,NULL
        endif
      endif
    @End
    
    @OnMidiInput
      if MIDICommand <> 0x90 and MIDICommand <> 0x80
        SendMIDIThru
      endif
    @End
    
    @OnSysex
      SendSysexThru
    @End
    
    @Quantize
      // Using our own quantize "nearest" method. The stock ScaleQuantize
      // always quantizes upward even if the match is several steps away.
      // It also returns note 127 if no match is found, which we don't want.
      
      index = MIDIByte2
    
     //Search scale upward until an enabled tone is found
      u = 0
      foundup = NO
      while (foundup = NO) and (u < 12) and (index + u <= 127)
        foundup = scale[(index + u) % 12]
        if foundup = NO
          Inc u
        endif
      endwhile
        
      //Search myscale downward until an enabled tone is found
      d = 0
      founddown = NO
      while (founddown = NO) and (d < 12) and (index - d >= 0)
        founddown = scale[Abs((index - d) % 12)]
        if founddown = NO
          Inc d
        endif
      endwhile
        
      //Use the higher note if closer or equal distance
      if (foundup = YES) and (founddown = NO or u <= d)
        note = MIDINote + u
      elseif (founddown = YES) and (MIDINote - d >= 0)
        note = MIDINote - d
      else
        note = NULL
      endif
    @End
    
    @OnShiftDown
      Call @Panic
    @End
    
    @Panic
      for ch = 0 to 15
        if ch <> scale_channel
          SendMIDICC ch,123,0
          SendMIDICC ch,120,0
        endif
      endfor
      FillArray scale,NO,12
      Call @SetAllPads
    @End
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue knob
      
      if knob = _kScaleChannel
        scale_channel = Round (TranslateScale value,0,127,NULL,15)
        knob = _kSplitNote
        Call @SetKnobPosition
        Call @SetKnobLabel
        knob = _kScaleChannel
      elseif knob = _kSplitNote
        if scale_channel = NULL
          split_note = Round (TranslateScale value,0,127,12,120)
        endif
      elseif knob = _kAction
        action = Round (TranslateScale value,0,127,_quantize,_passthru)
      elseif knob = _kLatch
        latch = Round (TranslateScale value,0,127,OFF,AUTO)
        if latch = OFF
          for idx = 0 to 11
            scale[idx] = NO
          endfor
          note_count = 0
          for idx = 0 to 15
            ColorPad idx,_cNormal
          endfor
        endif
      endif
      
      Call @SetKnobLabel
    @End
    
    @SetKnobLabel
      if knob = _kScaleChannel
        if scale_channel = NULL
          LabelKnob knob,{Ctrl: SPLIT}
        else
          LabelKnob _kScaleChannel,{Ctrl:}, (scale_channel+1)
        endif
      elseif knob = _kAction
        if action = _quantize
          LabelKnob knob, {Quantize}
        elseif action = _auto
          LabelKnob knob, {Auto}
        elseif action = _passthru
          LabelKnob knob, {PassThru}
        endif
      elseif knob = _kSplitNote
        if scale_channel = NULL
          LabelKnob knob,{< },(NoteName split_note,YES),{ (},split_note,{)}
        else
          LabelKnob knob,{ }
        endif
      elseif knob = _kLatch
        if latch = ON
          LabelKnob knob,{Latch ON}
        elseif latch = OFF
          LabelKnob knob,{Latch OFF}
        elseif latch = AUTO
          LabelKnob knob,{Latch AUTO}
        endif
      else
        LabelKnob knob,{ }
      endif
    @End
    
    @SetKnobPosition
      if knob = _kScaleChannel
        SetKnobValue knob,(TranslateScale scale_channel,NULL,15,0,127)
      elseif knob = _kSplitNote
        if scale_channel = NULL
          SetKnobValue knob,split_note
        else
          SetKnobValue knob,64
        endif
      elseif knob = _kAction
        SetKnobValue knob,(TranslateScale action,_quantize,_passthru,0,127)
      elseif knob = _kLatch
        SetKnobValue knob,(TranslateScale latch,OFF,AUTO,0,127)
      else
        SetKnobValue knob,64
      endif
    @End
    
    @SetAllKnobs
      for knob = 0 to 3
        Call @SetKnobPosition
        Call @SetKnobLabel
      endfor
    @End
    
    @SetAllPads
      for pad = 0 to 15
        Call @SetPadLabel
      endfor
    @End
    
    @SetPadLabel
      if _padNote[pad] <> -1
        LabelPad pad, NoteName _padNote[pad],NO
      else
        LabelPad pad,{ }
      endif
    @End
    
    @Constants
      
      // mozaic color constants
      _mozaic_white   = 0     // Soft rubbery white (default)
      _mozaic_red     = 1     // Red
      _mozaic_yellow  = 2     // Yellow
      _mozaic_green   = 3     // Green
      _mozaic_blue    = 4     // Light blue
      _mozaic_purple  = 5     // Lavender-purple 6 - Violet
      _mozaic_magenta = 7     // Magenta
      
      _cNormal = _mozaic_white
      _cScaleNote = _mozaic_green
        
      // Knobs
      _kScaleChannel  = 0
      _kSplitNote     = 1
      _kAction        = 2
      _kLatch         = 3
      
      _initLayout = 2         // Pads layout
      
      _padNote     = [-1,1,3,-1,6,8,10,-1,0,2,4,5,7,9,11,-1]
      _padPosition = [ 8,1,9,2,10,11,4,12,5,13,6,14]
      
      // Miscellaneous convenience constants
      NULL = -1
    
      // Convenience constants for the Latch knob
      OFF = 0
      ON = 1
      AUTO = 2
      
      // Convenience constants for the Mode knob
      _quantize = 0
      _auto = 1
      _passthru = 2
    @End
    
  • Hey Wim!
    Wow, absolutely amazing! I think that should cover all needs and works w/o a sustain pedal.

    @reezygle
    What I try to archive is basically this feature at around 6.00 min (without the bending of course)

    Playing chords and the according chord notes:

    Don't know if that's archivable at all to include accidentals into the filtered notes for a more jazzier vibe. I know.... the notes would be more or less unfiltered then...
    If I think about it: kind of a switch on/off button for notes filtering would solve this.

    To explain: I play the chords and noodle with the chord tones and connect them with passing notes or scale notes...

    ;-) Probably way to much and not sure if that's manageable in realtime.

    I am more than happy with your update.
    Thank you so much Wim!

  • @Basscleff said:
    Hey Wim!
    Wow, absolutely amazing! I think that should cover all needs and works w/o a sustain pedal.

    Don't know if that's archivable at all to include accidentals into the filtered notes for a more jazzier vibe. I know.... the notes would be more or less unfiltered then...
    If I think about it: kind of a switch on/off button for notes filtering would solve this.

    To explain: I play the chords and noodle with the chord tones and connect them with passing notes or scale notes...

    ;-) Probably way to much and not sure if that's manageable in realtime.

    I am more than happy with your update.
    Thank you so much Wim!

    Great. I'm glad it works. I'll polish it up a bit and then post it up to Patchstorage.com as version 2.0 of that script.

    The video example gives me some ideas for further enhancement - a switch to let non-chord notes through temporarily, but quantized to a scale. So, you'd need to set the key you're playing in, then either by pressing a pad or sending a midi message, let through additional notes that are still in the same key. I could add a function for at random times letting through of other notes (in scale) as well, to avoid having to switch manually.

    I could even put in a weighting factor, to set the prioritization between quantizing to chord notes or other scale notes.

    It would be trickier allowing accidentals since the script wouldn't know which would sound OK and which wouldn't. However, as I think about it, if the accidentals taken from the relevant major or minor blues scales, it might work, at least for some scales. 🤔

    I might fool around with those ideas at some point.

  • wimwim
    edited July 2025

    Hey @Basscleff - as I was writing the above, I remembered the Note to Be - MIDI Quantizer app. I haven't tried it, and it's not directly applicable to quantizing to chords as we've been discussing, but it might be worth checking out.

  • The video example gives me some ideas for further enhancement - a switch to let non-chord notes through temporarily, but quantized to a scale. So, you'd need to set the key you're playing in, then either by pressing a pad or sending a midi message, let through additional notes that are still in the same key. I could add a function for at random times letting through of other notes (in scale) as well, to avoid having to switch manually.

    I could even put in a weighting factor, to set the prioritization between quantizing to chord notes or other scale notes.

    Holy moly, this will getting better and better. Thanks so much Wim! I will have an eye on it for sure!

    If you need some inspirations check him out:

    https://payhip.com/leestrument

    Not really useful for this script I suppose but imho he has the most advanced chord features I have ever seen on any chord app.
    The chordimist for Ableton was a amazing, but now the vst version (though still in beta) is unbelievable.

    Send me a PM if you need these.
    Best!

    Thanks for "Note to be", have a few apps from him and will have an eye on that too.

  • +1 for Chordimist. Absolutely incredible app (desktop only folks, before you get too excited!)

  • edited July 2025

    @Kashi
    Yeah a shame that´s only desktop.
    One of the sickest features I have ever seen on any chord apps is the modal interchange button. Its crazy, you cycle trough only 2 or 3 chords and every time they sound different and so fresh.

    Scaler has this modal interchange thing also, but you have to fidle around til something sound cool...

  • @wim
    i am feeling like a complete idiot but could you explain it to me how to set things up....

    I tried it first in audiobus: put the chord pads from tonality as a midi effect and routed it to a piano and mapped some launchpad buttons to chord pad for playing them in real time. Then I loaded mozaic into the same place as chord pads and loaded your script. Tried the split mode but can't hear the chords, sometimes a few light and a few sound showed up in mozaic but unplayable...

    Tried it with cubasis also: midi channel with a few chords, loaded mozaic with your script and I can't hear the chords. Same as above.

    Do i have to duplicate the chord channel with the midi notes and route the duplicate to your script?

  • wimwim
    edited July 2025

    @Basscleff said:
    @wim
    i am feeling like a complete idiot but could you explain it to me how to set things up....

    I tried it first in audiobus: put the chord pads from tonality as a midi effect and routed it to a piano and mapped some launchpad buttons to chord pad for playing them in real time. Then I loaded mozaic into the same place as chord pads and loaded your script. Tried the split mode but can't hear the chords, sometimes a few light and a few sound showed up in mozaic but unplayable...

    Tried it with cubasis also: midi channel with a few chords, loaded mozaic with your script and I can't hear the chords. Same as above.

    Do i have to duplicate the chord channel with the midi notes and route the duplicate to your script?

    That's something I didn't think through. When it was only channel based, it was assumed the chords were being routed somewhere else, so I wasn't passing them through. I didn't think to add passthrough for the chords in split mode.

    Should be an easy fix.
    [edit] it was an easy fix, but then I found another bug. I'll fix both in a couple of hours, unless I find any other major smeg ups.

  • edited July 2025

    Thanks again as always ;-)

    So how was it supposed to do originally? I am also a bit lost in that case. Do I have to duplicate the chord track and send one of them with CH16 to your script? Perhaps I misunderstood the whole concept....

  • @Basscleff said:
    Thanks again as always ;-)

    So how was it supposed to do originally? I am also a bit lost in that case. Do I have to duplicate the chord track and send one of them with CH16 to your script? Perhaps I misunderstood the whole concept....

    Hard for me to say. I only wrote the script according to what someone described to me that they needed. I imagine they had two keyboards, the chords one routed both to the script and a plugin, and the other routed through the script for melodies. I didn’t think much about how it would be used in practice, which is why I didn’t anticipate the need for different handling if using keyboard split.

    I wasn’t able to get to altering the new version, and won’t likely have time today either, unfortunately. In the meantime, if you have AUM, you could route your keyboard in parallel to the script and whatever you’re playing, then on the direct routing, make a keyboard split to only take the chords.

    I’m sure I can sew it up by sometime tomorrow though.

  • hi @Basscleff

    v2.1 is up on patchstorage.com now. It adds pass-through for the notes that set the chord-scale filter.
    https://patchstorage.com/chord-scale-quantize/

  • hey @wim

    Wow, will have a look at this this weekend! Thank you, Thank you, Thank you!!!!

  • @brambos would you consider making Mozaic available on Macos?

  • I updated the categorized Mozaic Script List in the wiki. All PatchStorage script entries of 15.07.2025 are now present.

  • Sweet! Thanks @_ki.

  • @_ki said:
    I updated the categorized Mozaic Script List in the wiki. All PatchStorage script entries of 15.07.2025 are now present.

    🙏thanks . @_ki

  • @_ki said:
    I updated the categorized Mozaic Script List in the wiki. All PatchStorage script entries of 15.07.2025 are now present.

    You are awesome. Thanks.

  • @_ki said:
    I updated the categorized Mozaic Script List in the wiki. All PatchStorage script entries of 15.07.2025 are now present.

    Whoa, cheers!

  • edited August 2025

    I made a sequencer in Mozaic inspired by the Moog Labyrinth based on Burns Audio's Turing Machine code. It implements one of the 8 step sequencers in the Labyrinth with some features added and a few missing. Labyrinth has two 8 step sequencers but with Mozaic AUV3 you can add as many as you want.

    What's missing from Fabyrinth that Labyrinth has: chaining two sequencers together, sequence shifting, step recording.

    What's added that Labyrinth does not have:

    • flip bits (gates) on/off using the pads
    • separate knobs for "corrupting" notes and gates
    • adjustable gate length
    • subdivide host clock to 1/16, 1/8, 1/4 etc notes
    • 25 scales
    • four sequence snapshots that can be recalled

    The Labyrinth sequencer is great for Techno and I think this one is the same. The snapshot feature helps to get back to something cool when the randomness goes a bit too far...

    Quick guide:

    Tap the shift button to toggle between the two UI pages

    CorrNote and CorrGate knobs control the probability of "corrupting" notes and gates respectively.

    • Full CCW = lock notes/gates
    • Full CW = 100% chance of changing notes/gates

    Range - sets the range of sequencer notes
    Length - sets sequencer length 1-8 steps
    Notelength - gate duration. Don't make it too long or you might get stuck notes depending on the step length
    Knob to the right of Notelength - sets step length relative to host clock 1/16 notes to 8 bars
    Root - root note
    Knob to the right of Root - sets scale
    Top row of pads - flip gates on and off
    Bottom row - Snapshot capture/recall notes+gates. Does not currently save the other settings - would this be useful?

    I will post this on PatchStorage but I thought I'd put it here to get some feedback first.

    Also attached a little sample from an AUM jam. Four copies of Fabyrinth controlling three Synthmasters and OneShot for random percussion. HammerHead is laying down the drum track. There is quite a bit going on here and its all Fabyrinth. The only thing I manipulated during the recording was the Range of the pluck synth.

  • Really nice design work following the inspiration of the Moog Labyrinth and Burns Audio’s approach.
    It’s great to see you credit them in your description.

    After a quick play, I’m wondering is there a way to input the notes or does that miss the whole point… it generates
    sequences for you but you can change aspects of those programmer notes like length, random gating, etc.

  • the built in script "harp pad" is great when you load up four and use four fingers to trigger the sequence.

  • @egobeats said:
    the built in script "harp pad" is great when you load up four and use four fingers to trigger the sequence.

    @brambos put a lot of effort into making Mozaic easy to use and learn but it’s still something most avoid because
    of bad programming experiences that turned them off.

  • @McD said:
    Really nice design work following the inspiration of the Moog Labyrinth and Burns Audio’s approach.
    It’s great to see you credit them in your description.

    After a quick play, I’m wondering is there a way to input the notes or does that miss the whole point… it generates
    sequences for you but you can change aspects of those programmer notes like length, random gating, etc.

    Thanks! It’s my first attempt at Mozaic scripting and Burns Audio’s code was very helpful to get started.

    I think you can step record on the Labyrinth but I’m not 100% sure. It would be a nice feature especially when combined with the snapshots. I’m also thinking about chaining snapshots. One of the challenges of Mozaic is how to add things to the very simplistic UI.

Sign In or Register to comment.