Partager via


Composants MIDI et DirectMusic

Les programmes d’application s’appuient sur une combinaison de composants en mode utilisateur et noyau pour capturer et lire les flux MIDI et DirectMusic.

Une application peut utiliser l’une des interfaces logicielles suivantes pour la lecture et la capture MIDI :

  • Fonctions Microsoft Windows Multimedia midiOutXxx et midiInXxx

  • DirectMusic API

Le comportement des fonctions midiOutXxx et midiInXxx est basé sur les fonctionnalités des pilotes et périphériques MIDI hérités. À compter de Windows 98, le pilote système WDMAud traduit les appels à ces fonctions en commandes en pilotes audio WDM. Toutefois, en émulant le comportement des logiciels et du matériel plus anciens, les fonctions midiOutXxx et midiInXxx sacrifient le minutage de précision et les fonctionnalités améliorées qui sont désormais disponibles via l’API DirectMusic. Pour plus d’informations sur DirectMusic et les fonctions Windows Multimedia MIDI, consultez la documentation Microsoft Windows SDK.

DirectMusic et les fonctions Windows Multimedia MIDI sont des clients du pilote système SysAudio, qui génère les graphiques de filtre audio qui traitent les flux MIDI et DirectMusic. La création de graphiques est transparente pour les applications qui utilisent ces interfaces logicielles.

Composants MIDI

La figure suivante montre les composants en mode utilisateur et en mode noyau qu’une application MIDI utilise pour lire les données MIDI. Cette application s’interface aux pilotes audio WDM via les fonctions midiOutXxx , qui sont implémentées dans le composant système WinMM, Winmm.dll.

Diagramme illustrant les composants en mode utilisateur et en mode noyau de lecture MIDI.

L’application MIDI de la figure précédente lit les événements MIDI horodatés à partir d’un fichier MIDI et les lit. Les pilotes de miniport MIDI et DMus sont affichés sous forme de zones sombres pour indiquer qu’ils peuvent être des composants fournis par le fournisseur. Le cas échéant, un fournisseur peut choisir d’utiliser l’un des pilotes miniport fournis par le système (FMSynth, UART ou DMusUART) au lieu d’écrire un pilote miniport personnalisé. Tous les autres composants de la figure sont fournis par le système.

La boucle main d’une application de lecture MIDI classique appelle timeSetEvent pour planifier l’événement de note ou de remarque suivant. Cet appel prend comme paramètre un pointeur de fonction vers la routine de rappel de l’application. Lorsque l’événement se produit et que le système d’exploitation appelle la routine de rappel, cette routine appelle midiOutShortMsg pour activer ou désactiver une ou plusieurs notes planifiées. La fonction midiOutShortMsg stocke les messages MIDI dans des mémoires tampons de données verrouillées sur la page pour éviter d’avoir à paginer cette mémoire pendant un appel. Pour plus d’informations sur les appels timeSetEvent et midiOutShortMsg, consultez la documentation Microsoft Windows SDK.

WDMAud, qui se compose à la fois de composants en mode utilisateur et en mode noyau (Wdmaud.drv et Wdmaud.sys), enregistre l’heure à laquelle les messages MIDI bruts des appels midiOutShortMsg arrivent. WDMAud combine ces horodatages avec les messages MIDI pour générer le flux MIDI qu’il envoie à l’un des composants en mode noyau qui apparaissent sous WDMAud dans la figure.

Lors de la génération du graphique de filtre audio pour l’application MIDI, SysAudio sélectionne une seule des trois connexions possibles (à SWMidi, au port MIDI ou au pilote de port DMus) qui apparaissent dans la figure précédente. Si l’application sélectionne le périphérique MIDI par défaut, SysAudio recherche d’abord un appareil de synthétiseur dont le pilote de miniport MIDI ou DMus a une broche MIDI. S’il ne trouve aucun périphérique de ce type dans le Registre, SysAudio utilise à la place le pilote système SWMidi (Swmidi.sys). SWMidi est un filtre KS qui implémente un synthé pouvant être ondulé dans un logiciel, et il ne nécessite qu’un appareil capable de restituer un flux audio d’ondes.

