多个音符同时溢出

2024-05-15 06:19:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地用python生成了不同频率的正弦波.wav文件。 如果我想产生和声,例如,一个C大调长篇大论,我应该把每个音符的正弦波加在一起吗?你知道吗

当把两个音符加在一起时,比如说C和G,程序会产生正确的和声。但是,当我尝试添加第三个音符时,出现了溢出错误。如何才能成功地做到这一点。你知道吗

代码:

我把正弦波的数据放入一个有符号的短整数数组中。你知道吗

wave = array.array('h')

然后将多个波叠加在一起产生和声。你知道吗

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

真管用!你知道吗

但是当我添加第三个数组(wave3)时,它溢出了。你知道吗

这是因为有符号短整数已达到其最大值。我正在用16位速率工作。问题仅仅是比特率太低吗?当创建具有许多和声的复杂音频时,比特率是否需要更高?我是不是完全错误地处理了这个问题?你知道吗

Full Source


Tags: 文件代码程序错误符号整数数组array
1条回答
网友
1楼 · 发布于 2024-05-15 06:19:02

我不认为是拜登。你只需要规范化这些值,使它们适合。我已经重写了您的代码,因此它首先使用列表,然后将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)

相关问题 更多 >

    热门问题