步进音序器 · 网格分辨率 · 有损预检

音序器切换分辨率后,音符为什么少了?同一行碰撞预检

较密的 Pattern 里,同一鼓件行可能在一个粗网格单元覆盖的时间范围内放了两击。FingerDrum 切换分辨率时,会把每个亮起的源格重新映射到目标网格;若同一行的两个源格得到同一个目标地址,一个目标格无法同时保存两份事件,亮起格数就会减少,App 也会显示“密集音符可能合并”的提示。本文先算出会碰撞的格子,再预测保留哪份力度与时值,并用切回测试证明:分辨率切回去不会自动找回已经丢掉的事件。

范围:下文的精确映射与保留规则来自 2026-08-22 当天核对的 FingerDrum 当前步进 Pattern 实现。测试保持同一工程、每小节拍数、小节数、乐器行、声音与循环边界,只更改音序器分辨率。本文不讨论把现场 MIDI 演奏量化、鼓谱导入、改 BPM 或改变逐行循环长度。其他音序器可能保留同位 MIDI 事件、提供 microstep/retrigger、只改 step 时值而不重映射存储格,或使用不同取整规则;不要把 FingerDrum 公式直接套到别的产品。源格→目标格账本、C0 四项核对与 R1 切回测试是 FingerDrum 编辑团队的原创综合框架。

简答:碰撞键是“乐器行 + 目标格”,不是只有目标格

源 Pattern 有 O 格、目标 Pattern 有 N 格时,FingerDrum 把从 0 开始的源格 s 映射到 floor(s × N ÷ O)。按 (行, 目标格) 给亮起事件分组:桶里只有一个事件时不会发生碰撞丢失,但事件仍会移动到目标地址,时值也会按比例缩放并限制;超过一个时就只能留下一个目标事件。不同乐器行可以共用同一目标格而不合并。切换前先复制工程,因为回到更细网格只会把保留下来的事件拉开,不会重建被舍弃的源事件。

粗网格视图、MIDI 量化与存储格重采样不是同一种操作

“把网格设为 1/16”可能指完全不同的动作。Apple 说明 Logic Pro 的 Region Quantize 参数可以非破坏地调整播放位置,同时保留原始时间。Ableton 则把关闭网格吸附的自由移动与针对所选音符的 Quantize MIDI Tool 分开。Steinberg 会把所选 MIDI 事件起点移到网格,还专门定义了同音高、同起点的 “double notes”;这些事件可以先同时存在,再由独立命令删除。Novation 在 Circuit Tracks 的一个 step 内提供六个 microstep,所以一个看起来较粗的格子也能容纳同一样本的多次触发。这些数据模型都不等于“一个可见格只能存储一个起音”。

FingerDrum 当前步进 Pattern 不同:每个乐器行、每个 step 地址只对应一个 StepCell。切换分辨率时,App 会在保持拍数与小节数的前提下计算新的总格数,把所有亮起格重采样进新矩阵,再提交结果。UI 会比较重采样前后的亮起格数;只要计数下降,就提示密集音符可能合并。这个提示能确认结果有损,却不会告诉你是哪一行、哪些源格落到了哪一目标格,也不会列出最终保留的力度与时值;预检表正是补上这些信息。

操作可能的数据模型编辑前要确认的问题
只改可视吸附/网格原始事件时间仍彼此独立控件改变的是显示、后续编辑、播放,还是存储数据?
量化 MIDI 事件多个事件可能来到同一时间坐标同位事件会保留、重排、缩短还是删除?
使用 microstep/retrigger一个粗 step 可编码多次起音说明书允许几个子步或重复?
FingerDrum 切换分辨率每行每个目标格只有一个存储格哪些源格取得相同的 (行, 目标格) 键?

切换分辨率前,先冻结 P0

在 FingerDrum 工程库中复制当前工程,把完全不动的副本命名为 P0,再在第二份 C0 上操作。工程库已有“复制”操作,应在切换前使用,而不是看到提示后才补。截图适合做视觉对照,却不能代替可编辑源,因为截图没有保存每格的力度与音符时值。

  1. 记录容器:写下每小节拍数、小节数、源分辨率与目标分辨率。测试中不要改 BPM、循环小节、乐器行顺序或声音。
  2. 计算总格数:FingerDrum 当前提供 1/41/81/8T1/161/16T;总格数 = 每拍格数 × 每小节拍数 × 小节数。
  3. 盘点亮起格:打开“乐器”面板,先显示所有已有行。从左到右计数,最左格记为 01。在网格中,从每条琥珀色音符条的起点数到右边界;实际覆盖的源格数就是 旧时值。再点按亮起格打开“编辑音符”,记录画面显示的力度百分比。高亮的音值按钮只用于交叉核对:横拖得到的自定义时值可能没有按钮匹配,取整或 Pattern 末尾限制也可能让多个按钮同时匹配。最后逐行统计亮起格,再计算全 Pattern 总数。
  4. 只选一个方向:本文示例检查一小节 4/4 的 1/16 → 1/8,因此 O=16N=8。不要同时做直拍→三连音切换和另一次编辑。
  5. 暂时不要切换:先做完地址账本;预测出的目标计数才是 C0 的验收标准。
