2
我想用數組來播放音樂/聲音。輸出音樂/聲音需要和絃。如何將numpy數組轉換爲和絃音樂
我試試這個。
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
1)你知道支持複音的寫功能的替代? 2)我打開我的代碼的完整替代。重要的一點是生成(或播放)來自陣列的復調聲音。我試圖做一些像http://img44.imageshack.us/img44/6182/music.swf這樣的操作,但是要簡單得多,不是GUI,不是交互式的,就像1和0數組一樣,該行已經分配了特定的聲音/音符和列代碼以記錄那些音符的時間被播放。
嗨,艾薩克, 感謝您注意到dstack返回一個3D數組。我需要一個2D數組。 Polyphonic指同時發出不同的聲音/頻率。我想我不能簡單地總結「seq *」數組,因爲不是和絃,我會聽到噪音。事實上,我嘗試了你的解決方案,對於孤立音符來說沒什麼問題,但是C音代替了我聽到的可怕聲音。 – aloctavodia 2012-07-20 00:25:07
我只是自己試了一下,它看起來像是應該的那樣工作:按順序排列三個音,然後全部在一起。我正在使用你的代碼,但是用我的''song =''行代替你的代碼。 – Isaac 2012-07-20 00:33:44
是的,它可以像預期的那樣工作,除非所有聲音一起播放,聲音就像噪音。你聽到了什麼「好」嗎?...讓我檢查一下選定的頻率是否正常。 – aloctavodia 2012-07-20 00:40:16