midicn音频与音乐制作 EN

MIDI 消息结构

一条消息由状态字节与数据字节组成,读懂骨架才能读懂事件流。

MIDI 传送的不是声音,而是一串结构固定的短消息。看懂骨架,回放怪象就有落点。

问题

同一个音在不同软件里时而正常时而错位,问题常在消息而非音源。通道错一位,钢琴会落到鼓组;数据字节越界,会被当成新状态。

协议或消息

状态字节最高位为 1,高四位是类型,低四位是通道。0x9n 是 Note On,0x8n 是 Note Off,0xBn 是 CC,0xCn 是 Program Change。数据字节最高位为 0,取值 0 到 127。鼓循环里的 99 2A 57 表示第 10 通道、键号 42、力度 87。文件里每条事件前还有可变长度的 delta time。连续同类消息可省略状态字节,这叫运行状态。

参数与做法

排查先看通道,再看类型,最后看数值是否在 0 到 127。超过 127 的值要拆成两条消息或改用 14 位控制器。手工编辑别依赖运行状态,导出时让音序器自己写。

听什么

通道差一位,钢琴可能变成鼓,音头与尾音全变。力度差几个数值听感还在,差到二十以上,重音位置就会移动。

常见误解

消息不是音频采样,删掉不会留下声音。通道从 0 数起,界面上的 1 到 16 只是显示习惯。运行状态不是压缩算法,只省略重复的状态字节。

在库中听例子

rock-groove8 · 65 BPM · beat 4/4C10:28单轨鼓循环,210 个音符都由三字节的通道消息构成详情sailors battle midi theme 9C10:58单条轨里装着 5 个通道与 1081 个音符,状态字节的通道位很清楚详情raymond1206 chestnutC11:4917 条轨、16 个通道,事件流里能同时看到音符、CC 与弯音详情

每首均来自 midicn-lib,行内徽标为许可档位(C1 可商用 / C2 非商业 / C3 仅学习研究)。

事实来源

  • MIDI 1.0 规范对状态字节与数据字节的定义,依 MMA 公开规范核查,未抄文本
  • 本库 main 区文件的字节统计,由本地 SMF 解析脚本核对,数值随文件而定

仅用于核查事实,正文为原创撰写。