組み込みモジュールとともに

新しく使用するモジュールはwaveとarrayです。これらは組み込みモジュールと呼ばれていて、PySndObjのようにインストールする必要はありません。さて、この2つのモジュールを使って音声ファイル(モノラル)からデータを取得し、バイナリをint型に変換し、それらのデータをリアルタイムに扱う為にPySndObjに渡します。

import sndobj, wave, array, time

 #音声ファイル(モノラル)を読みこんでデータを取り出す。
read_file = wave.open("sample.wav", "rb")
sample_rate = read_file.getframerate()
channel = read_file.getnchannels()
read_data = read_file.readframes(read_file.getnframes())

 #バイナリの配列をint型に。
pre_data = array.array('h', read_data)
pre_size = len(pre_data)

 #PySndObjにデータを渡す。以前の日記を参照。
float_array = sndobj.floatArray(pre_size)
for i in range(pre_size):
    float_array[i] = pre_data[i]
tab = sndobj.UsrDefTable(pre_size, float_array)
freq = sample_rate / (pre_size*1.0)
osc = sndobj.Oscil(tab, freq, 1)
out = sndobj.SndRTIO(osc)
thread = sndobj.SndThread()
thread.AddObj(osc)
thread.AddObj(out, sndobj.SNDIO_OUT)

thread.ProcOn()
time.sleep(10)
thread.ProcOff()

この例はPySndObjだけでもできることで、SndWaveとSndTableを使用すると非常に簡単に実現できます(以前の日記を参考にしてください)。簡単ではないことをナゼにするかというと、読み込んだ音声ファイルに独自の処理を施したい場合などに有効だと考えています、それはまたいつか。