我的问题并不完全与编程相关,但我认为 SO 是正确的地方。
在我的程序中,我生成了一些音频数据并将曲目保存到 WAV 文件中。一台声音发生器一切正常。但是现在我想添加更多的生成器并将生成的音频数据混合到一个文件中。不幸的是,它比乍看起来要复杂得多。此外,我没有找到关于如何混合一组音频样本的有用信息。
那么有人可以给我建议吗?
编辑:
我正在用 C++ 编程。但这没关系,因为我对混合两个音轨背后的理论感兴趣。我遇到的问题是我不能只对样本进行总结,因为这通常会产生失真的声音。
我认为您的问题是,对于您添加的每个音频源,您都必须降低电平。
如果应用程序将控制权交给用户,就让他们直接控制关卡。辣是他们的责任,不是你的。这是“求和”。
如果混音是自动化的,那么您即将踏上一段旅程。如果没有限制,您可能需要压缩。(限制是压缩的极端版本。)
请注意,您对音频所做的任何事情(包括压缩和限制)都是一种失真形式,因此您将对音频进行着色。您选择的压缩和限制算法会影响声音。
由于您不是实时生成音频,因此您有可能进行“砖墙”限制。那是因为你对等级有预知。实时限制更受限制,因为您不知道会发生什么——您必须做出反应。
这是音乐,音效,人声,什么?
这里的程序员一直在处理这个问题。
混合音频样本意味着将它们加在一起,仅此而已。通常,您确实将它们添加到更大的数据类型中,以便您可以检测溢出并在将值转换回目标缓冲区之前对其进行钳制。如果您事先知道会溢出,那么您可以在加法之前缩放它们的幅度 - 只需乘以 0 和 1 之间的浮点值,再次记住精度问题,可能首先转换为更大的数据类型。
如果您有一个未解决的特定问题,请随时更新您的原始问题。
两个样品的肮脏混合物
mix = (a + b) - a * b * sign(a + b)
你从来没有说过什么编程语言和平台,但是现在我假设 Windows 使用 C#。
http://www.codeplex.com/naudio
伟大的开源库,真正涵盖了您在大多数音频操作中遇到的许多内容。