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.

Custom MIDI SysEx with XX substitute CONUNDRUM when using dials and sliders

edited April 9 in Loopy Pro

When a MIDI widget uses PC or CC we can set min and max values for all dials and sliders. Unfortunately only the stepped dial has a build in legend if set to PC or CC and/or Trigger Widget.

But… when set to CUSTOM and SysEx with XX substitute, the XX value regardless of type dial/slider is always 0-127 and to add to injury, it’s impossible to show the current value with any of the widgets for that matter. More often than not, Sysex XX strings are never 0-127 so it’s very important to be able to set min and max values!

The only (simple) way to show the current value in the stepped dial, is to paste the custom string to each and every item (and rename the item) while replacing the XX with an actual value, but this defeats the whole purpose of the XX substitute function!!

So what we really need is a min-max option for XX when using SysEx and an option to show the current value in all sliders and dials… Pretty please???

«1

Comments

  • @hotswank : For the time-being, Streambyter or Mozaic are probably the way to go for what you want.

  • edited April 9

    @espiegel123 said:
    @hotswank : For the time-being, Streambyter or Mozaic are probably the way to go for what you want.

    Thanks, I already looked at MIDI Designer Pro X but I can’t STAND the UI… ughhhh. Back to my trusty Peavey PC-1600, was hoping to do it all inside Loopy Pro.

  • @hotswank said:

    @espiegel123 said:
    @hotswank : For the time-being, Streambyter or Mozaic are probably the way to go for what you want.

    Thanks, I already looked at MIDI Designer Pro X but I can’t STAND the UI… ughhhh

    Streambyter is free and can be used as an AU in loopy pro. You can send midi to it from your widgets and have it build the sysex message.

  • wimwim
    edited April 9

    Mozaic is also available if its different scripting syntax looks more comfortable.

    It also has the very useful TranslateScale function which can make the math for scaling values easier.

  • It would be a good idea to search the feedback site to see if there’s an existing feature request to comment on and upvote if appropriate. If not, if you can add one and post the link here, that’ll help make sure it gets tracked.

    https://feedback.loopypro.com/

  • Can any of them handle 3 or more variables in the same string i.e. F0 43 10 30 aa 00 00 bb 10 cc F7? I did this in Max/MSP in the past but I lost my “license” key lol.
    Are there tutorials online specifically tailored to SysEx available as well?

  • @hotswank said:
    Can any of them handle 3 or more variables in the same string i.e. F0 43 10 30 aa 00 00 bb 10 cc F7? I did this in Max/MSP in the past but I lost my “license” key lol.
    Are there tutorials online specifically tailored to SysEx available as well?

    Mozaic and Streambyter can use essentially as many variables as you want.

  • wimwim
    edited April 10

    @hotswank said:
    Can any of them handle 3 or more variables in the same string i.e. F0 43 10 30 aa 00 00 bb 10 cc F7? I did this in Max/MSP in the past but I lost my “license” key lol.
    Are there tutorials online specifically tailored to SysEx available as well?

    Sysex communication is a pretty esoteric thing. I mean, there's everything in the world on YouTube somewhere and you can probably find some explainers. But it's not a typical thing like simply sending CC's to control things. Sysex implementations usually involve diving into long tables of messages and the detailed requirements of what you're talking to. Every implementation is unique.

  • edited April 11

    @wim said:
    Sysex communication is a pretty esoteric thing. I mean, there's everything in the world on YouTube somewhere and you can probably find some explainers. But it's not a typical thing like simply sending CC's to control things. Sysex implementations usually involve diving into long tables of messages and the detailed requirements of what you're talking to. Every implementation is unique.

    This I understand and my knowledge with Sysex is very good, the problem is there are no sysex specific scripts available and I don't have the time to re-learn scripting Mosaic without any existing scripts to start from.

    https://abwiki.loopypro.com/mozaic_scripts_list

    All I could find for Mosaic was one Sysex Dump script in Utilities and a MS6 SysEx Performance Editor in External Hardware Synths.

    Perhaps Streambyter does have SysEx scripts to customize. All I need is an example to start with but I can't find any. Any help or pointers would be appreciated!

    Edit: I asked ChatGTP and it looks like it gave me example Javascript with 3 variables. Hope this works!

  • @hotswank said:

    @wim said:
    Sysex communication is a pretty esoteric thing. I mean, there's everything in the world on YouTube somewhere and you can probably find some explainers. But it's not a typical thing like simply sending CC's to control things. Sysex implementations usually involve diving into long tables of messages and the detailed requirements of what you're talking to. Every implementation is unique.

    This I understand and my knowledge with Sysex is very good, the problem is there are no sysex specific scripts available and I don't have the time to re-learn scripting Mosaic without any existing scripts to start from.

    https://abwiki.loopypro.com/mozaic_scripts_list

    All I could find for Mosaic was one Sysex Dump script in Utilities and a MS6 SysEx Performance Editor in External Hardware Synths.

    Perhaps Streambyter does have SysEx scripts to customize. All I need is an example to start with but I can't find any. Any help or pointers would be appreciated!

    Sorry, I don't have any pointers. The Mozaic manual is really straightforward on the SendMIDISysex function and the OnMIDISysex event. If you're already familiar with Sysex, I think the basics of sending and receiving should be fairly easy to understand.

    If you would like to describe what you need to do, or just one part of it I could try to provide an example script. It's late here right now, so not for awhile though.

  • edited April 11

    That would be fantastic Wim! Thank you very much!

    Below is a typical string with many variables. It changes the bank/voice per MIDI note on a Yamaha RM50 Rythm Sound Module (rack version of the RY30 which I also own).

    F0 43 10 30 aa bb cc dd ee ff gg F7

    0xF0 0x43 0x10 0x30 aa bb cc dd ee ff gg 0xF7

    I would like to “pre-set” any of the variables in stand-alone mode or with step dials within Loopy Pro, and only send the final sysex string when one of those variables is altered (typically bank “ff” or voice number “gg” or the MIDI note number “dd”). Some of the variables are just one value or a 2-way switch, others are 0-63 or 0-127 etc.

    Most important thing is it can offset the ‘CC > sysex’ 0-1 value shown in Loopy Pro i.e. when the sysex parameter = 0x00, the value on the synth’s display is in fact 1 (the 00-0F = 1-16 problem).

    I saw in Mozaic ‘stand-alone mode’ you can program the ‘SHIFT’ button (short tap and long hold) and I would like to set the short tap to toggle between “ee” value 0x00 and 0x0A as an example if it’s not to much trouble or complicated. Not sure how this SHIFT function would translate in AUM plugin mode?

    The RM50 can layer 2 voices per MIDI note and turn them on or off (with “ff”), and with SHIFT I could quickly switch between Vce1 and Vce2 (with “ee”) to assign a particular voice (the RM50 has many preset, user and card voices to choose from which makes it a little complicated and hence the many variables).

    Below is a screenshot from a Windows editor to demonstrate the variables and complexity. I want to recreate a simplified version of this editor with Mosaic.

    According to ChatGPT it should be something like this: (and I’m very curious if this is correct for Mozaic)

    // Initialize parameters
    var xx = 0;
    var yy = 0;
    var zz = 0;
    
    // Optional: constrain to 7-bit MIDI range
    function clamp(v) {
        return Math.max(0, Math.min(127, v));
    }
    
    // Handle incoming MIDI CC to control parameters
    function onControlChange(cc, value, channel) {
        if (cc === 20) {
            xx = clamp(value);
        }
        if (cc === 21) {
            yy = clamp(value);
        }
        if (cc === 22) {
            zz = clamp(value);
        }
    
        sendSysex();
    }
    
    // Build and send SysEx
    function sendSysex() {
        var sysex = [
            0xF0,       // Start SysEx
            0x7D,       // Educational / test manufacturer ID
            xx,         // Variable 1
            yy,         // Variable 2
            zz,         // Variable 3
            0xF7        // End SysEx
        ];
    
        sendMidi(sysex);
    }
    
  • wimwim
    edited April 11

    @hotswank - that chatGPT code is just comically wrong. There isn't one line of Mozaic compatible code in the whole thing. I got a good chuckle out of it over breakfast. 😎

    I'll take a closer look at your post above later today.

  • I would like to “pre-set” any of the variables in stand-alone mode or with step dials within Loopy Pro

    By "in stand-alone mode", do you mean when running Mozaic as a standalone app? Mozaic's stand alone mode isn't really designed to be used that way. It has no midi routing functionality. I was assuming you would be using this in Loopy Pro. But then there's ...

    Not sure how this SHIFT function would translate in AUM plugin mode?

    Are you planning to try to use this in AUM as well? The question is important because if you won't be controlling the script through Loopy widgets, some means of changing controls needs to be added to the knobs and buttons of Mozaic, making the script significantly more involved.

    As for the SHIFT button, it acts the same in standalone and in plugin mode.

    SHIFT is probably not a good choice for the toggle functions you mention. It's not midi mappable nor is it controllable by AUv3 parameters. It's also more difficult to hit accurately and doesn't provide any visual feedback except when your finger is actually on it. Better to use one of Mozaic's pads or knobs for this.

    Most important thing is it can offset the ‘CC > sysex’ 0-1 value shown in Loopy Pro i.e. when the sysex parameter = 0x00, the value on the synth’s display is in fact 1 (the 00-0F = 1-16 problem).

    I'm sorry, I just can't make any sense out of the above. Can you explain it differently?

    Or, maybe can you describe the Loopy widgets you would like to use for controls and what you would like them to change in the RM50? Forget for now what needs to go out from those widgets, and just focus on the widgets themselves. Maybe we can start there. If the SHIFT function is involved, assume that a Loopy Pro button will handle that for now.

    Feel free to just use one example of each type of control if there will be many. I can try to comment the code sufficiently that you'll be able to extend it yourself.

    The next step will be to describe the Sysex needed in the RM50 for each widget type.

  • edited April 12

    Hi Wim, sorry for the confusion, I want to use Loopy Pro only (should have said “AU plugin mode”). I’m not going to use LP in a performative way either and thus no MIDI automation required: using LP only as the controller to allocate sounds to particular midi notes (the RM50 has a fixed GM-like midi note layout per preset kit, which sucks).

    Re ‘CC > sysex’ 0-1 value: it’s about the actual numbering of the banks and presets of the RM50. For instance 0x00 is bank 1 in the RM50 display, but the CC value is also 0 and therefor the legend shows 0 while in fact it’s preset 1. It’s not a big deal but I was wondering if that could be fixed with an offset?

    Here’s an explanation of the variables (in decimals) - aa bb cc etc. now reflect the actual midi data format in the appendices manual.

    F0 43 10 30 tt mm nn pp qq vv uu F7

    tt = parameter group (1=channel setup, 2=rythm kit, 3=voice parameter, 4=system setup, 5=program change table)
    mm = memory (0=preset 1=internal 2=card)
    nn = number (0-63)
    pp = parameter 1 (0=note 35, 1=note 36 etc)
    qq = parameter 2 (0=voice1, 10=voice2)
    vv = parameter value high (bank 0-23)
    uu = parameter value low (number 0-127)

    Loopy Pro widget and label:

    tt = radio button GROUP (1-5)
    mm = radio button MEMORY (0-2)
    nn = stepped dial NUMBER (0-63)
    pp = radio button NOTE (0-7)
    qq = radio button VOICE# (0 or 10)
    vv = stepped dial BANK (0-23)
    uu = stepped dial SOUND (0-127J

    CC channel 16:

    tt = 75
    mm = 76
    nn = 77
    pp = 16
    qq = 17
    vv = 18
    uu = 19

    I hope I did not forget anything and really, really appreciate your help! This would tremendously help me out… I’m currently creating a LP project with all the widgets with the CC’s etc and upload it here when ready.

  • Thanks @hotswank - It's late again here - I'll get a look at it tomorrow.
    Cheers,
    Mike

  • When I was wrestling with sysex my biggest problem was calculating the checksum. In the end checksum won and I never got to send any sysex. I was trying to set the main volume of a roland module.

  • Yes, the really early Roland devices used a much simpler sysex format without checksums for single parameter changes, just like this RM50. Checksum are often used only when sending and receiving dumps. For volume I would have used CC7 😉

  • For checksums, use the Mozaic AU to send the sysex. I’d suggest setting up Loopy Pro widgets for setting up the data with AU parameters and let Mozaic convert those values and build the sysex message. Mozaic has a convenient function for scaling values.

  • Hey @hotswank - sorry. I haven't forgotten about you, but have had a lot else going on. I hope to get a look at this, perhaps tomorrow.

  • @wim said:
    Hey @hotswank - sorry. I haven't forgotten about you, but have had a lot else going on. I hope to get a look at this, perhaps tomorrow.

    Hi Mike, no problem man! If the thing below is too much asked or impossible, please omit!

    I would like to “pre-set” any of the variables in stand-alone mode or with step dials within Loopy Pro, and only send the final sysex string when one of those variables is altered (typically bank “ff” or voice number “gg” or the MIDI note number “dd”).

  • edited April 17

    @wim said:
    Hey @hotswank - sorry. I haven't forgotten about you, but have had a lot else going on. I hope to get a look at this, perhaps tomorrow.

    Hi Mike, it would perfectly fine if you just build a script with just one or two variables if this saves time. From there I could figure out the rest. Thanks

  • edited April 18

    I went ahead and got it working but the only concern I have are the syntax errors: "unknown or invalid argument "UU" etc. etc."; ...but once all 7 variables are "dialed in" with the widgets from my previously shared Loopy project, the errors go away though. I wonder if I just could ignore them... please check and perhaps improve my script. I used MIDI Wrench to monitor the sysex output.

    I've attached the below Mozaic script, a simplified Loopy project and my Audiobus3 preset (if that makes any sense).

    @OnMidiInput

    if MIDIByte1 = 0xBF and MIDIByte2 = 0x4B // CC75 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    tt = MIDIByte3 // GROUP

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x4C // CC76 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    mm = MIDIByte3 // MEMORY

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x4D // CC77 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    nn = MIDIByte3 // NUMBER

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x10 // CC16 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    pp = MIDIByte3 // NOTE

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x11 // CC17 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    qq = MIDIByte3 // VOICE

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x12 // CC18 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    vv = MIDIByte3 // BANK

    elseif MIDIByte1 = 0xBF and MIDIByte2 = 0x13 // CC19 Ch16
    Log {Loopy: }, MIDIByte1, { }, MIDIByte2, { }, MIDIByte3
    uu = MIDIByte3 // SOUND

    endif

    data = [0x43, 0x10, 0x30, tt, mm, nn, pp, qq, vv, uu]
    SendSysex data, 10

    @End

  • @hotswank : can you write a summary of what you went that code to do?

  • edited April 18

    @espiegel123 said:
    @hotswank : can you write a summary of what you went that code to do?

    It’s a KIT editor for my Yamaha RM50. It has many preset and user voices and can all be layered and assigned to a certain MIDI note number but a real PITA on the device itself.

    Each variable (CC widget in Loopy) sets a certain parameter in the RM50 like preset, user or wave card bank, the number of that bank, the number of the voice, if it has 1 or 2 voices and on which midi note number.

    I was hoping Mike could help me but I couldn’t wait and went ahead myself. The only problem with the script are the syntax errors of the unknown arguments. Perhaps there is a better way to avoid those errors, or perhaps I could ignore them?

  • edited April 18

    @hotswank : did you consider using Mozaic as an AU inside Loopy Pro without using Audiobus? It might simplify things. You could set Mozaic AU parameters directly without needing to send MIDI from Loopy Pro to Mozaic.

  • edited April 18

    @espiegel123 said:
    @hotswank : did you consider using Mozaic as an AU inside Loopy Pro without using Audiobus? It might simplify things. You could set Mozaic AU parameters directly without needing to send MIDI from Loopy Pro to Mozaic.

    I used Audiobus as a proof of concept because I don't understand how to set it up in LP. That's what I'm trying to ask the whole time LOL. I was under the impression from the start it HAD to be done from Loopy AU and widgets but now I'm REALLY confused. What do you mean with setting the parameters directly??

    I want to see what I send to Mozais with radiobuttons.

    I'm thinking of abandoning this project because it frustrates the hell out of me not be able to get accross what I imagined (because of the language barrier).

  • wimwim
    edited April 19

    Sorry @hotswank - I have been, and probably will be for a little while, out of the action this last week.

    The "unknown or invalid argument" errors you're seeing are due to the else if clauses. When the script gets to the data = [0x43, 0x10, 0x30, tt, mm, nn, pp, qq, vv, uu], until all the variables have been assigned, the unassigned ones (because no else if was satisfied yet) throw the error on that line.

    You can avoid that by adding an @OnLoad event and assigning a default value to all the variables there.

    As for how to put the script to work in Loopy Pro, just add Mozaic as a MIDI source and make Mozaic the target of the SendMIDI action on a widget. Add your hardware as MIDI in the mixer, and make Mozaic the source for it.

    The widget will send midi to Mozaic, Mozaic will send to the hardware.

    Sorry that I don't have more time to be of more help right now.

  • @hotswank : here is an example of one way of approaching what you want. The project uses the free Streambyter as the midi destination so that you can see what is being sent. Tap on streambyter's magnifying glass to put it into monitor mode.

    the Mozaic code isnt very elegant. my goal was readability

  • @wim said:
    Sorry @hotswank - I have been, and probably will be for a little while, out of the action this last week.

    I understand, I fixed the syntax errors just like you mentioned, thanks

  • @espiegel123 said:
    @hotswank : here is an example of one way of approaching what you want. The project uses the free Streambyter as the midi destination so that you can see what is being sent. Tap on streambyter's magnifying glass to put it into monitor mode.

    the Mozaic code isnt very elegant. my goal was readability

    Ooh wow, that’s quite a more sophisticated approach compared to my prehistoric code I guess! Although it does the job just fine (I’m almost finished building all the CC widgets - mostly radio buttons with trigger widget actions), I’m definitely going to implement this code! Thank you very very much! I could never dreamed this shit up haha!

    I have found your YT channel and subbed!

    Cheers, Maurits

Sign In or Register to comment.