クラス

自ら楽器を定義してみましょう。楽器といっても笛やギターやフィルタなど様々ですが、それぞれ独自の振る舞いがあります、そしてその振る舞いを定義するのがクラスです。トレモロというオブジェクトは多分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)のようにできます。ここのところ改良が必要なんですがね。