SWMidi mélange toutes ses voix ensemble pour produire un flux PCM à onde unique, qu’il génère sur le pilote système KMixer. KMixer, à son tour, transmet un flux d’onde au format PCM à un appareil WaveCyclique ou WavePci, dont les pilotes de port et de miniport apparaissent dans l’angle inférieur gauche de la figure. KMixer peut également transmettre son flux de sortie à un périphérique audio USB contrôlé par le pilote système de classe USBAudio (non illustré dans la figure).

Dans la figure précédente, le pilote de port MIDI prend le flux MIDI horodaté de WDMAud et le convertit en messages MIDI bruts, que le pilote de miniport MIDI lit via le périphérique de synthétiseur. Le pilote de port MIDI contient un séquenceur, implémenté dans le logiciel et capable de planifier les messages MIDI bruts avec une résolution du minuteur d’une milliseconde.

Le pilote de port DMus est en mesure d’obtenir une précision de minutage beaucoup plus élevée que le pilote de port MIDI si le périphérique de synthétiseur contient un séquenceur matériel. Dans ce cas, le pilote de miniport DMus doit spécifier une mémoire tampon matérielle suffisamment grande pour absorber la gigue résultant de la concurrence du temps processeur avec les ISR (routines de service d’interruption) et d’autres opérations de priorité élevée. Les horodatages dans le flux MIDI que le pilote de port DMus génère au pilote miniport sont des valeurs de 64 bits avec une résolution de 100 nanosecondes.

Si le synthétiseur DMusic n’a pas de séquenceur matériel, il doit s’appuyer sur le séquenceur logiciel du pilote de port DMus, qui, comme le pilote de port MIDI, a une résolution du minuteur d’une milliseconde.

Un pilote d’adaptateur crée un pilote de port MIDI ou DMus en appelant PcNewPort avec une valeur GUID CLSID_PortMidi ou CLSID_PortDMus, respectivement. Dans Windows XP et versions ultérieures, les pilotes de port MIDI et DMus partagent la même implémentation logicielle.

En bas de la figure précédente figurent les noms des pilotes de miniport fournis par le système FMSynth, UART et DMusUART, qui sont inclus dans Portcls.sys. Un pilote d’adaptateur crée l’un de ces pilotes miniport en appelant PcNewMiniport. FMSynth et UART fournissent des interfaces IMiniportMidi , et DMusUART fournit une interface IMiniportDMus . Notez que L’UART est désormais obsolète (après Windows 98 Gold) et n’est pris en charge que pour les pilotes existants. Les nouveaux pilotes d’adaptateur doivent à la place utiliser DMusUART (dans Windows 98 SE et versions ultérieures, et dans Windows 2000 et versions ultérieures), qui implémente un sur-ensemble de fonctionnalités UART. DMusUART est un exemple de pilote miniport DMus qui ne prend en charge ni les téléchargements DLS ni le séquencement matériel. Le code source des pilotes miniport FMSynth et DMusUART est disponible dans les exemples de pilotes audio du Kit de pilotes Windows (WDK).

La figure suivante montre les composants en mode utilisateur et en mode noyau qu’un programme d’application MIDI utilise pour capturer des données MIDI. Cette application s’interface aux pilotes audio WDM via les fonctions midiInXxx .

Diagramme montrant les composants en mode utilisateur et noyau de capture MIDI.

Dans la figure précédente, les pilotes miniport MIDI et DMus sont affichés sous forme de zones sombres pour indiquer qu’ils peuvent être des composants fournis par le fournisseur. Le cas échéant, un fournisseur peut choisir d’utiliser l’un des pilotes miniport fournis par le système, UART ou DMusUARTCapture. Tous les autres composants de la figure sont fournis par le système.

La source des données MIDI est généralement un appareil MPU-401. En appelant PcNewMiniport, un pilote d’adaptateur peut créer l’un des pilotes miniport fournis par le système, UART ou DMusUARTCapture, pour capturer des données MIDI à partir d’un appareil MPU-401. Là encore, UART est obsolète et les nouveaux pilotes doivent utiliser DMusUARTCapture (dans Windows 98 SE et versions ultérieures, et dans Windows 2000 et versions ultérieures).

Chaque fois qu’un événement de note-on ou de note-off MIDI se produit, le pilote de miniport de capture MIDI ou DMusic (en bas de la figure précédente) ajoute un horodatage au message MIDI avant de l’ajouter au flux MIDI qui circule vers le pilote de port MIDI ou DMus.

