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
Forget the code... tweak the data and play. You liked E4:
Base_Note = 64
Sequence = [1,2,3,5,7,8,6,5,4,5,2,3,5,4,3,2]
Scale = [1,3,4,6,8,9,11,13,15,16,18,20,21,23,25]
Length = 16
delay = 600
Octave = 4
Change the melody:
Sequence = [1,3,5,2,4,6,3,5,7,9,7,5,7,5,3,2]
Sequence = [1,8,2,9,3,10,9,2,6,7,8,9,7,5,3,2]
Sequence = [1,2,3,5,4,5,6,8,2,3,4,6,5,7,4,2]
Slow it down and drop an octave:
delay = 2000
Octave = 2
It's really just typing. Not really coding.
Which feature update would get you most interested in more testing?
Knobs ( change scales, transpose, root, delay, octaves)
PAD's to set customer sequences (using PAD's like the white key on a piano to select scale notes).
What's the best way to speed testing? AUM projects with pre-loaded scripts to test and pre-coded to s Base_Note. Maybe a project with 12 Base_Notes. What are the best base notes to target for typical Drum Pads. I haven't even broken out my Kat Pad yet to play.
I just poke the AUM keyboard and that keeps me busy. Tweaking and auditioning targets for great sounds. I'm really digging the IAP"s in "Noise Melody" lately. (Just be careful with the Swan IAP"s that only working with the internal Noise keyboard or real Roli hardware controllers. But there other IAP's are great.
@McD The very first thing that needs to happen is stuck note prevention. The synths are apparently not getting any note offs.I get nothing but hung notes(see my @wim suggestion?).From what I can tell lowest velocity plays random(?)chords. Higher velocities play more notes in chosen numbered scale. Not really a simple round robin but more like a velocity modulated midi delay/transposer?
Sharing AUM projects work.Your knob parameters choices sound good. Your base notes selection-I don’t know if it matters. I see myself using multiple instances of this. One per track/note in AUM each triggering its own synth rather than one instance in one track with multiple note inputs for different scales of one sound. I could just use a midi note filter to sort it out if you kept it multi note.
OK.
No my invention in this Object was to convert velocity into the number of notes emitted. How many would you prefer... one per tap? Easy. A Drum pad produces the timing details which just triggers one of more notes but I wanted to do something new with the velocity details. Worth a try.
I think so too. I can go crazy with knobs but the code becomes more and more complex. I'm thinking
I want more simple Objects delivered in AUM in one load. But open each would expose knobs to
make that one do something... transpose. Play harmony notes in relation to the ones above and below.
So, 3 instances create chords per tap but you can use knobs to generate chords that you like. I just take the notes above and below and add some integer value:
1
3
5
defines a simple 3 note triad.
-7
1
5
10
defines a big open voiced chord.
One app with multiple instances and different Knobs settings... I hope you see the benefits of simple scripts users can change, tweak and stack creatively in AUM. Edit the data (which is what the Knob really does... change default data).
I pass thru the original NOTE so one tap can actually trigger a tree of objects. But you could alternatively
configure Objects per PAD device site AUM is so powerful for plumbing FX and Apps.
No my invention in this Object was to convert velocity into the number of notes emitted. How many would you prefer... one per tap? Easy. A Drum pad produces the timing details which just triggers one of more notes but I wanted to do something new with the velocity details. Worth a try.
That’s what I thought. I’ll try a different controller to see if that helps. I kept getting chords on soft strikes.
One per tap would be great but I see a use for this delay type thing also. I would use both.
Definitely a lot of potential using multiple simple scripts too.
I think when I get a few basic simple "Objects" with Knobs and the "hung note fix" I'll zip them up and
Patchstorage can deliver a *zip file of them. Then they end up in a Subdirectory of Mozaic and I might
also put AUM projects in the text description on PatchStorage along with some SoundCloud demos to
inspire people to want to give it a play.
haven’t had a single hung note..
Regarding hung notes, how confident are we that they're actually a result of the synth getting overloaded and skipping a note off? I would look for other causes before resorting to that as an explanation.
Is there a simple way to replicate the note off problem? If so, log the midi that's actually getting sent to the synth to confirm whether or not each NoteOn command has a corresponding NoteOff command. Distilling problem down into simplest set of steps to replicate is the best way to approach quashing bugs. "Hung notes everywhere" is not real helpful. "A hung note when, immediately after I load the script, I press Middle-C" is feedback that can really help.
I haven't fully grokked the code, but it looks to me like there's a spot where NoteOff command may not be getting sent properly. Look at the SendMidi commands in this section:
It looks to me like on the last time thru this loop that 'Note' is being turned on, and 'Old_Note' is being turned off. However, the loop then exits, and the 'Note' that was turned on in final pass does not get turned off. If so, then the fix may just be to add the final NoteOff command right after the for loop:
There will be a NoteOff command from the user unpressing the key on the keyboard that gets sent elsewhere using 'SendMidiThru', but that note is likely not the same note as the one that was turned on in the final pass of the loop.
Also, just for clarity, I would probably change those two SendMidiOut commands to one SendMIDINoteOn and one SendMIDINoteOff command.
Or maybe I just haven't looked closely enough.
Also, this 'elseif' statement has no condition following it:
I think that should be generating a syntax error, since elseif should always be followed by an expression. What you want there is a simple 'else' to catch every other condition. Without any condition at all (and no flagging of the elseif as a syntax error) I wonder whether it's evaluating the elseif as having an always true condition (in which case it's the same as a bare 'else') or as having an always false condition (in which case that SendMidiThru is never getting executed).
Some apps don't understand the NoteOn short-form for NoteOff - which was designed for packing multiple notes in the same event.
In other words, switching to explicit NoteOff event may help with stuck notes - unless Mozaic is already doing this behind the curtain.
Yes. As is the SendMidiCommands are sending two NoteOn commands (guaranteed since we know the MidiCommand variable is 144), with one having a velocity of 0. If you wanted to continue using the SendMidiCommand form, you'd want to change it to expressly send NoteOff command, using form like this: 'SendMidiCommand 0x80, [noteval], [vel], [delay]'. But expressly using SendMidiNoteOn and NoteOff commands seems better.
Also, on second thought, I think you do want to have that 'else' be an 'elseif' with a condition that excludes certain NoteOff commands from getting sent thru. At least you do, if you're intending to send all your NoteOns and NoteOffs from BaseNote presses in the code for the main condition ('MidiCommand = 144 and MidiNote=BaseNote') of the If statement. It might not screw things up if you send the NoteOff from the user's keypress thru, but you aren't sending those NoteOns thru, so filter the NoteOff from user keypresses, too:
Another thought: I've never used the delay parameter in midi note commands, but is there any need for the OldNote variable and its associated logic at all?
Why not just issue both NoteOn and NoteOff commands for 'Note' at the same time, but add a larger delay for the NoteOff command so Mozaic delays sending it for longer?:
Unless I'm missing something (which is possible) that should work, and simplify by letting you get rid of all the OldNote related stuff.
Also, look at p.26 of the manual, regarding the 'delay' parameter it says:
I think this means that the midi commands are queued inside Mozaic and not sent until their time comes. If so, this means the synth isn't getting overloaded with lots of commands sent all at once; they're saved within Mozaic until Mozaic engine decides the time has come for them to be sent. (Another way of saying this is: 'Delay' parameter is not part of the midi standard; all midi note on and off commands are executed by the synth as soon as they're received; the delay parameter instead is parsed and applied within Mozaic.)
Here are some screen captures of the issues.
High velocity from a KORG nanokey 2. Hanging note.
Here is with medium and low velocity. One at 70 and one at 24. Low velocity creates a chord and then hangs.
Hope this helps with a diagnosis.
Your instincts are good. I tried my Kat Pad controller and it sounds terrible. I quickly hacked on the code and got some nice short notes which work fern with FAC Alteza. Combined with a Note/Tap it's more useful.
Do not be concerned about ownership if you want to create a variant. I would consider that to be a win.
But I will continue making my own set of Objects. I cal them Objects to honor the idea of Object Oriented Programming. An Object is a bit of behavior with some internal data. Object Oriented programming combines networks of objects into full/complex applications. The benefit of objects are "re-use". So feel free to take the ideas and make some too. You'll have ideas I would never think of...mdas
Here's the current code instance I'm playing with after some quick editing/hacking.
I fixed the Note Off's and changed it to Tap per Note.
Very simple. Note On and Note Off go out as a pair.
NOTE: setting velocity = 0 is interpreted as a Note Off.
So every Tap advances the "pointer" (loop) into the Sequence Array and gets reset at "length".
Thank you for looking carefully at my malformed code that I posted here. This new script is less complex and behaves better. I did not do put the "Base_Note" detection test back in (yet) to use one Controller with multiple Pads like the prior version.
According to the spec yes, but not according to some apps.
I would not be surprised if you have to work around these flawed implementations, as others have had to do.
Then I would be well advised to use a real note off and will take your input. It's a small change to
modify the MIDICommand to 129 or something like that. Eventually I'll memorize all these MIDI numbers in Decimal. Thank you @Brambos for not making us use Hex, Octal or Binary to set the right bits in these commands.
There's another thing to check with these SendMIDIOut commands:
These commands will always send midi over channel 0, regardless of what channel the original midi command came in on. This may seem like it's working fine, if the controller is in fact coming in on channel 0. But it's going to break, or work unexpectedly, if a user is sending on a different channel and expecting the midi commands to come out on the same channel they're going in on.
You can read the explanation on p.33 of the manual, but I would expect you want to send it out on same channel it's coming in on, for which you'd need one of these:
or, what is the same thing:
I would vote for using SendMidiNoteOn, and SendMidiNotOff myself, which would also clarify that you need to indicate what channel you're using (because the 'MidiCommand' part of those commands -- 0x90 and 0x80 -- is implicit, not stated at all).
I'm in total agreement. Use a variable for the MIDIchannel and I'll look for the right MIDIcommand decimal that doesn't require a velocity = 0 and still is accepted as a valid Note Off.
Here's the guidance in @Brambos' Mozaic Manual:
This is particularly useful because we can now easily check the command, without having to worry about channel data getting in our way:
Simply add MIDIChannel to MIDICommand to recreate the original command byte:
He also provides Commands to send explicit NoteOn or NoteOff with you needing to specify the MIDIChannel and not stress over the 144 vs 128 decimal values to set the most significant bits in the command:
SendMIDINoteOn 0, 35, 100
SendMIDINoteOff 0, 35, 0, 300
These coding details drive a lot of people crazy since they don't really care. That's why I want a bullet proof script BUT people can tweak the data like they would enter Notes in a Piano Roll.
The trick is getting people out of their comfort zone to learn a bit more about the technical details.
This is true with Synth's, Sequencers and MIDI effects. With a little effort a whole new level of expression is opened up over buying more apps that do similar magic for $5 a pop.
OK... I got a chance to try the "One Tap per Note" script with 7 Zeeon instances.
Here's a a folder with a copy of the AUM project that will load the 7 scripts and uses the Zeeon Synth for targets. And the Mozaic Script used with sequence variations and input notes that match my KatPad with 2 pedals (kick and hi-hat inputs).
https://www.dropbox.com/sh/pflln5xhsytct2g/AACrBsRTDfDJmTgR0GgGg0nfa?dl=0
Here's the script... it's "Tap per Note" and doesn't hang notes.
Yeah. Now we’re getting somewhere! Nice demo too.
I made a couple more Kat Pad Jams using these scripts... they just differ in the incoming note, sequences numbers and the delay values... otherwise there are 6 instances of the same basic code (bass drum, hi-hat pedal and 4 Pads):
Nice. Melodic round robin is fun to play isn’t it?
Couple questions. I know the base note is the note coming from your controller but is it always also the 1 (root note) in the scale? What does delay do if the notes are tapped and don’t rely on being sequenced ?
No. The Base_Note is just a detail for the script to trigger for a given pad. The scale root (so far) is C and the sales I've been using lately are C dorian (which is a nice minor). I'd like to start implementing some knobs to allow changes in key, scales and "offsets" so 2 instances could play parallel intervals and 3 could be set to chord relationships.
The delay always determines how long each note rings... adding massive reverbs helps make things sound more legato but the reverb is suppling the Sustain and Release. The instrument selected determines the attack and the Delay variable is effectively the Decay in the ADSR envelope model.
Turn off the reverbs and the notes will sound like beeps with short delays and like full notes with 1000+ msec delays. Delay can be second long too if you want to avoid those massive reverbs on everything.
I made a Phillip Glass sounding track using Pad Objects, "One Finger Orchestra" fr the constant Kraftwerk-like rhythm background and the Enso AU Looper. I like these AUM projects because it seems to come back ready to perform.
Thanks for the clarifications. Delay between note on and off - note length. Got it. All your future options sound good . At some point it would be nice to work on velocity. I take it now it’s all set to a static amount? Would be great to either be able to set it manually for each of the numbers in the sequence OR just let it pass through and have all notes respond to your playing dynamics.
Nice demo also.
No. the velocity of the tap is applied the the sequenced note so you should hear accents it you play them.
They should respond if I didn't mess it up.
I'm starting to enjoy the generative approach to a live session. I could see making a dozen AUM projects and doing a live performance or busking with an iPhone and a Kat Pad tapped with my hands.
Everything would fit in a backpack. I should look at the power specs of the Kat Pad to see if it can run from a battery pack. The Kat wants 9 Volts and everything I have is 5V... darn.
I should shop for a 9V battery adapter cable to see if I can still do this. All those Guitar Pedals expect 9V so there maybe something to power those but they typically just have a 9V battery slot as an option. The external power port is the exception and not the rule.
A little MIDI keyboard would also suffice with Mozaic sequencing for the background textures like Kraftwerk loops. Now I want an EWI to play midi synth solos over the top
with breath controls. I just keep expanding my little bag of tricks. So much fun.
No. the velocity of the tap is applied the the sequenced note so you should hear accents it you play them.
You are right. That’s really weird. I was testing on the first Zeeon and for some reason it wasn’t responding to velocity even though my midi monitor said it was receiving it. Maybe I’m not understanding Zeeon’s way of handling velocity. Other tracks with Zeeon seemed fine too. Just that first one.
I did experience a cpu spike/ audio silence while playing the keyboard while adjusting the script- sequence length maybe? Not sure.
I’m getting more comfortable with typing in values in the script. Can’t wait for adjustable root notes!
Cool. Add these lines and you can change the root without a knob:
Then any MIDIOut lines just need to addd this value to the Note calculation which currently is:
Note = Scale[Sequence_Note - 1] + (Octave * 12) - 1
So to to transpose add the new root variable:
Note = Scale[Sequence_Note - 1] + (Octave * 12) - 1 + root
Modified Script with root variable option:
I obviously don’t know how to properly set this up. Was I supposed to copy both sections of code? Only the second? You’ll have to make it way more simple for me. It doesn’t seem to be working. Instead of me copying and pasting willy nilly it would be best for now to send it as a simple AUM project with the new preset already saved.
Will do.
Here are the steps I will do.
Open one of the Mozaic scripts. I have 6 of them. I will open the code section in the GUI and high light all the text until it asks what I want to do with it. I will high light the text above and select it to the clip buffer. When I click in the empty code box now I can used "Control V" to copy in the new text.
Then I save the Script in the GUI. I'll load it since all Mozaic instances share the save folder of scripts.
Once loaded in the other 6 scripts I'll save them with unique names and do a bit of testing. I'll make
"root = 2" moving the tonal center to D. Test a bit and save the AUM.project and upload it into
a DropBox folder and post a link here your for and others to test the updated version.
Given a a day to move the ball forward. I appreciate your interest in the functionality. Ideally you should only have to edit variables in the @OnLoad section at various stages and I'll always make an AUM project available since it saves everyone a lot of extra "text processing" that comes with coding.
Developer's love tools to make this all easier and Mozaic is pretty rudimentary in this regard.
👍🏻