我想用数组来播放音乐/声音。输出音乐/声音需要复音。
我试过了:
from scipy.io.wavfile import write
import numpy as np
duration=0.24
amp=1E4
rate=44100
def note(freq, duration, amp, rate):
t = np.linspace(0, duration, duration * rate)
data = np.sin(2*np.pi*freq*t)*amp
return data.astype(np.int16) # two byte integers
tone0 = note(0, duration, amp, rate) #silence
tone1 = note(261.63, duration, amp, rate) # C4
tone2 = note(329.63, duration, amp, rate) # E4
tone3 = note(392.00, duration, amp, rate) # G4
seq1 = np.concatenate((tone1,tone0,tone0,tone0, tone1),axis=1)
seq2 = np.concatenate((tone0,tone2,tone0,tone0, tone2),axis=1)
seq3 = np.concatenate((tone0,tone0,tone3,tone0, tone3),axis=1)
song = np.dstack((seq1,seq2,seq3))
write('song.wav', 44100, song)
我想播放song.wav文件并一个接一个地听到音符C,E和G然后是静音,然后是C和弦(C,E,G音符同时播放)。
我得到的是写函数的错误。这是好的因为写函数(据我所知它不能创建和弦wav文件)。
以防万一,错误是:
Traceback (most recent call last):
File "music2.py", line 26, in <module>
write('song.wav', 44100, song)
File "/usr/lib/python2.7/dist-packages/scipy/io/wavfile.py", line 168, in write
fid.write(struct.pack('<ihHIIHH', 16, 1, noc, rate, sbytes, ba, bits))
struct.error: 'I' format requires 0 <= number <= 4294967295
答案 0 :(得分:1)
您得到的错误是由于write
只想要一维或二维数组。你传递的是一个三维数组(dstack
的输出是3D)。
我不确定我的复音是什么意思,但是如果你只是想要将不同的音调叠加在一起,那么你需要做的就是叠加波形:
song = seq1 + seq2 + seq3 # Assumes seqs are of same length
最后你可能想传递一维数组。如果你想要写立体声,2-D阵列就可用了。