2012-07-19 64 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