(前言:这是我有关Stack Overflow的第一个与音频有关的问题,因此,我将尽最大可能写出最好的措辞。欢迎编辑。)

我正在创建一个允许用户循环播放音乐的应用程序。目前,我们的原型(prototype)允许这些“循环标记”(实现为UISliders)每秒捕捉一次,指定循环的开始和结束。显然,在循环播放音乐时,秒是处理此问题的一种非常粗糙的方式,因此我想使用节拍。

除了标记节拍,我不想做任何其他事情来使UISliders捕捉到:

  • 向我们的loadMusic方法提供一个音频文件。
  • 在一个库中运行它以检测节拍或节拍之间的间隔(也许)。
  • 将该值输入到滑块的setNumberOfTickMarks:方法中。
  • 利润!

  • 不幸的是,我通过Google和SO遇到的大多数结果都产生了更先进的节拍检测库,例如混音器会使用的那些库。在我的情况下,矫kill过正。

    这是CoreMedia,AVFoundation或AudioToolbox可以处理的吗?如果没有,还有其他库可以处理吗?我对Apple文档的研究仅产生了有关MIDI文件的相关结果。但是Apple自己的软件具有类似iMovie's snap-to-beats functionality这样的功能。

    此时,任何指导,代码或摘要都将非常有用。

    编辑:在进行了更多挖掘之后,似乎我寻找的正确术语是发作检测。

    最佳答案

    从查看原始音乐信号到使用频域技术,发作检测算法有多种形式。

    如果您想要一种快速简便的方法来确定节拍在哪里:

  • 将音乐信号切成小段(20-50ms块)
  • 计算信号的平方和平均值:Sum(Xn ^2) / N(其中N是每个20-50ms的样本数)

  • 如果您想使用更复杂的技术,请查看:

    http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf

    或对其进行硬性处理:

    http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf

    10-06 09:24