MIDI 同步 · 鼓机 · 位置测试
MIDI 鼓机 BPM 已同步,为什么还从错拍或错小节开始?Clock—走带—SPP 三层测试
两个屏幕显示相同 BPM,只能证明速度数字相同。接收端可能已经跟随 MIDI Timing Clock,却没收到 Start;也可能把 Continue 当成重新开始,或根本不支持 Song Position Pointer。听起来都像“不同步”,原因却位于不同层。下面用一条直连路由、一个四小节标记样式和三道通过门禁,把速度、走带与位置分开,再决定是否需要调延迟。
范围:一台有文档的 MIDI 1.0 时钟发送端,加一台作为接收端的软/硬件音序器、鼓机或 groovebox。测试固定为 4/4、四小节接收端样式与单一同步路由;不处理音频字时钟、MIDI Timecode、MIDI Machine Control、Ableton Link、音符映射、音频接口监听延迟或无鼓伴奏的速度检测。不同产品、模式和端口支持的消息并不相同,必须以两端当前说明书和 MIDI Implementation Chart 为准。本文不声称 FingerDrum 当前发送或接收外部 MIDI Clock;C—T—P 门禁和四小节标记样式是 FingerDrum 面向外部设备整理的原创排查框架。
C 检查 Timing Clock:接收端是否跟随发送端速度?T 检查走带:Start、Stop,以及设备支持时的 Continue,是否得到预期运行状态?P 检查位置:Song Position Pointer(SPP)能否在播放前让接收端定位?只有工作流需要的三层都通过,才进入延迟调整。固定提前/滞后可能是延迟;错拍、错小节或每次回到开头,通常不是。
BPM 一样,不等于同步状态一样
MIDI Association 把 Timing Clock 列为 System Real-Time 消息:需要同步时,每个四分音符发送 24 次;Start、Continue 与 Stop 是另外三种 System Real-Time 消息。SPP 则单列为一个 14-bit System Common 位置值,从乐曲起点开始计数“ MIDI beat”,每个 MIDI beat 等于 6 个 clock。这些定义对应三个任务:Clock 提供随速度变化的脉冲,走带消息改变播放状态,SPP 提供位置。
两台设备都手动设成 100 BPM,仍可能各跑自己的计时器、在不同时刻开始、持有不同播放位置。它们只有相同设置,没有共享时钟、相位和起点。反过来,接收端也可能已经正确跟随发送端速度,却在每次收到 Start 时把自己的样式从第 1 小节重开:Clock 接收成功,只是这套走带行为不适合“从乐曲中途继续”的目标。
| 层 | 消息或状态 | 通过能证明什么 | 仍不能证明什么 |
|---|---|---|---|
| C · Clock | Timing Clock | 接收端跟随发送端速度 | 两端会一起启停或知道同一小节 |
| T · 走带 | Start / Stop / Continue | 接收端进入预期运行状态 | 中途播放头位置已传过去 |
| P · 位置 | Song Position Pointer | 接收端能定位到相对于同一乐曲起点的位置 | 两端音色、样式长度或拍号一致 |
| D · 延迟 | 逐端口同步延迟或同类控制 | 可以修整稳定的音频时间偏移 | 能修复错小节或缺失消息 |
接线前,先证明精确的 TX/RX 配对
不要把 MIDI Implementation Chart 简化成“支持 MIDI 同步”。分别查看发送列与接收列,逐项核对 Clock、Start、Continue、Stop 和 Song Position;再确认哪个实体或虚拟端口承载 System Real-Time 与 System Common 消息。音符输入、DAW 的 Track 开关和 Sync 开关,可能不是同一条路由。
Roland 当前 SH-4d Rhythm 实现表很好地说明了为什么必须做矩阵:Clock、Start、Stop 的发送与接收都标为支持;Continue 只接收、不发送;Song Position 双向都标为不支持。这只是一个特定产品示例,不能外推到 Roland 或所有节奏设备;它证明的只有一点:“Clock 能用”无法推出 SPP 也能用。
| 能力 | 发送端 TX | 接收端 RX | 本测试用途 | 你的证据 |
|---|---|---|---|---|
| Timing Clock | 是 / 否 | 是 / 否 | C 门 | 说明书或实现表的准确章节 |
| Start | 是 / 否 | 是 / 否 | T1 冷启动 | 准确模式与端口 |
| Stop | 是 / 否 | 是 / 否 | T2 停止 | 准确模式与端口 |
| Continue | 是 / 否 | 是 / 否 | T3 续播 | 准确模式与端口 |
| Song Position Pointer | 是 / 否 | 是 / 否 | P 门 | Song/Pattern 设置与实现表 |
只要任一端对目标所需的一行明确写着“不支持”,就记录 unsupported,重新设计工作流。调整同步延迟、音频 buffer 或 MIDI 音符通道,都不能补出缺失的走带或位置消息。
冻结一条路由,让每小节都有身份
两端都使用工程副本或空白测试工程。把一个发送输出直连一个接收输入:打开发送端文档指定的同步输出,接收端设为外部时钟。暂时关闭第二时钟源、MIDI-thru 回路、无线中转、速度自动化、概率、Swing、Fill、Follow Action 与自动样式切换。分别监听两台设备,或录到两条独立音轨。
在接收端建立四小节样式 MARK4。每小节的第 1、2、3、4 拍都放闭镲,让四分音符相位可听;再给每小节开头加入唯一标记:
| 小节 | 第 1 拍标记 | 额外标记 | 身份 |
|---|---|---|---|
M1 | 底鼓 | 无 | 样式/乐曲起点 |
M2 | 军鼓 | 无 | 第 2 小节 |
M3 | 底鼓 + 军鼓 | 无 | 乐曲中途定位目标 |
M4 | 底鼓 | 第 2 拍再加军鼓 | 循环末小节 |
具体音色不重要;只要在你的接收端能稳定区分四种身份即可。发送端时间线也固定为 4/4,并标出相同的四小节起点。MARK4 是诊断样式,不是音乐编配建议,也不假设 General MIDI 映射。
C 门:先证明 Clock 速度,不解释起始位置
做两次从停止状态开始的 pass。这里的速度只是诊断取值,不是通用练习速度:
- C100:两端停止,发送端设为
100 BPM,两端回到各自文档定义的起点,跑完四个标记小节并录音。 - C110:停止两端,只把发送端改为
110 BPM,回到相同起点,再录同样四小节。 - 比较速度:如果说明书定义了外部同步指示或接收 BPM 显示,可以一起记录;同时比较两次接收端四分踩镲的间距。不要只看两个手动输入的数字一样。
- C 通过:接收端跟随发送端的速度变化,并在每次 pass 中稳定保持四分脉冲。此门不评价从哪个标记开始;那是 T 与 P 的工作。
如果接收端速度不变,到此停止。检查发送端的 Sync 输出——不是只有音符/Track 输出——接收端外部模式、选中的端口,以及两端实现表的 Clock 行。如果速度跟随,但接收端始终晚一拍或从 M2 开始,应把 C 记为通过,继续排查;位置错误不会推翻速度跟随。
T 门:分开从头 Start 与停止后 Continue
按下发送端 Play,并不能证明端口实际送出了哪条 MIDI 消息。查看当前模式说明,或用可信 MIDI monitor 只读记录。以 Apple 当前 Logic 文档为例,Pattern 模式会发送 Start;不同 Song 模式可以在非乐曲起点开始时先发 SPP,再发 Continue。Ableton 同样区分 Song 与 Pattern 时钟行为。账本里要写实际消息,不要只写按钮名称。
- T1 · 冷启动:停止两端,发送端定位到
1.1.1,接收端MARK4回到开头,只按发送端 Play。接收端只启动一次并从M1开始,才通过。 - T2 · Stop:播放到
M2小节中途时,从发送端停止。接收端无需再按本地按钮就停止一次,才通过;记录可见或可听的停止位置。 - T3 · Continue:不移动任一播放头,使用发送端说明书明确会发 Continue 的操作。接收端从已停止相位继续,而不是回到
M1,才通过。 - 对照:T3 后再做一次 T1。真正的冷 Start 仍应得到文档承诺的样式起点行为;不要靠接收端恰好停在方便位置来“修好”续播。
对 Pattern/Start 工作流,这可能正是正确行为。只有当你的明确目标是从停止点继续,而且两端文档都承诺兼容的 Continue 路径时,它才算失败。把结果记为以下四者之一:发出 Start、Continue 已发送且接收、Continue 不支持、消息未知。不要把四者都叫做“Clock 漂移”。
P 门:用 SPP 验证共同位置
在这个固定 4/4 测试里,一个四分音符包含 24 个 clock,一个 SPP MIDI beat 包含 6 个 clock。因此一小节跨越 4 × 24 ÷ 6 = 16 个 SPP 单位;M1 到 M4 的零基起点分别是 0、16、32、48。这些数只适用于共同起点和当前拍号;如果工程有弱起、不同拍号表,或接收端不是同一首四小节结构,就不能照抄。
| 发送端位置 | 从起点计的 SPP | 接收端应先听到 | 预期消息方案 |
|---|---|---|---|
| 第 1 小节起点 | 0 | M1 | 文档定义的冷 Start,或发送端同等方案 |
| 第 2 小节起点 | 16 | M2 | SPP 定位 + 当前模式文档承诺的兼容走带 |
| 第 3 小节起点 | 32 | M3 | SPP 定位 + 当前模式文档承诺的兼容走带 |
| 第 4 小节起点 | 48 | M4 | SPP 定位 + 当前模式文档承诺的兼容走带 |
- P3:停止播放,只把发送端移到第 3 小节起点,确认使用 Song/SPP 模式,然后只从发送端启动。接收端最先响起的标记是
M3,才通过。 - P4:从第 4 小节起点再做一次。最先响起的标记必须是
M4;这样可排除第 3 小节碰巧对上的假阳性。 - 可选循环门:只有当接收端识别 SPP,而且文档还满足以下一个更强条件时,才让发送端循环第 3–4 小节两轮:发送端在 cycle jump 执行
Stop → SPP → Continue,或接收端明确会在运行中应用 SPP。记录本次属于哪一种,再期待M3 → M4 → M3 → M4。 - 回归对照:关闭循环,从共同起点再跑 T1,证明定位测试没有留下隐藏偏移。
SPP 携带从乐曲起点开始的计数;其公开消息定义并不包含你的样式名称、音色分配或小节标签。因此可以推断:两端必须先约定内容结构与起点,32 才会共同表示“我们的 M3”。接收端若准确定位到另一套编排,并不是线路协议失败,而是两个工程没有对齐。
抓第一道失败门,不追最响的症状
| 观察结果 | 第一道失败门 | 下一项检查 | 暂时不要改 |
|---|---|---|---|
| 接收端不跟随 C100 → C110 | C · Clock | Clock TX/RX、Sync 端口、外部模式、第二时钟源或重复 Clock 路由 | SPP 与同步延迟 |
| 速度跟随,但发送端 Play/Stop 没作用 | T · 走带 | Start/Stop 支持、端口过滤、走带选项 | 速度与音符通道 |
| 冷启动正确,续播却回 M1 | T3 · Continue | 是否发了 Start?Continue 是否发送并被接收? | Clock 速度与音频 buffer |
| T 通过,从第 3 小节启动却得到 M1 或错标记 | P · 位置 | SPP TX/RX、Song/Pattern 模式、共同起点与长度 | 逐端口延迟 |
| M3/M4 身份正确,但每个瞬态都固定提前或滞后 | C/T/P 通过 | 分别录两路 click,只调整一个同步延迟 | 样式内容 |
| 小节身份对齐,但鼓音色错误 | 不在本测试内 | 音符/通道映射 | Clock、Continue 或 SPP |
符号标记都对上后,再调延迟
符号标记对齐后,再比较两端节拍器;如果硬件没有节拍器,就用简单重音节奏,然后才调整 MIDI Clock Sync Delay。Apple 在 Logic 中提供逐目的端口的 MIDI 时钟延迟,Ableton 也提供 MIDI Clock Sync Delay 控制。这些控制针对稳定时间偏移,不能让不支持 SPP 的接收端理解第 3 小节定位,也不能把 Start 变成 Continue。
- 保持已经通过的 C/T/P 配置,分别录下两台设备至少两轮完整
MARK4。 - 使用四分踩镲与短促的 M1–M4 标记,比较瞬态先后,不比较采样尾音或效果返回。
- 只改一个目的端口上有文档的同步延迟;保存原值,不同时改 buffer、插件、MIDI 路由和样式。
- 候选值之间插回原值。只有新值在多次 pass 中都减小同方向偏移,并且 C、T、P 仍通过,才采用。
没有通用毫秒答案。USB 调度、MIDI 接口、音频 buffer、设备处理和音色本身都会影响观测偏移。如果前几个小节与后续小节的稳定状态不同,应分开记录,不要平均成一个数字。
保存 TX/RX 证据、MARK4、C100、C110、T1、T2、T3、P3、P4、可选循环结果和最终延迟 A/B。第一道失败门会直接告诉你:应该修 Clock 路由、走带行为、工程位置,还是只修最后的音频偏移。这比“两个都是 100 BPM,但听着还是不对”更可执行。
来源与访问日期
MIDI 消息职责与单位来自 MIDI Association;Song/Pattern 行为和延迟控制只归于被点名的 DAW;Roland 实现表只作为兼容矩阵案例。FingerDrum 公开产品范围直接按 origin/main 提交 631b74908c02be3a1aead2ba43c7e192f5f285f9 复核。没有任何来源定义本文原创的 C—T—P 门禁或 MARK4 样式。
- FingerDrum 官网 — 当前功能概览(访问于 2026-08-23)
- MIDI Association — Summary of MIDI 1.0 Messages(访问于 2026-08-23)
- Apple — 将多台 MIDI 设备同步到 Mac 版 Logic Pro(访问于 2026-08-23)
- Ableton — Routing and I/O, Live Reference Manual(访问于 2026-08-23)
- Roland — SH-4d MIDI Implementation Chart(Rhythm)(访问于 2026-08-23)