卷 III · 图形 ♩=90→150 CH 16 16 / 24

变速加速、减速,和突然停住

前面十五章都建立在一个前提上:网格是固定的。这一章把这个前提拿掉。
变速段落难在一个具体的地方:你要改的不是某一下,是整张网格 —— 而你的身体有一个默认速度,它会一路把你往回拽。加速时你落后,减速时你抢先,而且是系统性的。
顺带还有一个连谱面工具都常算错的细节:渐变速度必须积分,不能取平均。120 → 180 BPM 走 16 拍,天真算法差 87.4ms —— 5.2 帧,早就飞出判定窗了。

渐变速度积分默认速度斜率骤停自由速度

变速有三种,难度完全不同

先分类,因为它们的对策不一样:

类型样子难在哪对策
突变某一小节起,速度直接换一个值切换的那一瞬间把切换点当成一次重新起拍
渐变速度连续地快起来或慢下去每一拍都在变跟着趋势走,不锁死旧速度
骤停音乐停住,几拍之后再起空白期你得自己撑第 7 章那套(静默续拍)

其中渐变最难,因为它不给你任何一个可以「重新对齐」的时刻 —— 网格在你脚下持续地滑动。

突变反而好办:它有一个明确的切换点,你只要在那个点上重新起一次拍就行。难的是别在切换之前就慌。

为什么突变反而好办

先把最容易的那种处理掉,因为它的对策可以直接借用前面的章节。

突变的本质是「两段各自恒定的速度,中间有一个接缝」。接缝之前你在一张网格上,接缝之后你在另一张网格上,两张网格各自都是稳的。

所以真正需要处理的只有那个接缝。而处理接缝的办法,第 21 章会给一整套(那一章讲的是崩掉之后怎么回来,但「主动重新起拍」用的是同一套动作)。核心是三步:

  • 不要试图平滑过渡。接缝就是接缝,承认它,别指望自己能滑过去。
  • 在接缝之后的第一个明确标记上重新起。通常是新段落的第一个小节头。
  • 接缝那一两拍宁可放弃。丢两个音符,换回后面整段的稳定,这笔账非常划算。

最后一条是很多人做不到的:他们不肯放弃接缝处那一两下,于是一路挣扎着追,把后面整段也搭进去。第 21 章会用一个 demo 量给你看,这种「不肯放弃」的代价有多大。

渐变必须积分,不能取平均

这一节讲一个工程上的事实,因为它能解释你在某些关卡里遇到的那种「怎么算都对不上」。

假设速度从 b0 线性变到 b1,走 N 拍。第 n 拍在什么时刻到来?

直觉的答案是「用平均速度算」。这个答案是错的,而且错得不小。

为什么不能取平均

    速度是「每分钟多少拍」,而你要求的是「时间」。
    时间 = 拍数 ÷ 速度 —— 这是一个【倒数】关系。

    而倒数的平均,不等于平均的倒数。

    速度线性上升时,前面那些拍走得慢(占时间多),
    后面那些拍走得快(占时间少);
    用中间那个速度去代表整段,会系统性地低估总时长。

正确的做法是积分。如果速度对拍位线性变化,积分有闭式解:

// 速度 b(β) = b0 + k·β,其中 k = (b1 − b0) / N
// 第 n 拍到来的时刻(秒):
//
//   t(n) = (60 / k) · ln( (b0 + k·n) / b0 )
//
// k → 0 时退化成 60n / b0。
function rampBeatTime(n, b0, b1, N) {
  const k = (b1 - b0) / N;
  if (Math.abs(k) < 1e-12) return 60 * n / b0;
  return (60 / k) * Math.log((b0 + k * n) / b0);
}

本书的验证脚本把这个闭式解和数值积分对了一遍,三组参数下最大差异在 1e-10 秒的量级 —— 也就是说它是对的。然后把它和「取平均速度」的天真算法比:

120 → 180 BPM,走 16 拍

    正确(积分)        6.487 秒
    天真(平均速度)    6.400 秒
    ─────────────────────────────
    差                  87.4ms  =  5.2 帧

    5.2 帧远远超出「完美」窗(±2 帧),
    也超出「还行」窗(±4 帧)。

    每一拍的实际长度:从 492.3ms 一路缩到 336.9ms。
◆ 判词 · 这不只是数学洁癖

87.4ms 是整段结束时的累计误差。它意味着:如果一个谱面工具用平均速度去排音符,那么这段变速的后半部分,音符全都排在了错误的位置上

玩家会遇到什么?一段「怎么打都不对,而且越到后面越不对」的变速。而他会以为是自己跟不上。

