我正在为iPad上的合成器制作一个控制器,我有4或5个信号要混合并发送到remoteIO渲染回调。现在我有两个选择:
我可以使用多声道混音器单元,但我不知道它是如何在内部工作的。它只是简单地将缓冲区加在一起并除以缓冲区的数量吗?因为这意味着每个的体积将大大减少。
我以正确的方式阅读http://www.vttoth.com/digimix.htm和http://atastypixel.com/blog/how-to-mix-audio-samples-properly-on-ios/来混合信号,我现在正考虑在remoteIO回调中手动进行混音。
有什么建议吗?
答案 0 :(得分:9)
由于我最近已经完成了这个问题并且无论如何都有意义,我已经写了一篇详细的帖子,介绍了在渲染回调中手动混合/求和音频时的三个选项:
Mixing Audio without Clipping in iOS: Limiters and Other Techniques
基本上,您引用的博客文章中概述了第一种方法。然而,如A Tasty Pixel的帖子所述,这种“平均”技术引入了谐波失真。显然,它在某些应用中并不明显,例如当音源是全曲目或基于噪音的打击乐时(例如军鼓)。根据A Tasty Pixel的说法,专业级音频工具Loopy app成功地使用了这种技术。
第二个选项,如果你有自然声音和/或高复音音,可能会更好,只需通过将音频数据预先乘以0来缩小音频音量。 A< 1.这可能听起来很滑稽,但我相信我的博客文章中概述的原因是OpenAL根据您分配的来源做了类似的事情。比例因子不必像你想象的那么低。我的应用Sound Wand已将样本标准化为满量程,最大复数为20,并且我使用的预标度值仅为约1/3(不是1/20)。在你的乐器中,上部是一个非常好的动态范围 - 即柔和的音符是安静的,而硬音符或者它们中的很多音符都要大得多。这通常被认为是质量工具的标志之一。缺点是iPhone / iPad的内置扬声器有时会有点安静,而且便宜的外部放大器的动态范围太大了。
第三种选择确实是砖墙限制器,但没有什么简单的。常规砖墙限制器不会阻止削波。您需要一个 lookahead 砖墙限制器,并且这些代码并不容易获得。你需要超前的原因是限制器需要时间来平滑地减小音量,直到剪辑首次发生。当波形开始剪辑时“立即减小音量”是不够的,因为减小音量使其恢复到1.0是完全与剪辑相同的事情!因此,非超前限制器只会删除一半剪辑(而仅因为释放时间)。
(Brickwall限制没有“前瞻”踢得太晚,只能阻止一半的剪辑)
前瞻限制器也有缺点。它们引入了自己的谐波失真,尽管比削波要小得多。更糟糕的是,他们通过超前时间增加了延迟,即用户动作和音频结果之间的时间。这意味着响应速度较慢的应用。正如您可能已经猜到的那样,更长的前瞻意味着更透明的结果(更少的失真),因此需要权衡。我仍然认为这是可行的方法,我在the post的底部略微概述了它。
关于使用AU混音器与在remoteIO中手动混音的最后一个注意事项:如果我的声道像音频“音轨”那样我通常更倾向于使用AU而我希望控制通常的音量/声像由用户或如果你有一个游戏与几个频道可能为背景/前景/等。如果你有很多声音,比如键盘上的音符,或者如果你想要对定量进行定制控制(例如不同的平移定律,关于哪些声音开/关的特殊规则等),你可能最好手动完成。如果你只是总结几个音轨而不是任何一个选项都可以。如果你选择上面的选项2,那么一旦你进入Accelerate Framework's vDSP functions,手动执行它实际上只需要几行代码。
答案 1 :(得分:1)
Apple在他们的网站上发布了sample project which uses the mixer audiounit,但我认为这不会回答你关于AU如何在内部工作的问题。我也不知道,但是惯例规定信号在混合时简单地加在一起。混音器单元现在提供平移的事实意味着根据平移量从左或右声道中减去一点增益。
如果您手动进行混音,您可能需要在混音器的输出上应用简单的砖墙限制器,然后再将其发送回放。这样,您可以减少因添加太多信号而导致的潜在失真。虽然很明显,如果你有很多频道,理想的方法是在混音时降低信号强度。