我知道这是一个非常广泛的主题,但我一直在讨论演示和我自己的测试,我不确定我是否正确地攻击了这个问题。因此,任何我应该开始的线索都会受到赞赏。
目标是让应用根据用户的设置生成一些合成声音。 (这不是唯一的应用程序功能,我不是在这里重新创建Korg,但是synth是其中的一部分。)用户可以设置典型的合成器设置,如波形,混响等,然后在音符播放时选择,可能使用俯仰和速度修正器。
我用音频单元和RemoteIO玩了一下,但只是勉强理解我在做什么。在我走到那个兔子洞之前,我想知道我是否在正确的球场。我知道音频合成器会很低级,但是我希望也许有一些更高级别的库我可以使用。
如果您有关于从哪里开始的指示,以及我应该阅读的iOS技术,请告知我们。
谢谢!
编辑:让我更好地总结一下问题。是否已经为iOS构建了任何合成库? (商业或开源 - 我没有找到任何搜索,但也许我错过了它。)
是否有更高级别的API可以帮助您更轻松地生成缓冲区?
假设我已经可以生成缓冲区,是否有更好/更简单的方法将这些缓冲区提交到iOS音频设备而不是RemoteIO Audio Unit?
答案 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)
答案 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,这是一种以低延迟播放不同音高的基于样本的音频的超级简单方法。