这本书的 demo 用的是积分版本,所以你在那里量到的偏差全是你的。但你在别处遇到的变速段,未必有这个待遇。

你的身体会往回拽

现在说人这一侧。变速难,还有一个生理原因,第 6 章埋过伏笔:你有一个默认速度。

让人不听任何音乐、按最舒服的速度敲,多数人落在每秒两下上下,也就是 120 BPM 附近。而这个默认值会在你跟随任何速度时,持续地施加一个拉力。

默认速度的拉力,方向是可预测的

    音乐在 80 BPM(比默认慢)  →  你会不自觉地加速
    音乐在 120 BPM(≈ 默认)   →  最省力
    音乐在 170 BPM(比默认快) →  你会不自觉地拖

    在变速段里,这个拉力表现为:
      加速段:你跟不上,误差斜率为【正】(越来越晚)
      减速段:你慢不下来,误差斜率为【负】(越来越早)

这就是为什么变速段的诊断指标是斜率,而不是抖动或偏移。demo 会把这个斜率算给你 —— 它的符号直接告诉你,你是在「跟不上」还是在「刹不住」。

跑一段变速

◗ 先听一下 · 加速和减速各来一次

下面这台机器可以设起速、终速和拍数。建议先做这两组:

90 → 150(加速):看你的斜率是不是正的。多数人是。

150 → 90(减速):看斜率是不是负的。减速对多数人更难,因为「慢下来」需要主动抑制。

散点图上那条虚线就是斜率。你要的目标不是把点压到中线上,而是把那条线压平。

怎么跟上一段渐变

知道了机制,办法就比较清楚了。三条,从粗到细:

一、跟趋势,不跟单点。不要一拍一拍地去校正(那是反应,第 1 章说过来不及)。要在心里维持一个「正在变快」的状态 —— 你的整张网格在收缩,而不是每一拍单独被推了一下。

二、加速段主动多提前一点,减速段主动多等一点。这是全书除了裏拍之外,第二个需要你做主动补偿的地方。因为你的默认速度会拽你,所以你必须往反方向多用一点力。

三、用旋律的走向来预测。渐变几乎从不是随机的 —— 它总是伴随着音乐上的某种意图(推向高潮、准备收尾)。听懂那个意图,你就能预测速度接下来往哪走,而不是等它变了才发现。

⚠ 坑 · 不要在变速段里数细分

直觉会告诉你:这段这么难,我数细一点吧。

这是错的。细分在变速段里会主动坑你 —— 因为每一格的宽度都在变,你数得越细,累积的误差越多,而且你会把注意力全花在维护这个正在变形的网格上。

正确的做法是把粒度调粗:数拍,甚至数小节。粗粒度对速度变化的敏感度低得多,而且省下来的注意力正好用来感受趋势。

这条和第 10 章那条「难的地方要把粒度调粗」是同一条规矩,只是在这里表现得特别极端。

为什么减速比加速难

做完那两组之后,多数人会发现减速那一轮更难受。这值得解释一下,因为它反直觉 —— 慢下来听起来应该更轻松才对。

三个原因叠在一起:

一、慢意味着每一拍的绝对误差更大。第 6 章那条规律:误差大致正比于时长。速度降下来,每一拍要撑的时间变长,你的误差自然变大 —— 而判定窗一点没变宽。

二、「慢下来」是一个抑制动作。加速是「多做一点」,减速是「少做一点、忍住不动」。而抑制在神经系统里从来都比启动更费劲 —— 这也是为什么急刹车比起步难,为什么话说到一半停下来比说下去难。

三、减速通常出现在结尾。音乐里的渐慢多半是收尾手法,而收尾意味着你已经打了一整关、注意力所剩不多。最难的一段被安排在你状态最差的时候,这不是巧合,是音乐结构的自然结果。

◆ 判词 · 渐慢是唯一一种「越晚越对」的情况

这本书从第 1 章就在说「你必须提前出发」。渐慢是唯一一个例外的方向 —— 在减速段里,你需要主动地比自己想的更晚一点。

而这非常别扭,因为它和你练了十五章的那个本能是反的。

可操作的说法是:在渐慢里,不要「等下一拍到来」,要「让这一拍变长」。前者会让你去追一个还没到的点(于是抢),后者让你留在当前这一拍里(于是自然会慢下来)。

还有第四种变速:你自己

前面讲的三种都是音乐在变。还有一种是音乐没变,你在变 —— 那就是第 2 章那个「走位」。

这两件事在你的感受里几乎无法区分。「音乐变快了」和「我变慢了」,主观上是同一件事。而它们的处理方式完全相反:前者你该跟上去,后者你该把自己拉回来。

