Talk to other MIDI Designer users about MIDI Designer, iOS MIDI and related topics. Or share layouts, pages, and ideas.

Also check out the Facebook Group.

Of course, if you want to send us an email, feel free.

MIDI Designer
Design your perfect MIDI controller for iPad, iPhone and iPod touch.
NRPN / HiRes CC oddness - MIDI Designer Q&A

NRPN / HiRes CC oddness

+1 vote
asked Jan 30, 2019 in Advanced by noiseboyuk (790 points)
edited Jan 31, 2019 by noiseboyuk
Great, thanks for all your recent shares!  Just to clarify on the layouts you have posted recently - They work as emulators of the actual hardware when used with Omnisphere and they will work to control the hardware synths as well?
Yes - I don't have the hardware to test on, but should be the case as I'm mapping from the hardware midi implementation tables.  I suppose they're primarily designed to be a substitute for the hardware itself with Omni.

A couple more coming shortly.
I didn't read this whole post yet, but in general, either it's the normal way, or the LSB is flipped. Aside from that, occasionally you're totally out of luck, but it's pretty rare.

Random insight: 14-bit CCs are exactly like NRPNs in that they split the value over two bytes. Only low-value CCs can be made 14-bit. Luckily everything I know about MIDI can be shown by creating controls in MD and watching the log.

So... it looks like you're sorted with Edit 2?
Yes thanks Dan, it all just worked when I stopped trying to be too clever and realised you use regular CCs not NRPNs.  Somewhere there must be a master list of what LSB is associated with the MSB in HiRes mode as I think it's cast in stone for everyone, but I couldn't find it.  Moog list both in their manual though, so it was no issue.  The weird thing is knowing you don't have to enter the LSB at all, it just works.  But you do have to remember to steer clear of the LSB for any other control.
So in the 14-bit CC case there's a direct relationship between the first message and the second, but in NRPN there's no way to know what the LSB is for a particular MSB. Manufacturers can combine as they wish. When you say, "you don't have the enter the LSB at all" you mean for... 14-bit cc or nrpn hi-res?
Yes, I was talking about HiRes.

So having done a little more research and testing, here's my best understanding (bear in mind I'm absolutely still finding my feet with all this, don't trust my word for any of it!)


This uses fixed Midi CCs to have a high range of controllers and numerical values

MSB - CC99
LSB - CC98
Parameter Value (used in 128 mode) - CC6
Fine detail parameter value (additionally used in 16K mode) - CC38

So for this, all the CCs are set in stone.  As far as MDP goes, you go into NRPN mode (if any of the numerical values are over 128 it's likely all using the NRPN 0-16K mode) enter the MSB and LSB which is the NRPN value.  Often this is written as a single number, and you need to divide it up into an MSB and LSB - MSB is counted in blocks of 128, LSB is the remainder.  If your NRPN number is 121, MSB=0, LSB =121.  If the NRPN number is 131, MSB=1, LSB=3 (128x1 + 3 = 131). 419 is MSB=3, LSB=35 (128x3 + 35) etc

HiRes Midi CC

These are separate pairs of midi CCs.  MSB is the lower number, LSB the higher.  I believe these pairs are fixed and are 32 apart.  Here's the pairs that the Moog Voyager uses

1 (33)
2 (34)
3 (35)
4 (36)
5 (37)


To use in MDP, you go into Control Change mode and set the 14 bit switch.  Then just enter the CC number of the MSB, the allocation of the LSB is automatic and you don't need to do anything.

The good news is MDP handles both happily!
Perfect. So when I set out to implement NRPN and all that in MIDI Designer Pro 2, I expected that the CoreMIDI API would handle it all. In fact, it handled NONE of it. It gives me bytes and expects bytes. Everything else, both the UI that make this comprehensible to you, and the math that converts movements to MIDI values. With 14-bit CC, a user got in touch in 2013 or so and insisted that I implement this. I was like, “explain it to me” and that turned into that feature. But I  digress....

AFAIK, while the values that make an NRPN an NRPN are fixed, the variable bits are not set in stone, which means you get 16 x 128 x 128 addresses instead of 16 x 128 for regular CC. Ironically, for 14-bit CC you get way less, something like only 16 x 32 or something. Then... both of these give 14-bit granularity.

So yes, your understanding and breakdown is awesome.
Good stuff!  It would save a small bit of maths if we could enter a NRPN number like 419 just as 419, and MDP translated it into MSB and LSB.  Far from vital, just a nicety if the UI allowed it somehow - I realise that keeping the UI uncluttered would be the hard bit!
Have you seen the MIDI Byte Calculator?

Hint: it's ours.
Note: I avoided the UX problem of where to put it.