31

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

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

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

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

谢谢!

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

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

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

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

4

10 回答 10

10

This is a really good question. I sometimes ask myself the same things and I always end up using the MoMu Toolkit from the guys at Stanford. This library provides a nice callback function that connects to AudioUnits/AudioToolbox (not sure), so that all you care about is to set the sampling rate, the buffer size, and the bit depth of the audio samples, and you can easily synthesize/process anything you like inside the callback function.

I also recommend the Synthesis ToolKit (STK) for iOS that was also released by Ge Wang at Stanford. Really cool stuff to synthesize / process audio.

Every time Apple releases a new iOS version I check the new documentation in order to find a better (or simpler) way to synthesize audio, but always with no luck.

EDIT: I want to add a link to the AudioGraph source code: https://github.com/tkzic/audiograph This is a really interesting app to show the potential of AudioUnits, made by Tom Zicarelli. The code is really easy to follow, and a great way to learn about this --some would say-- convoluted process of dealing with low level audio in iOS.

于 2012-10-28T23:27:52.670 回答
6

斯威夫特和目标 C

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

AudioKit.io

于 2015-07-08T21:35:30.673 回答
4

将缓冲区获取到声卡的最低级别方法是通过 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

于 2011-02-01T18:17:39.537 回答
3

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

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

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

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

于 2013-06-09T17:33:37.400 回答
3

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

于 2011-08-31T00:53:24.937 回答
3

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

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

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

于 2013-08-22T09:46:27.760 回答
3

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

于 2010-12-29T15:33:15.380 回答
2

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

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

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

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

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

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

于 2011-12-11T00:43:23.533 回答
1

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

于 2012-05-26T04:10:45.807 回答
0

我一直在尝试使用Tonic Audio 合成器库。干净且易于理解的代码,带有可编译的 macOS 和 iOS 示例。

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

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

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

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

于 2017-08-21T12:15:15.550 回答