我有两个不同音频片段的两个样本数组。如果我只是以编程方式将它们组合在一起,这相当于在音频编辑套件中将一个轨道分层到另一个轨道?就像我有一个贝司的音频剪辑另一个鼓,我希望他们一起玩。
我可能会这样做:
for (int i = 0; i < length_of_array; i++){
final_array[i] = first_array[i] + second_array[i];
}
如果没有这样做,我能否得到一些正确方法的指示?
答案 0 :(得分:10)
这是一种正确的方法。合并在音频行话中称为MIXING。
BUT:
如果您的样本很短(16位有符号) - 您必须使用int(32位有符号)进行添加,然后手动剪切样本。如果你不这样做,那么你的价值观将会被包裹起来,你会听到你所做的事情会有很多乐趣:)
代码如下:
short first_array[1024];
short second_array[1024];
short final_array[1024];
for (int i = 0; i < length_of_array; i++)
{
int mixed=(int)first_array[i] + (int)second_array[i];
if (mixed>32767) mixed=32767;
if (mixed<-32768) mixed=-32768;
final_array[i] = (short)mixed;
}
在大多数情况下,普通音频样本不需要任何其他内容,因为裁剪将在极少数情况下发生。我是从实践而不是理论上谈论这个。
答案 1 :(得分:5)
如果两个音频剪辑的采样率和所需混音级别相同,则上述合并方法将起作用。如果所需的混合水平不同,那么混合器的稍微更一般的形式将是:
mixed_result[i] = rescale_and_clip_fix( volume1 * input1[i] + volume2 * input2[i] );
rescale_and_clip_fix()可能是限制器或压缩器,确保乘法后的比例对于结果的数据类型是正确的。如果结果数组是整数数据类型,那么您可能还希望在缩放时进行舍入或噪声过滤。
如果采样率不同,则需要先在其中一个输入通道上进行采样率转换,然后再对结果进行采样率转换。
答案 2 :(得分:1)
一般情况下,这可以满足您的需求 - 但请注意clipping。也就是说,注意不要以整数溢出结束;并且不要通过将值限制为所讨论类型的最大值/最小值来避免这种情况。在添加后,您可能需要应用compressor将值恢复到范围内。