如何跟随鼓手
摘要
一篇技术博文,描述了一个实时系统的开发,该系统通过使用锁相环从鼓点中估计节奏和相位来跟随鼓手,使软件能够适应人类的感觉,而不是强迫鼓手跟随机器。
暂无内容
查看缓存全文
缓存时间: 2026/07/09 19:38
# 如何跟随一名鼓手
来源:https://drummate.app/blog/how-to-follow-a-drummer
DRUMMATE (https://drummate.app/) —— 教会机器演奏者的本能
几乎每一种电子音乐系统都迫使人类跟随机器。节拍器是老大,音序器是老大,DAW的时间线是老大。当你在副歌加速时,机器根本不在乎——它自顾自地走,于是你就错了。
过去一段时间里,我一直在构建相反的东西:一套以鼓手为核心的系统,其他所有元素(速度、力度、感觉、加花、结尾)都跟随鼓手。起初,这只是一款与我在网上认识的鼓手共同开发的 Android 应用,但核心问题与平台无关,而且它比我想象中有趣得多。本文就是一篇总结,包括我犯过的所有错误。
## 敲击不是时钟
每个人都想到的第一个主意(包括我在内):获取底鼓,将每次敲击转化为一个脉冲,然后输入到你的时钟输入。搞定,对吧?
实际底鼓模式并不是时钟。演奏任何切分节奏,脉冲都会落在弱拍上。演奏一个加花,你会在半拍内触发六个脉冲。演奏一段底鼓休息一小节的乐句,你的时钟就会完全停止。即使鼓手以完全稳定的速度演奏,敲击间隔也会剧烈波动,因为敲击是音乐,不是节拍器。
节奏点击盒也存在类似问题,只是层级更高:大多数只是对最近的时间间隔取平均值,一次加花就会把速度拽得晃来晃去。而另一个流行做法——在每次底鼓敲击时重置音序器的相位——则认为每一次底鼓都是拍子一,这在鼓手切分节奏之前一直完美运行,结果你的整个系统在律动中间就跑到了错误的重拍上。
敲击应被视为证据,而非命令。目的是跟随一名鼓手,而不是服从他。
## 分频是免费的,倍频需要预测
这里有一个不对称性,我花了很久才意识到。时钟分频是因果性的:每个输入的脉冲只是让计数器加一,速度概念根本不需要存在,而且任何速度下都能工作。这就是为什么用鼓触发信号给模块化时钟分频器会感觉坚如磐石。
倍频就不同了。要在两次敲击之间触发第二个十六分音符,你需要对下一次敲击何时落地有一个判断。任何实现轮指、琶音或同步延音的设备,都暗含了一个速度模型。廉价版本假设一个最低 BPM,一旦低于该值就会崩溃。诚实的版本则必须解决实际问题:
根据迄今收到的敲击,网格在哪里?
## 估测层
对我行之有效的方案是一个自由运行的时钟,它被演奏所“引导”而非驱动。一种具有节拍感知前端的软件锁相环:
- 敲击以带有时间戳的起音形式到达。
- 跟踪器将这些起音与网格假设进行匹配:周期(速度)和相位(拍子一在哪里),重拍依据底鼓和军鼓的重音模式推断得出。
- 每个与假设一致的起音都会按比例微调时钟。不一致的起音——加花、切分、装饰音——大多被忽略。当敲击持续落在时钟预测的位置时,置信度上升;反之则下降。
- 时钟从不跳跃,它弯曲。速度变化会在大约一小节内被平滑处理,因此下游的一切都滑动而非突进。
关键在于灵敏度。如果时钟追逐每一次敲击,它就会吞噬律动:鼓手的“口袋”(那些刻意、美丽的偏差)会变成速度抖动。如果太迟钝,则会错过真实的副歌加速。有效的规则是:**小偏差是感觉,持续漂移才是速度变化**。持续偏向一个方向一小节,它就跟着你走。对一次慵懒的军鼓敲击,它不会动摇。
值得注意这不是什么:它不是 DJ 软件中的节拍检测。Traktor 和 Rekordbox 能预先获取整首曲目,可以提前看、做二次处理、修正错误。而实时跟踪器只能获得已经发生的敲击,且必须实时做出判断——没有前视,没有撤销。
## 教会我最多的一只 Bug
我最糟糕的一个版本在测试时表现完美,但一到真实鼓手就崩了。跟踪器会锁定,乐队加入,然后——就在鼓手做任何有趣的事情那一刻——置信度下降,锁定闪烁,乐队消失。演奏,乐队开始,乐队停止,重复。那感觉比任何方式都要崩溃。
解决办法是**滑行(coasting)**:当置信度摇摆不定但敲击仍在继续时,时钟保持最后一个良好估计继续运行并等待。它只在真正静音时才停止。事后看来很明显。人类乐手正是如此做的:当鼓手胡来两小时,你不会停止演奏,而是保持自己的律动并更仔细地听。
如果你在构建任何版本的这类系统(硬件或软件),我猜滑行不是可选项。一个在精彩部分就放弃的跟随器,比根本没有更糟糕。
## 预测而非反应
还有一点架构上的要义,比表面看起来更重要:该系统提前调度。音符被放置在时钟对接下来几拍的预测中,而不是在每次敲击后触发响应。这样,音频延迟预算就完全脱离了鼓手的时机循环——乐队并不是在你之后才反应,而是在你们共同前往的方向上等你。这也是人类节奏组的方式。没有人会先听到拍子一再去演奏拍子一。
## 机器依然失败的部分
在与模块化社区讨论后,有两个参考文献值得一看。
James Holden 的人类时间感研究 (https://www.ableton.com/en/blog/james-holden-human-timing/)(及其背后的 Hennig 等人研究)表明,人类时序偏差并非随机抖动——它们是相关的、带有记忆漂移的,这正是量化背景音乐听起来死板的原因,也是跟随器的时钟必须弯曲而非弹跳的原因。Holden 的 Max 补丁比我走得更远:他的机器和人类相互拉动,是真正的相互牵引、耦合振荡器。我的是刻意单向的——鼓手引领,乐队从不回推——因为这是前提。但那个方向非常迷人。
还有一点令人自省:人类轻拍节奏依然是迄今为止最好的速度跟踪器。大脑会预测,而不是反应。你听到一个加花即将到来,就已经在倾向拍子一的落点。我不知道任何算法能达到这一点。只有在软件中构建这个系统的唯一原因是,鼓手无法自己轻拍——两只手都忙着——而且并非每次即兴都有第二个人类参与。
整个问题实际上就是教会机器演奏者的本能,而不是让人类像机器一样演奏——这四十年来,节拍轨和量化背景音乐一直这样对待我们。
## 这在哪里实现
我将这些想法构建进了 DrumMate,一款 Android 应用。你通过 USB MIDI 连接电子鼓,一个生成的乐队(贝斯、键盘、主奏)会跟随你的速度、力度和感觉——免费测试版在 drummate.app (https://drummate.app/)。但这里写的大部分内容适用于任何版本的问题:一个 Eurorack 模块、一个 Max 补丁、一个插件。如果你构建了一个,我真心希望交流心得——那些催生了半数想法的社区讨论,是我做这件事过程中最棒的部分。
---
相似文章
灯光与音乐同步:从截断时间戳中估算精确的搜索时间
一位开发者描述了一个副项目,利用OCR和逆向工程DJ软件自动将灯光与现场音乐同步,并介绍如何通过区间平均值从截断的时间戳中估算精确的搜索时间。
深入解析:构建实时和弦识别器
本文解释了实时和弦识别器的技术架构,详细介绍了使用音级位掩码、候选生成、分数归一化和音乐启发式的四阶段流水线。
Backbeat Forge
Backbeat Forge 是一款将鼓点音频转换为可编辑乐谱的工具。
MCP 2000
MCP 2000 是一款在浏览器中运行的 AI 鼓机 MPC。
loopclub
loopclub 是一个共享鼓机,允许用户与陌生人或 AI 助手 Claude 一起即兴演奏。