Metalcore Piano Lab|从音频到谱面:一个离散化的实验(WIP)

有时候我会觉得音乐里最数学的部分不是和声或调式,而是节奏如何从连续变成可数

一段音频是连续的时间信号,而音游谱面是一串离散事件(notes),把前者映射到后者,本质上就是一次结构化的离散化:检测、估计、分段、对齐,最后再把结果变成可玩的交互。

Metalcore Piano Lab 是我最近做的一个浏览器端原型,上传一首 metalcore / prog-metal 的音频(或者midi),系统会自动分析并生成钢琴式多轨谱面,让它能直接玩起来。它还在开发中,目前谱子的识别还有很多需要优化的地方,但我想先把它作为一篇数学栏目里的研究记录,留下一条清晰的思路。

我在做什么

这是一个研究导向的 web rhythm game prototype(虽然其实就是我自己做着玩儿的但是说不定之后申请博士可以把这个写进去所以稍微弄得科研了一点)。

使用方式很简单:上传本地音频(mp3 / wav / m4a)或MIDI文件,点击 Analyze,等待系统生成谱面,然后用键盘进行游玩(支持 4/6/8 keys 与多难度)。

核心思路:从连续信号到离散事件

目前的流水线大致是这样:

  • 起音/打点检测
    哪些时间点“发生了事件”?鼓点、拨弦、重拍……这些瞬间决定了谱面的骨架。
  • 速度估计与节拍跟踪
    事件要落到哪里才“像音乐”?这一步给出一个节拍网格,让 notes 可以被量化,避免漂移。
  • 拍号估计
    让分组和重音更自然:尤其是在 prog-core 这种容易出现非典型分组的风格里,拍号会影响玩家的“理解成本”。
  • 自适应分段与模板对齐
    我很在意的一点是重复段落的谱面一致性,同一个 riff 回来时如果谱面逻辑突然变形,玩家会立刻觉得怪怪的。
    所以我更希望系统能识别段落结构,并尽量让重复段对齐,而不是每次都从零生成。
  • 感知对齐
    最后要对齐的不只是“数学上的时间点”,还有人的感知,比如哪些音该强调,哪些密度会让手感爆炸,哪些模式会更像可以练出来的谱面。

为什么把它放在「数学」栏目

因为这里面最有趣的不是“写了个小游戏”,而是:你必须把一堆模糊的直觉(听感、重拍、段落、可玩性)变成可计算、可复现的结构。

而金属核前卫核恰好非常适合作为压力测试,节奏密、切分多、等等,它会逼着算法正面回答什么叫“稳定”,什么叫“一致”,什么叫“人类会觉得合理”。

当前状态(以及它还没完善地方)

这是一个 WIP 原型,所以我也把限制写清楚:

  • 目前是 browser-native 的轻量实现,没有做深度的 stem separation(所以混音很糊或层次很复杂时会更难)。
  • 遇到复杂 polymeter 或突然变速(abrupt tempo changes),beat/拍号相关的稳定性可能会下降,导致谱面质量波动。

但我并不觉得这是失败,反耳(🤭)更像实验记录里必须留下的边界条件,哪些输入会让系统崩,哪些改动能改善它。

接下来要优化什么

我接下来的重点会放在“自动生成谱面更像人写的”这件事上:

  • 提升 tempo/beat tracking 在变速与强切分场景下的稳定性
  • 强化 sectioning + template alignment,让重复段落更一致、更少漂移
  • 更清晰的 difficulty scaling,把密度、跨度、左右手负担映射到可解释的难度曲线
  • 加入更多可玩性约束:避免不必要的连打、过大跳跃、手位不合理等
  • 更细的 offset/latency 校准,让判定更跟手

项目链接

https://github.com/lyuf09/metalcore-piano-lab

返回数学栏目