Partager via


Filtres MIDI et DirectMusic

Les filtres MIDI et DirectMusic représentent des appareils qui synthétisent, sortent ou capturent des données musicales MIDI. Les applications accèdent généralement aux fonctionnalités de ces appareils via l’API DirectMusic ou par le biais des fonctions MidiOutXxx et midiInXxx de Microsoft Windows Multimédia. Pour plus d’informations sur ces interfaces, consultez la documentation Microsoft Windows SDK.

Un filtre de synthétiseur MIDI ou DirectMusic reçoit en entrée un flux MIDI composé d’événements MIDI horodatés. Le filtre génère l’une des sorties suivantes :

  • Flux audio numérique au format vague

  • Signaux audio analogiques qui peuvent piloter un ensemble d’haut-parleurs

Un filtre de sortie MIDI ou DirectMusic reçoit en entrée un flux MIDI composé d’événements MIDI horodatés. Le filtre génère des messages MIDI bruts vers un module audio MIDI externe.

Un filtre de capture MIDI ou DirectMusic prend comme entrée une série de messages MIDI bruts à partir d’un clavier MIDI ou d’un autre périphérique MIDI externe. Le filtre génère un flux MIDI composé d’événements MIDI horodatés.

Un seul filtre MIDI ou DirectMusic peut effectuer une combinaison des trois fonctions (synthèse, sortie et capture) en fonction des fonctionnalités de l’appareil que le filtre représente. Par exemple, un appareil MPU-401 pur effectue la sortie et la capture, mais pas la synthèse.

Filtre MIDI

Un filtre MIDI est implémenté en tant que paire de pilotes port/miniport. Une fabrique de filtre MIDI crée un filtre MIDI comme suit :

  • Il instancie un objet pilote miniport MIDI.

  • Il instancie un objet de pilote de port MIDI en appelant PcNewPort avec la valeur GUID CLSID_PortMidi.

  • Il appelle la méthode IPort::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Création de sous-appareil illustre ce processus. Les pilotes de port et de miniport communiquent entre eux via leurs interfaces IPortMidi et IMiniportMidi .

Pour prendre en charge les périphériques de sortie MIDI et de synthétiseur, le pilote de port MIDI contient un séquenceur logiciel qui génère des messages MIDI bruts vers le pilote miniport avec une résolution du minuteur d’une milliseconde.

Filtre DirectMusic

Un filtre DirectMusic fournit un sur-ensemble des fonctionnalités d’un filtre MIDI. Le sur-ensemble comprend les fonctionnalités supplémentaires suivantes :

  • Ressources DLS (son téléchargeable) qui contiennent des données de forme d’onde et d’articulation décrivant des instruments MIDI. Une KSPROPERTY_SYNTH_DLS_DOWNLOAD demande set-property télécharge une ressource DLS vers un filtre.

  • Groupes de canaux pour augmenter le nombre d’instruments sélectionnables. La structure DMUS_KERNEL_EVENT , utilisée pour empaqueter chaque message MIDI horodaté dans un flux MIDI, spécifie le groupe de canaux à utiliser pour ce message.

  • Horodatages 64 bits avec une résolution de 100 nanosecondes pour la prise en charge du séquencement MIDI matériel. La structure DMUS_KERNEL_EVENT spécifie l’horodatage haute résolution d’un message MIDI.

Avec les groupes de canaux, le nombre de notes pouvant être lues simultanément n’est plus limité aux 16 canaux de la spécification MIDI d’origine. Elle est limitée uniquement par le nombre de voix disponibles dans le synthétiseur.

Un filtre DirectMusic est implémenté en tant que paire de pilotes port/miniport. Une fabrique de filtres DirectMusic crée un filtre DirectMusic comme suit :

  • Il instancie un objet pilote miniport DMus (DirectMusic).

  • Il instancie un objet pilote de port DMus en appelant PcNewPort avec la valeur GUID CLSID_PortDMus.

  • Il appelle la méthode IPort::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Création de sous-appareil illustre ce processus. Les pilotes de port et de miniport communiquent entre eux via leurs interfaces IPortDMus et IMiniportDMus .

Pour prendre en charge les appareils de synthétiseur DirectMusic, le pilote de port DMus contient un séquenceur logiciel basse résolution (une milliseconde) qui peut générer des événements MIDI horodatés dans la mémoire tampon du séquenceur matériel avant qu’ils soient lus. Pour prendre en charge les périphériques de sortie DirectMusic, le séquenceur logiciel du pilote de port peut également être configuré pour générer des messages MIDI bruts au moment où ils doivent être lus.

Énumération des appareils MIDI et DirectMusic

