Introduction to MIDI Messages
Since its release in 1983, MIDI (Musical Instrument Digital Interface) has become the global standard for electronic instrument communication. This article, based on the official MMA MIDI 1.0 specification, provides a systematic introduction to the complete MIDI message system.
1. MIDI Message Categories
The MIDI 1.0 specification divides messages into two major categories: Channel Messages and System Messages. Channel Messages travel on 16 logical channels and only affect devices assigned to that channel; System Messages are sent to all devices in the MIDI system.
2. Status Bytes and Data Bytes
MIDI messages begin with a Status Byte, followed by 0-2 Data Bytes. The MSB (D7) of a Status Byte is always 1, while Data Bytes always have MSB = 0. This design allows receivers to easily identify message boundaries.
Status Byte: 1nnn nnnn (MSB=1, n=message type/channel) Data Byte: 0ddd dddd (MSB=0, d=data)
3. Channel Voice Messages In Detail
3.1 Note On / Note Off
The most commonly used MIDI messages. Note On (status 0x9n) includes note number (0-127) and velocity (0-127). Note Off (0x8n) also includes note number and release velocity. A Note On with Velocity=0 is equivalent to Note Off (Running Status optimization).
Note On, Ch.1, Middle C, Velocity 100: 0x90 0x3C 0x64 Note Off, Ch.1, Middle C: 0x80 0x3C 0x40 (or 0x90 0x3C 0x00)
3.2 Control Change
Control Change (0xBn) is MIDI's most flexible message type, carrying a CC number (0-127) and value (0-127). CC#0-31 are 14-bit MSB controllers, CC#32-63 are their LSB counterparts. CC#64-69 are switch pedals. CC#120-127 are reserved for Channel Mode messages. See our dedicated CC article for details.
3.3 Program Change
Program Change (0xCn) carries a single data byte: the patch/preset number (0-127). Combined with Bank Select (CC#0 MSB + CC#32 LSB), it can access up to 128×128=16,384 patches. On the LdA MS-3, PC 1-100 maps directly to presets 1-100.
3.4 Pitch Bend
Pitch Bend (0xEn) is the only 14-bit Channel Voice message, combining two data bytes (LSB + MSB) for high-precision pitch control. Center position is 0x2000 (8192), range 0-16383. Sensitivity is set by the receiver via RPN 0.
4. System Messages
4.1 System Exclusive (SysEx)
SysEx (0xF0...0xF7) is MIDI's most powerful extension mechanism. Manufacturers can define arbitrary-length custom messages for patch dumps, firmware updates, device configuration, etc. SysEx messages begin with a manufacturer ID (1 or 3 bytes) and end with 0xF7. LdA uses temporary ID 0x7D.
4.2 System Real-Time
System Real-Time messages are single-byte (no data bytes) and can be inserted at any time — even in the middle of a SysEx message. Timing Clock (0xF8) is sent 24 times per quarter note for device sync. Active Sensing (0xFE) is sent every 300ms as a connection keep-alive.
| Message | Status Byte | Description |
|---|---|---|
| Timing Clock | 0xF8 | 24 ppqn |
| Start | 0xFA | Start sequence |
| Continue | 0xFB | Resume from stop |
| Stop | 0xFC | Stop sequence |
| Active Sensing | 0xFE | Keep-alive every 300ms |
| Reset | 0xFF | Reset all receivers |
5. Running Status
Running Status is a MIDI 1.0 bandwidth optimization: when sending consecutive messages of the same type, the status byte can be omitted for subsequent messages, sending only data bytes. In high-density scenarios (e.g., consecutive Note On messages), this saves approximately 33% bandwidth.
// Without Running Status: 0x90 0x3C 0x64 0x90 0x3E 0x64 0x90 0x40 0x64 // With Running Status: 0x90 0x3C 0x64 0x3E 0x64 0x40 0x64
Note: Running Status only applies to Channel Messages (0x80-0xEF). System messages and SysEx interrupt Running Status.
6. Summary
Understanding the MIDI message system is the foundation for mastering MIDI device communication. From simple Note On/Off to complex SysEx, each message type has its design intent and optimal use case. The LdA MS-3 leverages Program Change (preset switching), Control Change (loop control), and SysEx (data management) to provide a complete MIDI control experience.