【问题标题】:Beat Matching Algorithm节拍匹配算法
【发布时间】:2013-12-31 01:58:50
【问题描述】:

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

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

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

  • 提前计算 BPM,识别“节拍”(使用 sonicapi.com 之类的东西),并尝试适当排列,并在调整播放速率(节奏调整)的情况下开始混音

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

什么不起作用:

  • 利用 echonest 的 API(它在服务器上击败了比赛,我们想在客户端上进行)
  • 类似 pydub 的东西(不实时执行)

今天谁在使用这个算法:

  • iwebdj

  • 拖拉机

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

【问题讨论】:

  • @svenoaks:我愿意;有些人玩糖果迷恋,有些人为了好玩而匹配节拍:)
  • 你不能只使用一个共同的位置。如果它们的速度相同,则文件应该在相同的时间和地点读取,所以虽然它们可能不是第一次,但在同一时间精确启动,不会有任何可检测的延迟。
  • @svenoaks:我想在手机上以特定方式混合音乐。只是我正在做的一个很酷的小项目,没有什么疯狂的。
  • @BobbyDigital:你会这么想,但由于某种原因,延迟开始了,它“听起来”并不好。更重要的是,进来的音乐总是在变化,这意味着这是一个可以接受任何歌曲的动态算法。

标签: java android ios objective-c


【解决方案1】:

有很多方法可以解决这个问题,其中一些方法比其他方法效果更好。 Matthew Davies 已就此事发表了多篇论文,其中包括许多其他论文。查看this article 似乎分解了执行此操作所需的一些步骤。我和一个同学在 Matlab 中构建了一个节拍跟踪器(不幸的是......),我们的目标是在 2 首歌曲之间创建一个 outro/intro 以便它们之间的节奏是无缝的。我们希望对 BPM 变化很小的歌曲(两者之间的 BPM 为 +-7 左右)执行此操作。我们的方法是这样的:

  1. 在我们的数据库中找到两首重叠“关键中心”的歌曲。所以让我们说两首歌,都是在美国。

  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 首歌曲在两首歌曲之间完全匹配。

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

我遇到的几个库可以很好地进行原型设计,或者至少研究源代码以更好地了解如何在移动应用中做到这一点:

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

在 iOS 领域做这类事情需要阅读的其他内容: vDSP Programming guide This article may also help 我遇到了this project,它正在做一些节拍检测。不幸的是,虽然它似乎已经过时了,但它可能会提供一些额外的见解。

不幸的是,它并不像同时“按下播放”来对齐节拍那么简单,除非您假设它们非常具体(准确的节奏等)。

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

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 2011-06-18
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多