2012-07-19 61 views
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數組一樣,該行已經分配了特定的聲音/音符和列代碼以記錄那些音符的時間被播放。

回答

1

你得到的錯誤是由於write只想要1維或2維數組。你傳遞給它一個三維數組(dstack的輸出是3D)。

我不知道我讓你通過和絃的意思,但如果你只是意味着你想擁有覆蓋在每個-其它不同的音調,那麼所有你需要做的是疊加的波形:

song = seq1 + seq2 + seq3 # Assumes seqs are of same length 

最後你可能想傳遞一個一維數組。二維陣列適用於如果你想寫立體聲。

+0

嗨,艾薩克, 感謝您注意到dstack返回一個3D數組。我需要一個2D數組。 Polyphonic指同時發出不同的聲音/頻率。我想我不能簡單地總結「seq *」數組,因爲不是和絃,我會聽到噪音。事實上,我嘗試了你的解決方案,對於孤立音符來說沒什麼問題,但是C音代替了我聽到的可怕聲音。 – aloctavodia 2012-07-20 00:25:07

+0

我只是自己試了一下,它看起來像是應該的那樣工作:按順序排列三個音,然後全部在一起。我正在使用你的代碼,但是用我的''song =''行代替你的代碼。 – Isaac 2012-07-20 00:33:44

+0

是的,它可以像預期的那樣工作,除非所有聲音一起播放,聲音就像噪音。你聽到了什麼「好」嗎?...讓我檢查一下選定的頻率是否正常。 – aloctavodia 2012-07-20 00:40:16