在 python 中组合多个波一次演奏多个音符?
Combining multiple waves to play more than one note at a time in python?
我正在尝试制作一个非常基本的程序,可以在 python 中将 midi 文件转换为单个波形,因此作为一个非常基本的测试,我使用 np.cos 生成了一些波形,然后将它们加在一起,但是,当我尝试使用 sounddevice 播放我生成的波形时,听起来真的很奇怪。我绝不是声音和信号概念方面的专家。这对我来说是一个很新的主题,所以非常感谢任何帮助。
代码如下:
import sounddevice as sd
import numpy as np
def make_wave(freq, duration, sample_rate = 22050):
wave = []
for i in range(0,duration*sample_rate):
wave.append(i/((sample_rate/(2*np.pi))/freq))
wave = np.cos(np.stack(wave))
return wave
A = make_wave(440, 10)
Cs = make_wave(554.37, 10)
E = make_wave(659.25, 10)
sd.play(A+Cs+E, 22050)
对于实际上碰巧遇到相同或类似组合波问题的人,事实证明这实际上是一个非常简单的问题;因为加起来的总振幅大于 1,所以计算机音频异常,出现一些削波,导致奇怪的噪音,所以简单地,我只需要将振幅限制为 0.1。
新代码:
import sounddevice as sd
import numpy as np
def make_wave(freq, duration, sample_rate = 22050):
wave = []
for i in range(0,duration*sample_rate):
wave.append(i/((sample_rate/(2*np.pi))/freq))
wave = np.sin(np.stack(wave))
return wave
A = make_wave(440, 10)
Cs = make_wave(554.37, 10)
E = make_wave(659.25, 10)
chord = A+Cs+E
chord = chord*0.1/np.max(chord)
sd.play(chord, 22050)
希望我写这篇文章至少对某些人有所帮助!
我正在尝试制作一个非常基本的程序,可以在 python 中将 midi 文件转换为单个波形,因此作为一个非常基本的测试,我使用 np.cos 生成了一些波形,然后将它们加在一起,但是,当我尝试使用 sounddevice 播放我生成的波形时,听起来真的很奇怪。我绝不是声音和信号概念方面的专家。这对我来说是一个很新的主题,所以非常感谢任何帮助。
代码如下:
import sounddevice as sd
import numpy as np
def make_wave(freq, duration, sample_rate = 22050):
wave = []
for i in range(0,duration*sample_rate):
wave.append(i/((sample_rate/(2*np.pi))/freq))
wave = np.cos(np.stack(wave))
return wave
A = make_wave(440, 10)
Cs = make_wave(554.37, 10)
E = make_wave(659.25, 10)
sd.play(A+Cs+E, 22050)
对于实际上碰巧遇到相同或类似组合波问题的人,事实证明这实际上是一个非常简单的问题;因为加起来的总振幅大于 1,所以计算机音频异常,出现一些削波,导致奇怪的噪音,所以简单地,我只需要将振幅限制为 0.1。
新代码:
import sounddevice as sd
import numpy as np
def make_wave(freq, duration, sample_rate = 22050):
wave = []
for i in range(0,duration*sample_rate):
wave.append(i/((sample_rate/(2*np.pi))/freq))
wave = np.sin(np.stack(wave))
return wave
A = make_wave(440, 10)
Cs = make_wave(554.37, 10)
E = make_wave(659.25, 10)
chord = A+Cs+E
chord = chord*0.1/np.max(chord)
sd.play(chord, 22050)
希望我写这篇文章至少对某些人有所帮助!