MIDI- und DirectMusic-Filter

MIDI- und DirectMusic-Filter stellen Geräte dar, die MIDI-Musikdaten synthetisieren, ausgeben oder erfassen. Anwendungen greifen in der Regel entweder über die DirectMusic-API oder über die Funktionen MidiOutXxx und midiInXxx von Microsoft Windows Multimedia auf die Funktionen dieser Geräte zu. Weitere Informationen zu diesen Schnittstellen finden Sie in der Dokumentation zu Microsoft Windows SDK.

Ein MIDI- oder DirectMusic-Synthesizerfilter empfängt als Eingabe einen MIDI-Stream, der aus zeitstempelten MIDI-Ereignissen besteht. Der Filter gibt eine der folgenden Ausgaben aus:

  • Ein wellenformatierter digitaler Audiostream

  • Analoge Audiosignale, die eine Reihe von Lautsprechern antreiben können

Ein MIDI- oder DirectMusic-Ausgabefilter empfängt als Eingabe einen MIDI-Stream, der aus zeitstempelten MIDI-Ereignissen besteht. Der Filter gibt unformatierte MIDI-Nachrichten an ein externes MIDI-Soundmodul aus.

Ein MIDI- oder DirectMusic-Aufnahmefilter verwendet als Eingabe eine Reihe von unformatierten MIDI-Nachrichten von einer MIDI-Tastatur oder einem anderen externen MIDI-Gerät. Der Filter gibt einen MIDI-Stream aus, der aus zeitstempelten MIDI-Ereignissen besteht.

Ein einzelner MIDI- oder DirectMusic-Filter kann je nach den Funktionen des Geräts, das der Filter darstellt, eine Kombination aus den drei Funktionen – Synthese, Ausgabe und Erfassung – ausführen. Beispielsweise führt ein reines MPU-401-Gerät die Ausgabe und Erfassung aus, aber keine Synthese.

MIDI-Filter

Ein MIDI-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine MIDI-Filterfactory erstellt einen MIDI-Filter wie folgt:

  • Es instanziiert ein MIDI-Miniporttreiberobjekt.

  • Es instanziiert ein MIDI-Porttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortMidi aufgerufen wird.

  • Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.

Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Vorgang. Die Port- und Miniporttreiber kommunizieren über ihre IPortMidi - und IMiniportMidi-Schnittstellen miteinander.

Zur Unterstützung von MIDI-Ausgabe- und Synthesizergeräten enthält der MIDI-Porttreiber einen Softwaresequenzer, der unformatierte MIDI-Nachrichten mit einer Timerauflösung von einer Millisekunde an den Miniporttreiber ausgibt.

DirectMusic-Filter

Ein DirectMusic-Filter bietet eine Übermenge der Funktionalität eines MIDI-Filters. Die Obermenge enthält die folgenden zusätzlichen Funktionen:

  • DLS-Ressourcen (downloadable sound), die Wellenform- und Artikulationsdaten enthalten, die MIDI-Instrumente beschreiben. Eine KSPROPERTY_SYNTH_DLS_DOWNLOAD Set-Property-Anforderung lädt eine DLS-Ressource in einen Filter herunter.

  • Kanalgruppen zum Erweitern der Anzahl der auswählbaren Instrumente. Die DMUS_KERNEL_EVENT-Struktur , die zum Verpacken jeder zeitstempelten MIDI-Nachricht in einem MIDI-Stream verwendet wird, gibt an, welche Kanalgruppe für diese Nachricht verwendet werden soll.

  • 64-Bit-Zeitstempel mit einer Auflösung von 100 Nanosekunden zur Unterstützung der Hardware-MIDI-Sequenzierung. Die DMUS_KERNEL_EVENT-Struktur gibt den Hochauflösenden Zeitstempel für eine MIDI-Nachricht an.

Bei Kanalgruppen ist die Anzahl der gleichzeitig wiedergegebenen Noten nicht mehr auf die 16 Kanäle der ursprünglichen MIDI-Spezifikation beschränkt. Sie ist nur durch die Anzahl der im Synthesizer verfügbaren Stimmen begrenzt.

Ein DirectMusic-Filter wird als Port/Miniport-Treiberpaar implementiert. Eine DirectMusic-Filterfactory erstellt einen DirectMusic-Filter wie folgt:

  • Es instanziiert ein DMus-Miniporttreiberobjekt (DirectMusic).

  • Es instanziiert ein DMus-Porttreiberobjekt, indem PcNewPort mit dem GUID-Wert CLSID_PortDMus aufgerufen wird.

  • Es ruft die IPort::Init-Methode des Porttreibers auf, um den Miniporttreiber an den Porttreiber zu binden.

Das Codebeispiel in der Untergeräteerstellung veranschaulicht diesen Vorgang. Die Port- und Miniporttreiber kommunizieren über ihre IPortDMus - und IMiniportDMus-Schnittstellen miteinander.

Zur Unterstützung von DirectMusic-Synthesizergeräten enthält der DMus-Porttreiber einen Softwaresequenzer mit niedriger Auflösung (eine Millisekunde), der zeitstempelte MIDI-Ereignisse im Puffer des Hardwaresequenzers ausgeben kann, bevor sie wiedergegeben werden sollen. Um DirectMusic-Ausgabegeräte zu unterstützen, kann der Softwaresequenzer des Porttreibers auch so konfiguriert werden, dass unformatierte MIDI-Nachrichten zu dem Zeitpunkt ausgegeben werden, zu dem sie wiedergegeben werden sollen.

Aufzählen von MIDI- und DirectMusic-Geräten

