Questions

MIDI messages cheat sheet: every type, status byte and range

Download InputConfig on the Mac App StoreInputConfig is completely free on the Mac App Store. You don't have to make an account, there are no subscriptions, and nothing is locked. Optimized for Apple silicon.

A MIDI 1.0 message is a status byte, which says what the message is, followed by zero, one or two data bytes. There are seven channel messages, from Note Off at 80 hex to Pitch Bend at E0, each carrying its channel in the last digit, and a set of system messages from F0 to FF that have no channel at all. The tables below cover every one of them, with the ranges each data byte takes, and each row links to the page on this site that explains that message in depth.

The values come from the MIDI Association's own summary of MIDI 1.0 messages and its Control Change list, which I read on October 27, 2026. I make InputConfig, a free Mac app that reads and sends MIDI, so one table says which of these messages it handles.

On this page: 11 sections
  1. Steps
  2. Tell a status byte from a data byte
  3. Read the channel messages
  4. Know the channel mode messages
  5. Read the system messages
  6. Look up the CC numbers worth knowing
  7. See what InputConfig reads and sends
  8. If a message is not what you expected
  9. Go deeper on one message
  10. The short version
  11. Questions

Steps

  1. Read the first byte of the message in hex.
  2. If it is 80 to EF, the first digit names the message and the second digit is the channel, 0 for channel 1 up to F for channel 16.
  3. If it is F0 to FF, it is a system message with no channel, so look it up in the system table.
  4. Read the data bytes that follow, each from 0 to 127, using the channel table.
  5. For a Control Change, look the controller number up in the CC table.

Tell a status byte from a data byte

Every byte in MIDI 1.0 is either a status byte or a data byte, and the top bit decides which. In the MIDI Association's table, every status byte is written starting with a 1 in binary and every data byte with a 0.

  • Status bytes. 80 to FF hex, 128 to 255. They start a message.
  • Data bytes. 00 to 7F hex, 0 to 127. That is why almost every value in MIDI stops at 127.
  • The channel. In a channel message the second hex digit is the channel, 0 to F, which apps show as channels 1 to 16. So 90 is Note On on channel 1 and 9F is Note On on channel 16.
  • 14-bit values. When 128 steps are not enough, two data bytes join: the fine half, the LSB, and the coarse half, the MSB. Together they run from 0 to 16383, and Pitch Bend puts its center at 8192, 2000 hex.

A byte of 128 or more starts a message, and a byte under 128 carries a value. MIDI channels and MSB and LSB go further on both.

Read the channel messages

These seven carry the music: notes, pressure, knobs, patch changes and the pitch wheel. The status column is hex, with the low digit set by the channel.

MessageStatus (hex)Data byte 1Data byte 2More
Note Off80 to 8FNote number, 0 to 127Release velocity, 0 to 127note numbers
Note On90 to 9FNote number, 0 to 127Velocity, 0 to 127 (0 acts as Note Off)velocity
Polyphonic key pressureA0 to AFNote number, 0 to 127Pressure, 0 to 127aftertouch
Control ChangeB0 to BFController, 0 to 119Value, 0 to 127CC list
Program ChangeC0 to CFProgram, 0 to 127Noneprogram change
Channel pressureD0 to DFPressure, 0 to 127Noneaftertouch
Pitch BendE0 to EFFine half (LSB), 0 to 127Coarse half (MSB), 0 to 127pitch bend

A Note On with a velocity of 0 counts as a Note Off, which the MIDI Association's own Arduino guide uses to end a note. The Control Change controller number stops at 119 because 120 to 127 are taken by the channel mode messages below. Pitch Bend's range in semitones is not in the message at all: the receiver decides it, and the MIDI table notes it can be set with RPN 0. Program Change and channel pressure carry one data byte, and the other five carry two.

Know the channel mode messages

Channel mode messages use the Control Change status byte, B0 to BF, with controller numbers 120 to 127. They change how the channel behaves rather than how it sounds.

ControllerNameWhat it does
120All Sound OffSilences every voice at once
121Reset All ControllersPuts controllers back to their default state
122Local Control0 is off, 127 is on: whether the keys play the synth's own sound
123All Notes OffReleases every held note
124 and 125Omni Mode Off and OnWhether the device listens on one channel or all of them
126 and 127Mono Mode On and Poly Mode OnOne note per channel, or chords

The MIDI Association's list notes that 124 to 127 also turn all notes off. A panic button is mostly CC 123 and CC 120 sent on all 16 channels. MIDI panic lists the exact bytes.

Read the system messages

System messages start with F and carry no channel, so every device on the cable may read them. F0 to F7 are system common messages and F8 to FF are real-time ones, the only messages allowed in the middle of a SysEx message.

Status (hex)MessageDataMore
F0System ExclusiveMaker ID, then any number of data bytes, until F7SysEx
F1MIDI Time Code quarter frameOne byte: a piece of the time code
F2Song Position PointerTwo bytes: a 14-bit count of beats from the start, where a beat is 6 clocks
F3Song SelectOne byte: which song or sequence
F6Tune RequestNone. Asks analog synths to tune their oscillators
F7End of ExclusiveNone. Ends a SysEx message
F8Timing ClockNone. Sent 24 times per quarter noteMIDI clock
FA, FB, FCStart, Continue, StopNoneMIDI clock
FEActive SensingNone. Optional, at least every 300 ms once a device starts sending it
FFResetNone. Puts receivers back to their power-up state

