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.

iOs/iPadOS Sysex Recording/Playback

edited April 2021 in App Tips and Tricks

If you have a host that doesn't support sysex messages there is still some simple ways to record/playback these events. For this, although they are other solutions, I use a Mozaic script hosted in AUM, as they both support sysex, convert the sysex (or part of it) to CC(or any MIDI data).
Then on playback rebuild the sysex and send back to the external device.

Ok, first you need to launch or buy AUM - audio mixer (it's a bit more than an audio mixer) and Mozaic plugin workshop (a MIDI scripting tool that let's you do pretty much eveything with MIDI)

1) Launch Mozaic, then close it (it's intended to be used as a plugin, not standalone)
2) Launch AUM, tap the big + sign and select MIDI
3) Tap the + sign in the white circle, choose Audio Unit Processor, then look for Mozaic ( if it's not showing up you may need to turn of your iPad and restart it, then back to 2) )
4) Tap on the Mozaic icon to open it. If needed you can resize(hold the lower rigth side)/move(hold the big gray bar on top) the window .
5) Click on Code, then on Maximize, select all the text in it and delete it (cut or BACKSPACE)

6) Now copy/paste the code below, it's a simple MIDI monitor and displays sysex as well, unfortunately only in decimal, but to test it's good enough.

7) Now hit Upload, this will start the script(program). And make sure LOG is selected, that's where our MIDI data will show up.
8) We still need to connect to the hardware (or any port, it can be from virtual ports, bluetooth, network, ...). Click on the "Z" or "S", second icon on top of the Mozaic window. In MIDI Sources select the port(s) you want to listen too.
9) Ok when moving knobs, faders,.. on your MIDI device you should see midi data coming in, if it has only 4 values it's a standard midi message (Command, channel, byte2, byte3) and if it's longer it's a sysex.
10) Now time to save, in Mozaic, hit SHOW GUI, then SAVE, mozaic doesn't allow subfolders so you may save this one to something like UTIL_MIDI monitor, once you have a hundred scripts you will understand why :)
11) To save the AUM project, hit the hamburger icon (top rigth) , Save, click the blue pencil, rename and Save session. Note that saving the aum session will also save the mozaic script, but it's a good habit to save them both.

OK, next time you launch AUM, just tap Reload last Session or use Files/Sessions >
That's it for now, next we will send / receive these sysex to other host.

// simple midi monitor 1.0  Mozaic 1.3.9
@OnLoad
  SetTimerInterval 1200
  SetShortName {Log..}
@End

@OnTimer
   Log { }
  StopTimer
@End

@OnMidiInput
  if MIDIByte1 > 0xF0
    exit
  endif
  SendMIDIThru
  StopTimer
  log MIDICommand , {,}, MIDIChannel , {,}, MIDIByte2 , {,}, MIDIByte3
  StartTimer
@End

@OnSysex
  StopTimer
  // log {Received a Sysex message! (}, SysexSize, { bytes long)}
  ReceiveSysex msg
  sl = SysexSize
  FillArray msg[sl], -1, 16
  i = 0
  if sl > 16
    log { }
  endif
  if sl < 9
    log msg[0+i], {,} , msg[1+i], {,} , msg[2+i], {,} , msg[3+i], {,} , msg[4+i], {,} , msg[5+i], {,} , msg[6+i], {,} , msg[7+i]  
  elseif sl < 11
    log msg[0+i], {,} , msg[1+i], {,} , msg[2+i], {,} , msg[3+i], {,} , msg[4+i], {,} , msg[5+i], {,} , msg[6+i], {,} , msg[7+i], {,}, msg[8+i], {,} , msg[9+i]
  else
    repeat
      log msg[0+i], {,} , msg[1+i], {,} , msg[2+i], {,} , msg[3+i], {,} , msg[4+i], {,} , msg[5+i], {,} , msg[6+i], {,} , msg[7+i], {,}, msg[8+i], {,} , msg[9+i], {,} , msg[10+i], {,} , msg[11+i], {,} , msg[12+i], {,} , msg[13+i], {,} , msg[14+i], {,} , msg[15+i]
      i = i+16
    Until (i >= sl)
    if sl > 16
      log { }
    endif
  endif
  StartTimer
