Skip to content

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 0x64

Description: 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 0x40

Note On with Velocity 0 (Alternate Note Off)

Status byte: same as Note On Velocity: 0

144 60 0
0x90 0x3C 0x00

Description: 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 0x64

Program Change

Purpose: Select preset or instrument Status byte: Decimal: 192–207 Hex: 0xC0–0xCF Byte sequence:

[ Status ] [ Program Number ]

Example:

192 10
0xC0 0x0A

Note: 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 0x40

Channel Pressure (Channel Aftertouch)

Purpose: Pressure affecting entire channel Status byte: Decimal: 208–223 Hex: 0xD0–0xDF Byte sequence:

[ Status ] [ Pressure ]

Example:

208 80
0xD0 0x50

Polyphonic 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 0x5A

System Exclusive (SysEx)

Purpose: Manufacturer-specific data Status bytes: Start: 240 (0xF0) End: 247 (0xF7) Byte sequence:

0xF0 [ Manufacturer ID ] [ Data... ] 0xF7

Example:

240 67 16 76 0 247
0xF0 0x43 0x10 0x4C 0x00 0xF7

MIDI Clock

Purpose: Tempo synchronization Status byte: Decimal: 248 Hex: 0xF8 Byte sequence:

248
0xF8

Sent 24 times per quarter note.

Start

Purpose: Start playback Status byte: Decimal: 250 Hex: 0xFA

250
0xFA

Continue

Purpose: Resume playback Status byte: Decimal: 251 Hex: 0xFB

251
0xFB

Stop

Purpose: Stop playback Status byte: Decimal: 252 Hex: 0xFC

252
0xFC

Active Sensing

Purpose: Connection monitoring Status byte: Decimal: 254 Hex: 0xFE

254
0xFE

System Reset

Purpose: Reset all devices Status byte: Decimal: 255 Hex: 0xFF

255
0xFF

Summary

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.

Made with 🩶 in the EU · © 2019–2026 Electra One