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