次の方法で共有


シンセサイザーの遅延

シンセサイザーのタイミングに関するもう 1 つの考慮事項は、レイテンシーです。これは、現在時刻とノートが最初に再生される時刻との差です。 現在のサンプル時間では、MIDI メッセージをシンセサイザーに送信して出力バッファにレンダリングすることはできません。 すでにバッファに配置されているが、波形出力デバイスにまだストリーミングされていないデータを考慮する必要があります。

したがって、波シンクは、IReferenceClock オブジェクトであるレイテンシー クロックを実装する必要があります (Microsoft Windows SDK ドキュメントで説明されています)。 レイテンシー クロックの IReferenceClock::GetTime 方式は、データが既にバッファーに書き込まれているサンプル時間を取得し、これをマスター クロックを基準とした基準時間に変換します。 ウェーブ シンクは、IDirectMusicSynthSink::SampleToRefTime および IDirectMusicSynthSink::RefTimeToSample を使用して基準時間とサンプル時間の間の変換を行うため、この場合、シンセサイザーは IDirectMusicSynthSink::RefTimeToSample を呼び出して変換を実行します。

待ち時間はすべて Wave Sink によって管理されます。 IDirectMusicSynthSink::GetLatencyClock 方式の実装では、レイテンシー クロックへのポインターを出力する必要があり、このポインターは IDirectMusicSynth::GetLatencyClock によって取得される必要があります。 アプリケーションはレイテンシ クロックを使用して、IDirectMusicSynth::PlayBuffer 方式を呼び出して MIDI メッセージをシンセサイザーに渡すときに、MIDI メッセージを再生するためにキューに入れることができる最も早い時点を決定します。

MIDI メッセージのレイテンシーの例を次の図に示します。

Diagram illustrating the latency of a MIDI message in a PCM buffer loop.

上の図では、レイテンシ クロックは、ノートを再生できる PCM バッファ ループ内の最初の場所を指します。 マスター クロックは 22 時間単位にあり、現在サウンドが再生されているポイントですが、22 と 30 時間単位の間のスペースはすでに波形データで埋められており、書き込むことができないことに注意してください。 したがって、新しいタイムスタンプ付き MIDI イベントの再生をスケジュールできる最初の場所は時間 30 です。 したがって、レイテンシ クロックは 30 時間単位を読み取ります。

メッセージは、この待機時間またはその後のいつでも再生するようにスケジュールできます。 したがって、すぐにレンダリングされるメッセージには、シンセサイザーの入力バッファーに配置される前に (現在の時間ではなく) 待ち時間がスタンプされます。