如何通过编程确定歌曲的速度/BPM?常用的算法有哪些,需要考虑哪些因素?
如何通过编程确定歌曲的速度/BPM?常用的算法有哪些,需要考虑哪些因素?
在单个 StackOverflow 帖子中解释这是具有挑战性的。一般而言,最简单的节拍检测算法是通过定位声能量中的峰值来工作,这很容易检测到。更复杂的方法使用梳状滤波器和其他统计/波形方法。有关详细说明和代码示例,请查看此 GameDev 文章。
需要搜索的关键词是“节拍检测”,“节拍跟踪”和“音乐信息检索”。这里有很多信息:http://www.music-ir.org/
还有一个(或许)年度竞赛叫做MIREX,不同的算法会在其中测试它们的节拍检测性能。
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
这应该会给你一个要测试的算法列表。
一个经典算法是Beatroot(Google一下),非常容易理解。它的工作原理如下:
根据我的经验,这种算法的缺点包括:
这里是该算法的实时演示,显示了谱通量(底部黑线)和起始点(绿色圆圈)。值得注意的是,节拍仅从绿色圆圈中提取。我将起始点播放为点击音,并且老实说,我认为我无法从点击音中听出节拍,所以在某些方面,该算法比人们更擅长节拍检测。我认为将信号降至如此低的维度是其弱点所在。
令人恼火的是,几年前我发现了一个非常好的网站,其中有许多关于节拍检测的算法和代码。但我完全找不到它了。
以下是一些很棒的链接,可以帮助您入门:
您感兴趣的研究领域被称为音乐信息检索(MUSIC INFORMATION RETRIEVAL)
有许多不同的算法可以做到这一点,但它们都基本上围绕起始点检测(ONSET DETECTION)展开。
起始点检测测量事件的开始,而在这种情况下,事件是指发出音符。 您可以查找加权傅里叶变换(高频内容)中的变化,也可以查找谱内容中的大量变化(谱差异)。(在下面我推荐了几篇论文供您进一步了解)完成起始点检测算法后,您可以通过阈值选取节拍位置。
一旦获得了节奏的时间定位,就可以使用各种算法。 您可以将其转换为脉冲列(创建一个信号,该信号在所有时间为零,仅在发生节拍时为1),然后对其应用FFT,现在您已经在最大峰处获得起始点的频率。
以下是引导您正确方向的一些论文:
https://adamhess.github.io/Onset_Detection_Nov302011.pdf
以下是一些人正在讨论的扩展内容:
有人提到了研究应用机器学习算法:基本上,从起始点检测函数(上述提到的)中收集大量特征并将其与原始信号结合在神经网络/逻辑回归中,学习什么构成了节拍。
请查看Andrew Ng博士,他在网上提供斯坦福大学的免费机器学习课程(不是冗长的视频讲座,实际上是在线远程课程)。
analysis.tempo
可以给出BPM。除了简单的BPM之外,它还可以执行更多操作,可以从API文档或这个教程中看到。转发我的回答:做到这一点的简单方法是让用户按照节奏轻敲按钮,并计算时间内轻敲次数的数量。
其他人已经描述了一些节拍检测方法。我想补充说明的是,有一些可用的库提供了这种任务所需的技术和算法。
Aubio 是其中之一,它具有良好的声誉,并使用C编写了一个C++包装器,因此您可以轻松地将其与可可应用程序集成(苹果框架中的所有音频内容也都是用C/C++编写的)。
我想在4-4的舞曲中会更容易实现,因为每秒应该有一个低频重击。