MIDI message decoder and hex converter
Paste MIDI bytes and read what they say, or build a message and see its bytes in hex, decimal and binary. It understands notes, Control Change, Program Change, pitch bend, pressure, and the clock and transport messages. Nothing is uploaded.
Separate bytes with spaces or commas. A 0x prefix or a trailing h is fine. Several messages in a row are read one after another.
Build a message
Read a MIDI message by hand
- Look at the first byte. If it is 80 or above, it is a status byte.
- Its first hex digit is the message type: 9 is Note On, B is Control Change, C is Program Change, E is Pitch Bend.
- Its second hex digit is the channel, counted from 0, so 0 is channel 1 and F is channel 16.
- Read the data bytes that follow. Each is 00 to 7F, which is 0 to 127.
The first digit says what kind of message it is, and the second says which channel.
Every MIDI message type
| Status (hex) | Message | Data bytes | What they are |
|---|---|---|---|
| 8n | Note Off | 2 | Note number, release velocity |
| 9n | Note On | 2 | Note number, velocity. Velocity 0 means note off |
| An | Polyphonic Pressure | 2 | Note number, pressure |
| Bn | Control Change | 2 | Controller number, value |
| Cn | Program Change | 1 | Program number |
| Dn | Channel Pressure | 1 | Pressure |
| En | Pitch Bend | 2 | Fine half, coarse half of a value from 0 to 16383 |
| F0 ... F7 | System Exclusive | Any number | Maker-specific data, closed by F7 |
| F2 | Song Position Pointer | 2 | Position, in sixteenth notes |
| F3 | Song Select | 1 | Song number |
| F8 | MIDI clock | 0 | Sent 24 times for every quarter note |
| FA, FB, FC | Start, Continue, Stop | 0 | Transport |
| FE | Active Sensing | 0 | A keep-alive some devices send |
| FF | System Reset | 0 | Returns a device to its power-on state |
The n is the channel digit, 0 to F. Statuses 8 to E carry a channel, and the F statuses belong to the whole connection.
Know about running status
When several messages of the same type and channel follow each other, a device may send the status byte once and then only the data bytes. That is running status, and it is why a stream can show 90 3C 64 followed by 40 64 with no second 90. The decoder reads such a stream and marks the messages it filled in. A data byte with no status in front of it belongs to the last status that was sent.
Send the message you built
In Chrome, Edge and Firefox, the builder can send its message to any MIDI output the computer has: a synth, an interface, or a virtual cable to another app. On a Mac that cable is the IAC Driver, and the IAC Driver page turns it on in four clicks. Sending one message by hand is the quickest test of whether a device is listening. To watch what comes back from a device, use the MIDI tester.
Put a message on a button
InputConfig, the free Mac app I make, sends notes, Control Change, pitch bend, Program Change and the transport messages from a game controller button, a key or a foot pedal, through its own virtual MIDI port, and it turns the same messages coming in from a MIDI device into keyboard shortcuts. Once you can read a message, you can bind it. MIDI output and MIDI to keystroke on a Mac have the steps.
Questions
How do I read MIDI hex bytes?
The first byte is the status: its first digit is the message type and its second is the channel, counted from 0. The bytes after it are data. 90 3C 64 is Note On, channel 1, note 60, velocity 100.
What is 90 3C 64 in MIDI?
A Note On for middle C at velocity 100 on channel 1. 90 is Note On on channel 1, 3C is 60 in decimal and 64 is 100 in decimal.
How do I convert a MIDI CC to hex?
Write B, then the channel minus one as a hex digit, then the controller number and the value in hex. Volume at 127 on channel 1 is B0 07 7F. The builder on this page does it for you.
What does F8 mean in MIDI?
MIDI clock. Twenty-four of them are sent for every quarter note. FA is Start, FB is Continue and FC is Stop.
Why are MIDI data bytes never above 7F?
A byte with its top bit set, 80 and above, is always a status byte, so data bytes are limited to 0 through 7F, which is 0 through 127.
Can this page send a MIDI message?
Yes, in Chrome, Edge and Firefox. Press Send to a MIDI output, allow MIDI, pick an output, and the Send button sends the message you built. Safari does not offer MIDI to web pages.
Related
Free. macOS 14 or later. No account, nothing leaves your Mac. Open source on GitHub.
Updated