12

前言:这是我在 Stack Overflow 上的第一个与音频相关的问题,所以我会尽我所能说出这个问题。欢迎编辑。)

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

除了标记节拍让 UISlider 捕捉到之外,我不想做任何事情:

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

不幸的是,我通过 Google 和 SO 遇到的大多数结果都产生了更高级的节拍检测库,例如混音器将使用的那些。就我而言,矫枉过正。

这是 CoreMedia、AVFoundation 或 AudioToolbox 可以处理的吗?如果没有,是否有其他库可以处理这个问题?我对 Apple 文档的研究只产生了相关的结果……对于 MIDI 文件。但苹果自己的软件也有类似的功能,比如iMovie 的 snap-to-beats 功能

在这一点上,任何指导、代码或摘要都会非常有帮助。

编辑:在做了更多的挖掘之后,我正在寻找的正确术语似乎是onset detection

4

1 回答 1

4

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

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

  1. 将音乐信号切成小段(20-50ms块)

  2. 计算信号的平方和平均值:(Sum(Xn ^2) / N其中N是每个 的样本数20-50ms

如果您想要更复杂的技术,请查看:

https://adamhess.github.io/Onset_Detection_Nov302011.pdf

或对其进行硬核处理:

https://scholar.google.com/citations?view_op=view_citation&hl=en&user=PMHXcoAAAAAJ&citation_for_view=PMHXcoAAAAJ:uJ-U7cs_P_0C

于 2012-04-03T14:17:12.757 回答