2008年3月9日日曜日

[プログラミング]PortAudioについてちょっとお勉強

さて、今日はやりたいことに挙げていたうちの1つ、プログラミングのお勉強をしてました。
今日調べていたのはPortAudioについて。共同研究先のチームの方が、
「今はASIOをPortAudio経由で叩いている」
と仰っていたのと、前々から興味があったということで。
まずはPortAudioのHPからSDKをダウンロード。
本来なら、さらにASIOのSDKもDLしてこなくてはいけませんが、私の持っているサウンドカードがASIO非対応であるため、プログラムを作っても動作テストできないと言うことで今回はスルー。コンパイルはせず、PortAudioのSDKに含まれるサンプルデモを眺めつつお勉強することとします。
とりあえず、基本となるパススルーのソースを眺めたら基本的なことは分かるでしょうと言うことでパススルーのソースを探す。
発見。patest_wire.cってのがそうらしい。ワイアード接続ってことなのかしらん? まぁいいや。
とりあえずこいつがパススルーを実現しているらしい。実際、コールバック関数の部分は出力のバッファに入力のバッファ値をコピーしているだけ。実にSimple。まぁこの処理がややこしかったらたまんないわけですが^^;
コールバック関数の引数は、入力信号バッファ、出力信号バッファ(ともにvoid*型)、バッファに格納されているフレーム数(unsigned long型)、タイムスタンプ?(PaTimestamp型。これだけよく分からない)、コールバック関数に渡したい変数(void*型。複数データを渡したいときは構造体を渡せばいい)ってな構成。
前に一度ASIOのSDKも眺めたことがあるので、今回は取っつきやすかったや。今回のパススループログラムにはタイムスタンプを利用していないためこいつの存在意義が不明。マニュアル嫁?めんどいから後d(こら
とりあえず、こいつがバックグラウンドで勝手に呼ばれるので、入力信号を加工して出力信号をごにょごにょしてやれば簡易エフェクタの出来上がりっと。
さて、コールバック関数はその辺にして、mainを眺めてみることに。
まぁ、これまたSimple。Pa_Initialize()で初期化して、Pa_OpenStream関数にもろもろ引数渡してストリームを開始。ここでコールバック関数の登録とユーザデータの引き渡しも行いますよっと。
で、特にエラーも起こらなければPa_StartStream関数に先ほど開いたストリームのポインタを渡し、バックグラウンドでストリームの処理開始。フロントの方はgetchar()で入力待ちとし、Enterが入力されたらPa_CloseStreamにてストリーム終了。最後にPa_Terminate()を呼び出して後処理。
処理のフローはこんな感じ。組むときに気をつけなくてはいけないのは、コールバック関数が次に呼ばれるまでにきちんと処理を終了できるかってところ。サンプリングレートを高くするとここがきつそう。
信号はブロックで受け取ってブロックで渡すことになるから、ブロック処理というものを念頭に置いてもいいかも。私が研究してる内容では、DFT(FFT)を利用して帯域制限フィルタを構築し、出力信号を弄っています。そのため、負荷が1/DFTサイズの間隔で跳ね上がるんですよね。
逃げの発想にはなってしまうけれど、他と比べて大幅に負荷の上がるこのフィルタ更新処理を1サイクルで実行することをあきらめ、バックグラウンドで行わせてその間はフィルタの更新は行わないという手も。
現状、この処理がどうやっても高サンプリングレート下では行えず、ダウンサンプリングを余儀なくされているため、音質の劣化が懸念材料なんですよね。
技術者としては、こういった逃げの発想はよろしくないのでしょうけれど^^; とりあえず、実際に体験できる"モノ"を作るには手っ取り早い方法かも。高速化はその間に考えるという、つなぎの目的で。実際に動く"モノ"があると、もっと他に調べたいことも並行して行えますしね。
・・・、まぁ語るだけなら誰でもできる。来月からは社会人として会社に所属しますし、研修期間が終わればひょっとすると(というかほぼ?)そのチームに配属されるかもなので、手土産にプログラムを持って行けたらかっちょえぇよなぁとか妄想してたり(ぇ
せっかくPortAudioの扱い方も勉強し始めましたしね。残念ながら家で実際に音鳴らしての実験はできませんが、シミュレーションプログラムとして私の考えている構成が実現可能なのか、またそれを実現するとどの程度更新が遅れてしまうのかを検証したいと思ってます。
やっぱアルゴリズム考えるより実装の方が楽しくてええわー!w


さてさて、今日紹介するのはコチラ。
きっとこの場所で (from ピアプロ)
今まではニコニコ動画とZoomeってことで動画サイトだったんですが、今回はピアプロから。ユーザ登録なしでも試聴は可能(再生ボタンをポチっとな)ですのでよければ聴いてみてくださいなー。
この曲は割としっとりとしてるのかな? しんみりとまでは行きませんが、思い出に浸る感じなのかと。
ちなみに、以前紹介した「Next Stage」と同じ作者であります。Next Stageより5日前に投稿されてますね。割と対照的な2曲ですが、両方好きです。ハイ。
ところで、修了式が3/25にあるってことは知ってるんだけど、場所をはっきりと聞いてないのよね(ぉ きっと本館かどっかに掲示してあったんだろうけど、見事忘れてt(ターン
う〜ん、火曜日研究室に顔出す予定やから、そんときにでも調べておかなくては。修了式出席できないとえらいことなっちゃうわw