■
今日はwavファイルを出力するプログラム。
…クラスだけなので、インタプリタから操作する。
と言うわけでスクリーンショットはない。
#!/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) def getA(self): return 440 # ラ def getAS(self): return self.getA()*self.inc # ラ# def getB(self): return self.getAS()*self.inc # シ def getC(self): return self.getB()*self.inc # ド def getCS(self): return self.getC()*self.inc # ド# def getD(self): return self.getCS()*self.inc # レ def getDS(self): return self.getD()*self.inc # レ# def getE(self): return self.getDS()*self.inc # ミ def getF(self): return self.getE()*self.inc # ファ def getFS(self): return self.getF()*self.inc # ファ# def getG(self): return self.getFS()*self.inc # ソ def getGS(self): return self.getG()*self.inc # ソ#x def addWaveA(self,len,volume=15000): self.addWave(self.getA(),len,volume) def addWaveB(self,len,volume=15000): self.addWave(self.getB(),len,volume) def addWaveC(self,len,volume=15000): self.addWave(self.getC(),len,volume) def addWaveD(self,len,volume=15000): self.addWave(self.getD(),len,volume) def addWaveE(self,len,volume=15000): self.addWave(self.getE(),len,volume) def addWaveF(self,len,volume=15000): self.addWave(self.getF(),len,volume) def addWaveG(self,len,volume=15000): self.addWave(self.getG(),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)) # self.baseVolume = 15000.0 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 no9(self): w.addWaveE(1) w.addWaveE(1) w.addWaveF(1) w.addWaveG(1) w.addWaveG(1) w.addWaveF(1) w.addWaveE(1) w.addWaveD(1) w.addWaveC(1) w.addWaveC(1) w.addWaveD(1) w.addWaveE(1) w.addWaveE(1) w.addWaveD(1) w.addWaveD(1) w.addWave(0,1) w.addWaveE(1) w.addWaveE(1) w.addWaveF(1) w.addWaveG(1) w.addWaveG(1) w.addWaveF(1) w.addWaveE(1) w.addWaveD(1) w.addWaveC(1) w.addWaveC(1) w.addWaveF(1) w.addWaveE(1) w.addWaveD(1) w.addWaveC(1) w.addWaveC(1) w.closeFile()
こんな感じで使う。
>>> w = waveGenerator() >>> w.openFile('test.wav') >>> w.addWave(440,1) >>> w.addWave(0,1) >>> w.addWave(440,1) >>> w.addWave(0,1) >>> w.addWave(880,1) >>> w.closeFile()
addWaveには周波数、秒数を渡す。
>>> w = waveGenerator() >>> w.no9()
とかやると(どっか間違えた)第9が。
…バグ探しは明日にする。