为什么要保留逐行计数?

总数从 12 变成 11,只证明少了一个存储格,不能判断丢的是底鼓、军鼓、踩镲还是其他乐器。逐行计数能定位损失,也能避免把同一步的正常底鼓+军鼓误标成碰撞。

先映射每个源地址,再开始听

FingerDrum 会逐行独立遍历。在从 0 开始的坐标里,源格 s 的目标地址为:

目标格 = floor(源格 × 目标总格数 ÷ 源总格数)

对于 16 → 8,目标零基地址是 floor(s ÷ 2)。本文表格使用 1 基编号;App 网格本身不显示列号,请把最左格数作 01。源格 01、02 都进目标 01;源格 03、04 都进目标 02,依此类推。公式锚定的是当前 FingerDrum 源码,不能换成另一个编辑器的 “nearest” 或 “round”。

1 基源格0 基计算1 基目标格共同目标桶
01floor(0 × 8 ÷ 16)=001T01
02floor(1 × 8 ÷ 16)=001
03floor(2 × 8 ÷ 16)=102T02
04floor(3 × 8 ÷ 16)=102
05floor(4 × 8 ÷ 16)=203T03
06floor(5 × 8 ÷ 16)=203
07floor(6 × 8 ÷ 16)=304T04
08floor(7 × 8 ÷ 16)=304
16 → 8 快速检查

逐行检查 01+0203+0405+0607+0809+1011+1213+1415+16。同一行内,只要某一对的两格同时亮起,它们就会映射到一个目标格并发生合并。

把计算继续到整个 Pattern 结束;不要因为画面翻页就在每页重新从 0 开始,除非存储的 Pattern 本身也在那里重启。三连音→直拍必须使用整段的真实总格数。例如一小节 1/16T → 1/1624 → 16,不能凭感觉写成“每三个删一个”。

只有“同一行 + 同一目标地址”的组才会碰撞

给每个亮起源格建立 (行, 目标格) 键,再把相同键分到一组。在这个受控的 16 → 8 示例中,踩镲(Hat)行相邻的源格 01、02 都映射到 Hat 目标 01,因此形成 many-to-one。军鼓(Snare)行的源格 02 也来到时间上的目标 01,但它属于另一行,会作为独立事件保留,并可与最终保留的 Hat 同时发声。

源格力度时值目标键预检结果
Hat010.421(Hat,01)与 Hat 02 碰撞
Hat020.781(Hat,01)与 Hat 01 碰撞
Hat030.561(Hat,02)一对一
Snare020.901(Snare,01)一对一;不同行

四个源格最终只有三个唯一目标键,所以预期亮起格数是 3。这是结构计算,不是听感判断。Choke group、采样尾音与效果可能让保留下来的两行听起来像一个动作;反过来,长采样也可能遮住少掉的一次 retrigger。先核对矩阵,再用音频辅助。

不要只预测计数,还要预测最终保留的力度与时值

FingerDrum 的目标桶为空时,第一个映射来的源格会先写入;后续源格只有在力度更高时才替换已有内容。因此上面的 (Hat,01) 会保留源格 02 的 0.78 力度。若力度相等,后到的相同力度不会替换,扫描顺序较早的源格留下。这是确定的实现规则,不是“更响就一定更有音乐性”的建议。

最终保留源格的时值随后按网格尺寸比例缩放:

新时值 = round(旧时值 × N ÷ O),再限制在剩余目标格范围

缩放后的时值至少为 1 格,而且靠近 Pattern 末尾的音符不能越过最后一格。若碰撞的两个源格拥有不同时值,只有力度规则最终保留的那一个提供时值。只查亮起格数,可能计数通过,奏法长度却与原意不同。

