MIDI NRPN
NRPN stands for Non-Registered Parameter Number. It is a MIDI mechanism that allows devices to expose more than the 128 parameters available via standard Control Change (CC) messages. NRPN allows up to 16384 parameters, each with up to 14-bit resolution (16384 steps).
Unlike RPN (Registered Parameter Number), which is standardized by the MIDI specification for a small set of universal parameters (pitch bend sensitivity, fine tuning, coarse tuning, …), NRPNs are manufacturer-specific. Each manufacturer assigns their own parameter numbers, which must be looked up in the device’s MIDI implementation chart.
Why NRPN instead of CC?
Standard CC messages have two hard limits:
- 128 parameter slots (CC 0–127), of which many are already assigned by the MIDI specification (volume, pan, sustain pedal, modulation…), leaving relatively few free slots for device-specific use.
- 7-bit resolution, each CC value ranges from 0 to 127.
NRPN addresses both constraints. Because the parameter number itself is 14 bits (encoded as MSB + LSB), a device can expose up to 16384 distinct parameters. The value sent to each parameter is also 14 bits, giving 16384 steps of resolution, useful for smooth automation of parameters like filter cutoff or LFO depth where 128 steps would produce audible stairstepping.
Message structure
An NRPN message is a sequence of four to six Control Change (CC) messages sent in order on the same MIDI channel. The sequence is identical in structure to RPN, but uses CC 98 and CC 99 instead of CC 100 and CC 101 to select the parameter.
| Msg # | CC | CC hex | Value | Purpose |
|---|---|---|---|---|
| 1 | 99 | 0x63 | NRPN MSB | High 7 bits of the parameter number |
| 2 | 98 | 0x62 | NRPN LSB | Low 7 bits of the parameter number |
| 3 | 6 | 0x06 | Data Entry MSB | High 7 bits of the value |
| 4 | 38 | 0x26 | Data Entry LSB | Low 7 bits of the value (often omitted) |
| 5 | 101 | 0x65 | RPN MSB -> Null | 7Fh : deselect active parameter |
| 6 | 100 | 0x64 | RPN LSB -> Null | 7Fh : deselect active parameter |
Computing the parameter number bytes
A 14-bit NRPN parameter number N is split into two 7-bit values:
A 14-bit NRPN parameter number is split into two 7-bit values: MSB (high byte) and LSB (low byte). This is because each MIDI byte can only carry 7 bits (values 0–127).
The split is a simple integer division and remainder by 128:
NRPN MSB = N/128 (integer division, discard remainder)
NRPN LSB = N mod 128 (remainder of the division)
For example, parameter number 200:
NRPN MSB = 200/128 = 1 (with remainder 72)
NRPN LSB = 200 mod 128 = 72
Verification: 1 × 128 + 72 = 200
In programming languages like C, Python, or JavaScript, the same calculation is written
using bitwise operators like N >> 7.
In our examples, N >> 7 is equivalent to “divide by 128” and N & 0x7F is equivalent to “mod 128”.
The arithmetic results are identical. The division form is easier to reason about without any programming background.
The formulas become :
NRPN MSB = (N >> 7) & 0x7F high 7 bits
NRPN LSB = N & 0x7F low 7 bits
For example, the parameter number 200 (0x00C8) is split into:
NRPN MSB = (200 >> 7) & 0x7F = 1 (0x01)
NRPN LSB = 200 & 0x7F = 72 (0x48)
Computing the value bytes
A 14-bit value V is split the same way:
Value MSB = (V >> 7) & 0x7F
Value LSB = V & 0x7F
For a 7-bit parameter (value range 0–127), Value MSB = V and Value LSB = 0.
For a 14-bit parameter, for example value 8192 (0x2000):
Value MSB = (8192 >> 7) & 0x7F = 64 (0x40)
Value LSB = 8192 & 0x7F = 0 (0x00)
Concrete examples - Novation Bass Station II
The Bass Station II illustrates two distinct reasons to use NRPN. The first is resolution: some parameters need more than 7 bits. The second, and more common on this device, is namespace separation: Novation uses NRPN for device-specific parameters to avoid occupying CC slots, regardless of how many values the parameter actually needs. Osc 1 waveform, for example, has only four values and could technically fit in a single CC byte, but because it is specific to the Bass Station II and not a universally meaningful continuous controller, Novation chose to express it as an NRPN. This keeps the CC space clean and semantically consistent.
All NRPN parameters on the Bass Station II share NRPN MSB = 0 (00h), so only the
LSB changes between parameters. All examples below are sent on channel 1 (status
byte B0h).
Set Osc 1 waveform (NRPN MSB=0, LSB=72) to Sawtooth
Osc 1 waveform is a 7-bit parameter with four values: 0 = Sine, 1 = Triangle,
2 = Sawtooth, 3 = Pulse. To select Sawtooth, send value 2 (02h).
B0 63 00 CC 99 (NRPN MSB) : 00h
B0 62 48 CC 98 (NRPN LSB) : 48h = 72
B0 06 02 CC 6 (Data Entry MSB): 02h = 2 (Sawtooth)
B0 26 00 CC 38 (Data Entry LSB): 00h
B0 65 7F CC 101 (RPN Null MSB) : 7Fh ─┐
B0 64 7F CC 100 (RPN Null LSB) : 7Fh ─┘ deselect
Set Osc 2 waveform (NRPN MSB=0, LSB=82) to Pulse
Same structure, different LSB (52h = 82). Value 3 = Pulse (03h).
B0 63 00 CC 99 : 00h
B0 62 52 CC 98 : 52h = 82
B0 06 03 CC 6 : 03h = 3 (Pulse)
B0 26 00 CC 38 : 00h
B0 65 7F
B0 64 7F
Set Amp Env mode (NRPN MSB=0, LSB=73) to Single trigger
Amp Env mode controls envelope retriggering behaviour: 0 = Multi, 1 = Single,
2 = Autoglide. Single trigger means the envelope does not retrigger on legato notes.
B0 63 00 CC 99 : 00h
B0 62 49 CC 98 : 49h = 73
B0 06 01 CC 6 : 01h = 1 (Single)
B0 26 00 CC 38 : 00h
B0 65 7F
B0 64 7F
Enable LFO 1 BPM sync (NRPN MSB=0, LSB=87)
Switches LFO 1 from free-running speed mode to tempo-synced mode: 0 = Speed, 1 = BPM sync.
B0 63 00 CC 99 : 00h
B0 62 57 CC 98 : 57h = 87
B0 06 01 CC 6 : 01h = 1 (BPM sync)
B0 26 00 CC 38 : 00h
B0 65 7F
B0 64 7F
Concrete examples - Elektron Digitakt
The Digitakt uses NRPN to expose parameters that either exceed the CC slot budget or
require higher resolution than 7 bits. All examples below are sent on channel 1
(status byte B0h).
Set filter frequency (NRPN MSB=1, LSB=20) to value 64
Filter frequency is a 7-bit parameter. Value 64 = 0x40. LSB is 00h.
B0 63 01 CC 99 (NRPN MSB) : 01h
B0 62 14 CC 98 (NRPN LSB) : 14h = 20
B0 06 40 CC 6 (Data Entry MSB): 40h = 64
B0 26 00 CC 38 (Data Entry LSB): 00h
B0 65 7F CC 101 (RPN Null MSB) : 7Fh ─┐
B0 64 7F CC 100 (RPN Null LSB) : 7Fh ─┘ deselect
Set filter resonance (NRPN MSB=1, LSB=21) to value 100
B0 63 01 CC 99 : 01h
B0 62 15 CC 98 : 15h = 21
B0 06 64 CC 6 : 64h = 100
B0 26 00 CC 38 : 00h
B0 65 7F
B0 64 7F
Set LFO depth (NRPN MSB=1, LSB=39) to value 8192 - 14-bit
LFO depth is a 14-bit parameter (CC MSB = 109, CC LSB = 118). Using NRPN gives the same
14-bit resolution. Value 8192 = 0x2000:
Value MSB = (8192 >> 7) & 0x7F = 64 (0x40)
Value LSB = 8192 & 0x7F = 0 (0x00)
B0 63 01 CC 99 : 01h
B0 62 27 CC 98 : 27h = 39
B0 06 40 CC 6 : 40h value MSB
B0 26 00 CC 38 : 00h value LSB
B0 65 7F
B0 64 7F
Set delay feedback (NRPN MSB=2, LSB=3) to value 90
Note the MSB changes to 02h here - delay parameters are in a different parameter page
on the Digitakt.
B0 63 02 CC 99 : 02h
B0 62 03 CC 98 : 03h
B0 06 5A CC 6 : 5Ah = 90
B0 26 00 CC 38 : 00h
B0 65 7F
B0 64 7F
Practical tips
Always send MSB before LSB. The device latches the complete parameter number only when CC 98 (NRPN LSB) arrives. Sending them out of order produces undefined behaviour.
Always send Data MSB before Data LSB. Similarly, the device applies the new value when CC 38 (Data LSB) arrives. CC 6 must have arrived first.
Null after every message. Send CC 101 = 7Fh + CC 100 = 7Fh to close the active
parameter. This prevents stray CC 6 or CC 38 messages from corrupting a parameter later.
Consult the device’s MIDI implementation chart. NRPN assignments are not transferable
between devices. The same parameter number (MSB=1, LSB=20) means “filter frequency” on
the Digitakt and something entirely different on another device.
7-bit vs 14-bit parameters. The device documentation will specify the resolution. For
7-bit parameters, CC 38 (Data LSB) is typically ignored, but send it as 00h anyway.
For 14-bit parameters, both bytes are significant.
NRPN vs CC - Quick summary
| Criteria | CC | NRPN |
|---|---|---|
| Number of parameters | Up to 128 | Up to 16384 |
| Value resolution | 7-bit (0–127) | 7-bit or 14-bit (0–16383) |
| Messages per change | 1 | 4–6 |
| Standardised across devices | Partially (GM/GM2) | No, device-specific |
| DAW/sequencer support | Universal | Variable, check your DAW |
| Real-time use (knob automation) | Good | Usable, but heavier |