我的问题并非完全与编程相关,但我认为SO是正确的问题。
在我的程序中,我生成一些音频数据并将轨道保存到WAV文件。一台声音发生器一切正常。但是现在我想添加更多的生成器并将生成的音频数据混合到一个文件中。不幸的是,它比初看起来更复杂。 此外,我没有找到关于如何混合一组音频样本的有用信息。
那么有人可以给我建议吗?
编辑:
我正在用C ++编程。但这没关系,因为我对混合两个音轨的理论感兴趣。我遇到的问题是我不能只是总结样本,因为这通常会产生失真的声音。
答案 0 :(得分:6)
我认为您的问题是,对于您添加的每个音频源,您都必须降低级别。
如果应用程序控制用户,只需让他们直接控制级别。热情是他们的责任,而不是你的责任。这是“总结”。
如果混合是自动化的,you're about to go on a journey。如果不是限制的话,你可能需要压缩。 (限制是压缩的极端版本。)
请注意,您对音频执行的任何操作(包括压缩和限制)都是一种失真形式,因此您将对音频进行着色。您选择的压缩和限制算法会影响声音。
由于您没有实时生成音频,因此您可以进行“砖墙”限制。那是因为你已经了解了关卡。实时限制更有限,因为你无法知道将要发生什么 - 你必须被动反应。
这音乐,音效,声音,是什么?
程序员here一直在处理这个问题。
答案 1 :(得分:5)
混合音频样本意味着将它们加在一起,就是这样。通常,您会将它们添加到更大的数据类型中,以便在返回目标缓冲区之前检测溢出并钳制值。如果你事先知道你会有溢出,那么你可以在加法之前调整它们的幅度 - 简单地乘以0到1之间的浮点值,再次记住精度问题,可能首先转换为更大的数据类型。 / p>
如果您遇到未解决的特定问题,请随时更新原始问题。
答案 2 :(得分:2)
两个样本的脏混合
mix = (a + b) - a * b * sign(a + b)
答案 3 :(得分:0)