切换后观察解释下一项检查
计数按预测减少已知的同一行 many-to-one 合并核对最终保留的力度与缩放时值
底鼓、军鼓仍在同一目标格正常的跨行同击不要修复一个不存在的碰撞
计数不变,但听感位置改变地址或时值移动,却没有合并复核直拍/三连音映射与全部目标地址
某一行出现账本未预测的计数下降P0 盘点或源/目标总格数错误回到副本,重数不显眼或很轻的格子
另一音序器保留了两击其存储模型或碰撞政策不同检查 double notes、microstep、retrigger 与导出行为

运行 P0 → C0 → R1,证明“切回细网格”不是撤销

账本完成后,只在 C0 中从源分辨率切到目标分辨率。只有在至少一个亮起格确实丢失时,画面警告才是预期结果。看到警告不等于验收通过,还要逐个检查目标键与属性。

  1. 计数门:C0 总数必须等于唯一 (行, 目标格) 键数量;每一行也必须等于本行唯一目标格数。
  2. 地址门:C0 每个亮起格都必须出现在源格→目标格表里;结果不应按 nearest 规则映射,也不能按屏幕分页重新起算。
  3. 属性门:每个碰撞桶必须保留预期的源格力度,以及由它缩放并限制后的时值。
  4. 边界门:播放越过 loop 回绕,在不改 BPM、小节数、声音与效果的条件下检查最后一个目标格和下一轮首拍。
  5. 切回测试:复制 C0 为 R1,把 R1 切回原来的细分辨率,再逐格与 P0 比较。

发生碰撞后,R1 不应再等于 P0。升到细网格会把每个保留下来的粗格映射到更细的地址,但系统已经没有记录“这个粗格曾由两个源格合并而来”。示例中,唯一保留下来的 Hat 目标 01 可以回到某个细格;被舍弃的相邻 Hat 不会重新出现。因此,切换前副本是证据,不只是整理习惯。

预检发现碰撞后怎么办?

切换前主动选择:两次起音都不可少,就保留较细网格;目标只能容纳一格,就人工选定一个源事件并记录这是近似;或者改用说明书明确支持合适 microstep、retrigger 或多事件表达的目标。目标无法描述原节奏时应停止转换。只留一击的替代不能叫“无损”。

这是不是在量化一段手指鼓 MIDI 演奏?

不是。既有的 FingerDrum 量化文章比较演奏的 timing correction、amount、锚点、groove 与需要保护的装饰音。本文从已经正确的步进 Pattern 出发,单独测试 App 的分辨率重采样功能,不判断源演奏应更准还是更“人性化”。

同一时刻的底鼓与军鼓会合并吗?

仅因为时间相同,不会在这次 FingerDrum 操作中合并。各行独立重采样,所以 (Kick,05)(Snare,05) 是两个键。必须是同一行至少两个亮起源格取得同一目标格,才构成碰撞。

直拍切到三连音分辨率,只是密度改变吗?

不是,它也改变时间坐标的分区。一小节 4/4 的 1/16T → 1/16 会把 24 格映射到 16 格;有些相邻三连音格共享目标,有些不会。应完整计算 24 个地址,不能写成“每三个删一个”,也不能从另一个 DAW 推断通用的二选一规则。

最终交付:一个可回到的源,与一份不可逆切换预测

保存 P0、源/目标总格数、逐行事件盘点、完整地址表、碰撞分组、最终保留属性预测、C0 四项核对和 R1 对比。这样你能在切换分辨率前就指出哪些音符会合并,并把有意的粗网格近似与原因不明的漏击分开。

来源与访问日期

FingerDrum 的精确映射、提示条件、最终保留规则、时值缩放与工程复制能力,均于 2026-08-22 直接按仓库 origin/main 提交 bab44af1f35271dd04d4bf70b30ea7733533de62 的源码和确定性测试核对。下列公开来源支持官网可见的音序器能力与跨产品对比模型,不负责定义 FingerDrum 的内部实现。

  1. FingerDrum 官网 — 步进音序器(访问于 2026-08-22)
  2. Apple — Mac 版 Logic Pro 步进音序器概览(访问于 2026-08-22)
  3. Apple — Mac 版 Logic Pro 量化参数值(访问于 2026-08-22)
  4. Steinberg — Cubase Pro 15 量化 MIDI 事件起点(访问于 2026-08-22)
  5. Steinberg — Cubase Pro 15 删除 Double Notes(访问于 2026-08-22)
  6. Novation — Circuit Tracks 用户指南(中文简体)(访问于 2026-08-22)
  7. Ableton — Editing MIDI, Live 12 Reference Manual(访问于 2026-08-22)