节拍匹配算法

时间:2013-12-31 01:58:51

标签: java android ios objective-c

我最近开始尝试创建一个可自动击败匹配(http://en.wikipedia.org/wiki/Beatmatching)两首歌曲的移动应用(iOS / Android)。

我知道这存在,并且还有其他人取得了一些成功,但我遇到了与球员准确性有关的问题。

具体来说,我遇到“同步”问题,其中“节拍”没有排队。迄今使用的各种方法是:

  • 提前计算BPM,识别“节拍”(使用像sonicapi.com这样的东西),然后尝试正确排队,并开始调整其播放速率(速度调整)

  • 利用一堆元数据触发特定的启动和停止

什么行不通:

  • 利用echonest的API(它击败了服务器上的匹配,我们希望在客户端上进行)
  • pydub之类的东西(实时不做)

今天谁使用此算法:

  • iwebdj

  • 拖拉机

有没有人对如何解决这个问题有什么建议?我见过很多人这样做,但在移动设备上实时做这件事似乎是一个问题。

1 个答案:

答案 0 :(得分:4)

有很多方法可以解决这个问题,其中一些方法比其他方法效果更好。 Matthew Davies已就此问题发表过多篇论文。瞥一眼this article似乎打破了这样做所需的一些步骤。我在Matlab(不幸的是......)和同学建立了一个节拍跟踪器,我们的目标是在两首歌曲之间创建一个outro / intro,这样他们之间的节奏就是无缝的。我们希望为BPM中的各种歌曲做少量(两者之间+ -7左右的BPM)。我们的方法有点像这样:

  1. 在我们的数据库中找到两条重叠的“密钥中心”的歌曲。所以让我们说两首歌,都在Am。

  2. 找到两者之间关键中心的这种特殊重叠。说歌曲1秒30秒,歌曲2秒60秒

  3. 现在创建一个节拍地图,使用onset-detection algorithm进行峰值拾取;此外,this对我们很有帮助。

  4. 为每个曲目选择第一个“节拍”,并在该点重叠两个曲目。现在,由于彼此的BPM略有不同,节拍不会真正相互排列。

  5. 由此,我们创建了一种地图,它给了我们歌曲A和歌曲B之间的样本偏移。从这里,我们希望能够延长时间 - 拉伸淡入区域歌曲B使得其每个开始(在这种情况下为节拍)在正确的样本索引处排列为来自歌曲A的开始,在ITS淡出区域。因此,例如,如果歌曲B的起始2在歌曲A的起始2之前显示为5,000个样本,则我们简单地拉伸该5,000个样本区域,使得起始2在两首歌曲之间精确匹配。

  6. 这听起来很奇怪,但听起来确实不错。虽然这是在Matlab中完全脱机完成的,但我也在寻找一种在移动应用程序中实时执行此操作的方法。不完全确定您可以在Android世界中使用的库,但我认为它在C ++中最有效。

    我遇到的几个库对于原型设计很有用,或者至少研究源代码以便更好地理解如何在移动应用中实现这一点:

    Essentia(伟大的社区,开源) Aubio(似乎也保持相当好,开源)

    在iOS版本中执行此类操作时需要阅读的其他内容: vDSP Programming guide This article may also help 我遇到this project正在做一些节拍检测。虽然不幸的是它看起来很过时,但它可能会提供一些额外的见解。

    不幸的是,除了你正在假设非常具体的方面(精确的节奏等)之外,它并不像在同一时间“按下比赛”一样简单。

    如果你真的有时间在手上,你应该看看Tristan Jehan's (founder of Echonest) thesis;它充满了用于节拍检测的算法和方法等。