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.

NRPN Support in Loopy Pro

Hello Loopy Pro Developers,

After a few days of struggling to configure Loopy Pro to talk to my Allen & Heath CQ‑18T mixer, along with buying and playing around with bunch of third-party apps (MIDI Designer, MIDIFire, MIDIFlow and StreamByter - half of which didn't work for me 🙄), I’ve finally found a workable solution for my setup but this could have been much easier with some additions to Loopy:

1. Full NRPN Support

I discovered Loopy can send NRPN MIDI messages by using the built-in Custom option, but it can't 'Learn' using NRPN messages since they're sent as a sequence of CC messages (CC99/98/6/38) and Loopy only picks up one CC at random.

If you could add full direct NRPN support (such as the ability to MIDI Learn and feedback NRPN), that would make connecting to NRPN devices a breeze and eliminate the need for the below (in my case anyway).

2. Per-Device MIDI Input Filtering

Even after configuring MIDIFire (with the help of StramByter) to convert the NRPN messages to CC, I still have issues learning the correct MIDI message because Loopy listens to all connected MIDI devices indiscriminately, including my CQ‑18T, which spams NRPNs and interferes with the CC messages I want from MIDIFire. As far as I can tell, there’s currently no way to disable or filter individual MIDI inputs inside Loopy. It would be great if you could add this as an option. I imagine it could have some other benefits as well.

3. Feedback to MIDI plugins (such as StreamByter)

To keep things simple and clean, I tried using StreamByter directly in Loopy (rather than relying on external apps such as MIDIFire), but when I map a control to StreamByter, it seems Loopy doesn't send feedback to that plugin (despite the Feedback Enabled toggle being turned on).

If you can make this possible it will eliminate the need for other apps to be running in the background and I can just use Stream Byter as a plugin in Loopy.

Thank you guys for the amazing work on Loopy. Keep up the good work!


For anybody in a similar situation, this is how I ended up getting it to work eventually.

  1. Install MIDIFire and set up these two signal chains:

Chain 1: CQ18T (source) >> Event Monitor (optional - but useful for testing) >> Stream Byter - NRPN to CC (see code to install below) >> Event Monitor (optional - but useful for testing) >> Loopy Pro (destination)

Chain 2: Loopy Pro (source) >> Event Monitor (optional - but useful for testing) >> Stream Byter - CC to NRPN (see code to install below) >> Event Monitor (optional - but useful for testing) >> CQ18T (destination)

  1. Use MIDI Learn in Loopy Pro and adjust something on the CQ18T (or whatever NRPN device you're using), but make sure it picks up the Virtual MIDI In (not any other devices which might populate if they reach Loopy first - you might have to do it quite a few times to get the right one).

  2. (optional) Inside Loopy, go to Menu > Control Settings > Virtual MIDI In (under MIDI Devices) and set the Latency Compensation to 200 ms. I found some of the controls from Loopy to the CQ are super choppy without this.

Below is the code I used for Stream Byter. This should work for all Allen & Heath CQ series mixers but if you're using a different NRPN device, you will almost certainly have to modify the code to suit. ChatGPT will be your friend here ;)

Code for Stream Byter - NRPN to CC module in MIDIFire


# NRPN-to-CC conversion for CQ Mixer # Levels: MSB 0x40 → Ch7, CC102 to CC117 # Pans: MSB 0x50 → Ch8, CC102 to CC117 # Mutes: MSB 0x00 → Ch9, CC102 to CC117 IF M0 == 0XB0 # Identify MSB IF M1 == 0X63 IF M2 == 0X40 ASS K0 = 1 # Level ASS K2 = 0 ASS K4 = 0 ELSE IF M2 == 0X50 ASS K0 = 0 ASS K2 = 1 # Pan ASS K4 = 0 ELSE IF M2 == 0X00 ASS K0 = 0 ASS K2 = 0 ASS K4 = 1 # Mute ELSE ASS K0 = 0 ASS K2 = 0 ASS K4 = 0 END END END BLOCK END # LSB (shared across all) IF M1 == 0X62 ASS K1 = M2 BLOCK END # Handle LEVEL and PAN via CC6 IF M1 == 0X06 IF K0 == 1 IF K1 == 0X00 SND 0XB6 0X66 M2 # CC102 BLOCK END IF K1 == 0X01 SND 0XB6 0X67 M2 BLOCK END IF K1 == 0X02 SND 0XB6 0X68 M2 BLOCK END IF K1 == 0X03 SND 0XB6 0X69 M2 BLOCK END IF K1 == 0X04 SND 0XB6 0X6A M2 BLOCK END IF K1 == 0X05 SND 0XB6 0X6B M2 BLOCK END IF K1 == 0X06 SND 0XB6 0X6C M2 BLOCK END IF K1 == 0X07 SND 0XB6 0X6D M2 BLOCK END IF K1 == 0X08 SND 0XB6 0X6E M2 BLOCK END IF K1 == 0X09 SND 0XB6 0X6F M2 BLOCK END IF K1 == 0X0A SND 0XB6 0X70 M2 BLOCK END IF K1 == 0X0B SND 0XB6 0X71 M2 BLOCK END IF K1 == 0X0C SND 0XB6 0X72 M2 BLOCK END IF K1 == 0X0D SND 0XB6 0X73 M2 BLOCK END IF K1 == 0X0E SND 0XB6 0X74 M2 BLOCK END IF K1 == 0X0F SND 0XB6 0X75 M2 BLOCK END END IF K2 == 1 IF K1 == 0X00 SND 0XB7 0X66 M2 BLOCK END IF K1 == 0X01 SND 0XB7 0X67 M2 BLOCK END IF K1 == 0X02 SND 0XB7 0X68 M2 BLOCK END IF K1 == 0X03 SND 0XB7 0X69 M2 BLOCK END IF K1 == 0X04 SND 0XB7 0X6A M2 BLOCK END IF K1 == 0X05 SND 0XB7 0X6B M2 BLOCK END IF K1 == 0X06 SND 0XB7 0X6C M2 BLOCK END IF K1 == 0X07 SND 0XB7 0X6D M2 BLOCK END IF K1 == 0X08 SND 0XB7 0X6E M2 BLOCK END IF K1 == 0X09 SND 0XB7 0X6F M2 BLOCK END IF K1 == 0X0A SND 0XB7 0X70 M2 BLOCK END IF K1 == 0X0B SND 0XB7 0X71 M2 BLOCK END IF K1 == 0X0C SND 0XB7 0X72 M2 BLOCK END IF K1 == 0X0D SND 0XB7 0X73 M2 BLOCK END IF K1 == 0X0E SND 0XB7 0X74 M2 BLOCK END IF K1 == 0X0F SND 0XB7 0X75 M2 BLOCK END END BLOCK END # Handle MUTES via CC38 (Data Entry LSB) IF M1 == 0X26 IF K4 == 1 IF K1 == 0X00 SND 0XB8 0X66 M2 BLOCK END IF K1 == 0X01 SND 0XB8 0X67 M2 BLOCK END IF K1 == 0X02 SND 0XB8 0X68 M2 BLOCK END IF K1 == 0X03 SND 0XB8 0X69 M2 BLOCK END IF K1 == 0X04 SND 0XB8 0X6A M2 BLOCK END IF K1 == 0X05 SND 0XB8 0X6B M2 BLOCK END IF K1 == 0X06 SND 0XB8 0X6C M2 BLOCK END IF K1 == 0X07 SND 0XB8 0X6D M2 BLOCK END IF K1 == 0X08 SND 0XB8 0X6E M2 BLOCK END IF K1 == 0X09 SND 0XB8 0X6F M2 BLOCK END IF K1 == 0X0A SND 0XB8 0X70 M2 BLOCK END IF K1 == 0X0B SND 0XB8 0X71 M2 BLOCK END IF K1 == 0X0C SND 0XB8 0X72 M2 BLOCK END IF K1 == 0X0D SND 0XB8 0X73 M2 BLOCK END IF K1 == 0X0E SND 0XB8 0X74 M2 BLOCK END IF K1 == 0X0F SND 0XB8 0X75 M2 BLOCK END END BLOCK END END

Code for Stream Byter - CC to NRPN module in MIDIFIre

# CC-to-NRPN conversion for CQ Mixer
# LEVELS (Channel 7 → MSB 0x40, CC6)
IF M0 == 0XB6
  IF M1 >= 0X66
    IF M1 <= 0X75
      MAT I0 = M1 - 0X66
      SND 0XB0 0X63 0X40 # MSB
      SND 0XB0 0X62 I0 # LSB
      SND 0XB0 0X06 M2 # Data Entry MSB (value)
      SND 0XB0 0X26 0X00 # Data Entry LSB cleared
      BLOCK
    END
  END
END

# PANS (Channel 8 → MSB 0x50, CC6)
IF M0 == 0XB7
  IF M1 >= 0X66
    IF M1 <= 0X75
      MAT I0 = M1 - 0X66
      SND 0XB0 0X63 0X50
      SND 0XB0 0X62 I0
      SND 0XB0 0X06 M2
      SND 0XB0 0X26 0X00
      BLOCK
    END
  END
END

# MUTES (Channel 9 → MSB 0x00, CC38)
IF M0 == 0XB8
  IF M1 >= 0X66
    IF M1 <= 0X75
      MAT I0 = M1 - 0X66
      SND 0XB0 0X63 0X00
      SND 0XB0 0X62 I0
      SND 0XB0 0X26 M2 # Data Entry LSB = value
      SND 0XB0 0X06 0X00 # Clear MSB
      BLOCK
    END
  END
END

Comments

Sign In or Register to comment.