■
Tiny MML
この辺を参考にwaveGeneratorを音が出る版にしてみた。
またしてもguiはついていないので、インタプリタからどうぞ。
>>> import sndPlay >>> w = sndPlay() >>> w.no9()
こんな感じで。
#!/usr/bin/env python import math, array, ossaudiodev class sndPlay(): def __init__(self): self.inc = math.pow(2,1.0/12) self.A = 440 self.scaleFreqMap = {'A':0,'AS':1,'B':2,'C':3,'CS':4,'D':5,'DS':6, 'E':7,'F':8,'FS':9,'G':10,'GS':11} self.f = ossaudiodev.open('w') self.f.setparameters(ossaudiodev.AFMT_S16_LE, 1, 8000) self.framerate = 8000 self.volume = 15000.0 def closeFile(self): self.f.flush() self.f.close() def getFreq(self,scale): return math.pow(self.inc,self.scaleFreqMap[scale]) * self.A def addScale(self,scale,length): self.addWave(self.getFreq(scale),length) def getWaveArray(self,freq,length): data = array.array('h') for i in range(int(self.framerate*length)): ft = int(math.sin(math.pi * 2 * freq / float(self.framerate) * i)*self.volume) data.append(ft) return data def addWave(self,freq,length): self.f.writeall(self.getWaveArray(freq,length)) def addHarmonyWave(self,scales,length): dataList = [] for scale in scales: freq = self.getFreq(scale) dataList.append(self.getWaveArray(freq,length)) data = array.array('h') data.extend([0]*int(length*self.framerate)) for scaleData in dataList: for ii in range(len(scaleData)): ft = data[ii] + scaleData[ii] if ft >= 32767: ft = 32767 if ft <= -32768: ft = -32768 data[ii] = ft self.f.writeall(data.tostring()) def no9(self): self.A = 220 self.addScale('E',0.5) self.addScale('E',0.5) self.addScale('F',0.5) self.addScale('G',0.5) self.addScale('G',0.5) self.addScale('F',0.5) self.addScale('E',0.5) self.addScale('D',0.5) self.addScale('C',0.5) self.addScale('C',0.5) self.addScale('D',0.5) self.addScale('E',0.5) self.addScale('E',0.5) self.addScale('D',0.5) self.addScale('D',0.5) self.addWave(0,0.5) self.addScale('E',0.5) self.addScale('E',0.5) self.addScale('F',0.5) self.addScale('G',0.5) self.addScale('G',0.5) self.addScale('F',0.5) self.addScale('E',0.5) self.addScale('D',0.5) self.addScale('C',0.5) self.addScale('C',0.5) self.addScale('D',0.5) self.addScale('E',0.5) self.addScale('D',0.5) self.addScale('C',0.5) self.addScale('C',0.5) self.closeFile()