ソフトウェアシンセサイザーとリアルタイムのオーディオアプリケーションを作ります

StackOverflow https://stackoverflow.com/questions/1392725

質問

私はピアノのような鍵盤の機能を(例えば、ユーザが、「W」キーを押すと、スピーカーがDのノートを弾く)になり、いくつかのソフトウェアを作るに探しています。私はおそらくOpenALのを使用することがあります。私は、デジタルオーディオの基本を理解しますが、キーの押下に応じて、リアルタイムのオーディオを再生すると、私はトラブル解決を抱えているいくつかの問題を提起します。

ここで問題です:のレッツは、私は10個のオーディオバッファを持っていると言うと、各バッファは、音声データの1秒を保持しています。私は、彼らがスピーカーで再生される前にバッファを埋めるために持っている場合は、それらが再生される前に、私は、バッファ1または2秒埋めることになるでしょう。ユーザーの試行は、ノートをプレイするたび、1または演奏されているキーノートを押すとの間に2秒の遅延があることを意味します。

どのようにこの問題を周りに入手できますか?あなただけのできるだけ小さいバッファを作り、できるだけ遅く、それらを埋めるのですか?私が行方不明だということを、いくつかのトリックはありますか?

役に立ちましたか?

解決

ほとんどのソフトウェアシンセサイザーは、すべての複数のバッファを使用しないでください。

彼らはただ絶えず再生され1つの、小さなリングバッファを使用します。

できるだけ頻繁チェック現在の再生位置をとして、自由部分を記入します優先度の高いスレッド(例えば、あなたのスレッドが実行されていた前回再生された部分)の音声データをリングバッファでます。

このはあなただけあなたのリング・バッファとサウンドカードの出力レイテンシーのサイズ(通常はそれほどではない)によって拘束され、一定のレイテンシを提供します。

あなたは、さらにあなたのレイテンシーを下げることができます:

再生する新しいノートの場合は

(例えば、ユーザは、単にキーを押した)あなたは、リングバッファ内の現在の再生位置を確認し、安全のためにいくつかのサンプルを追加し、との音データを再レンダリング新しいサウンド設定が適用されます。

あなたが(遅延線、リバーブなど)を実行している時間ベースの効果を持っている場合、これはトリッキーになりますが、それはなんとかです。ちょうどあなたの時間ベースのエフェクトミリ秒ごとかそこらの最後の10個の状態を追跡します。それは時間を遡って10ミリ秒を取得することを可能にします。

他のヒント

WinAPIのでは、あなただけの待ち時間の観点から、これまでに取得することができます。通常、あなたは非常に厄介である40-50msの下に取得することはできません。解決策は、あなたのアプリでASIOのサポートを実装し、バックグラウンドでASIO4ALLのようなものを実行したユーザを作ることです。これは5msのまでが、コストでの待ち時間をもたらします:他のアプリケーションが同時にサウンドを再生することはできません。

私はFL Studioのユーザーだから、私はこのことを知っています。

ソリューションは、リアルタイムのスレッドによって頻繁に満たされた、小さなバッファです。どのように小さなあなたがバッファ(あるいはどのように完全なあなたは、バッファは、リングバッファになってみましょう)は、オペレーティングシステムのスケジュール遅延によって制約されていることを確認。おそらく、許容できると10msのを見つけることができます。

特にソフトウェアアーキテクチャとスレッドの安全性に関してで -

初心者のために、ここでいくつかの厄介な落とし穴があります。

あなたは Juce のを見た試みることができる - オーディオソフトウェアを書くためのクロスプラットフォームのフレームワークであります、特に - などSoftSynthsや効果などのオーディオプラグイン。これは、サンプルプラグインとホストの両方のためのソフトウェアを含みます。これは、スレッドの問題は主に扱っていることをホストしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top