MIDI フィルターと DirectMusic フィルター

MIDI フィルターと DirectMusic フィルターは、MIDI 音楽データを合成、出力、またはキャプチャするデバイスを表します。 アプリケーションは通常、DirectMusic API または Microsoft Windows マルチメディア midiOutXxx および midiInXxx 関数を介して、これらのデバイスの機能にアクセスします。 これらのインターフェイスの詳細については、Microsoft Windows SDK のドキュメントを参照してください。

MIDI または DirectMusic シンセサイザー フィルターは、タイムスタンプ付き MIDI イベントで構成される MIDI ストリームを入力として受け取ります。 フィルターは、次のいずれかを出力します。

  • ウェーブ形式のデジタル オーディオ ストリーム

  • 一連のスピーカーを駆動できるアナログオーディオ信号

MIDI または DirectMusic 出力 フィルターは、タイムスタンプ付き MIDI イベントで構成される MIDI ストリームを入力として受け取ります。 フィルターは、外部 MIDI サウンド モジュールに生の MIDI メッセージを出力します。

MIDI または DirectMusic キャプチャ フィルターは、MIDI キーボードまたはその他の外部 MIDI デバイスからの一連の生 MIDI メッセージを入力として受け取ります。 このフィルターは、タイムスタンプ付きの MIDI イベントで構成される MIDI ストリームを出力します。

1 つの MIDI または DirectMusic フィルターは、フィルターが表すデバイスの機能に応じて、合成、出力、キャプチャという 3 つの関数の組み合わせを実行できます。 たとえば、純粋な MPU-401 デバイスは出力とキャプチャを実行しますが、合成は実行しません。

MIDIフィルター

MIDI フィルターは、ポート/ミニポート ドライバー のペアとして実装されます。 MIDI フィルター ファクトリでは、次のように MIDI フィルターが作成されます。

  • MIDI ミニポート ドライバー オブジェクトをインスタンス化します。

  • GUID 値を CLSID_PortMidiして PcNewPort を呼び出すことによって、MIDI ポート ドライバー オブジェクトをインスタンス化します。

  • ポート ドライバー の IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。

Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、IPortMidi インターフェイスと IMiniportMidi インターフェイスを介して相互に通信します。

MIDI 出力およびシンセサイザー デバイスをサポートするために、MIDI ポート ドライバーには、生の MIDI メッセージを 1 ミリ秒のタイマー解像度でミニポート ドライバーに出力するソフトウェア シーケンサーが含まれています。

DirectMusic フィルター

DirectMusic フィルターは、MIDI フィルターの機能のスーパーセットを提供します。 スーパーセットには、次の追加機能が含まれています。

  • MIDI 楽器を記述する波形とアーティキュレーション データを含む DLS (ダウンロード可能なサウンド) リソース。 KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property 要求は、DLS リソースをフィルターにダウンロードします。

  • 選択可能なインストルメントの数を拡張するためのチャネル グループ。 各タイムスタンプ付き MIDI メッセージを MIDI ストリームにパッケージ化するために使用される DMUS_KERNEL_EVENT 構造体は、そのメッセージに使用するチャネル グループを指定します。

  • ハードウェア MIDI シーケンス処理をサポートする 100 ナノ秒解像度の 64 ビット タイムスタンプ。 DMUS_KERNEL_EVENT構造体は、MIDI メッセージの高解像度タイムスタンプを指定します。

チャンネルグループでは、同時に再生できるノートの数は、元のMIDI仕様の16チャンネルに制限されなくなりました。 シンセサイザーで使用可能な音声の数によってのみ制限されます。

DirectMusic フィルターは、ポート/ミニポート ドライバーのペアとして実装されます。 DirectMusic フィルター ファクトリは、次のように DirectMusic フィルターを作成します。

  • DMus (DirectMusic) ミニポート ドライバー オブジェクトをインスタンス化します。

  • GUID 値をCLSID_PortDMusして PcNewPort を呼び出すことによって、DMus ポート ドライバー オブジェクトをインスタンス化します。

  • ポート ドライバー の IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。

Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、IPortDMus インターフェイスと IMiniportDMus インターフェイスを介して相互に通信します。

DirectMusic シンセサイザー デバイスをサポートするために、DMus ポート ドライバーには低解像度 (1 ミリ秒) のソフトウェア シーケンサーが含まれています。このソフトウェア シーケンサーは、再生がスケジュールされる前に、タイムスタンプ付きの MIDI イベントをハードウェア シーケンサーのバッファーに出力できます。 DirectMusic 出力デバイスをサポートするために、ポート ドライバーのソフトウェア シーケンサーは、再生時に生の MIDI メッセージを出力するように構成することもできます。

MIDI および DirectMusic デバイスの列挙

