在我看来,CoreAudio在混入单个通道时会将声波加在一起。我的程序将发出合成声音。我知道每种声音的振幅。当我一起演奏它们时,我应该将它们加在一起并乘以结果波以保持在范围内吗?我可以这样:
MaxAmplitude = max1 + max2 + max3 //Maximum amplitude of each sound wave
if MaxAmplitude > 1 then //Over range
Output = (wave1 + wave2 + wave3)/MaxAmplitude //Meet range
else
Output = (wave1 + wave2 + wave3) //Normal addition
end if
我可以这样吗?我是否应该预先分析声波以找到实际的最大振幅(因为最大点在时间轴上可能不匹配)并使用该振幅?
我想要的是一种可以同时播放几种合成声音而又不会降低音量的方法,而且声音听起来浑然一体。如果我用几种合成乐器演奏和弦,则我不希望要求单个音符实际上是无声的。
谢谢。
最佳答案
突然在单个样本的基础上改变音阶,这就是您的“if”陈述所做的事情,听起来很糟糕,类似于裁剪。
您可以研究自适应AGC(自动增益控制),它会更缓慢地改变比例因子,但在快速瞬变期间仍会削波或使音量突然变化。
如果将前瞻性与AGC算法结合使用,以防止突然的瞬变削波,则延迟会变得更糟。
如果您确实使用了AGC,则孤立的音符听起来可能比在和弦中演奏时响亮得多,这可能无法正确表示音乐作品的意图(尽管这种压缩方式在烦人的电视和广播广告中很常见)。
按比例调低调音台的输出音量,以使音符永远不会削波或减小其音量,除非在作曲指示时,否则会导致大量通道的混合音量大大减小(这就是为什么在收音机上正确再现古典音乐的原因)通常太安静了,无法吸引足够多的观众赚钱。
这都是一个权衡。
关于ios - 混合声波(iOS上的CoreAudio),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8549258/