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
Sorry, I still don't fully understand the algorithm here.
Is it...
?
Perhaps it would help me if you could explain the use case of the offset parameter?
I just uploaded a script to patchstorage.com called MuteMIDI. The purpose of the script is allow/deny MIDI getting from a source to a destination based on the setting of Pad 0 and a control note received on MIDI in. MIDI notes 0-11 are reserved for the script’s use.
Further documentation is in the script’s comments.
In addition to being on patchstorage, here’s a link to the file on DropBox:
https://www.dropbox.com/s/9qsytmg5doue4n3/MuteMIDI.mozaic?dl=0
So I'm adding CC recording to Flow and it's super-duper-fun to have.
But, right now I'm recording CCs on each "part" of the sequencer (every step in the sequencer has 8 parts, so 16*8 parts per sequencer loop).
For "fast" sequences, say step lengths of 1/8 at 120 bpm this works great. For slow ones where every step is 1-2 bars, not so much as midi output will be stepped and for example a filter cutoff jump for each part change.
Any of you clever Mozaic brains out there that has a suggestion for clever interpolation of CC output?
Timers with interpolation in OnTimer?
Higher PPQN and interpolation in OnMetroPulse?
Or maybe a bunch of SendMidiCC with clever delay to fill the gap between parts?
Or maybe @brambos has some clever SendInterpolatedMidiCC function brewing
@Peblin All three variants are valid and good ideas.
I didn't yet measure the impact of higher ppqn, but if the code inside does run only sparsely (not on every of the pulses) then i didn't notice an impact. I have some scripts running with a ppqn of 384 which is about one event call about every msec.
Same for fast timers. I just checked that all timer-events are called and none is omitted even for 1msec timer interval. (i just increment a var in OnTimer and output every OnHostBar running with 120bpm which equals 2000msec ) The 1ms timer runs with stable 2005 incs, perhaps the host tempo is not correct ? A 10ms timer results in the expected 200 calls. AUMs dsp is showing 2% with 1msec timer, so there isn't a big hit.
The idea with the pre-delayed CCs is nice (and easy to implement), but could result in CC changes after the host stopped.
@brambos sorry if you already decided on this or not, but would you consider making maximum array size 1024 instead of 1000? 8x8x16 has a TON of musical applications.
Sincerely, someone who just bought a novation launchpad
@brambos
It's probably been reported, if not - releasing shift outside the button doesn't trigger @onshiftup
It is a fun little curiosity how 4:4 music gets related to bits and bytes counting in multiples of 8/16/256/1024 :-) But yeah, 1024 is probably more useful than 1000 as that randomly picked limit, in this world of 4:4 and 16 steps music.
I have considered a launchpad XL for some time (just waiting to see if it gets updated with bluetooth). Some useful Mozaic scripts utilizing it would surely tip me over!
Thanks for the feedback! I've implemented the "pre-delay" solution for now - it works like a charm and eliminates the need for quite a lot of state-keeping when several patterns are re-playing CCs at the same time
The number in green in the offset?
Is the bottom left quadrant correct, where F#1 is supposed to be triggered by F#1 with no offset?
@winconway Reading your original description and looking at your diagram, I think the offset is RR_SIZE * (note - ROOT). Where RR size is 2 in this case and the root is F#1.
So playing A#1 triggers group offset = 2 * 4 = 8
Group 1 + 8 = Group 9
You might want to take a look at this: CC Processor, in particular the Slew Limiter section. It may be just what you’re looking for.
I uploaded a new version of Clusters with a few tweaks to the Shift key code. Let me know if the issue persists. I couldn’t find any obvious issues with my code, so I’m not sure why the Shift key intermittently stops working. I wonder if there might be a bug in Mozaic’s timer, but I haven’t been able to nail anything down to say for sure...@brambos, any ideas? I have had a lot of problems with the interpreter throwing up a bunch of bogus errors when I upload code; sometimes it takes several tries to get it to upload cleanly.
Yes, I should mention that Clusters was originally inspired by Olafur Arnalds. It’s evolved a lot since that initial inspiration, so I can’t say it’s a clone of his software (which I don’t have access to anyway), but rather an attempt to capture the spirit of his idea.
https://youtube.com/watch?v=vAj1SwPKfqc
I will check it out. FWIW, the shift key never worked for me, but I have enjoyed using Clusters nonetheless.
Is there a way to select which Voice is used? I was checking out the presets in a session and it seems like when I used the same preset in another session it was using a different voice pad and resulted in different note selections with the same settings. Probably user error on my part.
I just downloaded the new version.
When I used it the shift key was not working at first. I went into the code and added a Log call in OnShiftDown and OnShiftUp and magically the shift key started working even though the only thing that I did was add the log call which should not have affected anything.
It seems like how long the shift key is down influences whether the shift up is detected. I just notice that if I tap the shift key quickly, it switches to expert mode but if I hold it down longer it doesn't.
Weird. I just removed the two log calls and the shift key stopped working. Adding them backed solved the problem.
@brambos: is it possible that there is a race condition and that somehow having that simple log line somehow prevents the race?
I simply added log {shift is down} and log {shift is up} as the first line (where there was a blank line) in OnShiftUp and OnShiftDown respectively.
I think you may be on to something. I've had the same experience where adding a log call will mysteriously get something working again. As you said, this shouldn't matter but it seems it does. I'm glad you mentioned it because I'd had this happen a few times and thought I was going crazy.
I've also had some luck re-uploading the code (sometimes I must re-upload multiple times because the interpreter throws up a bunch of bogus errors; e.g., it might throw up a syntax error in OnAUParameter even though I'm not using the OnAUParameter event in my code). So I have no idea what the issue might be. It's above my pay grade, it seems. Hopefully @brambos has some ideas.
bram, i am on 12.3.1 with iPad 6th Gen if that helps
Same.
I’m looking into it!
@brambos, I noticed a small typo in the program and in the manual: In the CustomScale command there is a missing comma between <c#> and .
I just uploaded another attempt at getting the Shift key working consistently in the Clusters script (version 1.0.2). Let me know if the problem rears its ugly head again.
I think I just tried it (downloaded 10 minutes ago, 1.0.2).
SHIFT didn’t work for me until I removed the Log {} statements in OnShiftUp/OnShiftDown/OnTimer.
@peplin, Thanks for taking the time to test it. I'll keep messing around, but at this point I'm really stumped. If anyone has any ideas, I'm open to suggestions.
It sounds like it’s something on my end. Let me look into it.
@brambos thanks bram. I've also experienced several instances where adding/removing "NOP"-style code lines affect how the code runs so something's fishy somewhere.
Oh, and please, pretty please, pretty pretty please, do consider a CurrentTimeMillis call. It would help me SO MUCH to be able to do
Log {MetroPulse started: }, CurrentTimeMillis
thenLog {MetroPulse ended: }, CurrentTimeMillis
to profile my event handling. I'm really struggling to figure out how to profile my code and get it to use less DSP.