怎么区分?只有一个可靠的办法:看伴奏。如果伴奏的速度确实在变(你能听出鼓点在加密),那是真变速;如果伴奏纹丝不动而你觉得越来越赶,那是你在走位。

这也是第 7 章那个静默续拍练习的长期价值:它让你熟悉「自己走位」是什么感觉,于是你在真实曲子里能把这两种情况分开。分不开的人,会在没变速的地方跟着自己的走位一起漂走,然后以为是曲子变了。

骤停:最考验人的那一种

还有一种变速是速度直接变成零:音乐停住,几拍之后再起。

这在设计上是最经济的一种为难 —— 它一个音符都不用改,只需要把伴奏静音几拍。而它考的东西你已经在第 7 章练过了:没有外部校正时,你的钟能不能自己走。

骤停有两种变体,难度差很多:

  • 停在整拍上,之后从整拍重起:好办。数满那几拍就行。
  • 停在半拍上,或者重起的位置不在正拍:难得多。这时候骤停同时也是一次位移(第 13 章),你要处理的是两件事。

而无论哪一种,最要紧的原则都是第 7 章那条:不要停,也不要提前迎接。把静默段当成普通的乐句走完,伴奏回来的时候自然就对上了 —— 而如果你在最后一拍抢过去接它,你就错了。

还有一个细节容易被忽略:骤停之后重起的速度,未必和停之前一样。有些段落会借着这个空白偷偷换速度 —— 这时候你如果按老速度撑过空白,重起的瞬间就整个对不上。

对付这种情况的唯一办法是在空白的最后一拍把耳朵打开,准备接收新的速度信息,而不是闭着眼睛数完。这是个很细的差别,但它决定了你是「撑过去了」还是「撑过去了却接不上」。

🎮 回到节奏天国 · 变速通常是有预告的

这个系列很少无缘无故地变速。变速一般伴随着几种明确的信号:

1. 音乐上的信号 —— 一段渐强、一个鼓花、一句明显的「过门」。这是最可靠的预告,而且它比画面早。

2. 结构上的信号 —— 第几遍循环了。很多小游戏的规律是「前两遍原速,第三遍开始快」。数循环,你就能提前知道。

3. 画面上的信号 —— 通常最晚到,别指望它。

所以变速类关卡最该练的其实不是「跟上变速」,而是「提前知道要变速了」。前者是被动的,后者是这本书从第 1 章就在讲的那件事。

✋ 落到手上 · 变速的两个练法

练法一:极端斜率。用上面那台 demo,把变化幅度设得很大(比如 80 → 180,只走 8 拍)。这种夸张的变速反而好练 —— 因为趋势明显到你不可能忽略它。练熟之后再回到温和的变化,你会发现容易多了。

练法二:来回切换。加速一轮、减速一轮,交替做。重点在于观察自己两种情况下的斜率符号 —— 如果加速时斜率为正、减速时为负,说明你在两个方向上都被默认速度拽着,这时候补偿的方向就很清楚了。

卷 III 收尾

这一卷讲的全部是「把一串音符当成一个东西」之后能做的事:

  • 第 11 章:把它打包。这是所有后续操作的前提。
  • 第 12 章:把包整体复述出来(呼应)。
  • 第 13 章:把包整体挪一个位置(位移)。
  • 第 14 章:把包内部的格子改成不等宽(摇摆)。
  • 第 15 章:把两个包叠在一起(复节奏)。
  • 第 16 章:让承载包的那张网格本身变形(变速)。

这六种操作,加上卷 II 的基本功,几乎覆盖了节奏天国用来为难你的全部手段 —— 第 22 章会把它们正式归成九种机关。

回头看,这一卷其实一直在做同一件事:把「变化」从一个需要临场应付的意外,变成一个你认得出名字的操作。一段节奏突然让你不适应,原因无非就是这六种之一。而认出它是哪一种,比打得更用力有用得多 —— 因为这六种的对策各不相同,甚至有些是相反的(比如遇到复节奏要合并、遇到变速要调粗粒度,而遇到裏拍反而要加密)。

但在那之前,还有一卷要处理一件被绕开了很久的事:你的身体。到现在为止我们一直假设「只要你知道什么时候该动,你就能动」。那个假设不完全成立。手有物理上限,动作有出发时间,放开和按下是两件不同的事,而崩掉之后怎么回来,比不崩更值得练。

对症CH 16
偏移 抖动 走位 认错格

本章主治:走位。变速段是走位的放大镜 —— 平时被伴奏压住的那个「默认速度拉力」,在这里会毫无遮拦地表现成一条斜线。

带走一句话:变速时要改的是整张网格,不是某一下。而且粒度要调粗,不是调细。