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 · ClockTiming Clock接收端跟随发送端速度两端会一起启停或知道同一小节
T · 走带Start / Stop / Continue接收端进入预期运行状态中途播放头位置已传过去
P · 位置Song Position Pointer接收端能定位到相对于同一乐曲起点的位置两端音色、样式长度或拍号一致
D · 延迟逐端口同步延迟或同类控制可以修整稳定的音频时间偏移能修复错小节或缺失消息

接线前,先证明精确的 TX/RX 配对

不要把 MIDI Implementation Chart 简化成“支持 MIDI 同步”。分别查看发送列与接收列,逐项核对 ClockStartContinueStopSong 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。这里的速度只是诊断取值,不是通用练习速度:

  1. C100:两端停止,发送端设为 100 BPM,两端回到各自文档定义的起点,跑完四个标记小节并录音。
  2. C110:停止两端,只把发送端改为 110 BPM,回到相同起点,再录同样四小节。
  3. 比较速度:如果说明书定义了外部同步指示或接收 BPM 显示,可以一起记录;同时比较两次接收端四分踩镲的间距。不要只看两个手动输入的数字一样。
  4. 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 时钟行为。账本里要写实际消息,不要只写按钮名称。

  1. T1 · 冷启动:停止两端,发送端定位到 1.1.1,接收端 MARK4 回到开头,只按发送端 Play。接收端只启动一次并从 M1 开始,才通过。
  2. T2 · Stop:播放到 M2 小节中途时,从发送端停止。接收端无需再按本地按钮就停止一次,才通过;记录可见或可听的停止位置。
  3. T3 · Continue:不移动任一播放头,使用发送端说明书明确会发 Continue 的操作。接收端从已停止相位继续,而不是回到 M1,才通过。
  4. 对照:T3 后再做一次 T1。真正的冷 Start 仍应得到文档承诺的样式起点行为;不要靠接收端恰好停在方便位置来“修好”续播。
如果 Play 总是回到 M1

对 Pattern/Start 工作流,这可能正是正确行为。只有当你的明确目标是从停止点继续,而且两端文档都承诺兼容的 Continue 路径时,它才算失败。把结果记为以下四者之一:发出 StartContinue 已发送且接收Continue 不支持消息未知。不要把四者都叫做“Clock 漂移”。

P 门:用 SPP 验证共同位置

在这个固定 4/4 测试里,一个四分音符包含 24 个 clock,一个 SPP MIDI beat 包含 6 个 clock。因此一小节跨越 4 × 24 ÷ 6 = 16 个 SPP 单位;M1M4 的零基起点分别是 0、16、32、48。这些数只适用于共同起点和当前拍号;如果工程有弱起、不同拍号表,或接收端不是同一首四小节结构,就不能照抄。

发送端位置从起点计的 SPP接收端应先听到预期消息方案
第 1 小节起点0M1文档定义的冷 Start,或发送端同等方案
第 2 小节起点16M2SPP 定位 + 当前模式文档承诺的兼容走带
第 3 小节起点32M3SPP 定位 + 当前模式文档承诺的兼容走带
第 4 小节起点48M4SPP 定位 + 当前模式文档承诺的兼容走带
  1. P3:停止播放,只把发送端移到第 3 小节起点,确认使用 Song/SPP 模式,然后只从发送端启动。接收端最先响起的标记是 M3,才通过。
  2. P4:从第 4 小节起点再做一次。最先响起的标记必须是 M4;这样可排除第 3 小节碰巧对上的假阳性。
  3. 可选循环门:只有当接收端识别 SPP,而且文档还满足以下一个更强条件时,才让发送端循环第 3–4 小节两轮:发送端在 cycle jump 执行 Stop → SPP → Continue,或接收端明确会在运行中应用 SPP。记录本次属于哪一种,再期待 M3 → M4 → M3 → M4
  4. 回归对照:关闭循环,从共同起点再跑 T1,证明定位测试没有留下隐藏偏移。

SPP 携带从乐曲起点开始的计数;其公开消息定义并不包含你的样式名称、音色分配或小节标签。因此可以推断:两端必须先约定内容结构与起点,32 才会共同表示“我们的 M3”。接收端若准确定位到另一套编排,并不是线路协议失败,而是两个工程没有对齐。

抓第一道失败门,不追最响的症状

观察结果第一道失败门下一项检查暂时不要改
接收端不跟随 C100 → C110C · ClockClock TX/RX、Sync 端口、外部模式、第二时钟源或重复 Clock 路由SPP 与同步延迟
速度跟随,但发送端 Play/Stop 没作用T · 走带Start/Stop 支持、端口过滤、走带选项速度与音符通道
冷启动正确,续播却回 M1T3 · 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。

  1. 保持已经通过的 C/T/P 配置,分别录下两台设备至少两轮完整 MARK4
  2. 使用四分踩镲与短促的 M1–M4 标记,比较瞬态先后,不比较采样尾音或效果返回。
  3. 只改一个目的端口上有文档的同步延迟;保存原值,不同时改 buffer、插件、MIDI 路由和样式。
  4. 候选值之间插回原值。只有新值在多次 pass 中都减小同方向偏移,并且 C、T、P 仍通过,才采用。

没有通用毫秒答案。USB 调度、MIDI 接口、音频 buffer、设备处理和音色本身都会影响观测偏移。如果前几个小节与后续小节的稳定状态不同,应分开记录,不要平均成一个数字。

最终交付:一张兼容矩阵,加七个有名字的 pass

保存 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 样式。

  1. FingerDrum 官网 — 当前功能概览(访问于 2026-08-23)
  2. MIDI Association — Summary of MIDI 1.0 Messages(访问于 2026-08-23)
  3. Apple — 将多台 MIDI 设备同步到 Mac 版 Logic Pro(访问于 2026-08-23)
  4. Ableton — Routing and I/O, Live Reference Manual(访问于 2026-08-23)
  5. Roland — SH-4d MIDI Implementation Chart(Rhythm)(访问于 2026-08-23)