Le pilote de port de capture MIDI ou DMusic génère un flux MIDI horodaté vers Wdmaud.sys, la moitié en mode noyau du pilote système WDMAud. La moitié du mode utilisateur, Wdmaud.drv, génère le flux MIDI horodaté vers le programme d’application via les fonctions midiInXxx , qui sont implémentées dans Winmm.dll.

L’application MIDI en haut de la figure écrit des événements MIDI horodatés dans un fichier MIDI. Au moment où l’application appelle midiInOpen pour ouvrir le flux d’entrée MIDI, elle transmet un pointeur de fonction à sa routine de rappel. Lorsqu’un événement de note ou de remarque se produit, le système d’exploitation appelle la routine de rappel avec un bloc de données qui inclut un ou plusieurs messages MIDI horodatés. Les horodatages sur ces messages sont essentiellement les mêmes que ceux générés à l’origine par le pilote de miniport MIDI ou DMus.

Composants DirectMusic

La figure suivante montre les composants en mode utilisateur et noyau utilisés par un programme d’application DirectMusic pour lire ou capturer des données MIDI.

Diagramme illustrant la lecture et la capture des composants en mode utilisateur et en mode noyau.

Les composants de lecture sont affichés dans la moitié gauche de la figure précédente, et les composants de capture apparaissent à droite. Les pilotes miniport DMus sont affichés sous forme de zones sombres pour indiquer qu’ils peuvent être des composants fournis par le fournisseur. Le cas échéant, un fournisseur peut utiliser l’un des pilotes miniport fournis par le système, DMusUART ou DMusUARTCapture. Les autres composants de la figure sont fournis par le système.

Dans le coin supérieur gauche de la figure, une application DirectMusic dirige un flux MIDI horodaté d’un fichier vers le composant système DirectMusic en mode utilisateur (DMusic.dll), qui dirige à son tour le flux vers un pilote de port DMus. Ce pilote peut être lié au pilote miniport pour un synthétiseur DirectMusic ou un appareil MPU-401, s’il est disponible. Sinon, le pilote de port peut être lié au pilote système DMusic (Dmusic.sys), qui est un pilote miniport DMus fourni par le système qui implémente un synthétiseur pouvant être ondulé DLS dans le logiciel, et qui nécessite uniquement un appareil capable de restituer un flux audio d’ondes.

Comme SWMidi, le pilote DMusic, Dmusic.sys, mélange toutes ses voix pour produire un seul flux d’ondes au format PCM, qu’il génère sur KMixer. KMixer, à son tour, peut passer un flux d’ondes à un périphérique d’ondes, dont les pilotes de port et de miniport apparaissent dans l’angle inférieur gauche de la figure, ou à un périphérique audio USB contrôlé par le pilote système USBAudio, qui n’apparaît pas dans la figure.

Les composants de capture DirectMusic apparaissent dans la moitié droite de la figure précédente. Le pilote de miniport de capture DMusic dans l’angle inférieur droit de la figure contrôle le matériel de capture et horodate chaque message MIDI qu’il enregistre. Le pilote de port DMus dirige le flux MIDI horodaté vers le composant DirectMusic en mode utilisateur, DMusic.dll. L’application accède à ce flux via l’API DirectMusic et écrit les données MIDI horodatées dans un fichier.

Un pilote d’adaptateur peut utiliser le pilote miniport DMusUARTCapture fourni par le système pour contrôler un périphérique de capture MPU-401. Le pilote d’adaptateur crée ce pilote miniport en appelant PcNewMiniport avec la valeur GUID CLSID_DMusUARTCapture. L’objet pilote miniport résultant prend en charge une interface IMiniportDMus . Le code source du pilote miniport DMusUARTCapture est disponible dans les exemples de pilotes audio du Kit de pilotes Windows (WDK).

Une application DirectMusic peut également s’exécuter via un appareil midiOutXxx tel que SWMidi (Swmidi.sys) si elle le souhaite. Par souci de simplicité, ce chemin est omis de la figure précédente. Le pilote DMusic (Dmusic.sys) nécessite un téléchargement DLS initial pour fonctionner correctement ; l’utilisation de SWMidi évite cette exigence.