多个笔记同时 - 溢出错误

时间:2014-07-19 00:35:51

标签: python audio

我已成功生成不同频率的正弦波python中的.wav文件。 如果我希望产生和声,例如C大调,我是否应该将各个音符的每个正弦波加在一起?

当同时添加2个音符时,例如C和G,程序会创建正确的和声。当我尝试添加第三个音符时,会出现溢出错误。如何成功实现这一目标。

守则:

我将正弦波的数据放入有符号的短整数数组中。

wave = array.array('h')

然后添加多个波浪以产生和声。

for i in range(len(data)):
    wave1[i] += wave2[i]

这有效!

但是当我添加第三个数组(wave3)时,它会溢出。

这是因为签名的短整数已达到最大值。我正在使用16位速率。问题只是比特率太低了吗?在创建具有大量和声的复杂音频时,比特率是否需要更高?我是否在绝对错误的方向上解决了这个问题?

Full Source

1 个答案:

答案 0 :(得分:0)

我不认为这是字节速度。您只需要对值进行标准化,以使它们正确匹配。我稍微重写了你的代码,所以它首先使用列表,然后排列从0到32767的所有值,考虑到音量,并将其放入数组中。

def normalize(nmin, nmax, nums): #this could probably be done a bit shorter
    orange = max(nums)-min(nums)
    nrange = nmax-nmin
    nums = [float(num)/orange*nrange for num in nums]
    omin = min(nums)
    nums = [num-omin+nmin for num in nums]
    return nums

if __name__ == '__main__':
    data, data2, data3 = [], [], []

    data.extend(create_data(getTime(1), getFreq('C', 4)))
    data2.extend(create_data(getTime(1), getFreq('Bb', 4)))
    data3.extend(create_data(getTime(1), getFreq('G', 4)))

    for i in range(len(data)):
        data[i] += data2[i]
        data[i] += data3[i]

    data = array.array('h', [int(val) for val in normalize(0, 32767*VOLUME/100, data)])

    write_wave(data, int(len(data)/SAMPLE_RATE))
    winsound.PlaySound('output.wav', winsound.SND_FILENAME)