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:

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:

  1. A new non-real-time status byte arrives, updating or resetting the buffer.
  2. 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.

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.

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.