Windows マルチメディア midiInXxx または midiOutXxx 関数を介して MIDI 入力または出力デバイスを列挙する場合、アプリケーションはミニポート ドライバーが MIDI ピン を公開する WDM デバイスのみを表示できます。 これらは生の MIDI ストリームを管理するが、DLS やチャネル グループなどの高度な機能のサポートがないピンです。 ただし、DirectMusic を介してデバイスを列挙する場合、アプリケーションは MIDI ピンと DirectMusic ピンの両方を持つ WDM デバイスを表示できます。 DirectMusic ピンは、タイムスタンプ付きの MIDI ストリームを管理し、DLS とチャネル グループをサポートします。

カスタム ミニポート ドライバーを実装する場合、ハードウェア ベンダーは通常、MIDI ミニポート ドライバーまたは DMus ミニポート ドライバーを書き込みますが、両方を書き込む必要はありません。 MIDI ミニポート ドライバーは、MIDI ピンのみを公開できます。 ただし、DMus ミニポート ドライバーは、MIDI と DirectMusic の両方のピンを公開できます。これにより、別の MIDI ミニポート ドライバーを記述する必要がなくなります。 DirectMusic フィルターの MIDI ピンの例については、Windows Driver Kit (WDK) の Dmusuart サンプル オーディオ ドライバーを参照してください。

MIDI または DirectMusic ピンのデータ範囲を指定する場合、MIDI または DMus ミニポート ドライバーは、KSDATAFORMAT_TYPE_MUSIC型の主要な形式と、MIDI ピンまたは DirectMusic ピンのKSDATARANGE_SUBTYPE_DIRECTMUSICのKSDATARANGE_SUBTYPE_MIDI型のサブフォーマットを指定します。 MIDI ピンと DirectMusic ピンのデータ範囲記述子の例は、それぞれMIDI ストリーム データ範囲DirectMusic ストリーム データ範囲 に示されています。

MIDI フィルターの MIDI ピン インスタンスは、IMiniportMidiStream インターフェイスを公開します。 DirectMusic フィルターの MIDI または DirectMusic ピン インスタンスは、IMXF インターフェイスを公開します。

Windows Me/98 では、DirectMusic が同じ MPU-401 デバイスを 2 回列挙することがあります。 その理由は、一部のハードウェア ベンダーは、従来の WDM MIDI デバイスと WDM デバイスの両方として MPU-401 デバイスを公開しています。 レガシ デバイスの場合、DirectMusic は、DMusic.dllからIhvaudio.dllへの直接パスを表す MPU-401 デバイスを列挙します。 WDM デバイスの場合、DirectMusic は、次のコンポーネントシーケンスで構成される回路パスを介して同じ MPU-401 デバイスを列挙します。

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. ベンダーのミニポート ドライバー

Windows マルチメディア コントロール パネル (Mmsys.cpl) に表示される MIDI シンセサイザーは、WDM デバイスと同じ名前になります。

システム提供のポートとミニポート ドライバー

いくつかのシステム提供 MIDI および DMus ミニポート ドライバーは、PortCls システム ドライバーに組み込まれています。

  • FMSynth ミニポート ドライバーは、OPL3 スタイルの FM 合成を実装する MIDI デバイスへのインターフェイスを提供します。

  • UART ミニポート ドライバーは、MPU-401 ハードウェア インターフェイスを持つ MIDI デバイスをサポートしていますが、このドライバーは現在 (Windows 98 Gold の後) 古くなっており、既存のアダプター ドライバーでのみサポートされています。 新しいアダプター ドライバー コードでは、代わりに DMusUART ミニポート ドライバー (Windows 98 SEと Windows Me、および Windows 2000 以降) を使用する必要があります。このドライバーは、UART を置き換え、その機能のスーパーセットを実装します。

アダプター ドライバーは、 PcNewMiniport 関数を呼び出すことによって、システム提供のミニポート ドライバーにアクセスできます。 FMSynth および DMusUART ミニポート ドライバーは、Windows Driver Kit (WDK) のサンプル オーディオ ドライバーとしても含まれています。 これらのサンプルのソース コードを変更することで、ハードウェア ベンダーはドライバーを拡張してデバイスの独自の機能を管理できます。

DMusUART は、MIDI ピンと DirectMusic ピンの両方を公開する DMus ミニポート ドライバーの例ですが、DLS ダウンロードまたはハードウェア シーケンス処理はサポートしていません。 ミニポート ドライバーの DirectMusic レンダリング ピンには、いくつかの KSPROPSETID_Synth プロパティをサポートするシンセ ノード (KSNODETYPE_SYNTHESIZER) があります。 ミニポート ドライバーは、(内部シンセサイザーが含まれていないので) KSCATEGORY_SYNTHESIZERではなく、KSCATEGORY_RENDERとKSCATEGORY_CAPTUREカテゴリにそれ自体が含まれています。 詳細については、WDK の DMusUART サンプル オーディオ ドライバーを参照してください。

Windows XP 以降では、MIDI および DMus ポート ドライバーで同じ内部ソフトウェア実装が使用されることに注意してください。 これは、PcNewPort を呼び出す場合、CLSID_PortMidiCLSID_PortDMus の GUID が同等であることを意味します。 以前のバージョンの Windows 用に作成されたアプリケーションでは、MIDI および DMus ポート ドライバーの統合によって生じる動作に変化はありません。