我最近开始尝试创建一个可自动击败匹配(http://en.wikipedia.org/wiki/Beatmatching)两首歌曲的移动应用(iOS / Android)。
我知道这存在,并且还有其他人取得了一些成功,但我遇到了与球员准确性有关的问题。
具体来说,我遇到“同步”问题,其中“节拍”没有排队。迄今使用的各种方法是:
提前计算BPM,识别“节拍”(使用像sonicapi.com这样的东西),然后尝试正确排队,并开始调整其播放速率(速度调整)
利用一堆元数据触发特定的启动和停止
什么行不通:
今天谁使用此算法:
iwebdj
拖拉机
有没有人对如何解决这个问题有什么建议?我见过很多人这样做,但在移动设备上实时做这件事似乎是一个问题。
答案 0 :(得分:4)
有很多方法可以解决这个问题,其中一些方法比其他方法效果更好。 Matthew Davies已就此问题发表过多篇论文。瞥一眼this article似乎打破了这样做所需的一些步骤。我在Matlab(不幸的是......)和同学建立了一个节拍跟踪器,我们的目标是在两首歌曲之间创建一个outro / intro,这样他们之间的节奏就是无缝的。我们希望为BPM中的各种歌曲做少量(两者之间+ -7左右的BPM)。我们的方法有点像这样:
在我们的数据库中找到两条重叠的“密钥中心”的歌曲。所以让我们说两首歌,都在Am。
找到两者之间关键中心的这种特殊重叠。说歌曲1秒30秒,歌曲2秒60秒
现在创建一个节拍地图,使用onset-detection algorithm进行峰值拾取;此外,this对我们很有帮助。
为每个曲目选择第一个“节拍”,并在该点重叠两个曲目。现在,由于彼此的BPM略有不同,节拍不会真正相互排列。
由此,我们创建了一种地图,它给了我们歌曲A和歌曲B之间的样本偏移。从这里,我们希望能够延长时间 - 拉伸淡入区域歌曲B使得其每个开始(在这种情况下为节拍)在正确的样本索引处排列为来自歌曲A的开始,在ITS淡出区域。因此,例如,如果歌曲B的起始2在歌曲A的起始2之前显示为5,000个样本,则我们简单地拉伸该5,000个样本区域,使得起始2在两首歌曲之间精确匹配。
这听起来很奇怪,但听起来确实不错。虽然这是在Matlab中完全脱机完成的,但我也在寻找一种在移动应用程序中实时执行此操作的方法。不完全确定您可以在Android世界中使用的库,但我认为它在C ++中最有效。
我遇到的几个库对于原型设计很有用,或者至少研究源代码以便更好地理解如何在移动应用中实现这一点:
Essentia(伟大的社区,开源) Aubio(似乎也保持相当好,开源)
在iOS版本中执行此类操作时需要阅读的其他内容: vDSP Programming guide This article may also help 我遇到this project正在做一些节拍检测。虽然不幸的是它看起来很过时,但它可能会提供一些额外的见解。
不幸的是,除了你正在假设非常具体的方面(精确的节奏等)之外,它并不像在同一时间“按下比赛”一样简单。
如果你真的有时间在手上,你应该看看Tristan Jehan's (founder of Echonest) thesis;它充满了用于节拍检测的算法和方法等。