从哪里开始iOS音频合成器?

时间:2010-12-29 15:24:49

标签: ios audio synthesizer sound-synthesis

我知道这是一个非常广泛的主题,但我一直在讨论演示和我自己的测试,我不确定我是否正确地攻击了这个问题。因此,任何我应该开始的线索都会受到赞赏。

目标是让应用根据用户的设置生成一些合成声音。 (这不是唯一的应用程序功能,我不是在这里重新创建Korg,但是synth是其中的一部分。)用户可以设置典型的合成器设置,如波形,混响等,然后在音符播放时选择,可能使用俯仰和速度修正器。

我用音频单元和RemoteIO玩了一下,但只是勉强理解我在做什么。在我走到那个兔子洞之前,我想知道我是否在正确的球场。我知道音频合成器会很低级,但是我希望也许有一些更高级别的库我可以使用。

如果您有关于从哪里开始的指示,以及我应该阅读的iOS技术,请告知我们。

谢谢!

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

是否已经为iOS构建了任何合成库? (商业或开源 - 我没有找到任何搜索,但也许我错过了它。)

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

假设我已经可以生成缓冲区,是否有更好/更简单的方法将这些缓冲区提交到iOS音频设备而不是RemoteIO Audio Unit?

10 个答案:

答案 0 :(得分:9)

这是一个非常好的问题。我有时会问自己同样的事情,我总是最终使用斯坦福大学的MoMu Toolkit。这个库提供了一个很好的回调函数,连接到AudioUnits / AudioToolbox(不确定),所以你关心的是设置采样率,缓冲区大小和音频样本的位深度,你可以很容易地合成/在回调函数中处理你喜欢的任何内容。

我还推荐Ge Wang在斯坦福大学发布的Synthesis ToolKit (STK) for iOS。非常酷的东西来合成/处理音频。

每次Apple发布新的iOS版本时,我都会查看新文档,以便找到更好(或更简单)的方法来合成音频,但总是没有运气。

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

答案 1 :(得分:6)

斯威夫特&目标C

有一个很棒的开源项目,有很好的文档和Objective-C&的视频和教程。迅速的。

AudioKit.io

答案 2 :(得分:4)

将缓冲区连接到声卡的最低级别方法是通过audiounit api,尤其是remoteIO audiounit。这是一堆胡言乱语,但网上散布着一些例子。 http://atastypixel.com/blog/using-remoteio-audio-unit/就是一个。

我想有其他方法可以使用AVFoundation框架来填充缓冲区,但我从来没有这样做过。

另一种方法是使用openframeworks来处理所有音频内容,但这也假设你想在openGL中进行绘图。如果您确实希望以另一种方式进行绘图,那么撕掉音频实现应该不是太大的问题。这个特殊的实现很好,因为它会将所有内容转换为-1..1浮点数,以便填充。

最后,如果你想在一堆振荡器/滤波器/延迟线上跳转,你可以挂钩到openframeworks音频系统(或任何使用-1..1浮点阵列的系统)你可能想检查出http://www.maximilian.strangeloop.co.uk

答案 3 :(得分:3)

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

答案 4 :(得分:3)

我知道这有点老了,但这对我来说似乎是错误的方法 - 你应该做的是找一个音频单元合成器来模拟你想要做的变化。其中有很多,其中一些是开源的,另一些可能是可授权的 - 并且代码中包含音频单元。上面描述的机制似乎可以正常工作,但它们并没有真正针对ios平台进行优化。

答案 5 :(得分:3)

我知道这个主题已经过时了,我很惊讶iOS的情况在音频方面仍然没有改善。

然而,有一条银色线:iOS 6支持WebAudio API。我成功地设法用一个很好的polyphone合成器,在JavaScript中只有几行。至少有一些基本的东西,比如开箱即用的振荡器:

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

和(只是从众多中选择一个例子)

答案 6 :(得分:3)

我知道这是一篇旧帖子,但请查看The Amazing Audio Engine

  

Amazing Audio Engine是一款适用于iOS音频应用程序的复杂框架,无需使用即可构建。它的设计非常易于使用,并代表您处理所有复杂的iOS音频。< / p>

这是来自AudioBus for iOS的开发者。

答案 7 :(得分:2)

基本上它将是音频队列和音频单元之间的折腾。如果您需要接近实时,例如,如果您需要处理麦克风输入,音频单元是您实现最小延迟的方法。

但是,在渲染回调中可以进行多少处理有一些限制 - 即一大块数据到达超高优先级系统线程。如果你试图在这个线程中做太多,它将会影响整个操作系统。

因此您需要在此回调中进行智能编码。有一些陷阱,比如使用NSLog和访问没有非原子声明的另一个对象的属性(即它们将隐式创建锁)。

这是苹果建立更高级别框架(AQ)以消除这种低级别棘手业务的主要原因。 AQ允许您接收进程并在线程上吐出音频缓冲区,如果导致延迟则无关紧要。

但是,您可以通过大量处理来解决问题,特别是如果您使用加速框架来加速数学操作。

事实上,只需使用音频设备 - 从jonbro给你的链接开始。尽管AQ是一个更高级别的框架,但使用起来更加令人头疼,RemoteIO音频单元是这项工作的正确工具。

答案 8 :(得分:1)

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

答案 9 :(得分:0)

我一直在试验Tonic Audio synth library。干净且易于理解的代码,准备编译macOS和iOS示例。

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

我使用Tonic的对手Novocaine将我的浮点阵列推送到扬声器。

例如256k将这些用于它生成的所有音乐。

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