Tableは、なぜSndThreadと関係しないのか

Xヶ所村「習作ですがPythonでシンセ」を読んでいて、いくつか注意したいところがある。

それはSndTableのところである、他にもあるけど。SndTableはTableを継承したものでありコンストラクタした時点で入力したSndWaveから音声データをテーブルに読み込んでいるのだ。具体的にはSndTable.cppというコードを読んでいただくとわかりますが、コンストラクタでMakeTableというメソッドが呼ばれ、SndWaveからデータを移します。何を言いたいかと、それは、SndThreadにSndWaveをAddObjせずともすでに役目を終えているのである。

SndThreadには実行したいSndObjやSndIOをAddObjしますが、TableだけはAddObjしませんよね。それは僕が書いたサイン波を鳴らすで確認できるでしょう。

では、適時にサウンドファイルを読みこんでそれをオシレータで再生するルーピング・オシレータの例です。

from sndobj import *
import time

snd = SndWave("loop.wav", READ) #ファイルを読みこむ
dataSize = snd.GetDataFrames() #ファイルのサイズの取得
dataSr = snd.GetSr() #ファイルのサンプリングレート
freq = dataSr / dataSize 

#コンストラクタのときSndWaveから音声データを読み込む
tab = SndTable(dataSize, snd)

osc = Oscil(tab, freq, 10000) #オシレータにテーブルを
out = SndRTIO(1)
out.SetOutput(1, osc)

#ここ注意して、thread.AddObj(snd, SND_INPUT)とする必要がない
thread = SndThread()
thread.AddObj(osc)
thread.AddObj(out, SND_OUTPUT)

thread.ProcOn()
time.sleep(10)

snd2 = SndWave("break3.wav", READ) #別のファイルを読みこむ
dataSize2 = snd2.GetDataFrames()
dataSr2 = snd2.GetSr()
freq2 = dataSr2 / dataSize2

#コンストラクタのときSndWaveから音声データを読み込む
tab2 = SndTable(dataSize2, snd2)
osc.SetTable(tab2) #オシレータに違うファイルのテーブルを
osc.SetFreq(freq2)
time.sleep(10)

osc.SetTable(tab) #オシレータに最初のファイルのテーブルを
osc.SetFreq(freq)
time.sleep(10)

thread.ProcOff()