今日は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が。
…バグ探しは明日にする。