■
一昨日あたりに作成したwaveGeneratorを少し修正してみた。
音階を取得するところとかそーいうあたりをリファクタリング。
あと、AをプロパティにしたのでAを変更するとオクターブをかえれるようになっている。
#!/usr/bin/env python import wave, math, array class waveGenerator(): def __init__(self,fileName=''): if fileName!='': self.openFile(fileName) else: f = None 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} def getFreq(self,scale): return math.pow(self.inc,self.scaleFreqMap[scale]) * self.A def addScale(self,scale,len,volume=15000): self.addWave(self.getFreq(scale),len,volume) def openFile(self,fileName): self.nchannels = 1 self.sampwidth = 2 self.framerate = 44100 self.nframes = 0 self.compname = 'NONE' self.comptype = 'not compressed' self.f = wave.open(fileName,'w') self.f.setparams((self.nchannels,self.sampwidth,self.framerate,self.nframes, self.compname,self.comptype)) def closeFile(self): self.f.close() def addWave(self,freq,len,volume=15000.0): data = array.array('h') data.extend([0]*int(len*self.framerate)) a = math.pi * 2.0 * float(freq) / float(self.framerate) for i in range(int(self.framerate*len)): ft = int(math.sin(a*float(i))*volume) data[i] = ft self.f.writeframesraw(data.tostring()) def addHarmonyWave(self,freqs,len,volume=15000.0): print (freqs,len,volume) def no9(self): w.addScale('E',0.5) w.addScale('E',0.5) w.addScale('F',0.5) w.addScale('G',0.5) w.addScale('G',0.5) w.addScale('F',0.5) w.addScale('E',0.5) w.addScale('D',0.5) w.addScale('C',0.5) w.addScale('C',0.5) w.addScale('D',0.5) w.addScale('E',0.5) w.addScale('E',0.5) w.addScale('D',0.5) w.addScale('D',0.5) w.addWave(0,0.5) w.addScale('E',0.5) w.addScale('E',0.5) w.addScale('F',0.5) w.addScale('G',0.5) w.addScale('G',0.5) w.addScale('F',0.5) w.addScale('E',0.5) w.addScale('D',0.5) w.addScale('C',0.5) w.addScale('C',0.5) w.addScale('F',0.5) w.addScale('E',0.5) w.addScale('D',0.5) w.addScale('C',0.5) w.addScale('C',0.5) w.closeFile()