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()