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.
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.
- 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)
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).
(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
Just by way of clarification, you don't have to MIDI Learn controls. You can set them up specifically either by tapping the message while in MIDI learn, or in Control Settings > Global or Current Project profiles.
Upvote, and optionally add comments here:
https://roadmap.loopypro.com/feature-requests/p/implement-14-bit-midi-support-for-high-resolution-parameter-control
and possibly here (contains useful info in any case):
https://roadmap.loopypro.com/feature-requests/p/nrpn-msb-lsb-messages
To make things even easier, I exported my scene from MIDIFire. Now for Step 1. just install MIDIFire, then save and open this scene file on your device.
https://drive.google.com/drive/folders/1QpvsknLmaGFMMBeZLvgn6NRvskOE_mAQ?usp=drive_link
(You’ll still have to do steps 2 and 3 above)