PortAudioでリアルタイム入出力制御 (2)
~入出力編~
前回のサンプルを動かすあたりが雑だったので詳しく
ファイル(F)→新規作成(N)→プロジェクト(P)
テンプレート(T):空のCLRプロジェクト
プロジェクト名(N):PA(なんでもいい)
場所(L):デフォルトでいい。ドキュメントのプロジェクト内(例 C:\Users\[*ユーザー名*]\Documents\Visual Studio 2008\Projects)
ソリューション(S):新しいソリューションを作成する(ソリューションのディレクトリを作成(D)にチェック)
ソリューション名(M):PA(なんでもいい プロジェクト名と同じ)
ソリューション エクスプローラが以下のようになる
プロジェクト内のフォルダを開く
(例 C:\Users\[*ユーザー名*]\Documents\Visual Studio 2008\Projects\PA\PA)
(PA.vcproj みたいな名前のファイルがあるところ)
上記フォルダ内に以下のファイルを入れる
portaudio.h
portaudio_x86.lib
portaudio_x86.dll
paex_saw.c(サンプルファイル:pa_stable_v19_20111121\portaudio\examples\paex_saw.c)
ヘッダーファイルに portaudio.h を追加
ソースファイルに paex_saw.c を追加
重要! paex_saw.c を paex_saw.cpp にリネーム
コンパイルの関係上必要. 詳細は省略 共通ランタイムサポートを使用しないに設定すれば、必須ではないことがわかりました(2014/12/17)
ソリューション(PA)のプロパティを開き、構成プロパティを選択
構成(C):[すべての構成]に、プラットフォーム(P):[Win32]にしておく
構成プロパティ→リンカ→入力→追加の依存ファイル を選択("$(NoInherit)"ってなっているはず)
portaudio_x86.lib と入力
親またはプロジェクトの既定値から継承(I)にチェック
すると以下のようになる
これでportaudio_x86.lib/dll が読み込まれる
準備が完了したのでとりあえずデバッグモードでビルド
アクティブソリューション構成を Debug にする
ビルド(B)→ソリューションのビルド F7
*2014/12/17 追記
上記の設定では、Windowsの設定でデフォルトインプット・アウトプットデバイスをオーディーインターフェースにしていてもASIOが使用されないことがあることがわかりました。
以下に対策を記載します。
ソリューション(PA)のプロパティを開き、構成プロパティを選択
構成(C):[すべての構成]に、プラットフォーム(P):[Win32]にしておく
構成プロパティ→全般→共通言語ランタイムサポート の項目で、
「共通言語ランタイム サポートを使用しない」を選択
適用→OK
(追記ここまで)
手順通りなら問題なくビルドできるはず
エラー出たら以下を参考にするか、変な所いじったならはじめからやり直すとよい
(出そうなエラーと解決策)
cl : コマンド ライン error D8045 : C ファイル '.\paex_saw.c' を /clr オプションと共にコンパイルできません
→ paex_saw.c を paex_saw.cpp にリネーム
もしくはソリューション(PA)のプロパティを開き、いい感じの設定にしてください(説明は省略)
動かしてみよう(ノコギリ波を鳴らそう!)
うまくいくとコンソールが開いて4秒ほどノコギリ波を鳴らして勝手に終了します。
音が出ない時はオーディオインターフェイスの設定などを見直しましょう。
例えばQuad-Captureの場合 MIX が INPUT だと鳴りません. MIX か PLAYBACK にツマミを回しましょう.
デバッグなしで開始(H) Ctrl+F5 だとプログラムが終了した後もコンソールが残ります
実行ファイルにしよう
アクティブソリューション構成を Release にする
ビルド(B)→ソリューションのビルド F7
すると、プロジェクトのReleaseフォルダに PA.exe ができる
(C:\Users\[*ユーザ名*]\Documents\Visual Studio 2008\Projects\PA\Release)
この実行ファイルは単体では動きません
フォルダの中に portaudio_x86.dll を入れると動きます
pdpファイルは削除して大丈夫です
EXEを実行する
なにか配布とかすることがあればこの2つのファイルがあればよいことがわかる
録音してみよう
paex_saw.cpp をプロジェクトから除外
paex_record.c(サンプルファイル:pa_stable_v19_20111121\portaudio\examples\paex_record.c)
を追加
paex_record.cpp にリネーム
ソリューションのリビルド(R) Ctrl+Alt+F7
(※ソースファイルを入れ替えたあとはリビルドしましょう. ビルドだと前の中間ファイルをビルドしちゃうことがある)
数秒録音して再生します
デバイスの設定を表示
pa_devs.c
これで何番目のデバイスがASIOなのかとか確かめられる
再生しているドライバが表示され、15秒間入出力を行う
paex_read_write_wire.c
さらっと書いたけど実はこれが本題のリアルタイム入出力制御のサンプルソースとなる
ASIOドライバを使っていればレイテンシ(遅延)1msecくらいになると思うのでリアルタイムと言ってよいだろう
なお、オーディオインターフェイスの設定によってはレイテンシが大きくなってしまう
オーディオインターフェイス:Quad-Capture ver.1.5.2
ASIOバッファサイズ 32samples(44100Hz)
低レイテンシーモード
→ 0.000725624sec(32/44100=0.000725623)
バッファを大きくするとその分レイテンシが増えていく
サンプリング周波数を上げるとバッファを増やさざるを得ないのでレイテンシが増える
paex_read_write_wire.c は 15秒間の時間制限付きで使いにくいため次のサンプルを推奨する
ファズエフェクターサンプル
pa_fuzz.c
実行するとエンターキーを押すまでストリーミングし続けます
エンターキーで終了
(間違っても右上の×ボタンは押さないこと. exeが固まります. 再起動で直ります. )
Lchにギターをつなげばとんでもない歪み系サウンドのできあがり
(Rchはスルーです)
fuzzCallback 関数内の FUZZ(*in++) を *in++ に変えれば Lch もスルーになります
このサンプルを参考に色々改造していける
自作のエファクター考えてみたり
B○SSのエフェクターをシミュレートしてみたり
ボイスチェンジャー作ってみたり
と夢が広がるのではないでしょうか
信号処理系のオススメ書籍
C言語ではじめる音のプログラミング 青木 直史 著 C言語信号処理初心者に捧げるバイブル
http://floor13.sakura.ne.jp/book03/book03.html
サウンドプログラミング入門 青木 直史 著 こちらはリアルタイム処理まで網羅している
http://floor13.sakura.ne.jp/book06/book06.html
以下のサイトを参考に致しました
PortAudio公式のWindows適用例
http://portaudio.com/docs/v19-doxydocs/compile_windows.html
PortAudio公式のレイテンシについての回答
http://www.portaudio.com/docs/latency.html
hiloyaの日記 VC++2008を使用 DirectX
http://d.hatena.ne.jp/k002/20110929/1317309185
DenkiYagi VC++2012だとうまくいくらしい 2010だけダメなのだろうか
http://terurou.hateblo.jp/entry/2013/07/29/080512
たいてい自宅で迷想中 コールバック関数が詳しく解説されている
http://2ten1ryu.blog90.fc2.com/blog-category-8.html
Is this easiest way to make DLL for PortAudio ASIO on Windows using VisualC++ Express ? DLLの作成ができない場合はここを参考にするといいかも
http://junzo.sakura.ne.jp/c_plus1/c_plus1.htm
雷鳴の日記 PortAudioの低遅延について PA_MIN_LATENCY_MSEC = 50 を設定した人の話 特に改善したかどうかは書いてない
http://d.hatena.ne.jp/sorayukinoyume/20120216/1329361809
VS2012でPortAudioの環境構築
http://qiita.com/nicolai_twi/items/86c26fb192f1613ec96a
以上