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.

Request new Mozaic Scripts *HERE*

1222325272870

Comments

  • wimwim
    edited September 2020

    Hi @annahahn - OK, I misunderstood what you're trying to do. It's clear(er) now.

    So, basically, Mozaic has an LFO running. When it receives a note, it checks the value of that LFO and transposes that note up or down proportionally to the LFO value at that time. The script would need to track the incoming note and the transposition to ensure that the right note-off is sent when the note-off for the original note arrives.

    I assume it would need controls for LFO speed and shape and for transposition range. I also assume it would need some possibility to quantize output notes to a scale. All these controls would need to have midi CC's assigned to them for hosts that don't do Midi FX automation for AUs.

    Sound about right? I don't have time to work on something like this right now, but it doesn't seem too difficult if the above is correct. Maybe someone else can take it on if I don't get some time freed up sooner.

  • Hi @wim !

    Yes exactly! BUT thanks to your suggestion about Rozeta LFO I realized there is a way to do a much simpler implementation without the need for an LFO in mozaic, I could just pipe rozeta lfo in

    The only thing I would need would be a transposer with a transposition reader that has a pre-defined midi cc set to control it (this is to get around Cubasis’s lack of midi learn)

    So if there was a transposer with anti-note-sticking to protect from notes sticking as the transposition knob changes, and the transposition knob was set to be controlled by a pre-defined incoming cc number, I could point the LFO in rozeta to the cc corresponding to the transposition knob

    Does that make any sense? I feel like that could be really easy to implement just by getting rid of the ‘overlap’ function in the overlapping transposer, and reducing it a simple transposer with the knob pre- set to be addressed by a specific cc?

  • wimwim
    edited September 2020

    @annahahn said:
    Hi @wim !

    Yes exactly! BUT thanks to your suggestion about Rozeta LFO I realized there is a way to do a much simpler implementation without the need for an LFO in mozaic, I could just pipe rozeta lfo in

    The only thing I would need would be a transposer with a transposition reader that has a pre-defined midi cc set to control it (this is to get around Cubasis’s lack of midi learn)

    So if there was a transposer with anti-note-sticking to protect from notes sticking as the transposition knob changes, and the transposition knob was set to be controlled by a pre-defined incoming cc number, I could point the LFO in rozeta to the cc corresponding to the transposition knob

    Does that make any sense? I feel like that could be really easy to implement just by getting rid of the ‘overlap’ function in the overlapping transposer, and reducing it a simple transposer with the knob pre- set to be addressed by a specific cc?

    Actually, having the LFO inside the Mozaic script is simpler. Designing something to detect the incoming LFO values is no easier, and would be less reliable, than just making use of Mozaic's internal LFO.

    Unfortunately, I can't give any timeframe when I'd be able to do that. Maybe someone else will pick it up.

  • @annahahn said:
    Does that make any sense? I feel like that could be really easy to implement just by getting rid of the ‘overlap’ function in the overlapping transposer, and reducing it a simple transposer with the knob pre- set to be addressed by a specific cc?

    I think you have a good idea and someone will help when they have the time. Definitely
    before the end of the month. It's not a project that will take weeks to write. But many of these apps need multiple versions as the users request small changes or improvements so
    it's understandable that they might wait until they can check out the solution first
    and then commit to own it.

  • I have a question about best practices for automating an otherwise-manual Mozaic UI. I’m constructing a drum machine that has some configurable parameters which are selectable via knobs, so I’ve already implemented an @onKnobChange handler. What I’d like to do is enable automation of knob changes via MIDI messages, so that I could use a sequencer to send commands that I would otherwise do manually by turning knobs. I had imagined that I could receive a MIDI message, parse it, and call setKnobValue, which would then use the same logic to make my state changes. But I see in the manual that setKnobValue does not trigger @onKnobChange, so it presumably only updates the GUI without actually handling the new knob value.

    What’s the best way to handle this? I’d like the GUI to reflect the current state, regardless of whether I manually turned a knob or did it via a MIDI message. And I’d like 1 handler for the knob value, regardless of how the value was changed.

    Thoughts?

  • McDMcD
    edited September 2020

    @JohnInBoston said:
    I have a question about best practices for automating an otherwise-manual Mozaic UI. I’m constructing a drum machine that has some configurable parameters which are selectable via knobs, so I’ve already implemented an @onKnobChange handler. What I’d like to do is enable automation of knob changes via MIDI messages, so that I could use a sequencer to send commands that I would otherwise do manually by turning knobs. I had imagined that I could receive a MIDI message, parse it, and call setKnobValue, which would then use the same logic to make my state changes. But I see in the manual that setKnobValue does not trigger @onKnobChange, so it presumably only updates the GUI without actually handling the new knob value.

    What’s the best way to handle this? I’d like the GUI to reflect the current state, regardless of whether I manually turned a knob or did it via a MIDI message. And I’d like 1 handler for the knob value, regardless of how the value was changed.

    Thoughts?

    Consider this code example from the manual:

    @OnLoad
       knobnum = 0 
       knobvalue = 64 
       Call @MyKnobLabel
    @End
    
    @OnKnobChange
       knobnum = LastKnob
       knobvalue = GetKnobValue LastKnob 
       Call @MyKnobLabel
    @End
    
    // this is the new user event:
    @MyKnobLabel
      LabelKnob knobnum, knobvalue
      SetKnobValue knobnum, knobvalue
    @End
    

    User change to a knob result in the @OnKnobChange function to be executed
    which Calls @MyKnobLabel that sets the value of a Knobs labeling
    @OnLoad that runs when the script starts also calls the @MyKnobLabel

    You control when knobs are labeled. You can also change the variable "knobvalue" at any point in the three functions (Start, User Input, MIDi Input) and call your own KnobLabeling function either automatically or intentionally when passed a MIDI message. You could also use Sysex to pass messages of events and not burn a MIDI channel for the messaging or overcomplicate your time critical MIDI functions. The MIDI method is probably easier because you can use standard tools to see the messages. I tried to debut some sysex and the tools didn't even display the events. I gave up. I asked if anyone had a clue but it's too arcane for anyone to know.

  • Excellent! So I think what I really want is a @MyKnobHandler function, which can be called either via @OnKnobChange or @OnMidiInput. @OnKnobChange can be exactly as in the example, and @OnMidiInput just needs to decode the incoming message to the appropriate knobnum and knobvalue. Easy!

    Thanks!

  • If you don't want to deal with using CC's you can also make use of AU parameters. Each knob has a corresponding AU parameter. When you update a knob, it updates the AU parameter, and vice-versa. You can then use the host's midi-learn to change the AU parameters and avoid any CC handling code.

    The downside is if the script is used in other hosts, the AU parameters have to be midi-learned in each one.

  • edited September 2020

    In response to my earlier post

    This https://patchstorage.com/midi-cc-automatable-transposer-scaler-v1-0/

    And rozeta lfo is all you need✨

  • What is the lightest weight way to take an incoming MIDI CC of any value and randomize the outgoing value between 0 and 127?

  • McDMcD
    edited September 2020
    @OnMidiCC
        value = Random 0,127
        // MIDIByte1 = Channel, MIDIByte2 = CC, MIDIByte3 = incoming value (chuck it)
        SendMIDICC MIDIByte1, MidiByte2, value
    @End
    
  • @McD said:
    @OnMidiCC
    value = Random 0,127
    // MIDIByte1 = Channel, MIDIByte2 = CC, MIDIByte3 = incoming value (chuck it)
    SendMIDICC , MIDIByte1, MidiByte2, value
    @End

    Thank you. I'm always so close but just missing some crucial little bit.

  • heshes
    edited September 2020

    @lukesleepwalker said:

    @McD said:
    @OnMidiCC
    value = Random 0,127
    // MIDIByte1 = Channel, MIDIByte2 = CC, MIDIByte3 = incoming value (chuck it)
    SendMIDICC , MIDIByte1, MidiByte2, value
    @End

    Thank you. I'm always so close but just missing some crucial little bit.

    Does that actually work? There should be only two commas in the SendMidiCC command, the first one is a typo. Should be:

    SendMIDICC MIDIByte1, MidiByte2, value
    
  • @hes said:
    There should be only two commas in the SendMidiCC command

    Thanks for catching that... I changed the comment incase someone just cut's and pastes
    it into their Nuclear Reactor code and destroys Musikastan for 100 years.

  • @hes said:

    @lukesleepwalker said:

    @McD said:
    @OnMidiCC
    value = Random 0,127
    // MIDIByte1 = Channel, MIDIByte2 = CC, MIDIByte3 = incoming value (chuck it)
    SendMIDICC , MIDIByte1, MidiByte2, value
    @End

    Thank you. I'm always so close but just missing some crucial little bit.

    Does that actually work? There should be only two commas in the SendMidiCC command, the first one is a typo. Should be:

    SendMIDICC MIDIByte1, MidiByte2, value
    

    It worked after taking out the comma. 😉

  • Hello Mozaic mavens, a couple of questions for you...

    I was wondering if there's a plugin out there that will do a thing, I'm sure Mozaic would if I could ask it nicely, maybe there's other things too. I want to hit a controller button, and have it ramp a value. Specifically turn up/down a AUM channel fader over a set period, maybe a bar, maybe a time period like 5 seconds.

    Another question, one instance of Mozaic can tell multiple channels of things what to do, correct? So to do this in AUM, Mozaic would be hosted in an Midi channel, and all the other channels to be under its influence would have it selected as one of their midi inputs? Or I suppose if it's modifying something a controller does, Mozaic listens to the controller, and the instrument (or AUM channel in my case) listens to Mozaic?

    Last question, I use Group the Loop. It has a couple of modes, one where it cues up your next loop so you can hit the switch in advance. But in that mode you also have to preset how long your loop will be, which is no good for me. The mode I use is one where your loops can be any length, but you have to hit the loop button really close to when you want to record.
    I' thinking maybe I could send a command via Mozaic, and ask it nicely to hold on to that command until just before the next bar, then send it on. That would maybe solve my problems of trying to juggle things in real time.

    I don't have Mozaic yet but it seems like it be quite handy if I could speaks it language.

  • @SimonSomeone said:
    Hello Mozaic mavens, a couple of questions for you...

    I was wondering if there's a plugin out there that will do a thing, I'm sure Mozaic would if I could ask it nicely, maybe there's other things too. I want to hit a controller button, and have it ramp a value. Specifically turn up/down a AUM channel fader over a set period, maybe a bar, maybe a time period like 5 seconds.

    https://patchstorage.com/cc-gradual-glide/ - hasn't tried it.
    https://patchstorage.com/blueboard-switch-ramper/ - says it's for BlueBoard, but can work with anything.

    Another question, one instance of Mozaic can tell multiple channels of things what to do, correct? So to do this in AUM, Mozaic would be hosted in an Midi channel, and all the other channels to be under its influence would have it selected as one of their midi inputs? Or I suppose if it's modifying something a controller does, Mozaic listens to the controller, and the instrument (or AUM channel in my case) listens to Mozaic?

    Yes, perfectly possible.

    Last question, I use Group the Loop. It has a couple of modes, one where it cues up your next loop so you can hit the switch in advance. But in that mode you also have to preset how long your loop will be, which is no good for me. The mode I use is one where your loops can be any length, but you have to hit the loop button really close to when you want to record.
    I' thinking maybe I could send a command via Mozaic, and ask it nicely to hold on to that command until just before the next bar, then send it on. That would maybe solve my problems of trying to juggle things in real time.

    That's totally doable. You have @OnNewBeat and @OnNewBar events that you can use to trigger things. If the next bar isn't enough time, you can always set up a counter.

    I don't have Mozaic yet but it seems like it be quite handy if I could speaks it language.

    I highly recommend giving the manual a thorough read. That will tell you right off how much work it'll be to get your head around it, and should give you a good idea of its capabilities.

    Or ... check out PatchStorage.com to see the variety of already written scripts you might be able to make use of there. There's also the excellent compact list here: https://wiki.audiob.us/doku.php?id=mozaic_scripts_list&s[]=mozaic.

  • edited September 2020

    @wim, Thanks! Some more research to do :)

  • rcfrcf
    edited September 2020

    @SimonSomeone said:
    Hello Mozaic mavens, a couple of questions for you...

    I want to hit a controller button, and have it ramp a value. Specifically turn up/down a AUM channel fader over a set period, maybe a bar, maybe a time period like 5 seconds.

    I use the Blueboard Ramper script, courtesy of @Wim, all the time to do this. It works perfectly, both with the Blueboard and with my Audiofront Midi Expression ME and iO midi controllers... or any virtual midi switch for that matter. You can also trigger the ramp from Mozaic; fades can last as long as 60 seconds.

    I think the 'Blueboard Ramper' title maybe does this very useful script a disservice; it's possible that it sometimes gets overlooked by non Blueboard owners?

  • edited September 2020

    @wim @rcf thanks for the https://patchstorage.com/blueboard-switch-ramper/
    as mentioned skipped this before (got no blueboard)

  • This is very general but some more generative scripts. There’s only a handful and I’d love to see a few more that generated midi notes, Or multiple notes with ability to set scale. It be cool to Have some control over the midi generations too, maybe velocity, randomness, and probability type options. I’ve been doing some research on generative midi ideas and algorithms, and there seems to be some decent information available. Maybe I’ll try to make this idea a little more acute...

  • edited September 2020

    @Poppadocrock said:
    This is very general but some more generative scripts. There’s only a handful and I’d love to see a few more that generated midi notes, Or multiple notes with ability to set scale. It be cool to Have some control over the midi generations too, maybe velocity, randomness, and probability type options. I’ve been doing some research on generative midi ideas and algorithms, and there seems to be some decent information available. Maybe I’ll try to make this idea a little more acute...

    I started coding a script that generated fugues and canons, but it needed more parameter controls than Mosaic provides in one template. Using a master template to switch between control templates didn’t pan out because Mozaic doesn’t allow you to build pad labels on the master template that reflect the current settings of the control templates. Not without 100s of lines of if else statements... I may yet complete it, but it’ll be for my personal use, as the lack of dynamic labels makes the design somewhat user unfriendly.

  • @TheOriginalPaulB said:

    @Poppadocrock said:
    This is very general but some more generative scripts. There’s only a handful and I’d love to see a few more that generated midi notes, Or multiple notes with ability to set scale. It be cool to Have some control over the midi generations too, maybe velocity, randomness, and probability type options. I’ve been doing some research on generative midi ideas and algorithms, and there seems to be some decent information available. Maybe I’ll try to make this idea a little more acute...

    I started coding a script that generated fugues and canons, but it needed more parameter controls than Mosaic provides in one template. Using a master template to switch between control templates didn’t pan out because Mozaic doesn’t allow you to build pad labels on the master template that reflect the current settings of the control templates. Not without 100s of lines of if else statements... I may yet complete it, but it’ll be for my personal use, as the lack of dynamic labels makes the design somewhat user unfriendly.

    Ahh, Gotcha. That’s sounds cool, but also a lot of work.

  • Would love a script for separating the 12 notes to 12 different MIDI channels?: All Cs (C0,C1,C2,...) goes to MIDI channel 1, all C#s to channel 2, Ds to channel 3 and so on... Could be even better configuring what notes goes to what channel!
    Why? I’d like to to process by other different midi scripts each note for polyrithms, different harmonies, etc...
    Is there something like this? Or one of you coding magicians could make something like this?
    Thanks!

  • wimwim
    edited September 2020

    @Synthi said:
    Would love a script for separating the 12 notes to 12 different MIDI channels?: All Cs (C0,C1,C2,...) goes to MIDI channel 1, all C#s to channel 2, Ds to channel 3 and so on... Could be even better configuring what notes goes to what channel!
    Why? I’d like to to process by other different midi scripts each note for polyrithms, different harmonies, etc...
    Is there something like this? Or one of you coding magicians could make something like this?
    Thanks!

    This should do it I think.

    @Description
    Distribute to Channel by Note v1.0
    ▫️ Notes will be sent to the channel set by each knob.
    ▫️ DON'T CHANGE KNOBS WHILE NOTES ARE PLAYING. Or you'll get stuck notes.
    @End
    
    @OnLoad
      if Unassigned init
        init = YES
        channel[0] = [0,1,2,3,4,5,6,7,8,9,10,11]
        for knob = 0 to 11
          SetKnobValue knob,(TranslateScale channel[knob],0,15,0,127)
          Call @SetknobLabel
        endfor
        for knob = 12 to 21
          SetKnobValue knob,0
          LabelKnob knob,{ }
        endfor
      endif
    
      LabelKnobs {Distribute to Channel by Note v1.0}
      SetShortName {CHNOTE}
      ShowLayout 1
    @End
    
    @OnMidiNote
      SendMIDIThruOnCh channel[(MIDINote % 12)]
    @End
    
    
    @OnMidiInput
      // Pass anything except notes thru
      if MIDICommand <> 0x90 and MIDICommand <> 0x80
        SendMIDIThru 
      endif
    @End
    
    @OnSysex
      SendSysexThru
    @End
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue knob
    
      if knob <= 11
        channel[knob] = Round (TranslateScale value,0,127,0,15)
        Call @SetKnobLabel
      endif
    
    @End
    
    @SetKnobLabel
      LabelKnob knob,(NoteName knob,NO),{: ch.},(channel[knob]+1)
    @End
    
  • Thanks @wim ! 🙏🏻

    Will try later today!

  • Good lord that script sounds like it could open up some interesting possibilities...

  • Changing:
    channel[0] = [0,1,2,3,4,5,6,7,8,9,10,11]
    for knob = 0 to 11

    to 0 to 16 will let me choose any of the 16 MIDI channels?

  • @Synthi said:
    Changing:
    channel[0] = [0,1,2,3,4,5,6,7,8,9,10,11]
    for knob = 0 to 11

    to 0 to 16 will let me choose any of the 16 MIDI channels?

    No. 0 to 15 would.

    15 + 0 = 16. MIDI is so fun.

    This is a programmer thing. The number can be an offset
    so the Zero-th instance is just the root value. Then 1 is really the 2nd value. I hope your confused and
    gave up because 12 year olds are taking programming gigs.

  • @Synthi said:
    Changing:
    channel[0] = [0,1,2,3,4,5,6,7,8,9,10,11]
    for knob = 0 to 11

    to 0 to 16 will let me choose any of the 16 MIDI channels?

    Yes, but there's no need to do that. You can choose any channel for any note using the dials. Then just save the script. It'll reload with those channels selected.

    If you do change that array, keep in mind that channels go from 0 - 15, not 1-16 as they're typically referred to. Each position in the array corresponds to a note. Position 0 is C, position 1 is C#, position 2 is D. So, for instance, if you wanted note C to be on channel 16 and note A# to be on channel 15, you would change it to channel[0] = [15,1,2,3,4,5,6,7,8,9,14,11].

    But - like I say, you don't need to touch that array, or any of the code.

Sign In or Register to comment.