订单满 $200 免全球运费。
返回实验室

MIDI 消息入门

基础2025-01-15

MIDI(Musical Instrument Digital Interface)自 1983 年发布以来,已成为电子乐器通信的全球标准。本文基于 MMA(MIDI Manufacturers Association)官方 MIDI 1.0 规范,系统介绍 MIDI 消息的完整体系。

1. MIDI 消息分类

MIDI 1.0 规范将消息分为两大类:通道消息(Channel Messages)和系统消息(System Messages)。通道消息通过 16 个逻辑通道传输,仅影响分配到该通道的设备;系统消息则发送给 MIDI 系统中的所有设备。

通道消息 (Channel Messages)
├─ 通道语音消息 (Channel Voice)
Note On/Off, Poly Aftertouch, CC, Program Change, Channel Aftertouch, Pitch Bend
└─ 通道模式消息 (Channel Mode)
All Sound Off, Reset All Controllers, Local Control, All Notes Off, Omni/Mono/Poly
系统消息 (System Messages)
├─ 系统通用消息 (System Common)
SysEx, MTC Quarter Frame, Song Position, Song Select, Tune Request
└─ 系统实时消息 (System Real-Time)
Timing Clock, Start, Continue, Stop, Active Sensing, Reset

2. 状态字节与数据字节

MIDI 消息由状态字节(Status Byte)开始,后跟 0-2 个数据字节(Data Byte)。状态字节的最高位 (D7) 始终为 1,数据字节的最高位始终为 0。这种设计使接收设备可以轻松区分消息的开始位置。

Status Byte:  1nnn nnnn  (MSB=1, n=message type/channel)
Data Byte:    0ddd dddd  (MSB=0, d=data)

3. 通道语音消息详解

3.1 Note On / Note Off

最常用的 MIDI 消息。Note On(状态字节 0x9n)包含音符编号 (0-127) 和力度 (0-127)。Note Off(0x8n)同样包含音符编号和释键速度。Note On 中 Velocity=0 等同于 Note Off(Running Status 优化)。

Note On, Ch.1, Middle C, Velocity 100:
  0x90 0x3C 0x64

Note Off, Ch.1, Middle C:
  0x80 0x3C 0x40  (or 0x90 0x3C 0x00)

3.2 Control Change

Control Change(0xBn)是 MIDI 中最灵活的消息类型,携带 CC 编号(0-127)和值(0-127)。CC#0-31 为 14-bit MSB 控制器,CC#32-63 为对应的 LSB。CC#64-69 为开关型踏板。CC#120-127 保留给通道模式消息。详见本站 Control Change 专文。

3.3 Program Change

Program Change(0xCn)仅携带一个数据字节:音色/预设编号 (0-127)。配合 Bank Select(CC#0 MSB + CC#32 LSB),可访问最多 128×128=16,384 个音色。在 LdA MS-3 中,PC 1-100 直接对应预设 1-100。

3.4 Pitch Bend

Pitch Bend(0xEn)是唯一的 14-bit 通道语音消息,通过两个数据字节(LSB + MSB)组合实现高精度弯音控制。中心位置为 0x2000 (8192),范围 0-16383。灵敏度由接收端通过 RPN 0 设定。

4. 系统消息

4.1 System Exclusive (SysEx)

SysEx(0xF0...0xF7)是 MIDI 协议中最强大的扩展机制。制造商可定义任意长度的自定义消息,用于音色数据转储、固件升级、设备配置等。SysEx 消息以制造商标识(1 或 3 字节)开头,结尾为 0xF7。LdA 使用临时 ID 0x7D。

4.2 System Real-Time

系统实时消息为单字节消息(无数据字节),可随时插入——即使在 SysEx 消息中间。Timing Clock (0xF8) 每四分音符发送 24 次,用于设备同步。Active Sensing (0xFE) 每 300ms 发送一次以检测连接存活。

消息状态字节说明
Timing Clock0xF8每四分音符 24 次
Start0xFA开始播放
Continue0xFB从停止处继续
Stop0xFC停止播放
Active Sensing0xFE每 300ms 连接检测
Reset0xFF重置所有设备

5. Running Status(运行状态)

Running Status 是 MIDI 1.0 的带宽优化技术:如果连续发送相同类型的状态字节,可以省略后续消息的状态字节,仅发送数据字节。这在高密度场景下(如连续 Note On 消息)可节省约 33% 的带宽。

// Without Running Status:
0x90 0x3C 0x64  0x90 0x3E 0x64  0x90 0x40 0x64

// With Running Status:
0x90 0x3C 0x64  0x3E 0x64  0x40 0x64

注意:Running Status 仅适用于通道消息(0x80-0xEF)。系统消息和 SysEx 会中断 Running Status。

6. 总结

理解 MIDI 消息体系是掌握 MIDI 设备通信的基础。从简单的 Note On/Off 到复杂的 SysEx,每种消息类型都有其设计意图和最佳用途。LdA MS-3 充分利用了 Program Change(预设切换)、Control Change(Loop 控制)和 SysEx(数据管理)来提供完整的 MIDI 控制体验。