【问题标题】:Where to start on iOS audio synth?iOS 音频合成器从哪里开始?
【发布时间】:2011-06-01 02:50:01
【问题描述】:

我知道这是一个非常广泛的话题,但我一直在为演示和我自己的测试而苦苦挣扎,并且不确定我是否正确地解决了这个问题。所以任何关于我应该从哪里开始的线索将不胜感激。

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

我玩过一些音频单元和 RemoteIO,但几乎不明白我在做什么。在我深入那个兔子洞之前,我想知道我是否在正确的球场上。我知道音频合成器将是低级的,但我希望也许有一些更高级别的库可供我使用。

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

谢谢!

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

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

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

假设我已经可以生成缓冲区,有没有比 RemoteIO 音频单元更好/更简单的方法将这些缓冲区提交到 iOS 音频设备?

【问题讨论】:

    标签: ios audio synthesizer sound-synthesis


    【解决方案1】:

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

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

    我使用 Tonic 的对应产品 Novocaine 将我的浮点阵列推到扬声器上。

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

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

    【讨论】:

      【解决方案2】:

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

      Amazing Audio Engine 是一个用于 iOS 音频应用程序的复杂框架,您不必这样做。它的设计非常易于使用,并代表您处理所有复杂的 iOS 音频。

      这来自 iOS 版 AudioBus 的开发者。

      【讨论】:

        【解决方案3】:

        Swift 和目标 C

        有一个很棒的开源项目,其中包含有关 Objective-C 和 Swift 的视频和教程。

        AudioKit.io

        【讨论】:

          【解决方案4】:

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

          然而,一线希望:iOS 6 支持 WebAudio API。我成功地在 JavaScript 中只用了几行代码就成功地制作了一个不错的复音合成器。至少有一些基本的东西,比如开箱即用的振荡器:

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

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

          【讨论】:

            【解决方案5】:

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

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

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

            最后,如果您想在一堆振荡器/滤波器/延迟线上快速启动,您可以连接到 openframeworks 音频系统(或任何使用 -1..1 浮点数数组的系统),您可能需要检查出http://www.maximilian.strangeloop.co.uk

            【讨论】:

              【解决方案6】:

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

              我也推荐Synthesis ToolKit (STK) for iOS,也是斯坦福大学王戈发布的。用于合成/处理音频的东西真的很酷。

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

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

              【讨论】:

                【解决方案7】:

                我一直在使用来自开放框架的音频输出示例和 stanford stk 合成库来处理我的 iOS 合成器应用程序。

                【讨论】:

                • 您能分享一个指向您已发布产品的链接吗?
                【解决方案8】:

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

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

                所以你需要在这个回调中编写 smart 代码。很少有陷阱,例如使用 NSLog 和访问另一个声明为非原子的对象的属性(即它们将隐式创建锁)。

                这是 Apple 构建更高级别的框架 (AQ) 来解决这个低级别棘手业务的主要原因。 AQ 允许您在线程上接收进程并吐出音频缓冲区,这与您是否会导致延迟无关。

                但是,您可以避免大量处理,特别是如果您使用加速框架来加速您的数学运算。

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

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                  • 这并不完全正确。虽然第三方可以为 Mac OSX 创建音频单元,但 iOS 不允许开发人员这样做。相反,在 iOS 上,您将不得不依赖编写(或使用其他人的)渲染回调函数,当输出单元(或您想要连接的任何音频单元)需要更多音频数据时,该函数将被调用。 This page 显示 iOS 上可用的音频单元。
                  【解决方案10】:

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

                  【讨论】:

                  • 感谢您的回复!是的,我知道缓冲区是所有魔法发生的地方。我只是不确定我是否走在通过设备扬声器发送缓冲区的正确路径上。请参阅我上面的问题改述。
                  • iOS 不支持双缓冲。这是实时音频。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-09
                  • 2011-08-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-08-13
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多