如何以编程方式确定歌曲的速度/ BPM?常用什么算法,必须考虑什么?
Answers:
在单个StackOverflow帖子中进行解释很难。通常,最简单的节拍检测算法通过定位易于检测的声能峰值来工作。更复杂的方法使用梳状滤波器和其他统计/波形方法。有关包括代码示例的详细说明,请查看此GameDev文章。
要搜索的关键字是“节拍检测”,“节拍跟踪”和“音乐信息检索”。这里有很多信息:http : //www.music-ir.org/
有一个(也许)年度竞赛,称为MIREX,其中对不同算法的拍子检测性能进行了测试。
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
那应该给您列出要测试的算法。
经典算法是 Beatroot(google it),它很好而且易于理解。它是这样的:
根据我的经验,此算法的缺点:
这是该算法的实时版本的演示,显示了频谱通量(底部的黑线)和起始点(绿色的圆圈)。值得考虑的事实是,节拍仅从绿色圆圈中提取。我已经像单击一样播放了发作,说实话,我认为我听不到它们的节拍,因此在某些方面,该算法比起节拍检测的人要好。我认为将这种低维信号减小是其薄弱的一步。
令人讨厌的是,几年前我确实找到了一个很好的站点,其中包含用于节拍检测的许多算法和代码。我完全没能拒绝它。
这里有一些很棒的链接,可以帮助您入门:
节拍提取涉及音乐中认知度量结构的识别。通常,这些不对应于物理声能-例如,在大多数音乐中,都有一定程度的晕厥,这意味着我们感知到的“踩踏”拍不对应于物理声的存在。这意味着这与开始检测(物理声音的检测)完全不同,并且以不同的方式执行。
您可以尝试Aubio库,这是一个普通的C库,提供了开始和节拍提取工具。
还有在线Echonest API,尽管这涉及将MP3上传到网站并检索XML,所以可能不太合适。
编辑:昨晚我遇到了-一个非常有前途的C / C ++库,尽管我自己没有使用过。鞋面插件
您感兴趣的一般研究领域称为音乐信息检索
有许多不同的算法可以执行此操作,但是它们基本上都以“启动检测”为中心。
发作检测可测量事件的开始,在这种情况下,事件是正在播放的音符。您可以查找加权傅立叶变换(高频内容)中的更改,也可以查找频谱内容中的较大更改。(特殊差异)。(有几篇论文,我建议您进一步研究。)一旦应用了发作检测算法,您就可以通过阈值选择节拍的位置。
一旦获得节拍的时间本地化,便可以使用多种算法。您可以将其变成一个脉冲序列(创建一个始终为零的信号,仅在发生拍子时创建一个信号),然后对该信号应用FFT,然后BAM出现最大峰值的开始频率。
以下是一些指导您走向正确方向的论文:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
这是对某些人正在讨论的内容的扩展:
有人提到要研究应用机器学习算法:基本上是从上述的发作检测功能中收集一堆特征,然后将它们与原始信号在神经网络/逻辑回归中进行组合,并了解是什么使心跳加速。
看看吴安德(Andrew Ng)博士,他在线上有斯坦福大学提供的免费机器学习讲座(不是冗长的视频讲座,实际上是在线远程课程)
如果您可以在项目中管理与python代码的接口,则Echo Nest Remix API是适用于python的漂亮API:
有一种方法analysis.tempo
可以为您提供BPM。您可以从API文档或本教程中看到,它比简单的BPM还要完成更多的工作
准确的BPM检测非常困难。看到这个stackoverflow问题,以及我的答复。
重新发布我的答案:最简单的方法是让用户按节奏按节奏敲击一个按钮,然后计算轻击次数除以时间。
这是一个免费的程序,它将分析BPM并将其写入ID3V2标签。不知道有多好