/onset-detection-cplusplus

Onset detection algorithm written in C++. BanG Dream! 谱面生成器

Primary LanguageC++

onset-detection-cplusplus

由 C++ 实现的 Onset Detection 算法,可用于识别歌曲内的节拍点。

目前算法版本为 v1.0,处于测试阶段,仅可识别 wav 格式的歌曲。通过测试的 wav 格式有: 44100Hz 16bit,不保证其他格式能够正常运行。

参考代码 (即 main.cpp) 可以实现识别歌曲节拍点并输出为 BanG Dream! 格式的谱面文件,目前版本仅支持输出蓝键。

编译使用 GNU G++,不需要任何额外参数及依赖文件。

具体使用:

wavfile::open(const char*): 打开一个 wav 文件,括号内参数为文件路径。

wavfile::waveChannel(): 将 wav 文件内的数据转化为浮点数据。

wavfile::getSpectrum(int): 以传入的参数为目标频率,使用 STFT 算法将歌曲时域转化为频域。

wavfile::beatDetection(): 根据频域数据,识别歌曲的节拍点。

wavfile::beatSize: 识别到的节拍点个数。

wavfile::beats: 识别到的节拍点的时间信息,该信息除以传入的目标频率极为该节拍点的出现时间。

wavfile::averageSize: 差分处理时要取平均值的数据范围。

wavfile::multiplier: 差分处理时平均值扩增倍数,数值越大最后得到的节拍点越少。

wavfile::limit: 识别节拍点时的识别限制,大于该限制的节拍点才会被识别。

经测试,当 multiplier 为 1 时,一首三分钟的歌曲能识别出 2800 个节拍点,而为 1.5 时,仅能识别出 700 个节拍点。

一个 40MB 的 wav 文件计算时占用运行内存大小 150MB,请合理分配您的运行内存。