(きょうより、「ですます」調から、「である」調に変更します。内容は「寒い」まままです。)
そろそろ、何か音を鳴らしてみたいなと思い始めた。
今のところ、ASIOのみ音が鳴らせそうな雰囲気まできている。といってもVSTPluginを読み込んで鳴らしてみるとかはできない。モジュラー部分はまったく手をつけていないからだ。
WAVEファイルを読み込んで鳴らしてみようとしているレベルである。
Psycleでは音声は内部的にfloatで処理して、インターフェースに合わせてサンプルフォーマットを変換し、出力している。
私もそれに倣おうとしているが、少し工夫をしてみたい。
Psycleの場合、サンプルデータの作成→インターフェースへの出力は1つのスレッドで行っているのだが、ここを2つのスレッドに分けるのだ。
サンプルデータ生成スレッドは、せっせとデータを生成する。そのあとを追いかけるように出力スレッドが処理するわけだ。これを処理するために、出力インターフェースとの間にリングバッファを設ける。
利点は、サンプルデータの作成負荷に、出力処理が影響されないことだ。プチプチ音が途切れにくくなるのではないかと考えている。
でも、再生開始時にASIOのBufferSwitch()が呼び出されたとき、Psycleだとバッファと出力との同期が取れるが、私方式だと少しレイテンシが発生する恐れがある。BufferSwitch時にリングバッファにデータが蓄積されていない場合があるからだ。というか一発目は蓄積されていないな、多分。