判定器用全书的零件拼一台
这本书写到这里,手上的零件已经够拼一台完整的机器了:前瞻调度器、判定窗、三个数、机关分类、成绩单积分。
这一章把它们装起来 —— 一段 32 个音符的谱面,四段各一种机关(齐奏 → 裏拍 → 静默 → 变速)。
而它会做一件别的地方都没做过的事:用你这一局量到的偏移和抖动,代进第 3 章那个积分,预测你「应该」拿多少分,再和你实际拿到的分对一对。如果这本书的模型是对的,这两个数应该接近。
这台机器由什么组成
先把零件列一遍,因为这本书讲过的每一个都在里面:
| 零件 | 来自 | 在这里干什么 |
|---|---|---|
| 前瞻调度器 | 第 5 章 | 把音符精确排进音频时钟,让节拍器自己不晃 |
| 时钟对齐 | 第 5 章 | 把你的敲击换算到音频时间轴上 |
| 判定窗(帧) | 第 3 章 | 完美 ±2 帧 / 还行 ±4 帧 / 勉强 ±6 帧 |
| 三数诊断器 | 第 2 章 | 算出这一局的偏移与抖动(扣掉走位) |
| 正态积分 | 第 3 章 | 由两个数预测成绩单分布 |
| 变速积分 | 第 16 章 | 最后八拍的加速用闭式解排,不用平均速度 |
| 四种机关 | 第 22 章 | 谱面的四段结构 |
全部零件都在同一个文件里(assets/clock.js),而且和你在前面二十二章用过的是同一份 —— 没有为这一章另写一套。这也是这个闭环有意义的前提:预测和实际必须用同一套定义,否则对得上也是巧合。
这一点值得强调,因为它是这本书从第 1 章就承诺过的两条规矩之一:书里的数字,要么是你自己的手量出来的,要么是引擎当场算出来的。
正文里那些数 —— 一帧 16.67ms、swing 推后 83.3ms、3 对 2 的公共网格 166.7ms、变速积分差 87.4ms —— 全都来自这个文件,而且有一个独立的验证脚本每次都把它们重新算一遍、和正文逐条核对。demo 发出的每一声,也是同一个文件排的。
所以这一章的闭环不是「让 demo 自己表扬自己」。预测这一侧是纯数学,实际这一侧是你的手指 —— 中间没有任何可以互相迁就的余地。它们对得上,是一个真的结论;对不上,也是一个真的结论。
谱面:四段,四种机关
# 32 个音符,100 BPM
第 1–8 拍 ① 齐奏跟拍
伴奏给正拍,你跟着打
考:偏移
第 9–12 拍 ③ 裏拍进入
八个八分音符,全在裏拍上
考:认错格(正拍那个吸引子)
第 13–20 拍 ⑥ 静默续拍
伴奏消失,只留极轻的心跳
考:走位、内部时钟
第 21–28 拍 ⑤ 变速
速度渐快到 1.4 倍
考:网格变形时你改不改得过来
这个顺序是故意的:难度递增,而且后面每一段都建立在前面的基础上。如果你在第一段就不稳,后面三段没有一段能打好 —— 这本身就是一条诊断信息。
四段之间的接缝也是故意留的。第 22 章说过,Remix 的难度主要在接缝上;这里有三个接缝,每一个都要求你在一两拍之内换掉一样东西:
- ① → ③ 的接缝:出手位置从正拍搬到裏拍。你的身体会想留在正拍上。
- ③ → ⑥ 的接缝:伴奏消失。而你刚刚还在一个不稳定的相位上。
- ⑥ → ⑤ 的接缝:伴奏回来,同时开始加速。这是全场最难的一处 —— 你要在同一时刻既重新对齐、又开始跟随一个变化的网格。
如果你的失误集中在这三处,那不是巧合,也不是你手不好。那说明你的问题在「切换」上,而不在任何一种机关本身上 —— 而切换是可以单独练的(第 22 章末尾那条建议)。
第一遍不要打,只听。把四段的边界听出来 —— 你能听出裏拍段是从哪里开始的吗?静默是从哪一拍开始的?
这一步本身就是第 22 章那个「三十秒诊断」的练习。而且它会让你的第一次正式尝试好很多,因为你已经知道要来什么了。
然后再打两三局,看那个「闭环核对」的结果。
为什么要做这个闭环
先说清楚这一章为什么不只是「再来一个 demo」。
这本书从第 3 章开始,一直在用一个模型给你算账:给定你的偏移和抖动,命中率是一个确定的积分。基于这个模型,它做了不少断言 —— 校准能白拿九个百分点、全中概率涨 414 倍、打飞率减半平均连击翻倍。
但那些全是算出来的,不是量出来的。模型说得再漂亮,如果它和你真实的表现对不上,那它就只是一套自洽的数学。
所以这一章要做的事很简单:把预测和实际放在一起,看它们对不对得上。
这件事在这本书里有点特别,因为它是唯一一个可能推翻前面章节的地方。前二十二章都在教你东西,这一章在检验那些东西 —— 而检验的方式是让模型面对你的真实数据,而不是让你去相信它。
怎么读那个闭环
打完之后,最下面那一段会给出三个数:
闭环核对
预测得分 ← 拿你这一局的偏移和抖动,代进正态积分算出来的
实际得分 ← 你真的拿到的
校准后预测 ← 假设把偏移减到零,其他不变,能拿多少
如果模型是对的:预测 ≈ 实际。
预测和实际接近,说明什么?说明你这一局的失误确实主要是「随机地偏了一点」造成的 —— 也就是第 1 章那四种病里的偏移和抖动。这是好消息,因为这两种都有明确的处理办法。
而如果实际明显低于预测呢?那更有意思,因为它说明有某种模型没有覆盖的东西在拖累你。最常见的三种:
| 可能 | 怎么确认 | 去哪一章 |
|---|---|---|
| 认错格 | 某一段整体错位,几下误差极大 | 第 9、13 章 |
| 某一段特别差 | 看四段的分布,不是均匀的 | 看那一段是哪种机关(第 22 章) |
| 崩了之后没回来 | 失误之后连续几下都不好 | 第 21 章 |
换句话说:「预测 vs 实际」这个差值,本身就是一个诊断指标。它把「模型解释得了的失误」和「模型解释不了的失误」分开了,而后者往往才是你真正的短板。
这本书从第 3 章开始就在用一个模型:误差近似正态,命中率是一个积分。
模型总是简化的。这个模型明确不覆盖的东西至少有三样:认错格(不在同一个分布里)、疲劳(后半段的误差和前半段不同分布)、失误后的连锁(各次不独立)。
而这恰恰是它有用的地方。因为它不覆盖这三样,所以「预测和实际对不上」这件事,可以直接指向这三样中的某一样。
一个什么都能解释的模型,什么也告诉不了你。这个模型的价值,一半在于它算得准,另一半在于它算不准的时候你知道为什么。
那个「校准后预测」,是这本书能给你的最后一笔免费收益
第三个数值得单独说。
它的算法是:把你的偏移设成零,抖动一点不变,重新算一遍成绩单。也就是说,它回答的是那个从第 3 章就悬着的问题 —— 「如果我把偏移校准掉,能白拿多少分?」
这一次不是拿假设的数算给你看,是拿你自己刚打完那一局的真实数据算的。
如果那个差值很大(比如超过总分的百分之十),那么你现在该做的事非常明确:回第 5 章,花十分钟校准,然后回来再打一局。那十分钟会比接下来十小时的练习更有效。
如果那个差值很小,说明你的偏移已经接近零了 —— 恭喜,免费的部分你已经拿完了。剩下的只能靠抖动那一项,而那需要时间。
这台机器最好的用法不是玩,是当成一个固定的体检项目:
1. 每周同一时间打三局(三局取中位数,避免单次波动)。
2. 记三个数:得分、抖动、预测与实际的差值。
3. 只看趋势。抖动在往下走吗?差值在缩小吗?
因为谱面是固定的、机关是固定的、判定口径是固定的,所以这三个数在周与周之间是可比的 —— 而这正是游戏里的成绩做不到的(每关的谱面都不一样)。
一个固定的标尺,比一百次感觉良好更有用。
顺带看一眼这台机器是怎么做到不晃的
有一件事值得展开,因为它是这本书所有测量成立的前提,而且它是那种「不做就全错、做了没人看得出来」的工程细节。
如果节拍器自己在晃,那么你量到的抖动里有一大半是它的。
浏览器里最直觉的做法是用定时器:每隔一段时间触发一次,然后发一个音。这个做法的抖动是几十毫秒量级的 —— 也就是说,它比你的手还不稳。用它来量你,等于用一把橡皮尺量长度。
// 错的:定时器直接发声,抖动几十毫秒
setInterval(() => playClick(), 500);
// 对的:定时器只负责「往前排」,发声时刻交给音频时钟
function pump() {
// 往前看 120ms,把这段里该响的音符提前排进去
while (nextTime < ctx.currentTime + 0.12) {
playClickAt(nextTime); // 精确到采样点
nextTime += beatSec;
}
}
setInterval(pump, 25); // 定时器晃也没关系,它不决定发声时刻
关键在最后那句注释:定时器晃不要紧,因为它不决定声音什么时候响。它只负责「提前把安排交出去」,而真正的发声时刻由音频硬件的时钟保证。
这个模式在音频编程里是标准做法。而它在这本书里的意义是:你在任何一个 demo 上量到的数,都是你的,不是浏览器的。否则这二十三章全部白写。
顺带说,这件事和第 5 章那个「两个时钟必须对齐」是同一个问题的两半:发声这一侧要精确到采样点,接收这一侧要换算到同一根时间轴上。两边有任何一边偷懒,量出来的都是系统的抖动,不是你的。
这也是为什么这本书不建议你用随便一个手机节拍器 App 来做这里的测量。它响得准不准,你没法确认;而它有没有正确处理输入时间戳,你更没法确认。作为节拍器它可能完全够用,作为测量仪器就未必。
四段的成绩说明了什么
除了总分,四段各自的表现更有信息量。几种典型的分布:
- 第 1 段就不好,后面更差 → 底子问题。回卷 I 量三个数,回卷 II 练基本功。
- 第 1 段很好,第 2 段(裏拍)崩 → 典型的认错格。第 9 章。
- 前两段好,第 3 段(静默)崩 → 你的网格是借来的。第 7 章,这是最值得练的一项。
- 前三段好,第 4 段(变速)崩 → 已经相当不错了。第 16 章。
- 四段均匀地一般 → 纯抖动问题。没有捷径,卷 II 每天十分钟。
注意这五种情况指向五个完全不同的章节。而如果只看总分,它们看起来一模一样。这就是这本书从第 2 章开始一直在做的那件事:把一个笼统的评价,拆成几个可以分别下手的数。
一个提醒:别把这里的分数当成目标
说一句可能有点扫兴、但必要的话。
这台机器是一把尺子,不是一个目标。把「在这台机器上拿高分」变成目标,会引出两种没意义的行为:
一、针对这个固定谱面练。打了几十遍之后你会把这 32 个音符整个背下来,分数自然上去 —— 但那时候它测的已经不是你的节奏能力,是你对这一段的熟悉度。尺子被污染了。
二、在测量时刻意用力。屏住呼吸、格外专注、动作绷紧 —— 这能让单次成绩变好,但它量到的不是你平时的状态。而你平时的状态才是你在游戏里能用的那个。
所以用它的正确姿势是:按你平时的样子打,一周一次,只看趋势。如果某一周的数突然特别好,先怀疑是不是自己太用力了,而不是高兴。
这条其实适用于这本书里的每一个测量工具,只是在这一章最容易出问题 —— 因为它给分数,而分数天然勾引人去优化它。
诚实地说三条差别,免得你把这里的数直接搬过去:
1. 判定口径不同。本书用的是自己定的 2/4/6 帧,任何一款真游戏的窗口都可能不一样。所以这里的绝对分数没有可比性,只有你自己周与周之间的趋势有意义。
2. 这里没有视觉干扰。第 22 章那个 ⑨ 号机关(视听矛盾)在这台机器上是不存在的 —— 所以你在这里的成绩会系统性地比游戏里好一点。
3. 这里的谱面永远一样。真游戏考的还有「第一次遇到时的应变」,那是这台机器测不了的。
但这三条差别恰恰也是它的价值:它是一个受控的环境。你在这里量到的变化,一定来自你自己,而不是来自「今天这关比较难」。
接下来
最后一章把整本书收成一个每天十分钟的日常,并回答一个更大的问题:
这些东西除了打游戏,还能用在哪。
答案比你想的多。因为这本书从头到尾练的其实不是「按键」,是在时间里建立并维持一张网格的能力 —— 而那张网格,唱歌要用、学乐器要用、跳舞要用、甚至说话有没有节奏感也和它有关。
最后一章还会给一份完整的复习索引:按症状查章节。「手感很好但判定很差」查哪一章、「正拍全对后半拍全错」查哪一章、「一崩就整关废掉」查哪一章 —— 这本书真正的用法不是从头读一遍,是在遇到问题的时候翻对那一页。
本章治的是:全部四种,而且是同时。它是一台体检机 —— 四段分别对应不同的病,看哪一段崩就知道该翻哪一章。
带走一句话:模型算不准的地方,比它算得准的地方更有信息量。