Lors de l’énumération d’appareils d’entrée ou de sortie MIDI via les fonctions midiInXxx ou midiOutXxx multimédia Windows, une application peut voir uniquement les appareils WDM dont les pilotes miniport exposent des broches MIDI. Il s’agit de broches qui gèrent les flux MIDI bruts, mais qui ne prennent pas en charge les fonctionnalités avancées telles que DLS et les groupes de canaux. Toutefois, lors de l’énumération d’appareils via DirectMusic, une application peut voir les appareils WDM avec des broches MIDI et des broches DirectMusic. Les épingles DirectMusic gèrent les flux MIDI horodatés et prennent en charge les groupes de canaux et de DLS.

Lors de l’implémentation d’un pilote miniport personnalisé, un fournisseur de matériel écrit généralement un pilote miniport MIDI ou un pilote miniport DMus, mais pas les deux. Un pilote de miniport MIDI peut exposer uniquement des broches MIDI. Toutefois, un pilote miniport DMus peut exposer à la fois des broches MIDI et DirectMusic, ce qui élimine la nécessité d’écrire un pilote de miniport MIDI distinct. Pour obtenir un exemple d’épingle MIDI sur un filtre DirectMusic, consultez l’exemple de pilote audio Dmusuart dans le Kit de pilotes Windows (WDK).

Lors de la spécification d’une plage de données pour une broche MIDI ou DirectMusic, un pilote miniport MIDI ou DMus spécifie un format majeur de type KSDATAFORMAT_TYPE_MUSIC et un sous-format de type KSDATARANGE_SUBTYPE_MIDI pour une broche MIDI ou un KSDATARANGE_SUBTYPE_DIRECTMUSIC pour une broche DirectMusic. Des exemples de descripteurs de plage de données pour les broches MIDI et DirectMusic apparaissent respectivement dans la plage de données deflux MIDI et la plage de données de flux DirectMusic.

Une broche MIDI instance sur un filtre MIDI expose une interface IMiniportMidiStream. Une broche MIDI ou DirectMusic instance sur un filtre DirectMusic expose une interface IMXF.

Dans Windows Me/98, DirectMusic énumère parfois deux fois le même appareil MPU-401. La raison en est que certains fournisseurs de matériel exposent leurs appareils MPU-401 en tant qu’appareils MIDI hérités, pré-WDM et en tant qu’appareils WDM. Pour l’appareil hérité, DirectMusic énumère un appareil MPU-401 qui représente le chemin d’accès direct de DMusic.dll à Ihvaudio.dll. Pour l’appareil WDM, DirectMusic énumère le même appareil MPU-401 par le biais d’un chemin circuiteux constitué de la séquence de composants suivante :

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. Pilote miniport du fournisseur

Le synthétiseur MIDI qui s’affiche dans le panneau de configuration multimédia Windows (Mmsys.cpl) aura le même nom que l’appareil WDM.

Ports et pilotes Miniport fournis par le système

Plusieurs pilotes MIDI et miniport DMus fournis par le système sont intégrés au pilote système PortCls :

  • Le pilote miniport FMSynth fournit une interface à un périphérique MIDI qui implémente la synthèse FM de type OPL3.

  • Le pilote UART miniport prend en charge un périphérique MIDI avec une interface matérielle MPU-401, mais ce pilote est désormais obsolète (après Windows 98 Gold) et n’est pris en charge que pour les pilotes d’adaptateur existants. Le nouveau code de pilote d’adaptateur doit plutôt utiliser le pilote miniport DMusUART (dans Windows 98 SE et Windows Me, et dans Windows 2000 et versions ultérieures), qui remplace UART et implémente un sur-ensemble de ses fonctionnalités.

Les pilotes d’adaptateur peuvent accéder aux pilotes miniport fournis par le système en appelant la fonction PcNewMiniport . Les pilotes FMSynth et DMusUART miniport sont également inclus en tant qu’exemples de pilotes audio dans le Kit de pilotes Windows (WDK). En modifiant le code source dans ces exemples, les fournisseurs de matériel peuvent étendre les pilotes pour gérer les fonctionnalités propriétaires de leurs appareils.

DMusUART est un exemple de pilote miniport DMus qui expose à la fois les broches MIDI et DirectMusic, mais ne prend pas en charge les téléchargements DLS ni le séquencement matériel. La broche de rendu DirectMusic du pilote miniport a un nœud synthé (KSNODETYPE_SYNTHESIZER) qui prend en charge plusieurs propriétés KSPROPSETID_Synth . Le pilote miniport s’inclut dans les catégories KSCATEGORY_RENDER et KSCATEGORY_CAPTURE, mais pas dans KSCATEGORY_SYNTHESIZER (car il ne contient pas de synthétiseur interne). Pour plus d’informations, consultez l’exemple de pilote audio DMusUART dans le WDK.

Notez que dans Windows XP et versions ultérieures, les pilotes de port MIDI et DMus utilisent la même implémentation logicielle interne. Cela signifie que les GUID CLSID_PortMidi et CLSID_PortDMus sont équivalents lors de l’appel de PcNewPort. Les applications écrites pour les versions précédentes de Windows ne doivent voir aucun changement de comportement résultant de la consolidation des pilotes de port MIDI et DMus.