Beim Aufzählen von MIDI-Eingabe- oder Ausgabegeräten über die Windows Multimedia-Funktionen midiInXxx oder midiOutXxx kann eine Anwendung nur WDM-Geräte sehen, deren Miniporttreiber MIDI-Pins verfügbar machen. Dies sind Pins, die unformatierte MIDI-Streams verwalten, aber keine Unterstützung für erweiterte Features wie DLS und Kanalgruppen bieten. Beim Auflisten von Geräten über DirectMusic kann eine Anwendung jedoch WDM-Geräte mit MIDI-Pins und DirectMusic-Pins sehen. DirectMusic-Pins verwalten zeitstempelte MIDI-Streams und unterstützen DLS und Kanalgruppen.

Bei der Implementierung eines benutzerdefinierten Miniporttreibers schreibt ein Hardwarehersteller in der Regel entweder einen MIDI-Miniporttreiber oder einen DMus-Miniporttreiber, aber nicht beides. Ein MIDI-Miniporttreiber kann nur MIDI-Pins verfügbar machen. Ein DMus-Miniporttreiber kann jedoch sowohl MIDI- als auch DirectMusic-Pins verfügbar machen, sodass kein separater MIDI-Miniporttreiber geschrieben werden muss. Ein Beispiel für einen MIDI-Pin auf einem DirectMusic-Filter finden Sie im Dmusuart-Beispiel-Audiotreiber im Windows Driver Kit (WDK).

Bei der Angabe eines Datenbereichs für einen MIDI- oder DirectMusic-Pin gibt ein MIDI- oder DMus-Miniporttreiber ein Hauptformat vom Typ KSDATAFORMAT_TYPE_MUSIC und ein Unterformat vom Typ KSDATARANGE_SUBTYPE_MIDI für einen MIDI-Pin oder KSDATARANGE_SUBTYPE_DIRECTMUSIC für einen DirectMusic-Pin an. Beispiele für Datenbereichsdeskriptoren für MIDI- und DirectMusic-Pins werden im MIDI Stream Data Range bzw . directMusic Stream Data Range angezeigt.

Ein MIDI-Pin instance auf einem MIDI-Filter macht eine IMiniportMidiStream-Schnittstelle verfügbar. Ein MIDI- oder DirectMusic-Pin instance in einem DirectMusic-Filter macht eine IMXF-Schnittstelle verfügbar.

In Windows Me/98 listet DirectMusic manchmal dasselbe MPU-401-Gerät zweimal auf. Der Grund dafür ist, dass einige Hardwarehersteller ihre MPU-401-Geräte sowohl als Legacy-, Pre-WDM-MIDI-Geräte als auch als WDM-Geräte verfügbar machen. Für das Legacygerät listet DirectMusic ein MPU-401-Gerät auf, das den direkten Pfad von DMusic.dll zu Ihvaudio.dll darstellt. Für das WDM-Gerät listet DirectMusic dasselbe MPU-401-Gerät über einen Leitungspfad auf, der aus der folgenden Sequenz von Komponenten besteht:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. Der Miniporttreiber des Anbieters

Der MIDI-Synthesizer, der in der Windows-Multimedia-Systemsteuerung (Mmsys.cpl) angezeigt wird, hat den gleichen Namen wie das WDM-Gerät.

Vom System bereitgestellte Port- und Miniporttreiber

Mehrere vom System bereitgestellte MIDI- und DMus-Miniporttreiber sind in den PortCls-Systemtreiber integriert:

  • Der FMSynth-Miniporttreiber stellt eine Schnittstelle zu einem MIDI-Gerät bereit, das die FM-Synthese im OPL3-Stil implementiert.

  • Der UART-Miniporttreiber unterstützt ein MIDI-Gerät mit einer MPU-401-Hardwareschnittstelle, aber dieser Treiber ist jetzt veraltet (nach Windows 98 Gold) und wird nur für vorhandene Adaptertreiber unterstützt. Neuer Adaptertreibercode sollte stattdessen den DMusUART-Miniporttreiber (in Windows 98 SE und Windows Me und in Windows 2000 und höher) verwenden, der UART ersetzt und eine Obermenge seiner Funktionalität implementiert.

Adaptertreiber können auf die vom System bereitgestellten Miniporttreiber zugreifen, indem sie die PcNewMiniport-Funktion aufrufen. Die FMSynth- und DMusUART-Miniporttreiber sind auch als Beispiel-Audiotreiber im Windows Driver Kit (WDK) enthalten. Durch Ändern des Quellcodes in diesen Beispielen können Hardwarehersteller die Treiber erweitern, um die proprietären Features ihrer Geräte zu verwalten.

DMusUART ist ein Beispiel für einen DMus-Miniporttreiber, der sowohl MIDI- als auch DirectMusic-Pins verfügbar macht, aber weder DLS-Downloads noch Hardwaresequenzierung unterstützt. Der DirectMusic-Rendering-Pin des Miniporttreibers verfügt über einen Synthieknoten (KSNODETYPE_SYNTHESIZER), der mehrere KSPROPSETID_Synth-Eigenschaften unterstützt. Der Miniporttreiber umfasst sich selbst in Kategorien KSCATEGORY_RENDER und KSCATEGORY_CAPTURE, aber nicht in KSCATEGORY_SYNTHESIZER (da er keinen internen Synthesizer enthält). Weitere Informationen finden Sie im DMusUART-Beispiel-Audiotreiber im WDK.

Beachten Sie, dass in Windows XP und höher die MIDI- und DMus-Porttreiber dieselbe interne Softwareimplementierung verwenden. Dies bedeutet, dass die CLSID_PortMidi und CLSID_PortDMus GUIDs beim Aufrufen von PcNewPort gleichwertig sind. Anwendungen, die für frühere Versionen von Windows geschrieben wurden, sollten keine Verhaltensänderungen feststellen, die sich aus der Konsolidierung der MIDI- und DMus-Porttreiber ergeben.