OK, trying to convert this to plain English:
When sending data to control the sound of a device like the Kemper via MIDI, you would typically send it via so-called "Control Change" commands. Such a command is made up of two pieces of information (ignoring some of the finer detail like MIDI channel...):
- a "controller number" - this identifies what parameter you want to change, e.g. the number 7 stands for volume
- a "controller value" - this is the value you want to set the parameter to
Both of these allow values from 0 to 127.
Simple enough: set controller #7 to 64 - means that you set your volume to roughly 50% - OK so far?
Two problems with this:
- there are only 128 controller numbers available - if you have more parameters you want to control, you're SOOL...
- with only 128 values per parameter, you can't be very fine-grained in setting your parameters. Setting EQ frequencies with only 128 values is a bit rough...
The answer to this are so-called NRPNs "non-registered parameter numbers". Non-registered means that every manufacturer can use their own number scheme to allocate numbers to parameters of their device.
With NRPNs, you have 16384 different controller numbers instead of just 128 - should give us enough to play with. Also, you have values from 0 to 16383 for your parameter values as well - better for setting higher resolution parameters.
So far, so good - now Kemper can define all their 16000+ parameters and allow us to set them in high resolution. But how to communicate this to the device? The problem is that due to technical restrictions, MIDI can generally only transmit values from 0 to 127 - that's 7 bits (digits of 0 or 1) in digital-speak. To express numbers up to 16383, you need 14 bits - coincidentally, that's exactly two chunks of 7 bits.
So the funky thing the engineers have come up with is to break up the information into chunks of 7 bits and send them via "classic" control change commands . This means that in order to send a single parameter change via NRPN, you will need to send four control change commands:
- two to tell the Kemper which parameter you want to change
- two to tell it what value you want to change it to
There are specific MIDI commands to do that:
- First, send two commands to define the parameter number - CC 99 and CC 98
- Next, use two commands to send the actual value - CC6 and CC38
Each of these four commands sends part of the overall message; once the last message has been sent, the Kemper will execute the change.
Now - how to get to the values that you need to send?
Each of these large numbers from 0 to 16383 needs to be broken up into two parts, the "most significant bits" (MSB - the left half) and the "least significant bits" (LSB - the right half) - a binary number like 00100101001001 is broken up into MSB 0010010 and LSB 1001001. In the decimal world , this would be the number 2377 broken down into MSB 18 and LSB 73. There are tools and websites that help you make that calculation, e.g. the MIDI byte calculator. But you can also calculate the values yourself:
- MSB: divide the value by 128, keep only the result before the decimal point
- LSB: subtract MSB*128 from the original value
Typically, these values need to be sent in the sequence "MSB first, then LSB".
So, for a specific example, let's try to set the NRPN with the number 1111 to the value 2222. Using the calculator, 1111 breaks down to 8 / 87 and 2222 results in 17 / 46. So the commands to send are (in this sequence)
- CC99, value 8 (NRPN MSB)
- CC98, value 87 (NRPN LSB)
- CC6, value 17 (Data Entry MSB)
- CC38, value 46 (Data Entry LSB)
Now your parameter 1111 should be set to 2222 - all done!
Hope this helps!
Cheers,
Torsten