2012-02-20 66 views
12

前言:这是我的第一个关于堆栈溢出的音频相关问题,所以我会尽力将其尽可能最好地表达出来,编辑欢迎。 )使用AVFoundation/CoreMedia /其他框架来检测节拍/发音

我正在创建一个允许用户循环播放音乐的应用程序。目前我们的原型允许这些“循环标记”(实现为UISliders)每秒捕捉一次,指定循环的开始和结束。显然,当循环播放音乐时,秒是处理这种情况的一种非常粗糙的方式,所以我想用beat来代替。

我不想做的比标记以外的任何击败了UISliders捕捉到:

  • 订阅我们的loadMusic方法的音频文件。
  • 通过库运行它来检测节拍或它们之间的时间间隔(也许)。
  • 将该值输入到滑块的setNumberOfTickMarks:方法中。
  • 利润!

不幸的是,我通过Google和SO运行的大部分结果都产生了更多高级节拍检测库,如混音器将使用的那些。夸大我的情况。

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

在这一点上,任何指导,代码或摘要都是非常有用的。

编辑:做了一些更四处之后,它似乎是正确的术语为我正在寻找的是开始检测

+1

那么,你需要获得纯PCM数据。选择音频库提供的内容并将现有的algortihms应用于数据 – 2012-02-20 11:11:25

+0

看到这个问题?它似乎有一些相当不错的解决方案的链接。 http://stackoverflow.com/questions/657073/how-to-detect-bpm-of-the-song-by-programming – 2012-03-03 22:55:39

回答

4

通过查看原始音乐信号到使用频域技术,发音检测算法有许多种类。

如果你想有一个快速简便的方法来determin其中节拍:

  1. 砍了音乐信号转换成小片段(20-50ms块)

  2. 计算平方和平均的信号: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