我正在使用以下代码生成一个wav文件,其中包含持续2秒的440 Hz音调。
from scipy.io.wavfile import write
from numpy import linspace,sin,pi,int16
def note(freq, len, amp=1, rate=44100):
t = linspace(0,len,len*rate)
data = sin(2*pi*freq*t)*amp
return data.astype(int16) # two byte integers
tone = note(440,2,amp=10000)
write('440hzAtone.wav',44100,tone) # writing the sound to a file
我想知道我是否可以修改代码,基于note方法,以便用python实际生成一个曲调。
我尝试添加两种不同的音色,正如预期的那样,两种音调同时播放,创造出听起来有点像拨号音的东西:
tone1 = note(440,2,amp=10000)
tone2 = note(480,2,amp=10000)
tone = tone1+tone2
write('440hzAtone.wav',44100,tone)
我也试过将两个音调相乘,但这只会产生静态。
我也试过创建不同长度的音调并添加它们,但这会引发异常,如下所示:
tone1 = note(440,2,amp=10000)
tone2 = note(480,1,amp=10000)
tone = tone1+tone2
write('440hzAtone.wav',44100,tone)
导致:
ValueError: operands could not be broadcast together with shapes (88200) (44100)
所以,我想知道 - 我怎样才能连接这样的不同音调来调音?
答案 0 :(得分:4)
您可以使用numpy.concatenate(已发布)来执行此操作。您还需要指定连接轴。使用非常低的费率来说明:
from scipy.io.wavfile import write
from numpy import linspace,sin,pi,int16,concatenate
def note(freq, len, amp=1, rate=5):
t = linspace(0,len,len*rate)
data = sin(2*pi*freq*t)*amp
return data.astype(int16) # two byte integers
tone1 = note(440,2,amp=10)
tone2 = note(140,2,amp=10)
print tone1
print tone2
print concatenate((tone2,tone1),axis=1)
#output:
[ 0 -9 -3 8 6 -6 -8 3 9 0]
[ 0 6 9 8 3 -3 -8 -9 -6 0]
[ 0 6 9 8 3 -3 -8 -9 -6 0 0 -9 -3 8 6 -6 -8 3 9 0]
答案 1 :(得分:0)
numpy.linspace
创建一个numpy数组。要连接音调,您需要连接相应的数组。为此,一些谷歌搜索表明Numpy提供了名为numpy.concatenate
function的有用名称。