订单满 $200 免全球运费。

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 Off0x80-0x8FNote, Velocity音符释放
Note On0x90-0x9FNote, Velocity音符按下(Velocity=0 等同于 Note Off)
复音触后0xA0-0xAFNote, Pressure单键压力变化
Control Change0xB0-0xBFCC#, Value控制器变化,CC#120-127 为通道模式消息
Program Change0xC0-0xCFProgram #切换音色/预设
通道触后0xD0-0xDFPressure通道整体压力
Pitch Bend0xE0-0xEFLSB, MSB14-bit 弯音(中心=0x2000)
System Exclusive0xF0制造商标识 + 数据制造商自定义消息,以 0xF7 结束
Timing Clock0xF8每四分音符 24 个时钟脉冲
Start / Stop / Continue0xFA / 0xFC / 0xFB实时传输控制
Active Sensing0xFE连接存活检测(每 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#名称范围类型
0Bank Select0-127MSB
1Modulation Wheel0-127MSB
2Breath Controller0-127MSB
4Foot Controller0-127MSB
5Portamento Time0-127MSB
6Data Entry0-127MSB
7Channel Volume0-127MSB
8Balance0-127MSB
10Pan0-127MSB
11Expression0-127MSB
12Effect Control 10-127MSB
13Effect Control 20-127MSB
16General Purpose 10-127MSB
17General Purpose 20-127MSB
18General Purpose 30-127MSB
19General Purpose 40-127MSB
32Bank Select LSB0-127LSB
38Data Entry LSB0-127LSB
64Damper Pedal (Sustain)0-63=Off, 64-127=OnSwitch
65Portamento On/Off0-63=Off, 64-127=OnSwitch
66Sostenuto0-63=Off, 64-127=OnSwitch
67Soft Pedal0-63=Off, 64-127=OnSwitch
70Sound Controller 10-127LSB
71Sound Controller 20-127LSB
72Sound Controller 3 (Release)0-127LSB
73Sound Controller 4 (Attack)0-127LSB
74Sound Controller 5 (Brightness)0-127LSB
80General Purpose 50-127LSB
81General Purpose 60-127LSB
82General Purpose 70-127LSB
83General Purpose 80-127LSB
91Reverb Send Level0-127MSB
93Chorus Send Level0-127MSB
98NRPN LSB0-127LSB
99NRPN MSB0-127MSB
100RPN LSB0-127LSB
101RPN MSB0-127MSB
120All Sound Off0Mode
121Reset All Controllers0Mode
122Local Control0=Off, 127=OnMode
123All Notes Off0Mode
124Omni Mode Off0Mode
125Omni Mode On0Mode
126Mono Mode On0-16Mode
127Poly Mode On0Mode

4. SysEx 详解

4.1 SysEx 消息通用格式

System Exclusive (SysEx) 是 MIDI 协议中用于制造商自定义通信的机制。每条 SysEx 消息以 0xF0 开始、0xF7 结束,中间携带制造商 ID 和自定义数据。LdA 使用临时制造商 ID 0x7D。

┌──────┬──────────┬────────┬────────┬────────────┬────────┬──────┐ │ 0xF0 │ Maker ID │Dev ID │ Command│ Data │ Checksum│ 0xF7 │ │ Start│ (1 byte) │(1 byte)│(1 byte)│ (N bytes) │ (1 byte)│ End │ └──────┴──────────┴────────┴────────┴────────────┴────────┴──────┘

字段说明

字段字节数说明
Start10xF0 — SysEx 固定开始
Maker ID10x7D — LdA 临时 ID
Dev ID10x01=MS-3, 0x02=LS-4p3, 0xFF=通用查询
Command1命令编号
Data0-N命令相关数据
Checksum1XOR 校验:Maker ID ⊕ Dev ID ⊕ Command ⊕ Data[0..N-1]
End10xF7 — 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-0x2FMIDI 控制0x20=Send MIDI, 0x21=Configure Preset MIDI
0x30-0x3FLoop 控制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#功能说明
0Bank Select MSB预设组切换
32Bank Select LSB预设组选择低字节
80Loop 10-63=关, 64-127=开
81Loop 20-63=关, 64-127=开
82Loop 30-63=关, 64-127=开
90Tap Tempo踏三下设BPM
91Global Tap全局Tap
102Preset Up下一预设
103Preset Down上一预设
120All Sound Off静音所有
123All Notes Off关闭所有音符

Program Change 预设映射

PC 1-100
→ 预设 1-100
PC 127
→ Bypass 模式(所有 Loop 关闭)

6. 硬件连接

6.1 MIDI 物理接口

接口规格说明
5-pin DIN31.25 Kbaud, 5mA current loopMIDI 1.0 标准,光耦隔离,最长 15m
USB-CUSB 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 需要用户手动启用或使用第三方扩展。