MIDI Message Reference
The MIDI 1.0 channel and system messages — each status byte, its data bytes, and what it does. The byte-level reference for anyone sending or parsing MIDI in code.
| Message | Status byte | Data bytes | Meaning |
|---|---|---|---|
| Note Off | 0x8n | note, velocity | Release a note on channel n. |
| Note On | 0x9n | note, velocity | Start a note (velocity 0 acts as Note Off). |
| Poly Aftertouch | 0xAn | note, pressure | Pressure on an individual held note. |
| Control Change | 0xBn | controller, value | Move a controller — see the CC list. |
| Program Change | 0xCn | program | Select a patch/instrument (one data byte). |
| Channel Aftertouch | 0xDn | pressure | Single pressure value for the whole channel. |
| Pitch Bend | 0xEn | LSB, MSB | 14-bit bend, centred at 8192. |
| System Exclusive | 0xF0 … 0xF7 | manufacturer data | Arbitrary-length manufacturer message. |
The low nibble n of a channel status byte is the MIDI channel (0–15, shown as 1–16). Data bytes are 0–127 (high bit clear). So a middle-C note-on at full velocity on channel 1 is 0x90 0x3C 0x7F. See the CC list, GM programs and note numbers.
How to read this
A MIDI message is a status byte followed by one or two data bytes. The status byte's high nibble is the message type; the low nibble is the channel (0–15, shown to users as 1–16).
0x80 Note Off note, velocity
0x90 Note On note, velocity
0xA0 Aftertouch note, pressure
0xB0 Control Change controller, value
0xC0 Program Change program
0xD0 Channel Pressure pressure
0xE0 Pitch Bend LSB, MSB (14-bit)
Data bytes are always 0–127 — the high bit distinguishes status from data.
Notes & gotchas
- Note On with velocity 0 means Note Off. Most devices send it that way, which is why hunting for 0x80 in a stream often finds nothing.
- Pitch bend is 14-bit and centred at 8192, not 0. It is the one common message with real resolution.
- Running status lets a sender omit repeated status bytes, so a parser that assumes every message starts with one will desynchronise.
- Channel 10 is percussion under General MIDI — that is channel 9 when you are counting from zero in code, which catches everyone once.
- MIDI carries no audio and no timing of its own. Timing comes from the transport carrying it, which is why USB jitter is a real thing.