次の方法で共有


IDirectMusicSynth と IDirectMusicSynthSink

シンセサイザーと Wave シンク」で説明されているように、ユーザー モードで実行され、DirectMusic と通信するカスタム ソフトウェア シンセサイザーまたは wave シンクを実装することができます。 シンセサイザー オブジェクトには、IDirectMusicSynth インターフェイスが必要です。 wave シンク オブジェクトには、IDirectMusicSynthSink インターフェイスが必要です。

DirectMusic は、IDirectMusicSynth インターフェイスを通じてソフトウェア シンセサイ ザーと通信します。 DirectMusic では、DirectX 6.1 以降でこのインターフェイスがサポートされています。 IDirectMusicSynth では、メソッドが機能グループにまとめられた以下の表に示すメソッドがサポートされています。

グループ メソッド名
ライセンス認証 IDirectMusicSynth::Activate
チャンネル IDirectMusicSynth::GetChannelPriority、IDirectMusicSynth::SetChannelPriority
インストルメント IDirectMusicSynth::D ownload、IDirectMusicSynth::Unload
情報 IDirectMusicSynth::GetAppend、IDirectMusicSynth::GetFormat、IDirectMusicSynth::GetLatencyClock、IDirectMusicSynth::GetPortCaps、IDirectMusicSynth::GetRunningStats
再生 IDirectMusicSynth::P layBuffer、IDirectMusicSynth::Render
Port IDirectMusicSynth::Open、IDirectMusicSynth::Close、IDirectMusicSynth::SetNumChannelGroups
その他のパラメーター IDirectMusicSynth::SetMasterClock、IDirectMusicSynth::SetSynthSink

ほとんどのアプリケーションでは、IDirectMusicSynth インターフェイス内のメソッドを直接呼び出す必要はありません。通常は、DirectMusic ポートがシンセサイザーを管理します。 ただし、アプリケーションは、開発中およびテスト中にシンセサイザーと直接やり取りすることができます。

シンセサイザーは、IDirectMusicSynthSink インターフェイスを持つオブジェクトとして表される wave シンクへの接続なしでは完了しません。 wave シンクは、シンセサイザーのオーディオ出力ストリームを DirectSound、DirectShow、Windows マルチメディア waveOut API などのオーディオ レンダリング モジュールに接続します。

既定では、DirectMusic は内部 IDirectMusicSynthSink 実装を使用し、ソフトウェア シンセサイザーによって生成される wave データを処理します。 この wave シンクは、データを DirectSound にフィードします。

シンセサイザーをアクティブ化する前に、最初に wave シンクを作成し、IDirectMusicSynth::SetSynthSink の呼び出しを通じてシンセサイザーに接続する必要があります。 IDirectMusicSynth::GetLatencyClockIDirectMusicSynth::SetMasterClock などのタイミング関連の呼び出しの多くは、実際には IDirectMusicSynthSink で同等の呼び出しに渡されるため、シンセサイザーを作成した後の最初の呼び出しになります。

IDirectMusicSynthSink インターフェイスを使用したカスタム ユーザー モードの wave シンクの実装をサポートするのは、DirectX 6.1 と DirectX 7 だけです。 IDirectMusicSynthSink では、メソッドが機能グループにまとめられた以下の表に示すメソッドがサポートされています。

グループ メソッド名
初期化 IDirectMusicSynthSink::Activate、IDirectMusicSynthSink::GetDesiredBufferSize
IDirectMusicSynthSink::Init、IDirectMusicSynthSink::SetDirectSound
タイミング IDirectMusicSynthSink::GetLatencyClock、IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime、IDirectMusicSynthSink::SetMasterClock

DirectX 8 以降では、DirectMusic は常に内部 wave シンクとユーザー モード シンセサイザーを使用します。 これらの新しいバージョンの DirectMusic では、IDirectMusicSynthSink のカスタム実装はサポートされていません。

ただし、DirectX 6.1 と DirectX 7 では、独自の IDirectMusicSynthSink オブジェクトを自由に実装し、それを使ってシンセサイザーのオーディオ出力ストリームを任意の方法で管理することができます。 たとえば、wave データを DirectShow または waveOut API にフィードできます。 wave ストリーム オブジェクトを作成する場合、IDirectMusicSynthSink インターフェイスを使用して IDirectMusicSynth オブジェクトに接続する必要があります。

wave ストリームの管理に加えて、wave シンクはシンセサイザーのタイミングを制御します。 wave シンクは、IDirectMusicSynth::SetMasterClock の呼び出しによってマスター クロックを受け取ります。これにより、マスター タイム ソースが IDirectMusicSynthSink::SetMasterClock と同じ呼び出しで渡されます。 マスター クロックは wave ストリームと同じ crystal からは生成されないため、wave シンクはクロック ドリフトを補正して同期を維持する必要があります。

加えて、シンセサイザーが時間を適切に追跡できるよう、マスター クロック時間からサンプル時間と戻り時間に変換する 2 つの呼び出しが用意されています。

  • IDirectMusicSynthSink::RefTimeToSample

  • IDirectMusicSynthSink::SampleToRefTime

wave シンクは、IDirectMusicSynth::Render の呼び出しによってサンプルが書き込まれる時間を実際に管理するため、待機時間クロックを生成します。 DirectMusic は、DirectMusic ポートで IDirectMusicSynth::GetLatencyClock を呼び出すと、そのまま方向転換して IDirectMusicSynthSink::GetLatencyClock を呼び出しです。

ソフトウェア シンセサイザーが初めて開かれると、DirectMusic はシンセサイザーに、オーディオ出力ストリームのサンプル レートとチャンネル数を指定する DMUS_PORTPARAMS 構造 (Microsoft Windows SDK ドキュメントで説明されています) を提供します。 その後、wave シンクが IDirectMusicSynth::GetFormat メソッドを呼び出すとき、シンセサイザーは wave シンクに渡す標準 WAVEFORMATEX 構造にそれらを変換します。

詳しくは、Windows SDK ドキュメントの IDirectMusic インターフェイスと IDirectMusicPort インターフェイスの説明をご覧ください。