@End

edit: code change

Comments

  • edited April 2021

    ..

  • MultiTrackStudio supports sysex messages as of version 3.9, not sure if that helps

  • Cool, thanks for the tips and the script. What's the best way to playback sysex in AUM through midi cc?

  • @je>; @Littlewoodg said:

    MultiTrackStudio supports sysex messages as of version 3.9, not sure if that helps

    Thanks, good to know, would be probably a good choice for sysex editing. And tempo track / time signature !

  • edited April 2021

    Version 1.1.2, forgot to deal with values of 0 when using Note On ( 0x90)

    New version 1.1.1 ,now you can also send NoteOn, Key Aftertouch or Pitch wheel instead of CC
    Patch change and channel pressure should work too, but as they have only one data byte, some host may clear the second one.
    For Drambo set MIDICMD = 0x90 and NOTEOFFDURATION = 100 //msec or what you want
    But don't fool too much with quantisation and velocity changes unless you know what you do.

    You can have up to 24 CC in a single sysex
    Use values 1000+CC to define an element
    With a sysex like F0 00 01 02 03 F7
    SysExCheck = [0x0, 1000+11, 0x2, 1000+12] // the script uses 1000 to know it's a CC
    SysExCheckLen = 4 // in this case
    Otherwise all element must between 0-127 or 0x0 - 0x7F in Hex
    If you want to record each element
    SysExCheck = [1020, 1021, 1022, 1023, .. ad up to 24 CC ]
    But IMO, it's better to use CC for values you are really using

    Make sure to set SysExCheckLen = number of elements (without F0 and F7)
    I guess that the maximum size of the sysex can be 1024 (haven't tested)
    Note that this version doesn't allow sysex of different length

    In Cubasis avoid CC64 and CC123 as CB2/3 will send them after the sequencer stops

    On playback the script will check which CC it receives and if there is a double will
    generate an error and restart from there. Once it has all the CC's it generates a SYSEX
    Also once it receives the first CC, there is a timeout between each cc
    If it's longer than the one we define in SetTimerInterval, it generates an error (log) and
    resets the count



    // sys converter 1.1.2 Mozaic 1.3.9 @OnLoad SetShortName {SYS-CV} // things TODO !! SEND_SYSEX_THRU = no // yes or no , normally we'll block incoming sysex SEND_MIDI_THRU = no // yes or no, if possible avoid any other MIDI data channelCC = 16 // the channel to use for our CCs 1-16 !! // SYSEX we're looking for: F0 43 14 3E 04 02 03 35 01 F7 // NOTE: Mozaic adds/removes the first and last element itself F0..F7 // we want to record the two last values eg 0x35 and 0x01 using CC20 and CC21 // We replace elements to watch with: 1000 + CC number (decimal !!) SysExCheck = [0x43, 0x14, 0x3E, 0x04, 0x02, 0x03, 1020, 1021] // CC20, CC21 SysExCheckLen = 8 // our sysex is 8 data long !!! SetTimerInterval 10 // how long we wait to get next CC in millisecond // we don't have to use CC, note on, key aftertouch, pitch wheel can be used too MIDICMD = 0xB0 // NoteON: 0x90, Key Aftertouch: 0xA0, CC: 0xB0, PitchBend: 0xE0 NOTEOFFDURATION = 100 // only used with NoteOn 0x90, set note duration in msec // using note on (0x90) is not a very good choice as we'll lose value 126 // As a note on with velocity 0 is a note off, // the script has to increase the velocity by 1 (except for val >= 126) // and then decrease by 1 to rebuild the sysex, 127 is ok but we lose 126 in the op. // end of TODO CopyArray SysExCheck, sysBuffer, SysExCheckLen // copy of our sysex Dec channelCC, 0 // we need 0 base index for midi channels INFLAG = 0 // incoming CC check FillArray CCused, -1, 128 // for quick check // remember the data to change and the CC's being used NumIndexes = 0 CCFLAG = 0 for n = 0 to SysExCheckLen if SysExCheck[n] >= 1000 SYSINDEX[NumIndexes] = n SYSCC[NumIndexes] = SysExCheck[n]-1000 CCused[SYSCC[NumIndexes]] = NumIndexes CCFLAG = CCFLAG | (pow 2, NumIndexes) Inc NumIndexes endif endfor @END // Receiving sysex @OnSysex ReceiveSysex SysMsg sl = SysexSize if sl <> SysExCheckLen // not the correct length if SEND_SYSEX_THRU SendSysexThru endif exit // not our sysex endif i = 0 for n = 0 to sl-1 if SysExCheck[n] < 1000 AND SysMsg[n] <> SysExCheck[n] // not the one we are looking for if SEND_SYSEX_THRU SendSysexThru endif exit // not our sysex endif if SysExCheck[n] >= 1000 v = 0 if MIDICMD = 0x90 And SysMsg[SYSINDEX[i]] < 126 v = 1 endif SendMIDIOUT MIDICMD+channelCC, SYSCC[i], SysMsg[SYSINDEX[i]] + v if MIDICMD = 0x90 // note on SendMIDIOut 0x80+channelCC, SYSCC[i], 0, NOTEOFFDURATION endif Inc i endif endfor @END @OnTimer StopTimer log {Waiting for next CC, timer overflow} INFLAG = 0 @End // Now from CC back to our Sysex message @OnMidiInput if MIDIByte1 = (MIDICMD+channelCC) And CCused[MIDIByte2] > -1 StopTimer fl = pow 2, CCused[MIDIByte2] if INFLAG & fl Log {ERR: duplicate CC} INFLAG = 0 // let's start again endif v = 0 if MIDICMD = 0x90 And MIDIByte3 < 127 v = -1 endif sysBuffer[SYSINDEX[CCused[MIDIByte2]]] = MIDIByte3 + v INFLAG = INFLAG | fl if INFLAG = CCFLAG // we have them all SendSysex sysBuffer, SysExCheckLen INFLAG = 0 else StartTimer endif else if SEND_MIDI_THRU SendMIDIThru // if we want other MIDI to go thru endif endif @End

    The routing can be a little tricky

    The easiest is probably to record that CC on it's own channel/track in your DAW
    and use two instances of Mozaic with the same script, then in AUM:
    external midi -> mozaic1 -> DAW, converting sysex to CC, then
    DAW -> mozaic2 -> external midi, CC back to sysex

    With Cubasis 3 this would be:
    in AUM:
    external midi -> mozaic1 -> Cubasis 3
    'AUM' destination -> mozaic2 -> external gear

    In CB3 you need to set the midi In to All Inputs (there's no Cubasis In),
    so it's probably a good idea to receive only on our selected channel (16 in the example)
    and Midi output to AUM, same channel

    The good part is that once it works it should work all the time, just need to launch this AUM session

  • Little script to test with the Sysex Converter 1.1.0 script
    Generating random values for elements with a CC
    In AUM connect TOP = RND-SX, RIGHT = SYS-CV

    @OnLoad
      SetShortName {RND-SX} 
    // use the same data than in sys converter script 
      SysExCheck = [0x43, 0x14, 0x3E, 0x04, 0x02, 0x03, 1020, 1021]
      SysExCheckLen = 8 // our sysex is 8 data long !!!
      LabelPads {Hit a Pad to send a random SYSEX} 
    @End
    
    @OnPadUp
      For n = 0 to SysExCheckLen-1
        if SysExCheck[n] >= 1000 // cc ref
          szSYS[n] = Random 0, 127
        else
          szSYS[n] = SysExCheck[n]    
        endif  
      endfor 
      SendSysex szSYS, SysExCheckLen
    @End 
    
  • edited April 2021

    Tested with Cubasis 3 .. IT WORKS :o .. so far
    Tested with Drambo , no luck with note on, drambo records note on with a velocity of 1 as 0, witch generates a note off. :( , unless someone really cares, no drambo or change the script.

    Edit: should be fixed in a future version of Drambo.
    Still, converting sysex, CC, pitch wheel, .. to Notes is still a problem as a Note On with zero velocity is a note off, and most host won't record a note off on it's own.
    In the script to avoid loosing the zero, I increment all velocity by 1 up to 125, and on return decrement by 1 all values except 127, so we do loose value 126, better than loosing the zero.

Sign In or Register to comment.