我正在寻找创建一个模拟物理乐器的应用程序。我有音频样本,但我希望能够动态增加音高/频率,所以我不必从太多文件加载。
知道哪个音频API能够做到这一点?我估计OpenAL或音频队列服务,但不确定哪个是合适的。任何指南/示例代码的链接也非常感谢。
提前致谢。
答案 0 :(得分:19)
我在2009年走了这条路,尝试了Audio Toolkit,音频队列服务,openAL,最后解决了RemoteIO AudioUnit。
音频工具箱适用于基本触发音效,但无法改变频率或循环样本。
音频队列服务可以循环样本,但我能找到调整样本播放频率的唯一方法是重新读取文件中的数据 - 非常痛苦。此外,该框架非常麻烦 - 如果我试图从互联网上传输内容,我只会使用它。
OpenAL是一个天赐之物 - 在接下来不再可用于Apple的“CrashLanding”iPhone示例应用程序之后,在一小时内启动并运行它。我发现OpenAL非常适合游戏甚至是乐器 - 可以预先加载样本,调整频率很容易,循环也没问题。对我而言,这个交易破坏者的开始和停止循环样本几乎每次都会导致令人讨厌的“流行”。内置的3D位置音频混音器对我来说有点太占用CPU了。
如果您的仪器不使用循环样本,我建议首先尝试OpenAL路线 - 学习曲线不那么令人生畏。尝试追踪“SoundEngine.h”,“CrashLanding”或“TouchFighter”,或查看以下链接:
http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/
由于循环样本是我的要求,我最终决定使用AudioUnits(如果您想进行输入或输出,则在iPhone上称为“RemoteIO”)。实现起来非常困难 - 非常类似于音频队列服务,因为实现的核心将在“缓冲区回调”中,每秒调用几次以填充具有原始SInt16值的出站音频缓冲区。
最终,我的乐器使用多音符复音,循环样本,没有弹出和最小延迟。
不幸的是,RemoteIO没有很好的文档记录。 Michael Tyson是该领域第一个详细撰写RemoteIO的人之一,他的帖子(和评论)对我非常有用:
http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/
祝你好运!多年后编辑:我开源了上面提到的RemoteIO / AudioUnits代码:https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - 为这个烂摊子道歉,我希望有时间来清理代码和注释。
答案 1 :(得分:1)
尝试创建音频单元。我正在做类似的事情,AU对我来说效果很好。 最初我使用了一个音频队列,因为它更简单(更高级别?)和 同步,但它缺乏响应能力,所以我把它倾倒了 音频单元。
答案 2 :(得分:0)
听起来有点像你正在创建播放MIDI文件的波表合成方法。您可以找到可以使用的iPhone MIDI合成器,然后使用音频样本构建波表集。无论何时你想播放音调,你只需将MIDI事件发送到iPhone MIDI合成器中,并加载波形表。
答案 3 :(得分:0)
现在的另一个选择是AUSampler。 http://developer.apple.com/library/mac/#technotes/tn2283/_index.html