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 StoreLoopy Pro is your all-in-one musical toolkit. Try it for free today.
Comments
Circling back to this issue... Turns out I wasn't totally crazy and the problem didn't just "fix itself". I've been watching the behavior to see if I could spot a pattern but for now I'll just say it's random. I haven't changed a thing since the last postings about the tuner window showing and closing, but sometimes it closes the tuner window and sometimes it doesn't. I'll try to spot a pattern and when I figure it out, I'll certainly post back here in case somebody can benefit from the information.
Is there a way to write a script so that AUMs keyboard will always quantize to a scale of choice? Or to always tell the keys to run thru an app like scaler when you simply press the keyboard option on any open app?
I know there are app like scaler that will quantize the keys, but in the middle of a live jam having to reroute to each instrument is not feasible.
Would be cool if scales were added into aums keys but i don’t count on that ever happening
No. Mozaic can only act on midi that's routed through it. When you pull up the AUM keyboard by tapping the icon in an app window, the keyboard is automatically routed straight to the app.
There are ways to make this a it more performance friendly.
One is to use midi busses. Create one bus for each synth and make the routing from the bus to the synths. Route the AUM keyboard to the scale app. Route the scale app to all the busses. Disable all the busses but the one you want to play. When ready to switch, disable the old one and enable the new.
Another is to use midi channels. You can route through a script such as MIDI Channel Router or others, to alter the outbound midi channel, then use channel filtering on the target apps.
Of course, that doesn't bring the app window you want into the foreground. So the idea would probably need to be taken further to set up some buttons to send a midi command to parallel bind to change the routing and bring the app to the foreground.
Is it possible to create an awesome glide in Mozaic. Osc Audio made a great glide in sub808. If it’s possible to create a similar glide in Mozaic script. I can’t do Mozaic for the life of me.
Glide is usually created in the synth itself via a setting that enables it for overlapping notes. It's not generally done over midi.
One could use pitch bend with some knobs to control the rate, but it's problematic. Non MPE pitch bend is global, meaning it will affect all playing notes in the target synth. You also need some way to trigger the slide. If you use overlapping notes and there's more than one note overlapping, how do you know which note to slide to? The bend needs to be released in such a way that you don't hear it sliding back down. Mozaic can know when the note is turned off, but it has no way of knowing when the note has stopped sounding. If the target has a long decay, the release of the pitch bend will sound.
Some of these issues would be a bit more manageable if the target synth is MPE enabled, or if it's purely Mono. But in those two cases I bet virtually every one has built-in glide.
I could go on about all the potential issues, but I've already thought of enough to convince me I wouldn't like to try it.
What target synth(s) did you have in mind.
I had assumed that glide was made with midi. I was using Dagger and wanted to glide with soundfonts too. Will be great to have for when you need it. Not every synth rompler has a glide. Do you know if ChatGPT or Ai can make Mozaic scripts?
Dagger has glide built in. Any other apps you have in mind? I can't think of any that don't have glide off the top of my head.
I remember some attempts to get ChatGPT to write Mozaic code. I'm not sure if this was ChatGPT fail or success recently: https://forum.loopypro.com/discussion/comment/1378373/#Comment_1378373.
You have a lot more questions to figure out before you try to write a program, ChatGPT or no. I listed a few. All of which and more would need to be considered. I'm not trying to be discouraging, I'm trying to help you set a direction that has a chance of being successful.
On the other hand, sometimes the best way to flush out questions and issues is just to jump in. If I'm honest, a lot of my projects go that way. I think about it as hard as I'm able, but usually just dive in. Most people would tell us that's a bad way to go. It usually (eventually) works for me though.
Is there a script in existence which allows to set a timer in between messages that are being passed through?
so for instance if you have a CC LFO, to be able to set the milliseconds in between every CC on the output?
Do you mean to only let through one message each period, ignoring the rest?
I don’t see a script like that, but it would be simple to make if thats all that’s needed.
Not ignoring the rest but putting an interval in between every pass through message.
@Mo13
https://patchstorage.com/datareducer/
Cheers
Thanks for the tip @Alfred but I don't think this is what I'm looking for as it doesn't seem to put a time distance in between sent out messages.
Here is a line of code from @wim's "mega cc randomizer" which does exactly what I'm after, but then if it could be applied to process incoming messages:
// default delay in ms between sending CC messages out
cc_metering_ms = 50
Check this for lfo:
https://apps.apple.com/nl/app/gsdsp-mmmm/id6450306205
That would not work.
If that LFO is sending a constant stream of messages, you can't just spread that out like that indefinitely.
Let's say it's sending 100 messages per second (1 message even 10ms) and you tell it to spread them out to 50ms apart. You get and send the first message, then 10ms later the second message comes in. You want that message to fire 40ms later. So you save it, and trigger it 40ms later.But in the meantime, 4 more messages have come in.
Each of those four messages has to be saved and delayed, but while each one is being delayed more messages are pouring in. You end up with a potentially infinite number of values that have to be saved and then played out over time. Mozaic has limited variable storage. Each variable can store only 1024 values. After that it gets tricky to manage storing lots of values.
Think of an assembly line where parts come down the conveyer belt once per second. At one assembly point it takes 10 seconds to do an operation and put the part back on the belt. By the time the first part is done, there's 9 parts needing assembly. By the time the next part is done, there will be 18, by the time those 18 are done there will be something like 162, by the time those are done, something like 1,458 ... and so on.
It could work for limited numbers of messages, but for something like a constant stream of LFO messages it'd be impractical.
Hello all again! I’m trying to utilize the single/double/triple tap/hold script by @_ki but its a bit over my head (understatement of the year, but its only Jan, so its OK….
). Where and how do I specify I want “THIS” to happen when I single / double / triple tap Pad 1 and Pad 2, etc. I’m sure it has to be in the @OnPadDown event, but I’m uncertain how. Right now the event looks like this:
@OnPadDown
pmPadDown[LastPad] = YES
if pmPadExclude[LastPad]
pPad = LastPad
pNumTaps = 1
pDown = YES
Call @OnPad
else
Call @PMCheckStartTimer
if not pmPadActive[LastPad]
Inc pmPadsActiveCnt
pmPadActive[LastPad] = YES
endif
inc pmPadTaps[LastPad]
endif
@End
Do I change the LastPad to an actual pad number for each pad? What about the each tap? Or do I write it somwhere else entirely? Thanks!
Here is the entire code:
Hi. I think you do not want to change the script at all. According to the documentation, you need to implement the OnPad and OnShift event handlers, replacing the logging in the sample code with the actions you wish to implement.
@ztones and @uncledave
Yes, you are right uncledave. The script is only a sample code on how to use the ‚script snippet‘ found between the lines
and
As described in the source you need to
Call @PadAndShiftManagerInit
in theOnLoad
function of your script and if needed, set set some of the pmXXX configuration variables before doing so.Then all you normall need to do is to add the two callback functions (ie user defined events)
@OnPad
andOnShift
in which you need to react to the values set in their respective parameter variables.If your script really needs to implement the Mozaic events
OnPadDown
/OnPadUp
/OnShiftDown
/OnShiftUp
orOnTimer
, the script contains instructions on how to cope with this requirement - usually the functionallity of the two new events will be enough.Ok I'll give that a go and see if I can set it up right... Thank you!
I implemented the @OnPad and @OnShift even handlers, I can certainly replace the LOG command with my own, but those only seem to be based on how many taps (with or without HOLD):
if pNumTaps = 1
Log {🟠 SINGLE-TAP & HOLD on pad }, pPad
elseif pNumTaps = 2
Log {🟠 DOUBLE-TAP & HOLD on pad }, pPad
else
Log {🟠 MULTI-},pNumTaps,{-TAP & HOLD on pad }, pPad
endif
else
if pNumTaps = 1
Log {🟠 SINGLE-TAP on pad }, pPad
elseif pNumTaps = 2
Log {🟠 DOUBLE-TAP on pad }, pPad
else
Log {🟠 MULTI-},pNumTaps,{-TAP on pad }, pPad
endif
So if I replace the Log line with whatever command I want, it'll do that for EVERY pad that is tapped once, twice etc... It just lists which pad was last pressed, but how do I make the if filter, to do: If I tap PAD 1 once, do this, if I tap PAD 2 once, do that?
Sorry if this should be obvious, I am still new to this.... Thanks!
Where the log line is , you can put a block of
code or a call to block of code,
For example, you might have
Call @handleSingleTap
where single tap is a user function that does something like
if pPad = 0 then
//do pad 0 stuff
elseif pPad = 1
//do pad 1 stuff
etc
Ah! The missing piece of the puzzle (for me)! I didn’t know you can put an “if” condition within an “if” condition! That’s awesome! Learn something new every time and that is a great thing! Thank you!
Anyone know if there is a mozaic script which will allow me to send in midi, then the script will give me some choices to transpose say a certain percentage of those notes up or down an octave or two? Eg set a probability that 2% of notes will be transposed up an octave, and 1% will be transposed up 2 octaves.
@Gavinski Nice (and simple to code) idea - but instead of percentage of notes one needs to specify it as percentage chance as one can‘t know the number of notes that will arrive in a bar (only after the fact).
And somehow the two chance knobs should interact, one can‘t set 100% chance of 1 octaves and 100% chance for 2 octaves… The sum can have a max of 100% - but could also be lower (ie 25% for 1 oct, 50% for 2 oct which leaves 25% for no modification)
AND:
All three ‚problems‘ can easily be solved using the notestatearray to store the used offsets (plus a note-currently-off state)
Great analysis, good point about not defining it as a percentage of notes, I didn't think that through when I phrased it. But now hopefully someone will make it haha. Would be very useful.
@Gavinski And since i was already thinking about it, i just implemented and tested it ;-)
And if you were ever to consider Drambo, you would have pieced this together in less than 5 minutes.
(Humor font on)
Sure. After 100 hours learning Drambo. Some of us don’t have 100 hours to spare and we need an AUv3 Kaossilator app that works with a manual, video support or forums for Q&A
((Humor font off)
Sometimes I forget to turn it off and mayhem ensues.
The spread the Mozaic knowledge, i‘ll explain the most complicated and compacted part - the random pick and actual tranposition:
_note = MIDINote + 12*OCTAVES[transpose[_rnd > percent[0]]]
The array
OCTAVES
contains the values -2,-1,+2,+3 in the index positions 0 to 3. The original note is shifted by 12 (ie an octave) times by the result of the OCTAVES access.The
OCTAVES
array is indexed by the value in thetranspose
array - which has two entries (ie at transpose[0] and transpose[1]), each of them in the range 0-3 and dialed in with the two shift knobs.The innermost
_rnd > percent[0]
is a boolean expression. If true it evaluates to 1 otherwise to 0. Therefore this part decides which of the two tranpositions is choosen by checking the random value versus the first entry of thepercent
array.The
percent
array contains the two dialed in percentages - the script enforces that they only add up to 100.The variable
_rnd
contains a random value in the range 0 to 100, which falls into of of these three groups:The third group is already handled in the
if
above the transposition part, therefor the transposition code only needs to decide which of the transposition settings is used, which is done by the_rnd > percent[0]
which evaluates to 1 if the random values falls into the second group.By the way: In my coding, i use the _ notation for local variables and the all caps notation for constants, which are hightlighted differently when using my Textastic Mozaic synatx checker and highlighter package. There is no real differentiation in the Mozaic language itself - all variables are global accessible in a script.
@_ki you rock, thank you so much, just tested it, works well! @bleep should have known you could ‘do it in Drambo™️’, thnx
@McD haha, indeed, indeed
@_ki Preach and spread the news.
“Yes! You too can make MIDI your bitch.”