3

キーボードをピアノのように機能させるソフトウェアを作成することを検討しています (たとえば、ユーザーが「W」キーを押すと、スピーカーが D ノートを再生します)。おそらくOpenALを使用するでしょう。デジタル オーディオの基本は理解していますが、キーを押したときにリアルタイム オーディオを再生すると、解決できない問題がいくつか発生します。

ここに問題があります。たとえば、10 個のオーディオ バッファーがあり、各バッファーに 1 秒間のオーディオ データが保持されているとします。スピーカーで再生する前にバッファーをいっぱいにする必要がある場合は、再生の 1 秒か 2 秒前にバッファーをいっぱいにすることになります。つまり、ユーザーがノートを再生しようとすると、キーを押してからノートが再生されるまでに 1 ~ 2 秒の遅延が発生します。

この問題をどのように回避しますか? バッファをできるだけ小さくし、できるだけ遅く埋めますか? 私が見逃しているトリックはありますか?

4

3 に答える 3

6

ほとんどのソフトウェアシンセサイザーは、複数のバッファーをまったく使用しません。

常に再生される単一の小さなリングバッファを使用するだけです。

優先度の高いスレッドは、可能な限り頻繁に現在の再生位置を確認し、リングバッファの空き部分(スレッドが最後に実行されてから再生された部分など)をサウンドデータで埋めます。

これにより、リングバッファのサイズとサウンドカードの出力レイテンシ(通常はそれほど大きくない)によってのみ制限される一定のレイテンシが得られます。

レイテンシーをさらに下げることができます。

新しいノートを再生する場合(たとえば、ユーザーがキーを押したばかりの場合)、リングバッファ内の現在の再生位置を確認し、安全のためにサンプルを追加してから、新しいサウンドでサウンドデータを再レンダリングします-適用された設定。

時間ベースのエフェクト(ディレイライン、リバーブなど)を実行している場合、これはトリッキーになりますが、実行可能です。ミリ秒ごとに、時間ベースの効果の最後の10の状態を追跡するだけです。これにより、10ミリ秒の時間を取り戻すことが可能になります。

于 2009-09-08T08:57:01.343 に答える
1

WinAPI を使用すると、遅延の点で限界までしか到達できません。通常、非常に厄介な 40 ~ 50 ミリ秒を下回ることはできません。解決策は、アプリに ASIO サポートを実装し、ユーザーがバックグラウンドで Asio4All などを実行できるようにすることです。これによりレイテンシは 5 ミリ秒に短縮されますが、コストがかかります。他のアプリが同時にサウンドを再生することはできません。

私は FL Studio ユーザーなので、これを知っています。

于 2010-09-08T17:45:29.393 に答える
0

解決策は、リアルタイム スレッドによって頻繁に埋められる小さなバッファです。バッファーをどれだけ小さくするか (またはリング バッファーでバッファーをどれだけいっぱいにするか) は、オペレーティング システムの遅延をスケジュールすることによって制限されます。おそらく、10 ミリ秒が許容範囲であることがわかります。

ここには、特にソフトウェア アーキテクチャとスレッド セーフに関して、初心者にとって厄介な問題がいくつかあります。

オーディオ ソフトウェア、特に SoftSynths やエフェクトなどのオーディオ プラグインを作成するためのクロスプラットフォーム フレームワークである Juce を試してみてください。これには、サンプル プラグインとホストの両方のソフトウェアが含まれています。スレッドの問題が主に処理されるのはホストです。

于 2012-12-30T18:27:35.707 に答える