MIDI Messages: Types, Numbers, and Byte Sequences
How MIDI Data Is Sent
MIDI data is transmitted as a sequence of bytes (8-bit values).
Each message consists of:
- Status byte (identifies message type and channel)
- Data bytes (parameters)
Byte Rules
- Status bytes: 128–255 (0x80–0xFF)
- Data bytes: 0–127 (0x00–0x7F)
- Most channel messages use 3 bytes
- Channel is encoded in the lower 4 bits of the status byte
MIDI Channels in Status Bytes
Status byte format for channel messages:
[ message type ][ channel ]Example:
- Channel 1 → 0
- Channel 16 → 15 (0x0F)
Note On
Purpose: Start playing a note Status byte: Decimal: 144–159 Hex: 0x90–0x9F Byte sequence:
[ Status ] [ Note Number ] [ Velocity ]Example (Note On, channel 1):
144 60 100
0x90 0x3C 0x64Description: Plays note 60 (Middle C) with velocity 100.
Note Off
Purpose: Stop playing a note Status byte: Decimal: 128–143 Hex: 0x80–0x8F Byte sequence:
[ Status ] [ Note Number ] [ Velocity ]Example:
128 60 64
0x80 0x3C 0x40Note On with Velocity 0 (Alternate Note Off)
Status byte: same as Note On Velocity: 0
144 60 0
0x90 0x3C 0x00Description: Treated identically to Note Off.
Control Change
Purpose: Change a continuous or switch parameter Status byte: Decimal: 176–191 Hex: 0xB0–0xBF Byte sequence:
[ Status ] [ Controller Number ] [ Value ]Example (CC 7 Volume):
176 7 100
0xB0 0x07 0x64Program Change
Purpose: Select preset or instrument Status byte: Decimal: 192–207 Hex: 0xC0–0xCF Byte sequence:
[ Status ] [ Program Number ]Example:
192 10
0xC0 0x0ANote: Only 2 bytes, no value byte.
Pitch Bend
Purpose: Smooth pitch control Status byte: Decimal: 224–239 Hex: 0xE0–0xEF Byte sequence:
[ Status ] [ LSB ] [ MSB ]Value range: 14-bit (0–16383), center = 8192 Example (center):
224 0 64
0xE0 0x00 0x40Channel Pressure (Channel Aftertouch)
Purpose: Pressure affecting entire channel Status byte: Decimal: 208–223 Hex: 0xD0–0xDF Byte sequence:
[ Status ] [ Pressure ]Example:
208 80
0xD0 0x50Polyphonic Key Pressure
Purpose: Pressure per individual note Status byte: Decimal: 160–175 Hex: 0xA0–0xAF Byte sequence:
[ Status ] [ Note Number ] [ Pressure ]Example:
160 60 90
0xA0 0x3C 0x5ASystem Exclusive (SysEx)
Purpose: Manufacturer-specific data Status bytes: Start: 240 (0xF0) End: 247 (0xF7) Byte sequence:
0xF0 [ Manufacturer ID ] [ Data... ] 0xF7Example:
240 67 16 76 0 247
0xF0 0x43 0x10 0x4C 0x00 0xF7MIDI Clock
Purpose: Tempo synchronization Status byte: Decimal: 248 Hex: 0xF8 Byte sequence:
248
0xF8Sent 24 times per quarter note.
Start
Purpose: Start playback Status byte: Decimal: 250 Hex: 0xFA
250
0xFAContinue
Purpose: Resume playback Status byte: Decimal: 251 Hex: 0xFB
251
0xFBStop
Purpose: Stop playback Status byte: Decimal: 252 Hex: 0xFC
252
0xFCActive Sensing
Purpose: Connection monitoring Status byte: Decimal: 254 Hex: 0xFE
254
0xFESystem Reset
Purpose: Reset all devices Status byte: Decimal: 255 Hex: 0xFF
255
0xFFSummary
MIDI communication is based on small byte sequences where the status byte defines the message type and channel, followed by one or two data bytes carrying parameters. Understanding the decimal and hexadecimal values of MIDI messages — and their byte order — is essential for low-level MIDI programming, debugging, and working with MIDI APIs such as Electra One’s Lua Extension.