How MIDI Running Status Optimizes Bandwidth
This article examines how the Musical Instrument Digital Interface (MIDI) uses "running status" to maximize throughput across limited serial transmission channels. It covers the bandwidth constraints of the original MIDI 1.0 hardware standard, breaks down the byte structure of standard MIDI messages, explains the operational mechanics of running status, and illustrates how eliminating redundant status bytes significantly reduces latency and data overhead during complex musical performances.
The Constraint of 31.25 kbps Serial Connections
When the MIDI 1.0 specification was introduced in 1983, it established an asynchronous serial communication speed of 31,250 bits per second (31.25 kbaud). With standard serial framing (one start bit, eight data bits, and one stop bit), transmitting a single byte requires 10 bits of transmission time. Consequently, a MIDI line can transfer a maximum of 3,125 bytes per second.
While sufficient for simple passages, this bandwidth quickly becomes congested during dense musical events, such as polyphonic chord strikes, aftertouch data, pitch-bend sweeps, and continuous controller (CC) modulations. Buffer congestion in slow serial links introduces audible timing jitter and latency.
The Structure of a Standard Channel Message
Standard MIDI voice channel messages typically consist of two or three bytes:
- Status Byte: An 8-bit byte with the most
significant bit (MSB) set to
1(binary1xxxxxxx, hex0x80to0xEF). It dictates the message type (e.g., Note On, Note Off, Control Change) and the target MIDI channel (1–16). - Data Bytes: One or two subsequent 8-bit bytes with
the MSB set to
0(binary0xxxxxxx, hex0x00to0x7F). These represent message values, such as pitch, velocity, or modulation depth.
Under standard transmission, every message requires the status byte followed by its respective data bytes:
[Status Byte] [Data Byte 1] [Data Byte 2]
A standard three-byte Note On message consumes 30 bits over the wire, taking roughly 0.96 milliseconds to transmit.
How Running Status Operates
Running status is a protocol rule designed to omit redundant status bytes. Under this rule, if a MIDI transmitter generates a sequence of messages that share the exact same status byte (same command and same MIDI channel), it only transmits the status byte on the first message. For all subsequent messages of that same type, the transmitter sends only the data bytes.
The receiving device maintains a "running status buffer" in memory.
When it receives a status byte, it stores it. When it encounters
subsequent bytes that have their MSB set to 0 (data bytes),
it automatically pairs them with the stored status byte.
Running status remains active until:
- A new non-real-time status byte arrives, updating or resetting the buffer.
- A System Exclusive (SysEx) or System Common message occurs.
Note: System Real-Time messages (such as MIDI Clock,
0xF8) consist of a single byte and can be interleaved at
any point without clearing or interrupting the active running
status.
Bandwidth Savings in Practice
Running status delivers substantial performance improvements in scenarios with repetitive message types.
1. Polyphonic Chords
Playing a four-note chord typically requires four separate Note On commands.
- Without Running Status: 4 messages × 3 bytes = 12 bytes (120 bits)
- With Running Status: 1 status byte + (4 notes × 2 data bytes) = 9 bytes (90 bits)
- Bandwidth Saved: 25% reduction in transmitted data.
2. Continuous Controller and Pitch Bend Streams
Manipulating a pitch bend wheel or modulation slider generates a continuous flood of identical status bytes with fluctuating values.
- Without Running Status: Each change requires 3 bytes (1 status + 2 data).
- With Running Status: The status byte is sent once; all subsequent movements transmit only 2 data bytes.
- Bandwidth Saved: 33.3% reduction in transmitted data across the entire stream.
3. Note On with Velocity 0 as Note Off
To further leverage running status, the MIDI specification allows a
Note On command with a velocity of zero (0x00) to act as a
Note Off command. This prevents the transmitter from alternating between
Note On (0x9n) and Note Off (0x8n) status
bytes.
Because both the start and end of notes can share the same
0x9n status byte, running status can remain uninterrupted
throughout an entire sequence of musical notes, maintaining continuous
bandwidth optimization.