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.

Send sysex with dial-wheel to StreamByte - a challenge with scaling of values

I want to send a SysEx message (Dial-wheel) from LP to a MIDI device (Zoom LiveTrak L6max).
The SysEx message should adjust Time-parameter in a Delay

from the value 10: f0 52 00 00 31 13 03 00 0a 00 f7
to the value 2000: f0 52 00 00 31 13 03 00 50 0f f7

In LP, at least, this does not work with e.g.: f0 52 00 00 31 13 03 00 xx xx f7
I have to do some math in Streambyter to make it work. But how?

I have discussed this in an older thread with @espiegel123 , @wim and @uncledave but I haven't managed to create a solution with Loopy Pro with one dial-wheel and StreamByter - yet.

The closest has been @espiegel123's suggestion - which works, but I want to avoid creating more objects to achieve what I want. (Previous thread: https://forum.loopypro.com/discussion/comment/1460093#Comment_1460093 )

Suggestions for a solution?

Comments

  • I think the streambyter approach that would be simplest is to set Q0 in streambyter to have the range $10 to $2000

    Have a knob/fader in loopy pro control parameter Q0

    In streambyter, generate and send the sysex message.

    The annoying part is the math to convert the Q0 value to two seven bit bytes.

  • edited March 18

    I think this is the script

    If Load
    
    
      Set sli 1 #show sliders on load
    
    
      Alias Q0 delayTime
      Alias I0 LSB
      Alias I1 MSB
    
      Define sliderMoved M0 == F0 7D
    
      # set up sliders 
      SET delayTime delayTime $10 $2000
    End #end load section
    
    
    if sliderMoved
      Log dt delayTime
      # lsb is delayTime mod 128
      # msg delayTime/$128
      MAT LSB = delayTime % 80
      #Log LSB LSB
      MAT MSB = delayTime / 80
      #Log MSB MSB
      SEND F0 52 00 00 31 13 03 00 LSB MSB 00 F7
    end
    
    
  • edited March 18

    And in loopy pro, set the value change of a slider/knob to adjust the streambyter Q0 parameter. Note that changing the slider in manually in streambyter won’t update the loopy pro widget due to a streambyter bug.

    @OlaRos : this was simpler than I thought it would be. I forgot that Streambyter could do value conversions by setting its slider ranges.

  • @espiegel123 said:
    And in loopy pro, set the value change of a slider/knob to adjust the streambyter Q0 parameter. Note that changing the slider in manually in streambyter won’t update the loopy pro widget due to a streambyter bug.

    @OlaRos : this was simpler than I thought it would be. I forgot that Streambyter could do value conversions by setting its slider ranges.

    You need to divide by 80 to extract the MSB, not 7F. Shift right by 7 bits.

  • @uncledave said:

    @espiegel123 said:
    And in loopy pro, set the value change of a slider/knob to adjust the streambyter Q0 parameter. Note that changing the slider in manually in streambyter won’t update the loopy pro widget due to a streambyter bug.

    @OlaRos : this was simpler than I thought it would be. I forgot that Streambyter could do value conversions by setting its slider ranges.

    You need to divide by 80 to extract the MSB, not 7F. Shift right by 7 bits.

    Oops! That’s right . I’ll correct the post

  • With the wide range of this parameter, you might want to scale the input logarithmically. That makes the precision of the available values proportional to the value; finer for small values, coarser near the top. This script will do that. It creates a conversion table in the Lxx array, and looks up values to be sent. You can test it by adjusting the Knob Value in the StreamByter gui.

    #LogKnob
    # Scale a knob input to 10..2000, logarithmically.
    # Send the 14-bit value in a specific SysEx message.
    # Map the Loopy Pro knob to the StreamByter Q0 AUv3 param.
    # Q1 displays the scaled result, as sent.
    
    # Load StreamByter in a MIDI slot. Paste this in and Install Rules.
    # You can Save it for later reuse (hamburger menu in lower right). 
    # Tap the magnifier to see the actual input and output messages. 
    # Tap the "globe" icon in lower right to switch between controls 
    # and edit screen.
    
    If load
    Set Name logknb
    
    # Screen Controllers ———————————————————————————
    Alias Q0 theKnobValue
    Alias 0 indKnobValue
    Alias Q1 theScaledValue 
    Alias 1 indScaledValue
    Set Q0 Knob_Value 0 $127
    Set Q1 Scaled_Value $10 $2000
    Set Q2 +H
    Set Q3 +H
    
    Set Q4 +H
    Set Q5 +H
    Set Q6 +H
    Set Q7 +H
    
    # Initial values for sliders. Actual values saved in any preset.
    Ass Q0 = 0 $10 0 0   0 0 0 0 +P
    # Ass Q8 = 0 0 0 0   0 0 0 0 +P
    
    Set Sliderdisplay 1
    # End Screen Controllers —————————————————————————
    
    # Create conversion table in L mapping 0..127 to 10..2000 logarithmically.
    # The ratio 2000/10 = 200. 200^(1/8) is 1.939, almost 2, so we can
    # generate 8 binary steps. Uses registers in the I40 range.
    # Values are interpolated linearly in each of the 8 bands.
    Alias $2000 maxValue
    Sub FillTable
       ass I40 = 0      # store index
       ass I42 = $10    # end of band
       while I40 < $128
          ass I41 = I42         # start of band
          mat I42 = 2 * I42 # each band doubles in width
          if I42 > maxValue
             ass I42 = maxValue
          end
          mat I43 = I42 - I41       # step for this band
          ass P00 = 8               # numerator for slope calc, rounded
          ass I45 = 0               # inner loop index
          while I45 < $16
             mat I46 = P00 / $16    # rounded division
             mat LI40 = I41 + I46   # add start and store in L array
             mat I40 = I40 + 1      # next array cell
             mat P00 = P00 + I43    # next numerator
             mat I45 = I45 + 1      # next step
          end
       end
       ass L$127 = maxValue # force last value
    End
    
    # sends the SysEx message to set the value
    Sub SendValue pVal
       mat I10 = 7F & pVal      # LSB
       mat I11 = pVal / 80          # MSB
       SEND F0 52 00 00 31 13 03 00 I10 I11 00 F7
    End
    
    # initialize the logarithmic map
    FillTable
    
    End # Initialization ———————————————————————————
    
    If M0 == F0 7D 01       # handle system events
       if M3 == indKnobValue
          ass I00 = theKnobValue
          ass I00 = LI00
          SendValue I00
          ass theScaledValue = I00      # display the value sent
       end 
       if M3 == indScaledValue
          SendValue theScaledValue
       end 
    End
    
  • edited March 18

    @espiegel123 said:
    I think this is the script

    If Load
      
      
      Set sli 1 #show sliders on load
      
      
      Alias Q0 delayTime
      Alias I0 LSB
      Alias I1 MSB
      
      Define sliderMoved M0 == F0 7D
      
      # set up sliders 
      SET delayTime delayTime $10 $2000
    End #end load section
    
    
    if sliderMoved
      Log dt delayTime
      # lsb is delayTime mod 128
      # msg delayTime/$128
      MAT LSB = delayTime % 80
      #Log LSB LSB
      MAT MSB = delayTime / 80
      #Log MSB MSB
      SEND F0 52 00 00 31 13 03 00 LSB MSB 00 F7
    end
    
    

    YES, YES, YES - It really works!
    Thank You soooo much @espiegel123 and @uncledave !!
    I have been trying to find a way to control some of the parameters in the Zoom Livetrak L6max with SysEx for a long time now. Without any communication protocol I had to sniff on the usb-C port with WireShark to find out how I could communicate with the L6max mixer.

    And now …
    With your solutions @espiegel123 and @uncledave (I tried them both), I can control all part of the mixer from Loopy Pro! Thank you very much for taking the time to give me this help!

Sign In or Register to comment.