クラス
自ら楽器を定義してみましょう。楽器といっても笛やギターやフィルタなど様々ですが、それぞれ独自の振る舞いがあります、そしてその振る舞いを定義するのがクラスです。トレモロというオブジェクトは多分PySndObjにはありませんので作ってみます、Ringというリング変調がありますのでこれを使って。かなりひねくれた感じですが、他の方法が思いつかなかった。
from sndobj import * import time class Tremolo: def __init__(self, inobj, freq=1.0, min=0.5, max=1.0): self.inobj = inobj self.freq = freq self.min = min * 0.5 self.max = self.min + max - min self.index = ADSR(0, self.max, 0, 1, 0, 1) self.tab = HarmTable(1024, 1, SINE) self.inobj2 = Oscili(self.tab, self.freq, self.min) self.inobj2.SetAmp(self.index) self.ring = Ring(self.inobj, self.inobj2) def thread(self): return (self.inobj, self.inobj2, self.index, self.ring) def out(self): return self.ring tab = HarmTable(1024, 1, SINE) inobj = Oscili(tab, 440, 5000) x = Tremolo(inobj) #トレモロに正弦波inobjを入力 write = SndWave("pyo.wav", OVERWRITE) rtout = SndRTIO(1, SND_OUTPUT) rtout.SetOutput(1, x.out())#トレモロのアウトプット write.SetOutput(1, x.out()) thread = SndThread() for i in x.thread(): #トレモロで使用した楽器を取り出す。 thread.AddObj(i) thread.AddObj(rtout, SNDIO_OUT) thread.AddObj(write, SNDIO_OUT) thread.ProcOn() time.sleep(10) thread.ProcOff()
これでは、予めある他のオブジェクトと比べスマートではありません。例えば、コメントのfor文のところ、トレモロで使用した楽器をすべてSndthredに追加しています。一方、予めあるオブジェクトはfor文なしにthread.AddObj(inobj)のようにできます。ここのところ改良が必要なんですがね。