note

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:

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 #CCCC hexValuePurpose
1990x63NRPN MSBHigh 7 bits of the parameter number
2 980x62NRPN LSBLow 7 bits of the parameter number
3 60x06Data Entry MSBHigh 7 bits of the value
4 380x26Data Entry LSBLow 7 bits of the value (often omitted)
51010x65RPN MSB -> Null7Fh : deselect active parameter
61000x64RPN LSB -> Null7Fh : 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

CriteriaCCNRPN
Number of parametersUp to 128Up to 16384
Value resolution7-bit (0–127)7-bit or 14-bit (0–16383)
Messages per change14–6
Standardised across devicesPartially (GM/GM2)No, device-specific
DAW/sequencer supportUniversalVariable, check your DAW
Real-time use (knob automation)GoodUsable, but heavier