在iOS音频合成方面,应该从哪里开始?

31

我知道这是一个非常广泛的话题,但是我一直在尝试演示和测试,不确定自己是否正确地解决了问题。因此,如果您有任何关于应该从哪里开始的线索,将不胜感激。

目标是让应用程序根据用户的设置生成一些合成声音。(这不是唯一的应用功能,我不是在重新创建Korg,但合成器是其中的一部分。)用户会设置典型的合成器设置,例如波形、混响等等,然后会选择什么时候播放音符,可能还会有音高和力度调节。

我已经稍微尝试过Audio Unit和RemoteIO,但只是了解得很浅。在我太深入这个领域之前,我想知道我是否正在正确的轨道上。我知道音频合成会很底层,但我希望也许有一些更高级别的库可以使用。

如果您有任何指针告诉我应该从哪里开始以及我应该更多地阅读哪些iOS技术,请告诉我。

谢谢!

编辑:我来更好地总结一下问题。

是否已经为iOS构建了任何合成器库?(商业或开源 - 我进行了很多搜索,但可能我错过了。)

是否有更高级别的API可以帮助更轻松地生成缓冲区?

假设我已经可以生成缓冲区,是否存在比RemoteIO Audio Unit更好/更容易的方式将这些缓冲区提交给iOS音频设备?

10个回答

10
这是一个非常好的问题。有时我也会问自己同样的问题,最终我总是使用斯坦福大学的MoMu Toolkit。该库提供了一个很好的回调函数,连接到AudioUnits/AudioToolbox(不确定),所以你只需要设置音频样本的采样率、缓冲区大小和位深度,就可以在回调函数中轻松地合成/处理任何你喜欢的东西。
我还推荐由Ge Wang在斯坦福大学发布的Synthesis ToolKit (STK) for iOS。真的很酷的东西来合成/处理音频。
每次苹果发布新的iOS版本时,我都会查看新的文档,以找到更好(或更简单)的方法来合成音频,但总是没有成功。

编辑:我想添加一个指向AudioGraph源代码的链接:https://github.com/tkzic/audiograph 这是一个非常有趣的应用程序,展示了AudioUnits的潜力,由Tom Zicarelli制作。代码非常易于理解,是学习iOS中处理低级音频的 --一些人会说-- 复杂 过程的好方法。


6

Swift 和 Objective C

有一个很棒的开源项目,对于 Objective-C 和 Swift 都有视频和教程进行了详细的文档记录。

AudioKit.io


4
最低级别的向声卡传输缓冲区的方法是通过音频单元API,特别是远程IO音频单元。这些都是一堆无意义的东西,但网上散布着一些例子。其中之一是http://atastypixel.com/blog/using-remoteio-audio-unit/
我想还有其他填充缓冲区的方法,可以使用AVFoundation框架,但我从未尝试过。
另一种方法是使用openframeworks进行所有音频处理,但这也假定您想要在openGL中进行绘图。如果您确实希望以另一种方式进行绘图,则拆除音频单元实现不应该太困难。这种特殊的实现很好,因为它将所有内容转换为-1..1浮点数供您填充。
最后,如果您想快速开始一堆振荡器/滤波器/延迟线,并将其连接到openframeworks音频系统(或任何使用-1..1浮点数组的系统),则可以查看http://www.maximilian.strangeloop.co.uk

3

我知道这可能有点过时,但我认为这似乎是错误的方法 - 你应该找到一个音频合成器单元来模拟你想要做的变化。有许多这样的工具,其中一些是开源的,其他的可能需要授权 - 并从你的代码中托管这些音频单元。上面描述的机制似乎可以正常工作,但它们不会真正针对iOS平台进行优化。


这并不完全正确。虽然第三方可以为Mac OSX创建音频单元,但iOS不允许开发人员这样做。相反,在iOS上,您将需要依赖编写(或使用其他人的)呈现回调函数,当输出单元(或任何您想要连接到的音频单元)需要更多音频数据时,该函数将被调用。 此页面显示了iOS上可用的音频单元。 - Tom

3
这有两个部分:首先,您需要生成合成音频的缓冲区 - 这几乎与平台无关,您需要对音频合成有很好的理解才能编写此部分。第二部分是将这些缓冲区传递给适当的特定于操作系统的API,以便实际播放声音。大多数音频播放API都支持双缓冲甚至多个缓冲区,因此您可以在播放当前缓冲区时合成未来的缓冲区。至于要使用哪个iOS API,则可能取决于您的应用程序的整体架构,但这真的是容易的部分。合成部分是您需要做大部分工作的地方。

谢谢回复!我知道缓冲区是所有魔法发生的地方。只是我不确定是否在正确的路径上将缓冲区发送到设备的扬声器。请参见我上面重新表述的问题。 - Dave Sanders
iOS不支持双缓冲,因为这是实时音频。 - Aran Mulholland

3

我知道这篇文章已经有些年头了,但是你可以看一下The Amazing Audio Engine

The Amazing Audio Engine 是一个 iOS 音频应用程序的先进框架,建立在您不需要处理音频的基础上。它被设计为非常易于使用,并代表您处理了所有 iOS 音频的复杂性。

这来自于 iOS 的 AudioBus 开发者。


3
我知道这个话题已经老掉牙了,但是在iOS上的音频问题仍然没有得到改善,这让我感到惊讶。
不过,好消息是:iOS 6支持WebAudio API。我成功地用几行JavaScript代码实现了一个漂亮的多音色合成器。至少,像振荡器这样的基本元素可以直接使用。

https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html

举个例子:


2
基本上,音频队列和音频单元之间存在取舍。如果您需要接近实时,例如需要处理麦克风输入,则音频单元是实现最小延迟的方法。
然而,在渲染回调中进行的处理量有一定限制 - 即一块数据在超高优先级系统线程上到达。如果您尝试在此线程中执行过多操作,它将导致整个操作系统卡顿。
因此,您需要在此回调中编写智能代码。有一些陷阱,比如使用NSLog和访问另一个对象的属性,这些属性没有声明为非原子(即它们将隐式创建锁)。
这是苹果构建更高级别框架(AQ)的主要原因,以消除这种低级别的棘手操作。 AQ允许您在不会引起延迟的线程上接收、处理和输出音频缓冲区。
但是,您可以通过大量处理来逃避,特别是如果您正在使用加速框架来加速数学操作。
事实上,只需使用音频单元-从Jonbro给您的链接开始。即使AQ是一个更高级别的框架,但使用它会更加头疼,RemoteIO音频单元才是此工作的正确工具。

1

我一直在使用open frameworks的音频输出示例和stanford stk合成库来开发我的iOS合成器应用程序。


1
你能分享一下你已发布产品的链接吗? - Aran Mulholland

0

我一直在尝试使用Tonic Audio合成库。干净易懂的代码,具备可编译的macOS和iOS示例。

在某个时候,我开始使用简单的C代码从头生成自己的缓冲区,以执行基本操作,例如正弦波、ADSR和延迟,这非常令人满意。

我使用Tonic的Novocaine将浮点数组推送到扬声器。

例如256k使用它们来生成所有音乐。

最近,我发现了AVAudioUnitSampler,这是一种播放基于采样的音频以不同音高低延迟的超级简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接