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!

19899100102104

Comments

  • @wim
    Thanks for all of information 🙏.

    I am reviewing and testing all the content you sent me.
    Soon I will send you one of the codes I wrote in that @ontimer.

  • Today I was getting mildly frustrated with getting the Orchestral Dreams pack in Module to sound right without hitting my keyboard unnaturally hard. I looked at AUM’s own keyboard with its ‘velocity range’ feature, and thought, “This is surely something @wim would have written a Mozaic script for, right?” and lo, it was so. Thank you, past @wim.

  • wimwim
    edited March 12

    @jebni said:
    Today I was getting mildly frustrated with getting the Orchestral Dreams pack in Module to sound right without hitting my keyboard unnaturally hard. I looked at AUM’s own keyboard with its ‘velocity range’ feature, and thought, “This is surely something @wim would have written a Mozaic script for, right?” and lo, it was so. Thank you, past @wim.

    Good to know. 👍🏼
    Which script was that? There are probably more sophisticated ones available. I don't remember writing anything like that. 😂

  • @wim said:

    @jebni said:
    Today I was getting mildly frustrated with getting the Orchestral Dreams pack in Module to sound right without hitting my keyboard unnaturally hard. I looked at AUM’s own keyboard with its ‘velocity range’ feature, and thought, “This is surely something @wim would have written a Mozaic script for, right?” and lo, it was so. Thank you, past @wim.

    Good to know. 👍🏼
    Which script was that? There are probably more sophisticated ones available. I don't remember writing anything like that. 😂

    Ha, the https://patchstorage.com/orchestral-instruments-range-limiter/ — I think the velocity range was an afterthought, but what I was looking for. Though the actual note range limiters also come in handy for my scenario, too 👍

  • wimwim
    edited March 12

    @jebni said:

    @wim said:

    @jebni said:
    Today I was getting mildly frustrated with getting the Orchestral Dreams pack in Module to sound right without hitting my keyboard unnaturally hard. I looked at AUM’s own keyboard with its ‘velocity range’ feature, and thought, “This is surely something @wim would have written a Mozaic script for, right?” and lo, it was so. Thank you, past @wim.

    Good to know. 👍🏼
    Which script was that? There are probably more sophisticated ones available. I don't remember writing anything like that. 😂

    Ha, the https://patchstorage.com/orchestral-instruments-range-limiter/ — I think the velocity range was an afterthought, but what I was looking for. Though the actual note range limiters also come in handy for my scenario, too 👍

    You might also want to check out CurveMaker and MIDI Scaler.

  • @wim said:

    @jebni said:

    @wim said:

    @jebni said:
    Today I was getting mildly frustrated with getting the Orchestral Dreams pack in Module to sound right without hitting my keyboard unnaturally hard. I looked at AUM’s own keyboard with its ‘velocity range’ feature, and thought, “This is surely something @wim would have written a Mozaic script for, right?” and lo, it was so. Thank you, past @wim.

    Good to know. 👍🏼
    Which script was that? There are probably more sophisticated ones available. I don't remember writing anything like that. 😂

    Ha, the https://patchstorage.com/orchestral-instruments-range-limiter/ — I think the velocity range was an afterthought, but what I was looking for. Though the actual note range limiters also come in handy for my scenario, too 👍

    You might also want to check out CurveMaker and MIDI Scaler.

    Ah, very cool. Changing the response curve was going to be my next thing. Glad I found this stuff in the context of orchestral note range, though. (While I’m not necessarily averse to unnatural pitch for sampled instruments, I’m still also the guy who often edits the wacky range of the uppermost zone in others’ multisampled instruments.)

  • How I wish I could use Mozaic in Logic on my Mac. @brambos It would open so many possibilities there.

  • @auxmux said:
    How I wish I could use Mozaic in Logic on my Mac. @brambos It would open so many possibilities there.

    With iDAM you could do a pretty effective job of that, I would think.

  • @wim said:

    @auxmux said:
    How I wish I could use Mozaic in Logic on my Mac. @brambos It would open so many possibilities there.

    With iDAM you could do a pretty effective job of that, I would think.

    NovoNotes SideRack is another good solution - but is also expensive compared to most apps

  • @wim said:

    @auxmux said:
    How I wish I could use Mozaic in Logic on my Mac. @brambos It would open so many possibilities there.

    With iDAM you could do a pretty effective job of that, I would think.

    Yes, that can work, Bluetooth also works, but I'd like to pair mozaic with other sequencers I have on MacOs.

  • @auxmux said:

    @wim said:

    @auxmux said:
    How I wish I could use Mozaic in Logic on my Mac. @brambos It would open so many possibilities there.

    With iDAM you could do a pretty effective job of that, I would think.

    Yes, that can work, Bluetooth also works, but I'd like to pair mozaic with other sequencers I have on MacOs.

    Midi is two way on idam, so things like that might be possible, but yeh, kludgy.

  • edited May 2

    Hi masters. @espiegel123 @wim @ki @McD

    If you remember, I asked a question a long time ago about the note numbers related to the chord or polyphonic notes ( The notes are held down simultaneously ) . For example i held down notes C4, E4, G4 . So in this example note C4 = first note , E4 = second note, G4 = third note . If i add note D4 , so The order of the notes will change : C4 = first note, D4 = second note , E4 = third note , G4 = fourth note .

    I had asked how to write code in mozaic that can recognize the order of note numbers .

    As far as I remember , if I'm not mistaken , You answered that such a feature can be achieved only by defining the types of chords.

    Now I ask again if there is any other way ?

  • wimwim
    edited May 2

    @pejman said:
    Hi masters. @espiegel123 @wim @ki @McD

    If you remember, I asked a question a long time ago about the note numbers related to the chord or polyphonic notes ( The notes are held down simultaneously ) . For example i held down notes C4, E4, G4 . So in this example note C4 = first note , E4 = second note, G4 = third note . If i add note D4 , so The order of the notes will change : C4 = first note, D4 = second note , E4 = third note , G4 = fourth note .

    I had asked how to write code in mozaic that can recognize the order of note numbers .

    As far as I remember , if I'm not mistaken , You answered that such a feature can be achieved only by defining the types of chords.

    Now I ask again if there is any other way ?

    I don't think I understand the question. Either that or you asked it differently before. What you've asked above doesn't sound like a problem but I feel like there is probably more to the question. How would you use these notes? Can you link to the earlier question for comparison?

    Simply ordering the notes that are held down in an array, then re-ordering them if a new one is added isn't too difficult.

  • Hi @wim

    Unfortunately I can't find the link .

    You wrote: “ Simply ordering the notes that are held down in an array, then re-ordering them if a new one is added isn't too difficult.“

    Can you write the code please?

  • wimwim
    edited May 2

    @pejman said:
    Hi @wim

    Unfortunately I can't find the link .

    You wrote: “ Simply ordering the notes that are held down in an array, then re-ordering them if a new one is added isn't too difficult.“

    Can you write the code please?

    I don't want to take the time to do that only to find that it doesn't do what you really wanted. Please describe the purpose of having code to sort the held down notes - how you would be getting the notes in, and what you would be doing with the notes once sorted.

    If we had this discussion before and determined what you wanted wasn't feasible, then there were surely good reasons. So, unless the use-case has changed, then the answer hasn't changed either.

  • @wim said:

    @pejman said:
    Hi @wim

    Unfortunately I can't find the link .

    You wrote: “ Simply ordering the notes that are held down in an array, then re-ordering them if a new one is added isn't too difficult.“

    Can you write the code please?

    I don't want to take the time to do that only to find that it doesn't do what you really wanted. Please describe the purpose of having code to sort the held down notes - how you would be getting the notes in, and what you would be doing with the notes once sorted.

    If we had this discussion before and determined what you wanted wasn't feasible, then there were surely good reasons. So, unless the use-case has changed, then the answer hasn't changed either.

    Plus, I seem to remember providing note-sorting code to someone before. Perhaps it was you in the earlier conversation? Please at least take the time to find the original conversation you referenced.

  • @wim

    Incredibly, I was able to find it because it was a long time ago and I didn't know which forum and witch page I had asked that question on.

    Page 88

    https://forum.audiob.us/discussion/comment/1189951/#Comment_1189951

    My question started with these sentences :

    “Why is there no syntax or command of the first note or the second note or the third note or
    the lowest note or the highest note From the chord that was performed via virtual keyboard in Mozaic , without needing to introduce chords into the mozaic, specially for when we are changing the chords in performance ?”

    You finally wrote such a script for me :

    https://forum.audiob.us/discussion/comment/1189978/#Comment_1189978

    But this script cannot correctly determine the order of the notes after we move our fingers ( Add a finger, subtract a finger, move a finger to the notes ).

    But again, I will give a clearer explanation about what I mean.

    Imagine me putting my fingers on several keys at the same time . For example C4 , E4 , G4 .

    In this case, I expect the mozaic in the log to show me like this :

    first note = C4 , second note = E4 , third note = G4

    If i release my finger from note E4 , I expect : mozaic shows in log : first note = C4 , second note = G4

    Then If i add note G3 this time, I expect : mozaic shows in log : first note = G3 , second note = C4 , third note = G4.

    I just need to discover and learn this code right now and I have no plans to use it right now.

  • wimwim
    edited May 2

    @pejman said:
    Imagine me putting my fingers on several keys at the same time . For example C4 , E4 , G4 .

    In this case, I expect the mozaic in the log to show me like this :

    first note = C4 , second note = E4 , third note = G4

    If i release my finger from note E4 , I expect : mozaic shows in log : first note = C4 , second note = G4

    Then If i add note G3 this time, I expect : mozaic shows in log : first note = G3 , second note = C4 , third note = G4.

    I just need to discover and learn this code right now and I have no plans to use it right now.

    Are you sure that script doesn't do what you describe? It seems to work just fine here.
    What isn't working correctly about it?

  • wimwim
    edited May 2

    @wim said:

    @pejman said:
    Imagine me putting my fingers on several keys at the same time . For example C4 , E4 , G4 .

    In this case, I expect the mozaic in the log to show me like this :

    first note = C4 , second note = E4 , third note = G4

    If i release my finger from note E4 , I expect : mozaic shows in log : first note = C4 , second note = G4

    Then If i add note G3 this time, I expect : mozaic shows in log : first note = G3 , second note = C4 , third note = G4.

    I just need to discover and learn this code right now and I have no plans to use it right now.

    Are you sure that script doesn't do what you describe? It seems to work just fine here.
    What isn't working correctly about it?

    Wait. I do see where your request now is different than it was then.
    I understand the change that you need now.

  • @wim .

    I'm glad you understand what I mean.

    Thank you very much for your time. 🙏

  • This is a comment for the reader’s of this thread interested in knowing more about how Mozaic “logs”
    things.

    Mozaic as an app doesn’t save anything when you press keys unless you write the script to store the
    data.

    Mozaic processes script “code blocks” for MIDI incoming events:

    @OnMidiInput
    @OnMidiNote
    @OnMidiNoteOn
    @OnMidiNoteOff
    @OnMidiCC
    SendMIDIThruOnCh chan, optionaldelay

    @pejman supplies a interaction and his expectation:

    For example i held down notes C4, E4, G4 .

    OK. That will generate 3 @OnMidi category events. Write the OnMidi* code block that stores these notes into an array. NOTE: When the thre notes arrive they may arrive in an unintended order unless you carefully roll the notes up or down the chord.

    So in this example note C4 = first note , E4 = second note, G4 = third note .

    At this point you would have 3 note numbers in a note array. You can sort them numerically at any pont you wish and have an array that matches this first note, etc.

    If i add note D4 , so The order of the notes will change : C4 = first note, D4 = second note , E4 = third note , G4 = fourth note .

    That D4 creates another OnMidi type event that should store the note number without deleting 1,2 and 3. Another “sort” process could be used to order them numerically.

    Mozaic is an EVENT DRIVEN runtime engine… very similar to the concepts of a Computer Graphics style of programming. Mozaic detects events:

    Midi Events
    Interface Events (PADS, knobs, sliders, etc)
    Timer Functions

    Every event must have a Code Block created to do anything useful.

    Writing these code blocks requires understanding all the Mozaic data, math, event and logging commands available for building robust custom “MIDI Apps”.

  • wimwim
    edited May 3

    @pejman said:
    @wim .

    I'm glad you understand what I mean.

    Thank you very much for your time. 🙏

    Here you go @pejman. This should work as far as I understand your request:

    @Description
    Track the notes that are being held down and sort them lowest note to highest note.
    NOTE: This is designed to only handle a SINGLE MIDI CHANNEL at a time.
    @End
    
    @OnLoad
      noteCount = 0
      FillArray heldNotes,-1
    @End
    
    @OnMidiNoteOn
      note = MIDINote
      Call @AddNote
      Call @SortNotes
      Call @LogNotes
    @End
    
    @OnMidiNoteOff
      note = MIDINote
      Call @RemoveNote
      Call @SortNotes
      Call @LogNotes
    @End
    
    @AddNote
      // Add a note to the stack
      heldNotes[noteCount] = note
      Inc noteCount
    @End
    
    @RemoveNote
      // Remove a note from the stack
      r = 0
      found = NO
      
      // Read through the stack until the note is found.
      // Once found, replace that with the next note in the stack
      // until there are no more notes (note = -1).
      repeat
        if heldNotes[r] = note
          found = YES
          Dec noteCount
        endif
        
        if found
          heldNotes[r] = heldNotes[r+1]
        endif
        Inc r  
      until heldNotes[r] = -1 or r = 1023
    @End
    
    @SortNotes
      // Sort the stack by copying the notes
      // in lowest-to highest order into a temporary array
      // then replace the active array with the temporary array
      
      // Exit if there are no notes left in the stack
      if noteCount = 0
        Exit
      endif
      
      FillArray tmp, -1
      sortCount = noteCount
      
      for s = 0 to (sortCount-1)
        Call @GetLowest
        tmp[s] = lowest
        note = lowest
        Call @RemoveNote
      endfor
      
      CopyArray tmp,heldNotes
      // noteCount has been decreasing as we remove already
      // copied notes, so we need to restore it here.
      noteCount = sortCount
    @End
    
    @GetLowest
      if noteCount = 0
        Exit
      endif
      
      lowest = 128
      for l = 0 to (noteCount - 1)
        if heldNotes[l] < lowest
          lowest = heldNotes[l]
        endif
      endfor
    @End
    
    @LogNotes
      if noteCount > 0
        Log {=== Start Note Array Contents ===}
        for l = 0 to (noteCount - 1)
          Log {[}, l, {] }, (NoteName heldNotes[l],YES), { (}, heldNotes[l], {)}
        endfor
        Log {===  End Note Array Contents  ===}
        Log { }
      else
        Log {No held notes.}
        Log { }
      endif
    @End
    

    [edit] See below for a much better method for sorting the notes.

  • @wim

    That’s great, that’s working 🙏.

    Yes, this is exactly what I wanted.

  • @pejman said:
    @wim

    That’s great, that’s working 🙏.

    Yes, this is exactly what I wanted.

    I’m glad it works. There are probably more elegant ways to do it, but it should be reasonably efficient.

  • Hi @wim @McD

    Thanks @McD for explanation.

    @wim , From reading your code, I noticed that you sort the notes through a loop .

    I had tried before I asked you my question .
    But not based on loop, but based on being if’s, with 2 array : The first array to collect held notes and the second array to sort them with ( if midinote = x put in x array’s sell), In the middle of the way, I realized that the direction I was going was completely wrong.

    But In the middle of the way, I realized that I needed a lot of (IFs) and I realized that the direction I was going was completely wrong. I was disappointed.

    In this script I was only trying on the first three notes .

    @OnLoad
    FillArray note, -1, 5
    FillArray count, -1, 5

    log {firstnote ➡️}, count[0] , { secondnote➡️}, count[1],{ thirdnote➡️}, count[2], { fortnote➡️}, count[3]
    @End

    @OnMidiNoteOn
    n = MIDINote
    CopyArray n, note[MIDINote] , 1

    Call @counter
    //log {firstnoteON ➡️}, note[0] , { secondnoteON➡️}, note[1],{ thirdnoteON➡️}, note[2], { fortnoteON➡️}, note[3]
    @End

    @OnMidiNoteOff
    n = -1
    CopyArray n, note[MIDINote]
    Call @counter
    //log {firstnoteoff ➡️}, note[0] , { secondnoteoff➡️}, note[1],{ thirdnoteoff➡️}, note[2], { fortnoteoff➡️}, note[3]

    @End

    @counter
    if note[0] = 0
    CopyArray note[0], count[0]
    elseif note[1] = 1
    CopyArray note[1], count[0]
    elseif note[2] = 2
    CopyArray note[2], count[0]
    elseif note[3] = 3
    CopyArray note[3], count[0]
    endif
    if note[0] = 0 and note[1] = 1
    CopyArray note[0], count[0]
    CopyArray note[1], count[1]
    elseif note[0] = 0 and note[2] = 2
    CopyArray note[0], count[0]
    CopyArray note[2], count[1]
    elseif note[0] = 0 and note[3] = 3
    CopyArray note[0], count[0]
    CopyArray note[3], count[1]
    endif

    if note[1] = 1 and note[3] = 3
    CopyArray note[1], count[0]
    CopyArray note[3], count[1]
    endif
    log {firstnote ➡️}, count[0] , { secondnote➡️}, count[1],{ thirdnote➡️}, count[2], { fortnote➡️}, count[3]
    @End

    After you sent me the script, I remembered that there is a script ( Latch and Switch ) by Mark Dammer, that can sort the notes in order in the pads. (Track the notes that are being held down and sort them lowest note to highest note.) , I had worked with this script, but I didn't remember that it could sort the notes .

    But unfortunately, I can't read this script to understand exactly how he did it.

    If you try this patch please set it to replace mode . With pressing shift and latch on/off pad (pad num 12 )

    https://patchstorage.com/latch-and-switch/?
    utm_source=discord&utm_medium=patchbot&utm_campaign=embed

  • wimwim
    edited May 3

    @pejman said:
    After you sent me the script, I remembered that there is a script ( Latch and Switch ) by Mark Dammer, that can sort the notes in order in the pads. (Track the notes that are being held down and sort them lowest note to highest note.) , I had worked with this script, but I didn't remember that it could sort the notes .

    But unfortunately, I can't read this script to understand exactly how he did it.

    They use a more efficient approach than I did. I like it much better. I knew there was a much more better way to go about it, but copying into a new array was easier for me to visualize.

    I have heavily commented the key while loop that does the sorting. Hopefully that will allow you to understand how it is working.

    @ShowNotes
      sorted = NO       // This tells the "while" loop up to run
      
      sl = alen         // alen is the length of the note array. sl is the
                        // counter used for the for loop length. We can't use alen in the for loop
                        // because the variable is going to be decreased in the last line of the while loop
                        // and we need to keep alen un-modified so we always know the length of the array.
                        
      while sorted = NO
        sorted = YES    // Look at the for loop below. If anything is found out of order
                        // in the for loop, sorted is set to NO to tell the while loop to
                        // execute again. If nothing is found out of order then sorted will
                        // remain YES and the while loop will no longer execute.
                        
        for si = 0 to sl              // This will loop through the array from first position to the last
        
            sj = si + 1               // sj will be used to look at the next position in the array
            
            if pdnt[si] > pdnt[sj]    // If the current position (si) note is higher than the next
                                      // position (sj) note, then ...
                                      
                sorted = NO           //  - the array needs to be checked again
                stmp = pdnt[si]       //  - save the current position note to a temporary variable
                pdnt[si] = pdnt[sj]   //  - replace the current position note with the next one because it's lower
                pdnt[sj] = stmp       //  - replace the next position note with the one we saved in smtp
                
                                      // This loop will end up with the highest note put into the last position.
                                      // To visualize how this works, try with some playing cards in random order.
                                      //  Start with the first. If it's higher than the next then swap positions of the
                                      //  two cards. Now repeat for each positoin of the cards.
            endif
          endfor
        Dec sl                        // Running the for loop resulted in the highest note being put at the end so
                                      // we don't need our for loop to check it each time. Decreasing sl will make the
                                      // for loop shorter each time for efficiency.
      endwhile
      
      for sj = 0 to mv
        snt = pdnt[sj]
        if snt = -1
          LabelPad sj, {--}
          ColorPad sj, 0
        else
          Call @NotePad
        endif
      endfor
    @End
    

    Thanks for posting that. I learned something useful from looking at that better code. 😎

  • @wim said:

    Thanks for posting that. I learned something useful from looking at that better code. 😎

    Thanks for reading the script and many thanks for the valuable analysis and explanations🙏.

    I will read both scripts, your script and latch and switch line by line .

  • Hi everyone.

    Is it possible to create specific channel output in the nodes which contains midi plug-in in aum , through aum itself ?

    It is possible to select a channel for each node's input, but there is no channel selection for its output.

  • Multiple output ports like Helium would be great.

    Not sure how you could adapt existing code to this. There could be a SendMidiOut to port x function or perhaps another variable added to the existing send midi functions to select a port?

  • Hi . @GrimLucky

    Thanks for replay.
    I don't mean multiple output.
    Some plugins don't have a built-in option for output channels , like atom pianoroll 1.
    I want to create 2 nodes with 2 atom.
    I want to send from atom1 to one of the cubasis tracks via chanel 2 , and another atom send with channel 3 to another cubasis track. Without any middle midi plugins.

Sign In or Register to comment.