我已成功生成不同频率的正弦波python中的.wav文件。 如果我希望产生和声,例如C大调,我是否应该将各个音符的每个正弦波加在一起?
当同时添加2个音符时,例如C和G,程序会创建正确的和声。当我尝试添加第三个音符时,会出现溢出错误。如何成功实现这一目标。
守则:
我将正弦波的数据放入有符号的短整数数组中。
wave = array.array('h')
然后添加多个波浪以产生和声。
for i in range(len(data)):
wave1[i] += wave2[i]
这有效!
但是当我添加第三个数组(wave3)时,它会溢出。
这是因为签名的短整数已达到最大值。我正在使用16位速率。问题只是比特率太低了吗?在创建具有大量和声的复杂音频时,比特率是否需要更高?我是否在绝对错误的方向上解决了这个问题?
答案 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)