MIDI 技术参考
基于 MIDI 1.0 规范的完整技术参考,涵盖消息类型、Control Change、SysEx 协议与硬件连接。为 LdA 设备用户编写。
1. MIDI 概述
MIDI (Musical Instrument Digital Interface) 是电子乐器之间通信的国际标准协议,由 MMA (MIDI Manufacturers Association) 和 AMEI 于 1983 年首次发布。MIDI 传输的不是音频信号,而是演奏数据——如按下了哪个音符、力度多大、旋钮转了多少。
MIDI 使用异步串行通信,波特率为 31.25 Kbaud (±1%),每字节包含 1 个起始位、8 个数据位和 1 个停止位(共 10 位,320 微秒)。数据以 5mA 电流环路形式传输,通过光耦隔离实现电气隔离。
2. 消息类型
| 消息 | 状态字节 | 数据字节 | 说明 |
|---|---|---|---|
| Note Off | 0x80-0x8F | Note, Velocity | 音符释放 |
| Note On | 0x90-0x9F | Note, Velocity | 音符按下(Velocity=0 等同于 Note Off) |
| 复音触后 | 0xA0-0xAF | Note, Pressure | 单键压力变化 |
| Control Change | 0xB0-0xBF | CC#, Value | 控制器变化,CC#120-127 为通道模式消息 |
| Program Change | 0xC0-0xCF | Program # | 切换音色/预设 |
| 通道触后 | 0xD0-0xDF | Pressure | 通道整体压力 |
| Pitch Bend | 0xE0-0xEF | LSB, MSB | 14-bit 弯音(中心=0x2000) |
| System Exclusive | 0xF0 | 制造商标识 + 数据 | 制造商自定义消息,以 0xF7 结束 |
| Timing Clock | 0xF8 | 无 | 每四分音符 24 个时钟脉冲 |
| Start / Stop / Continue | 0xFA / 0xFC / 0xFB | 无 | 实时传输控制 |
| Active Sensing | 0xFE | 无 | 连接存活检测(每 300ms) |
注:状态字节的低 4 位 (nnnn) 表示 MIDI 通道号 0-15→通道 1-16。
3. CC 参考
Control Change 消息使用状态字节 0xB0-0xBF(通道 1-16),后跟 CC 编号(0-127)和值(0-127)。CC#120-127 保留给通道模式消息。以下列出 MIDI 1.0 规范中定义的主要 CC 编号。
| CC# | 名称 | 范围 | 类型 |
|---|---|---|---|
| 0 | Bank Select | 0-127 | MSB |
| 1 | Modulation Wheel | 0-127 | MSB |
| 2 | Breath Controller | 0-127 | MSB |
| 4 | Foot Controller | 0-127 | MSB |
| 5 | Portamento Time | 0-127 | MSB |
| 6 | Data Entry | 0-127 | MSB |
| 7 | Channel Volume | 0-127 | MSB |
| 8 | Balance | 0-127 | MSB |
| 10 | Pan | 0-127 | MSB |
| 11 | Expression | 0-127 | MSB |
| 12 | Effect Control 1 | 0-127 | MSB |
| 13 | Effect Control 2 | 0-127 | MSB |
| 16 | General Purpose 1 | 0-127 | MSB |
| 17 | General Purpose 2 | 0-127 | MSB |
| 18 | General Purpose 3 | 0-127 | MSB |
| 19 | General Purpose 4 | 0-127 | MSB |
| 32 | Bank Select LSB | 0-127 | LSB |
| 38 | Data Entry LSB | 0-127 | LSB |
| 64 | Damper Pedal (Sustain) | 0-63=Off, 64-127=On | Switch |
| 65 | Portamento On/Off | 0-63=Off, 64-127=On | Switch |
| 66 | Sostenuto | 0-63=Off, 64-127=On | Switch |
| 67 | Soft Pedal | 0-63=Off, 64-127=On | Switch |
| 70 | Sound Controller 1 | 0-127 | LSB |
| 71 | Sound Controller 2 | 0-127 | LSB |
| 72 | Sound Controller 3 (Release) | 0-127 | LSB |
| 73 | Sound Controller 4 (Attack) | 0-127 | LSB |
| 74 | Sound Controller 5 (Brightness) | 0-127 | LSB |
| 80 | General Purpose 5 | 0-127 | LSB |
| 81 | General Purpose 6 | 0-127 | LSB |
| 82 | General Purpose 7 | 0-127 | LSB |
| 83 | General Purpose 8 | 0-127 | LSB |
| 91 | Reverb Send Level | 0-127 | MSB |
| 93 | Chorus Send Level | 0-127 | MSB |
| 98 | NRPN LSB | 0-127 | LSB |
| 99 | NRPN MSB | 0-127 | MSB |
| 100 | RPN LSB | 0-127 | LSB |
| 101 | RPN MSB | 0-127 | MSB |
| 120 | All Sound Off | 0 | Mode |
| 121 | Reset All Controllers | 0 | Mode |
| 122 | Local Control | 0=Off, 127=On | Mode |
| 123 | All Notes Off | 0 | Mode |
| 124 | Omni Mode Off | 0 | Mode |
| 125 | Omni Mode On | 0 | Mode |
| 126 | Mono Mode On | 0-16 | Mode |
| 127 | Poly Mode On | 0 | Mode |
4. SysEx 详解
4.1 SysEx 消息通用格式
System Exclusive (SysEx) 是 MIDI 协议中用于制造商自定义通信的机制。每条 SysEx 消息以 0xF0 开始、0xF7 结束,中间携带制造商 ID 和自定义数据。LdA 使用临时制造商 ID 0x7D。
字段说明
| 字段 | 字节数 | 说明 |
|---|---|---|
| Start | 1 | 0xF0 — SysEx 固定开始 |
| Maker ID | 1 | 0x7D — LdA 临时 ID |
| Dev ID | 1 | 0x01=MS-3, 0x02=LS-4p3, 0xFF=通用查询 |
| Command | 1 | 命令编号 |
| Data | 0-N | 命令相关数据 |
| Checksum | 1 | XOR 校验:Maker ID ⊕ Dev ID ⊕ Command ⊕ Data[0..N-1] |
| End | 1 | 0xF7 — SysEx 固定结束 |
4.2 校验和算法
uint8_t checksum = maker_id ^ dev_id ^ cmd;
for (int i = 0; i < data_len; i++) {
checksum ^= data[i];
}4.3 响应格式
设备收到命令后,返回响应消息。ResponseCode = Command | 0x80(命令字节的最高位设为 1 表示响应)。
F0 7D [DevID] [ResponseCode] [ResponseData] [Checksum] F7
4.4 错误响应
| ErrorCode | 含义 |
|---|---|
| 0x01 | 命令不支持 |
| 0x02 | 数据格式错误 |
| 0x03 | 校验和不匹配 |
| 0x04 | 设备忙碌(正在处理上一条命令) |
| 0x05 | 存储区错误 |
4.5 命令集概览
| 命令范围 | 类别 | 示例命令 |
|---|---|---|
| 0x00-0x0F | 系统命令 | 0x00=Firmware, 0x01=Device Info, 0x04=Ping |
| 0x10-0x1F | 预设管理 | 0x10=Read, 0x11=Write, 0x13=Switch, 0x14=Backup |
| 0x20-0x2F | MIDI 控制 | 0x20=Send MIDI, 0x21=Configure Preset MIDI |
| 0x30-0x3F | Loop 控制 | 0x30=Read Loops, 0x31=Toggle Loop, 0x32=Set All |
| 0x40-0x4F | 系统配置 | 0x40=Read Config, 0x42=Read MIDI Channel |
| 0xF0-0xFF | 固件升级 | 0xF0=Enter Bootloader, 0xF3=Data Block |
4.6 命令示例:查询固件版本 (0x00)
发送:
F0 7D 01 00 [Checksum] F7
响应(固件 v1.2.3):
F0 7D 01 80 01 02 03 00 [Checksum] F7
ResponseCode = 0x80 (0x00 | 0x80), 数据 = Major.Minor.Patch.Build
4.7 命令示例:切换 Loop 2 开 (0x31)
F0 7D 01 31 02 7F [Checksum] F7; LoopNum=2, State=0x7F(开)
5. MS-3 MIDI 实现
MS-3 支持标准 MIDI 消息和 SysEx 协议。通过 USB-C 或 5-pin DIN 接口连接,可用 Program Change 切换预设、Control Change 控制 Loop 开关,以及 SysEx 管理预设数据和系统配置。
MS-3 专用 CC 映射
| CC# | 功能 | 说明 |
|---|---|---|
| 0 | Bank Select MSB | 预设组切换 |
| 32 | Bank Select LSB | 预设组选择低字节 |
| 80 | Loop 1 | 0-63=关, 64-127=开 |
| 81 | Loop 2 | 0-63=关, 64-127=开 |
| 82 | Loop 3 | 0-63=关, 64-127=开 |
| 90 | Tap Tempo | 踏三下设BPM |
| 91 | Global Tap | 全局Tap |
| 102 | Preset Up | 下一预设 |
| 103 | Preset Down | 上一预设 |
| 120 | All Sound Off | 静音所有 |
| 123 | All Notes Off | 关闭所有音符 |
Program Change 预设映射
6. 硬件连接
6.1 MIDI 物理接口
| 接口 | 规格 | 说明 |
|---|---|---|
| 5-pin DIN | 31.25 Kbaud, 5mA current loop | MIDI 1.0 标准,光耦隔离,最长 15m |
| USB-C | USB MIDI Class Compliant | 免驱,macOS/Windows 10+ 即插即用 |
| TRS (3.5mm) | TRS MIDI (MMA RP-054) | Type A 适配器(MMA 标准),部分设备可能需要 Type B |
6.2 Web MIDI API 集成
现代浏览器通过 Web MIDI API 支持 MIDI 通信。以下是 LdA 设备的 JavaScript 集成示例:
// Request MIDI access with SysEx support
const midi = await navigator.requestMIDIAccess({ sysex: true });
// Send SysEx to LdA device (e.g., query firmware)
function sendSysex(output, makerId, devId, cmd, data = []) {
const checksum = [makerId, devId, cmd, ...data]
.reduce((a, b) => a ^ b, 0);
const msg = new Uint8Array([
0xF0, makerId, devId, cmd, ...data, checksum, 0xF7
]);
output.send(msg);
}
// Listen for MIDI input
input.onmidimessage = (event) => {
const [status, ...rest] = event.data;
if (status === 0xF0) {
// SysEx received
const [makerId, devId, responseCode, ...data] = rest;
const cmd = responseCode & 0x7F;
console.log('Response to cmd', cmd.toString(16), data);
}
};注:Chrome/Edge 支持 Web MIDI API。Safari/Firefox 需要用户手动启用或使用第三方扩展。