次の方法で共有


シンセサイザーの待機時間

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

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

待機時間はすべてウェーブ シンクによって管理されます。 IDirectMusicSynthSink::GetLatencyClock メソッドの実装では待機時間クロックへのポインターを出力する必要があり、このポインターは IDirectMusicSynth::GetLatencyClock によって取得される必要があります。 アプリケーションは、遅延クロックを使用して、 IDirectMusicSynth::P layBuffer メソッドを呼び出して、MIDI メッセージがシンセサイザーに渡されたときに再生する MIDI メッセージをキューに登録できる最も早い時点を決定します。

MIDI メッセージの待機時間の例を次の図に示します。

PCM バッファー ループ内の MIDI メッセージの待機時間を示す図。

前の図では、待機時間クロックは、ノートを再生できる PCM バッファー ループの最初の位置を指しています。 マスター クロックは 22 時間単位であり、サウンドが現在再生されているポイントですが、22 ~ 30 時間単位のスペースは既にウェーブ データで満たされており、書き込むことができないことに注意してください。 そのため、新しいタイムスタンプ付き MIDI イベントを再生するようにスケジュールできる最初の場所は、時刻 30 です。 したがって、待機時間クロックは 30 時間単位を読み取ります。

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