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