音楽テクノロジ GUID
MIDI または DMus ミニポート ドライバーは、各ピンが処理できるストリーム形式の範囲を指定する必要があります。 ファクトリのピン留め で説明されているように、ドライバーはこの情報を 1 つ以上のデータ範囲記述子の配列として指定し、それぞれが KSDATARANGE_MUSIC型の構造体です。 この構造体の テクノロジ メンバーは、MIDI または DirectMusic デバイスが使用するシンセサイザー テクノロジの種類を示します。 ミニポート ドライバーは テクノロジー メンバーを次の表 (左の列) に示す GUID 値のいずれかに設定できます。
KSDATARANGE_MUSIC テクノロジ GUID | MIDIOUTCAPS wTechnology Value | 意味 |
---|---|---|
KSMUSIC_TECHNOLOGY_PORT |
MOD_MIDIPORT |
デバイスは MPU-401 デバイスです。 |
KSMUSIC_TECHNOLOGY_SYNTH |
MOD_SYNTH |
デバイスはシンセサイザーです。 |
KSMUSIC_TECHNOLOGY_SQSYNTH |
MOD_SQSYNTH |
デバイスは正方形のシンセサイザーです。 |
KSMUSIC_TECHNOLOGY_FMSYNTH |
MOD_FMSYNTH |
デバイスはFMシンセサイザーです。 |
KSMUSIC_TECHNOLOGY_MAPPER |
MOD_MAPPER |
デバイスは Microsoft MIDI マッパーです。 |
KSMUSIC_TECHNOLOGY_WAVETABLE |
MOD_WAVETABLE |
デバイスは、ハードウェアウェーブテーブルシンセサイザーです。 |
KSMUSIC_TECHNOLOGY_SWSYNTH |
MOD_SWSYNTH |
デバイスはソフトウェア シンセサイザーです。 |
midiOutGetDevCaps 関数は、ドライバーから受け取ったテクノロジ GUID を、呼び出し元に出力する MIDIOUTCAPS 構造体の wTechnology メンバーに書き込むインデックスに変換します。 前の表は、各テクノロジ GUID に 対応する wTechnology 値 (中央の列) を示しています。 midiOutGetDevCaps および MIDIOUTCAPS の詳細については、Microsoft Windows SDK のドキュメントを参照してください。
デバイスを列挙する場合、Windows マルチメディア midiOut または midiIn API を使用する MIDI アプリケーションは MIDI ピンを表示できますが、DirectMusic ピンは表示されません。 DirectMusic アプリケーションは、MIDI と DirectMusic の両方のピンを表示できます。 MIDI または DMus ミニポート ドライバーは、ピンのデータ範囲のサブタイプ GUID をKSDATAFORMAT_SUBTYPE_MIDIに設定することで、MIDI ピンを識別します。 DMus ミニポート ドライバーは、サブタイプ GUID をKSDATAFORMAT_SUBTYPE_DIRECTMUSICに設定して DirectMusic ピンを識別します。 MIDI ピンと DirectMusic ピンのデータ範囲の例については MIDI ストリーム データ範囲 と DirectMusic Stream データ範囲を参照してください。
MIDI および DirectMusic フィルターで説明されているように、アダプター ドライバーは PcNewMiniport 関数を呼び出して、Portcls.sysでシステム提供のミニポート ドライバーの 1 つのインスタンスを作成します。 呼び出し元は、インスタンス化するミニポート ドライバーを指定する次の表のドライバー GUID のいずれかを指定します。
GUID ドライバ | GUID テクノロジ |
---|---|
CLSID_MiniportDriverDMusUART |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverDMusUARTCapture |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverFmSynth |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverFmSynthWithVol |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverUart |
KSMUSIC_TECHNOLOGY_PORT |
前の表の右側の列は、対応するミニポート ドライバーがそのピンのデータ範囲で指定するテクノロジ GUID を示します。 たとえば、FmSynth ミニポート ドライバーは、そのピンにKSMUSIC_TECHNOLOGY_FMSYNTH技術 GUID を割り当てます。
一部のウェーブテーブル シンセサイザー デバイスは、MPU-401 デバイス (テクノロジ GUID KSMUSIC_TECHNOLOGY_PORT) としてアプリケーションに公開されます。 外部シンセサイザーがない場合、彼らはウェーブテーブルシンセサイザーを介して生のMIDIバイトストリームを再生することができます。
ただし、midiOut API は、既定の (優先) MIDI 再生デバイスを選択するときに、ウェーブテーブル シンセサイザー デバイス (テクノロジ GUID KSMUSIC_TECHNOLOGY_WAVETABLE) を優先します。 MPU-401 デバイスを既定のデバイスとして選択することは明示的に回避されます。
それ自体がデフォルトデバイスになる資格を得るために、生MIDIを再生できるウェーブテーブルデバイスは、MPU-401デバイスではなく、ウェーブテーブルデバイスとして自分自身を公開する必要があります。 ただし、アダプター ドライバーがシステム提供の MPU-401 ミニポート ドライバー、DMusUART を使用して、そのウェーブテーブル シンセサイザー デバイスを管理する場合、ミニポート ドライバーは、そのピンにKSMUSIC_TECHNOLOGY_PORT技術 GUID を静的に割り当てます。
IMusicTechnology::SetTechnology メソッドを呼び出すことで、アダプター ドライバーはミニポート ドライバーのデータ範囲のテクノロジ GUID を上書きできます。 次のコード例では、アダプター ドライバーは、DMusUART ミニポート ドライバーのデータ範囲のテクノロジ GUID を既定値のKSMUSIC_TECHNOLOGY_PORTからKSMUSIC_TECHNOLOGY_WAVETABLE値に変更します。 この新しい設定では、MPU に似たウェーブテーブル デバイスは、midiOut API によって既定の MIDI デバイスとして選択される資格があります。
// Create the miniport object.
PUNKNOWN miniport;
ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);
// Query the miniport driver for the IMusicTechnology interface.
IMusicTechnology* pMusicTechnology;
if (NT_SUCCESS(ntStatus))
{
ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
}
// Set the Technology members in the DirectMusic data-range entries
// for all the pins that are exposed by this miniport.
// SetTechnology should be called before initializing the miniport.
if (NT_SUCCESS(ntStatus))
{
ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
}
前のコード例のコメントに示されているように、アダプター ドライバーは、ポート ドライバーの Init
メソッドを呼び出す前に SetTechnology を呼び出す必要があります (次に、ミニポート ドライバーの Init
メソッドを呼び出します)。 システム提供の DMusUART ミニポート ドライバーと UART ミニポート ドライバーは、どちらも IMusicTechnology インターフェイスをサポートしています。 その他のミニポート ドライバーの場合、IMusicTechnology のサポートは省略可能です。 詳細については、Microsoft Windows Driver Kit (WDK) の DMusUART サンプル オーディオ ドライバーの SetTechnology メソッドの実装を参照してください。