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!

18384868889104

Comments

  • @Gravitas said:

    @wim said:
    Great @Gravitas - glad I could help. It was a nice diversion.

    I made it v1.0 and posted it up to patchstorage.com: https://patchstorage.com/orchestral-instruments-range-limiter/

    I’ve had a look on Patchstorage and noticed that you included sub-types.

    That’s really cool.

    Yeh, that was always there but not obvious since the help message when you first load the script doesn't make it obvious that you can scroll down. That's a small thing I wish was a little better implemented in Mozaic.

    I needed to do it that way in order to fit in the needed number of pads. ;)

  • @wim said:

    @Gravitas said:

    @wim said:
    Great @Gravitas - glad I could help. It was a nice diversion.

    I made it v1.0 and posted it up to patchstorage.com: https://patchstorage.com/orchestral-instruments-range-limiter/

    I’ve had a look on Patchstorage and noticed that you included sub-types.

    That’s really cool.

    Yeh, that was always there but not obvious since the help message when you first load the script doesn't make it obvious that you can scroll down. That's a small thing I wish was a little better implemented in Mozaic.

    I needed to do it that way in order to fit in the needed number of pads. ;)

    It’s going to be perfect for composers who don’t read or write notation.

    It removes the necessity of looking up the ranges of commonly known instruments
    and a composer can play within the correct range per instrument and export out
    the midi to a third party notation app and in the notation app simply add
    the additional instructions necessary and then it’s giving the score to the musicians to play.

    Simplifies the whole process and opens up the
    world of classical composition for the everyday person. :)

  • @electri_fire said:

    So at values below 64 you won't have voice 3 at all, and above 64 is no voice 1 at all? From the way you've described it there is a max of two voices at one time. Is this right?:

    0 = 100% voice 1,
    1-63 = blend of voice 1 and 2,
    64 = 100% voice 2,
    65-126 = blend of voice 2 and voice 3, and
    127: 100% voice 3.

    and it follows that voice 2 is part of the mix everywhere except at the extreme values of 0 and 127.

    That is exactly what I need.

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel. You will need to check AUM Midi Ctrl for what channel nums and cc controls each track, so you can modify the @OnLoad settings in the code. This code uses linear ramping of cc vals. Also, I doubt whether the 0 - 127 cc outputs are what you want, since I think 0db for each fader is well below 127, but that can be easily tweaked if this works close to how you want.

    @OnLoad
      // set these up according to what
      // your midi control settings are
      // for the volume in channels in AUM
      // (remember AUM channel 1 is midi channel 0, I think)
      v1channel = 0
      v1cc = 7
      v2channel = 1
      v2cc = 7
      v3channel = 2
      v3cc = 7
      mozaicKnobNum = 0  // number of knob you'll use in Mozaic
    @END
    
    @OnKnobChange
    
      if LastKnob = mozaicKnobNum
    
        v = GetKnobval LastKnob
    
        if v < 64
          v1val = (64 - v) * 2
          v2val = v * 2
          v3val = 0
        elseif v >= 64
          v1val = 0
          v2val = ( 127 - v ) * 2
          v3val = ( v - 64 ) * 2
        endif
    
        SendMidiCC v1channel, v1cc, v1val
        SendMidiCC v2channel, v2cc, v2val
        SendMidiCC v3channel, v3cc, v3val
      endif
    
    @END
    
  • edited December 2021

    @hes said:

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel.

    Thanks hes,
    When testing, AUM fader1 snaps to maximum, fader2 and fader3 snap to zero, regardless of initial fader settings or Mozaic knob0 position.

    The Mozaic log displays:

    [OnKnobChange] Syntax Error: unknown or invalid argument "GETKNOBVAL"

  • @electri_fire said:

    @hes said:

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel.

    Thanks hes,
    When testing, AUM fader1 snaps to maximum, fader2 and fader3 snap to zero, regardless of initial fader settings or Mozaic knob0 position.

    The Mozaic log displays:

    [OnKnobChange] Syntax Error: unknown or invalid argument "GETKNOBVAL"

    Try putting parenthesis around GetKnobValue and its parameter

    (GetKnobValue LastKnob)

  • @espiegel123 said:

    @electri_fire said:

    @hes said:

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel.

    Thanks hes,
    When testing, AUM fader1 snaps to maximum, fader2 and fader3 snap to zero, regardless of initial fader settings or Mozaic knob0 position.

    The Mozaic log displays:

    [OnKnobChange] Syntax Error: unknown or invalid argument "GETKNOBVAL"

    Try putting parenthesis around GetKnobValue and its parameter

    (GetKnobValue LastKnob)

    Same result, but now the log sais:

    [OnKnobChange] Syntax Error: unknown or invalid argument "(GETKNOBVAL LASTKNOB)"

  • @electri_fire said:

    @espiegel123 said:

    @electri_fire said:

    @hes said:

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel.

    Thanks hes,
    When testing, AUM fader1 snaps to maximum, fader2 and fader3 snap to zero, regardless of initial fader settings or Mozaic knob0 position.

    The Mozaic log displays:

    [OnKnobChange] Syntax Error: unknown or invalid argument "GETKNOBVAL"

    Try putting parenthesis around GetKnobValue and its parameter

    (GetKnobValue LastKnob)

    Same result, but now the log sais:

    [OnKnobChange] Syntax Error: unknown or invalid argument "(GETKNOBVAL LASTKNOB)"

    Try GetKnobValue instead :smile:

  • @brambos said:

    @electri_fire said:

    @espiegel123 said:

    @electri_fire said:

    @hes said:

    This is a first stab at it. Untested, but I think it's close. I'm assuming you're wanting to control the AUM volume faders for each channel.

    Thanks hes,
    When testing, AUM fader1 snaps to maximum, fader2 and fader3 snap to zero, regardless of initial fader settings or Mozaic knob0 position.

    The Mozaic log displays:

    [OnKnobChange] Syntax Error: unknown or invalid argument "GETKNOBVAL"

    Try putting parenthesis around GetKnobValue and its parameter

    (GetKnobValue LastKnob)

    Same result, but now the log sais:

    [OnKnobChange] Syntax Error: unknown or invalid argument "(GETKNOBVAL LASTKNOB)"

    Try GetKnobValue instead :smile:

    Maybe, I shouldn't read code before drinking coffee

  • Try GetKnobValue instead :smile:

    Awsome, now works exactly as I wanted it to, thank you so much all.

  • Hey (first post here)

    i was wondering if there is the possibility to have the knob values updated from, let’s say an AU.

    What I am trying to achieve is: have a 8 or (X) knob/fader controller in Mozaic. Which are mapped to a AU. Then, when I change one mapped value from this AU in the AU.

    I would like to have the knob value in Mozaic also updated.

    The main goal would be, to have a 8 knob controller and some pads, which send notes, so be able to control the 8 macros of an Ableton rack.
    I already got the 8 knobs controlling the 8 macros by a simple User Remote script for Ableton, which automatically controls the first 8 parameters. By switching the Racks (with notes/pads) the knobs in Ableton chance aswell. So it would be quite handy to have the values from the Ableton knobs updated within my Mozaic Controller :)

    I am 99,5% new to coding & already through the manual. I guess this could be done with the getknobvalue but I cannot figure out how to get/read the values from the AU.

    Would be great if someone could help me out a bit.

    Kind regards

    A

  • The knobs in the au would have to send midi out for mozaic to pick it up.
    If you control the au with an external controller then you could route the external controller through mozaic. But picking up what the mouse changed will be impossble if the au does not give midi feedback, wich most do not.

  • Hi
    Please help me .

    I don't know if this question has been asked before or not.
    Mozaic doesn’t save state of knobs faders, ... , in cubasis 2. As midi plugin AUV3 . For example i select one preset , and adjust or change some of knobs as desired . And then close cubasis 2 , When I open cubasis again , there is mozaic with same preset but it exists in default preset mode . There is no this problem in auriapro app . I always use other midi plugins auv3 in Cubasis 2. But they do not have such a problem . Where is the problem? Please help , Because this problem is really annoying .

    Pejman

  • _ki_ki
    edited October 2022

    @pejman

    Mozaic‘s state saving depends on the script.

    In general Moazic saves all faders, knobs, labels etc in the session - but some scripts don‘t ‚guard‘ their variable intialization with an if unassigned xxx and therefore overwrite everything with their own defaults in the OnLoad

  • @_ki said:
    @pejman

    Mozaic‘s state saving depends on the script.

    In general Moazic saves all faders, knobs, labels etc in the session - but some scripts don‘t ‚guard‘ their variable intialization with an if unassigned xxx and therefore overwrite everything with their own defaults in the OnLoad

    Hi ki

    Thank you for your quick reply.

    You are right, But one question remains. Why state saving is the same preset that does not work in cubasis. In auria pro, it saves the situations correctly.?

  • If for the same script state-saving works in Auria Pro, but not in Cubasis that would be weird. Is that script published on patchstorage ?

    Maybe i find the time to have a look - i have both AuriaPro and Cubasis 2/3

  • I just loaded one of my Mozaic scripts (that implement state-save) into the MidiEffects slot of the default midi track of a fresh project, setup some internal settings (knobs, states etc) and closed Cubasis 3. Upon restart of Cubasis, the correct settings were restored.

    Also checked that they were restored when loading another project and then switching back to my MozaicTest project.

  • @_ki said:
    I just loaded one of my Mozaic scripts (that implement state-save) into the MidiEffects slot of the default midi track of a fresh project, setup some internal settings (knobs, states etc) and closed Cubasis 3. Upon restart of Cubasis, the correct settings were restored.

    Also checked that they were restored when loading another project and then switching back to my MozaicTest project.

    I apologize for the delay .

    Yes, I made a mistake somewhere.
    My preset hasn’t ( if unassigned xxx ) and for some of knobs has ( SetKnobValue ) and for some of knobs hasn’t it . Therefore, those knobs that don’t have ( setknobvalue ) are kept in their position ( state saving ) in both cubasis an auria pro . That is, my preset works exactly the same in both cubase and auriapro .
    I’m not a coder . Does adding this ( if unassigned ) in my preset require many changes?
    For having both options ( setknobvalue ) on load and ( if unassigned ) . This preset is for humanizing note delay and random velocity.

    Humaniz with control knobs
    via cc’s

    @Onload

    // change these to the cc's you want to use
    mintimecc = 13
    maxtimecc = 14
    minvelcc = 15
    maxvelcc = 16
    minvaluecc = 17
    maxvaluecc = 18

    ShowLayout 0

    LabelKnobs {humaniz}
    LabelKnob 0, {min time}
    LabelKnob 1, {max time}
    LabelKnob 2, {min vel}
    LabelKnob 3, {max vel}
    LabelKnob 5, {set min value}
    LabelKnob 6, {set max value}

    SetKnobValue 0, 0
    SetKnobValue 5, 0
    SetKnobValue 6, 64
    SetKnobValue 3, 100

    @End

    @OnMidiCC
    if MIDIByte2 = mintimecc
    SetKnobValue 0, MIDIByte3
    elseif MIDIByte2 = maxtimecc
    SetKnobValue 1, MIDIByte3
    elseif MIDIByte2 = minvelcc
    SetKnobValue 2, MIDIByte3
    elseif MIDIByte2 = maxvelcc
    SetKnobValue 3, MIDIByte3
    elseif MIDIByte2 = minvaluecc
    SetKnobValue 5, MIDIByte3
    elseif MIDIByte2 = maxvaluecc
    SetKnobValue 6, MIDIByte3
    else
    // comment this out if you don’t want other cc’s to pass thru
    SendMIDIThru
    endif
    @End

    @OnMIDINoteOn
    Maxval = TranslateScale ( GetKnobValue 6 ), 0, 127, 0, 500
    Minval = TranslateScale ( GetKnobValue 5 ), 0, 127, 0, 500
    delayMax = TranslateScale (GetKnobValue 1), 0, 127, 0, Maxval
    delayMin = TranslateScale (GetKnobValue 0), 0, 127, 0, Minval
    delay = Random delayMin, delayMax
    vel = Random (GetKnobValue 2), (GetKnobValue 3)
    SendMIDINoteOn MIDIChannel, MIDINote, vel, delay

    // remember the delay we're using for Note Off
    SetNoteState MIDIChannel, MIDINote, delay

    @End

    @OnMIDINoteOff
    // get the delay we used for this note
    delay = GetNoteState MIDIChannel, MIDINote
    SendMIDINoteOff MIDIChannel, MIDINote, 0, delay
    @End

  • Hi @pejman - Normally I wouldn't answer a question directed at someone else, but it's been some time since your post, so I expect it's probably late in @_ki 's timezone.

    What you need to do is check the @OnLoad and add something to check whether this is a new load of the script or not. In your case:

      SetKnobValue 0, 0
      SetKnobValue 5, 0
      SetKnobValue 6, 64
      SetKnobValue 3, 100
    

    Should be changed to:

    if Unassigned init
      init = YES
      SetKnobValue 0, 0
      SetKnobValue 5, 0
      SetKnobValue 6, 64
      SetKnobValue 3, 100
    endif
    

    The purpose of this is to make it so those knobs are only set on a brand new load of the script. I chose the name init for the variable we will check to do that, but you can call it anything you like. init has no value when the script is first loaded. It is Unassigned because until that if statement, we haven't assigned it any value.

    Once we drop into the statements inside the if block, we set a value for this variable: init = YES. Now, whenever the script reloads from a saved session, the if block will be skipped and the knobs won't be set to their default value.

    I hope that helps. The manual, page 12, does a much better job of explaining than I can.

  • @wim said:
    Hi @pejman - Normally I wouldn't answer a question directed at someone else, but it's been some time since your post, so I expect it's probably late in @_ki 's timezone.

    Hi @wim .
    Very very thanks for help and useful information 🙏🙏🙏🙏🙏.

  • @wim Thanks for answering/jumping in. I‘m still at work now, so an analysis and answer from my side would have taken some more hours 😀

  • @_ki said:
    @wim Thanks for answering/jumping in. I‘m still at work now, so an analysis and answer from my side would have taken some more hours 😀

    you are the best 🙏🙏🙏🙏

  • Hello friends.

    I have a problem with midiflow forum .

    I have successfully completed the register twice, in midiflow forum, But I can't use the new topic section.

    Every time I press New Topic, this box opens for me

    I can't communicate with them through email either.
    Because their email refers me to their forum, automatically.

    Are there any of you in this forum? that I can communicate with them through you.

    or someone who is related to the developer of midiflow app. ( Johannes ) .
    Please help me .🙏

  • edited February 2023

    Hello,
    I'm I right in thinking that the current event flow is OnNewBeat -> OnMetroPulse -> OnMidiInput ?

    I'm trying to read a note "on the beat" and based on the note, play the note out right away, however because the "pulse" event happens before, I'm getting the note information on pulse late... Is there a different event I should use?

    Thanks

    Edit: seems a way around this is to set a higher PPQN and (re-)trigger the note on the second pulse

  • wimwim
    edited February 2023

    The midi events @OnMidiInput, @OnMidiNote, etc. are completely independent of @OnNewBeat, etc.

    I don't know what you're trying to do, but if all you're trying to do is check a note and send it out under certain conditions, you don't need to involve the metronome at all. Something like this is sufficient.

    Note, examples below were not tested and were typed directly on the forum, so could have syntax and other errors.

    @OnMidiNote
      if MIDINote = <some condition>
        SendMIDIThru
      endif
    @Endif
    

    You only need to involve the metronome if you're trying to detect where the note is in relation to the beat. For this I suggest capturing the system time to a variable when the beat happens and when the note happens, then comparing them.

    @OnLoad
      tolerance = 60  //our tolerance for lateness
    @End
    
    @OnNewBeat
      lastBeat = SystemTime
    @End
    
    @OnMidiNoteOn
      noteOnTime = SystemTime
      if noteOnTime - lastBeat < tolerance
        SendMidiThru
      else
        Log {Sorry bud! Too late.}
      endif
    @End
    

    The script Live Quantize deals with metronome and note timing. It might be worth looking at.

    Oh, and in the comments for that one someone referenced another "accuracy" based script that could be even better. I haven't looked at it myself yet, but ... https://patchstorage.com/midiq/

  • McDMcD
    edited February 2023

    @pejman said:
    Hello friends.

    I have a problem with midiflow forum .

    I have successfully completed the register twice, in midiflow forum, But I can't use the new topic section.

    Every time I press New Topic, this box opens for me

    I can't communicate with them through email either.
    Because their email refers me to their forum, automatically.

    Are there any of you in this forum? that I can communicate with them through you.

    or someone who is related to the developer of midiflow app. ( Johannes ) .
    Please help me .🙏

    It looks like that Forum was mothballed in Nov, 2021. No new posts after that date.
    You should post in this as a new thread here to reach the widest audience of "experts" possible.

    Mozaic lovers are a small group compared to forum.audiob.us members.

  • @wim said:
    The midi events @OnMidiInput, @OnMidiNote, etc. are completely independent of @OnNewBeat, etc.

    I don't know what you're trying to do, but if all you're trying to do is check a note and send it out under certain conditions, you don't need to involve the metronome at all. Something like this is sufficient.

    Note, examples below were not tested and were typed directly on the forum, so could have syntax and other errors.

    @OnMidiNote
      if MIDINote = <some condition>
        SendMIDIThru
      endif
    @Endif
    

    You only need to involve the metronome if you're trying to detect where the note is in relation to the beat. For this I suggest capturing the system time to a variable when the beat happens and when the note happens, then comparing them.

    @OnLoad
      tolerance = 60  //our tolerance for lateness
    @End
    
    @OnNewBeat
      lastBeat = SystemTime
    @End
    
    @OnMidiNoteOn
      noteOnTime = SystemTime
      if noteOnTime - lastBeat < tolerance
        SendMidiThru
      else
        Log {Sorry bud! Too late.}
      endif
    @End
    

    The script Live Quantize deals with metronome and note timing. It might be worth looking at.

    Oh, and in the comments for that one someone referenced another "accuracy" based script that could be even better. I haven't looked at it myself yet, but ... https://patchstorage.com/midiq/

    O love this type of reply... it builds a database of useful clues.

  • edited February 2023

    @wim said:
    The script Live Quantize deals with metronome and note timing. It might be worth looking at.

    Oh, and in the comments for that one someone referenced another "accuracy" based script that could be even better. I haven't looked at it myself yet, but ... https://patchstorage.com/midiq/

    Many thanks @wim

    I'll have to check those examples with a fresh mind, but I really appreciate the detailed answer!

    The solution I came up with seems to work for my use case, but happy to change it if it can be improved. I'll share the script once I finish it.

  • Hey @brambos - fyi there's an error in the documentation and the in-app syntax description for the SendMIDIBankSelect action. They state that the syntax is SendMIDIBankSelect <chan>, <value> [,<delay>] when actually it's SendMIDIBankSelect <chan>, <MSB> ,<LSB>. LSB may be optional, I don't know for sure.

    Took me a couple of hours to figure out what was causing an issue for someone in the Basic MIDI Controls v1.2 script. It turns out that I must have figured this out back when I wrote the script since I was always sending 0 for the MSB, but after all this time I had forgotten.

    So ... posting here for anyone else that might run into this, and so that hopefully it can be corrected if you push an update to the app and docs.

  • _ki_ki
    edited March 2023

    @wim Good find that the Mozaic manual shows a different/wrong definition. The in-app syntax list shows the correct version SendMIDIBankSelect <chan>, <MSB>, <LSB> [,<delay_in_milliseconds>]

    I immediately checked my Mozaic Language Support package: Both the syntax checker and code completion use the in-app definition.

    .

    LSB isn‘t marked as [ optional ]. In case of missing trailing parameters, Mozaic doesn’t produce a syntax error but uses a default value for the parameter - in most cases a zero.

  • @_ki said:
    @wim Good find that the Mozaic manual shows a different/wrong definition. The in-app syntax list shows the correct version SendMIDIBankSelect <chan>, <MSB>, <LSB> [,<delay_in_milliseconds>]

    I immediately checked my Mozaic Language Support package: Both the syntax checker and code completion use the in-app definition.

    .

    LSB isn‘t marked as [ optional ]. In case of missing trailing parameters, Mozaic doesn’t produce a syntax error but uses a default value for the parameter - in most cases a zero.

    Thanks, that clears up a lot! You're right about the in-app syntax checker, I checked it too quickly since I never use it since I edit in Textastic. At the time I did notice your Textastic language support didn't like there not being at least three parameters, so supplied zero there, further confusing my troubleshooting.

    Anyway, thankfully it's all sorted now, and it's only a documentation bug, nothing to worry about in the app.

Sign In or Register to comment.