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

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

具体来说,我遇到了“同步”问题,其中“拍子”没有对齐。迄今为止使用的各种方法是:

  • 预先计算BPM,确定一个“节拍”(使用sonicapi.com之类的东西),然后尝试进行适当的排列,然后开始调整其播放速度(速度调整)进行混合
  • 利用一堆元数据来触发特定的开始和停止

  • 什么不起作用:
  • 利用echonest的API(它在服务器上击败了比赛,我们想在客户端上做到)
  • 类似于pydub(不实时执行)

  • 今天谁在使用此算法:
  • iwebdj
  • Traktor

  • 有人对如何解决这个问题有任何建议吗?我已经看到很多人这样做,但是在移动设备上实时进行似乎是一个问题。

    最佳答案

    有很多方法可以解决此问题,其中一些方法比其他方法效果更好。 Matthew Davies发表了有关此事的几篇论文,其中包括许多其他论文。浏览this article似乎可以分解执行此操作所需的一些步骤。我和一个同学在Matlab上制作了一个节拍跟踪器(不幸的是...),我们的目标是在两首歌曲之间创建外奏/前奏,以使它们之间的节奏保持无缝。我们希望对BPM稍有变化(两者之间的BPM约为+ -7)的歌曲执行此操作。我们的方法有点像这样:

  • 在我们的数据库中找到两首重叠“键中心”的歌曲。因此,让我们说两首歌,都是在Am。
  • 找到两者之间关键中心的这种特殊重叠。对歌曲1说30秒,对歌曲2说60秒
  • 现在使用带有峰值拾取功能的onset-detection algorithm创建拍子图;另外,this对我们也有帮助。
  • 为每个音轨选择第一个“拍子”,并在该点重叠两个音轨。现在,由于它们彼此之间的BPM稍有不同,因此拍子之间并不会真正对齐。
  • 由此,我们创建了一种 map ,为我们提供了歌曲A的节拍与歌曲B的节拍之间的样本偏移。由此,我们希望能够对歌曲B的淡入区域进行时间拉伸(stretch),以便每个在ITS淡出区域上,其首音之一(在本例中为拍子)与歌曲A的首音在正确的样本索引处对齐。因此,例如,如果将歌曲B的起始2显示为歌曲A起始2之前的5,000个样本,则我们只需拉伸(stretch)5,000个采样区域,以使起始2与两首歌曲完全匹配。

  • 这听起来似乎很奇怪,但实际上听起来还不错。尽管这是完全在Matlab中离线完成的,但我也在寻找一种在移动应用程序中实时进行此操作的方法。不能完全确定您可以在Android世界中使用的库,但我认为它在C++中将是最有效的。

    我遇到的几个库对于原型(prototype)设计或至少研究源代码以更好地了解您如何在移动应用中做到这一点非常有用:

    Essentia(伟大的社区,开源)
    Aubio(开源也似乎维护得很好)

    在iOS环境中进行此类操作需要阅读的其他事项:
    vDSP Programming guide
    This article may also help
    我遇到了正在执行节拍检测的this project。不幸的是,尽管它似乎已经过时了,但它可能会提供一些其他的见解。

    不幸的是,除非您假设它们具有非常具体的方面(准确的节奏等),否则它不只是同时“按动演奏”来对齐节拍一样简单。

    如果您真的有时间,请查看Tristan Jehan's (founder of Echonest) thesis;它挤满了用于节拍检测的算法和方法等。

    关于java - 节拍匹配算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20850575/

    10-10 02:31