BeatGrid Studio

wavesurfer.js 的节拍感知编辑层 · 自动 BPM · 相位对齐网格 · 吸附 · 按小节循环

音轨

合成鼓点,BPM 为生成时的真值,可与检测结果直接比对。

0:00.00 / 0:00

Space 播放/暂停 · L 循环当前小节 · T 打拍 · ←→ 微调相位

波形与节拍网格

BPM — 置信度 — 瞬态 —
未启用

网格参数

连续点击 2 次以上,取平均间隔。

检测明细
检测 BPM
—
真值 BPM
—
误差
—
瞬态数
—
相位置信度
—
网格线数
—

它解决了什么

wavesurfer.js 负责渲染与播放,但没有音乐时间的概念:没有 BPM、没有节拍网格、没有吸附、没有按小节循环。 上游在 2023 年把多轨功能拆成独立仓库(wavesurfer-multitrack,44★),因此本项目的方向不是重做多轨,而是补上节拍这一层。

检测流程

  1. STFT — 1024 点 Hann 窗,跳步 256,复用上游的 fft.ts
  2. 对数压缩谱通量 — log1p 后取正向差分,弱瞬态不会被强拍淹没
  3. 自适应阈值峰值拾取 — 100 ms 滑动均值 × 灵敏度系数,附局部极大与最小间隔约束
  4. 梳状评分 — 包络能量落在候选周期整数倍上的比例
  5. 齿能量均匀性 — 1/(1+CV),用来破除倍频错误
  6. 齿覆盖率 — 防止结果漂移到半速
  7. 相位拟合 — 1 ms 步长扫描,加权求最优首拍位置

三个真实踩到的坑(已写进测试)

测试结果

下列数字来自本机实际执行,未做估算。运行环境:Windows / Node 22 / Chromium 156(headless)。

— 单元测试通过
— 上游测试保持通过
— 4 首鼓点 BPM 误差
— 30 s 音频分析耗时