F4, F5, F9 and FD are undefined. Clock, Start and Stop are system messages, so they never carry a channel. For SysEx dumps and the apps that send them, see the SysEx librarian for Mac page.

Look up the CC numbers worth knowing

Many of the 120 Control Change numbers are left undefined, but a few have names in the MIDI standard that synths and apps follow. These are from the MIDI Association's Control Change list.

CCNameMore
0 and 32Bank Select, MSB and LSBMSB and LSB
1Modulation wheelCC list
2Breath controller
4Foot controller
6 and 38Data Entry, MSB and LSBNRPN and RPN
7Channel Volume
10Pan
11Expression
64Sustain (damper) pedal: 0 to 63 off, 64 to 127 onsustain pedal
65, 66, 67Portamento, Sostenuto and Soft pedal, on or off
98 and 99NRPN number, LSB and MSBNRPN and RPN
100 and 101RPN number, LSB and MSBNRPN and RPN

Controllers 32 to 63 are the fine halves, the LSBs, of controllers 0 to 31, which is how Bank Select becomes CC 0 plus CC 32. CC 64 is a switch, so any value from 64 up means the pedal is down. The MIDI CC list lists every number.

See what InputConfig reads and sends

InputConfig turns MIDI from a keyboard, pad controller or DAW into keys, clicks, the Mac's volume and more, and it sends MIDI from a game controller or a keyboard through a virtual port named InputConfig. Here is the honest list, message by message.

MessageBind as an inputSend as an output
Note On and OffYes, as a held buttonYes, at the velocity set in the row
Control ChangeYes, as a switch, a dial or a turnYes, a fixed value or a stick or trigger position
Pitch BendYes, plus and minus like a stickYes, from a stick axis or a button
AftertouchYesNo
Program ChangeYes, and it can activate a presetYes
Start, Continue, StopYesYes
Timing ClockNoNo
System ExclusiveNoNo
NRPN and RPNNoNo, it sends single messages

Two details trip people up. Buttons are not velocity sensitive, so each MIDI Note output plays at the velocity set in its row, from 1 to 127, and a trigger on CC 11 is the way to get dynamics. And a knob in Switch mode fires once the value passes halfway, which turns a sustain pedal into an on and off switch.

InputConfig's Live Visualizer in its MIDI view with the MIDI: Knob Deck preset, showing a keyboard, dials and the last messages.
Figure 1. The Live Visualizer names each knob by its CC number, so CC 7, 10, 64, 71 and 1 here read straight off the table above.
InputConfig's editor showing D-pad rows that each send a Program Change, one with a Bank Select before it.
Figure 2. CC 0 and Program Change working together. D-pad up sends Bank Select, then a Program Change, from one press.

If a control sends a note, a CC, pitch bend or a Program Change, InputConfig can bind it. MIDI to keystroke and MIDI output cover the setup.

If a message is not what you expected

Most surprises come from numbering, not from broken gear. Climb this ladder, smallest step first:

  1. Check the channel count. The byte says 0 to 15 and the app says 1 to 16. A device on channel 10 sends 99 for a Note On.
  2. Check the program count. The message carries 0 to 127, and many patch lists show 1 to 128, so patch 1 is sent as 0.
  3. Check for a hidden Note Off. A Note On with velocity 0 ends the note, so a log full of Note Ons can still be releasing keys.
  4. Decode the raw bytes. Paste them into the MIDI message decoder, or watch them arrive in the MIDI tester.

Off by one is the most common MIDI bug there is.

Go deeper on one message

Each page here takes one row of the tables and explains it with examples. If you are new to all of it, start with what MIDI is.

The short version

  • Status first. A byte of 80 hex or more starts a message, and the bytes after it are values from 0 to 127.
  • Channel messages. 80 to EF, with the channel in the last digit.
  • System messages. F0 to FF, with no channel: SysEx, clock, Start, Stop and the rest.
  • Big numbers. Two data bytes make 0 to 16383, as in Pitch Bend.

Read the first digit of the status byte and you know what kind of message it is.

Questions

How many MIDI message types are there?

MIDI 1.0 has seven channel messages (Note Off, Note On, polyphonic pressure, Control Change, Program Change, channel pressure and Pitch Bend), the channel mode messages on CC 120 to 127, and the system messages from F0 to FF.

What is a MIDI status byte?

The first byte of a message, from 80 to FF hex. It says what the message is and, for channel messages, which of the 16 channels it is on.

What is the difference between CC and NRPN?

A CC is one message with a controller number and a value from 0 to 127. An NRPN picks a parameter with CC 99 and 98 and sets it with Data Entry on CC 6 and 38, so one change takes three or four messages.

Which MIDI messages does InputConfig support?

It binds notes, Control Change, pitch bend, aftertouch, Program Change and Start, Continue and Stop, and sends notes, Control Change, pitch bend, Program Change and the transport. It does not handle clock, SysEx or NRPN.

Is MIDI clock a channel message?

No. Timing Clock, F8, is a system real-time message with no channel, sent 24 times per quarter note.

This page in other languages: Deutsch, Español, Français, Italiano, 日本語, 한국어, Polski, Português, Русский, ไทย, 繁體中文, 简体中文

Download InputConfig on the Mac App StoreCompletely free. You don't have to make an account, there are no subscriptions, and nothing is locked. Optimized for Apple silicon. Open source on GitHub.

Updated