Filtros MIDI y DirectMusic
Los filtros MIDI y DirectMusic representan dispositivos que sintetizan, generan o capturan datos de música MIDI. Las aplicaciones suelen acceder a las funcionalidades de estos dispositivos a través de directMusic API o a través de las funciones MidiOutXxx y midiInXxx de Microsoft Windows Multimedia. Para obtener más información sobre estas interfaces, consulte la documentación de Microsoft Windows SDK.
Un filtro de sintetizador MIDI o DirectMusic recibe como entrada una secuencia MIDI formada por eventos MIDI con marca de tiempo. El filtro genera una de las siguientes opciones:
Una secuencia de audio digital con formato de onda
Señales de audio analógicas que pueden conducir un conjunto de altavoces
Un filtro de salida MIDI o DirectMusic recibe como entrada una secuencia MIDI formada por eventos MIDI con marca de tiempo. El filtro genera mensajes MIDI sin procesar en un módulo de sonido MIDI externo.
Un filtro de captura MIDI o DirectMusic toma como entrada una serie de mensajes MIDI sin procesar desde un teclado MIDI u otro dispositivo MIDI externo. El filtro genera una secuencia MIDI formada por eventos MIDI con marca de tiempo.
Un solo filtro MIDI o DirectMusic puede realizar una combinación de las tres funciones- síntesis, salida y captura- dependiendo de las funciones del dispositivo que representa el filtro. Por ejemplo, un dispositivo MPU-401 puro realiza la salida y captura, pero no la síntesis.
Un filtro MIDI se implementa como un par de controladores de puerto/minipuerto. Un generador de filtros MIDI crea un filtro MIDI de la siguiente manera:
Crea una instancia de un objeto de controlador midi miniport.
Crea una instancia de un objeto de controlador de puerto MIDI llamando a PcNewPort con el valor GUID CLSID_PortMidi.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de miniporte al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de sus interfaces IPortMidi e IMiniportMidi .
Para admitir dispositivos de salida MIDI y sintetizador, el controlador de puerto MIDI contiene un secuenciador de software que genera mensajes MIDI sin procesar al controlador de minipuerto con una resolución de temporizador de un milisegundo.
Un filtro DirectMusic proporciona un superconjunto de la funcionalidad de un filtro MIDI. El superconjunto incluye estas funcionalidades adicionales:
Recursos DLS (sonido descargable) que contienen datos de forma de onda y de articulación que describen instrumentos MIDI. Una KSPROPERTY_SYNTH_DLS_DOWNLOAD solicitud set-property descarga un recurso DLS en un filtro.
Grupos de canales para expandir el número de instrumentos seleccionables. La estructura DMUS_KERNEL_EVENT , que se usa para empaquetar cada mensaje MIDI con marca de tiempo en una secuencia MIDI, especifica qué grupo de canales se va a usar para ese mensaje.
Marcas de tiempo de 64 bits con resolución de 100 nanosegundos en compatibilidad con la secuenciación MIDI de hardware. La estructura DMUS_KERNEL_EVENT especifica la marca de tiempo de alta resolución para un mensaje MIDI.
Con los grupos de canales, el número de notas que se pueden reproducir simultáneamente ya no se limita a los 16 canales de la especificación MIDI original. Solo está limitado por el número de voces disponibles en el sintetizador.
Un filtro DirectMusic se implementa como un par de controladores de puerto/minipuerto. Un generador de filtros de DirectMusic crea un filtro directMusic de la siguiente manera:
Crea una instancia de un objeto de controlador de minipuerto DMus (DirectMusic).
Crea una instancia de un objeto de controlador de puerto DMus llamando a PcNewPort con el valor GUID CLSID_PortDMus.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de miniporte al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de sus interfaces IPortDMus e IMiniportDMus .
Para admitir dispositivos de sintetizador directMusic, el controlador de puerto DMus contiene un secuenciador de software de baja resolución (un milisegundo) que puede generar eventos MIDI con marca de tiempo en el búfer del secuenciador de hardware de antemano cuando estén programados para reproducirse. Para admitir dispositivos de salida directMusic, el secuenciador de software del controlador de puerto también se puede configurar para generar mensajes MIDI sin procesar en las ocasiones en que se reproducirán.
Al enumerar dispositivos de entrada o salida MIDI a través de las funciones MidiInXxx o midiOutXxx de Windows, una aplicación solo puede ver dispositivos WDM cuyos controladores de minipuerto exponen patillas MIDI. Estos son pines que administran secuencias MIDI sin procesar, pero carecen de compatibilidad con características avanzadas, como DLS y grupos de canales. Sin embargo, al enumerar dispositivos a través de DirectMusic, una aplicación puede ver dispositivos WDM con patillas MIDI y pins de DirectMusic. Los pins de DirectMusic administran secuencias MIDI con marca de tiempo y admiten DLS y grupos de canales.
Al implementar un controlador de minipuerto personalizado, un proveedor de hardware normalmente escribe un controlador de miniporte MIDI o un controlador de miniporte DMus, pero no ambos. Un controlador de minipuerto MIDI solo puede exponer patillas MIDI. Sin embargo, un controlador DMus miniport puede exponer los pins MIDI y DirectMusic, lo que elimina la necesidad de escribir un controlador de minipuerto MIDI independiente. Para obtener un ejemplo de un pin MIDI en un filtro DirectMusic, consulta el controlador de audio de ejemplo Dmusuart en el Kit de controladores de Windows (WDK).
Al especificar un intervalo de datos para un pin MIDI o DirectMusic, un controlador de miniporte MIDI o DMus especifica un formato principal de tipo KSDATAFORMAT_TYPE_MUSIC y un subformato de tipo KSDATARANGE_SUBTYPE_MIDI para un pin MIDI o KSDATARANGE_SUBTYPE_DIRECTMUSIC para un pin de DirectMusic. Algunos ejemplos de descriptores de rango de datos para pins MIDI y DirectMusic aparecen en midi Stream Data Range y DirectMusic Stream Data Range, respectivamente.
Una instancia de patilla MIDI en un filtro MIDI expone una interfaz IMiniportMidiStream . Una instancia de pin MIDI o DirectMusic en un filtro directMusic expone una interfaz IMXF .
En Windows Me/98, DirectMusic a veces enumera el mismo dispositivo MPU-401 dos veces. La razón es que algunos proveedores de hardware exponen sus dispositivos MPU-401 como dispositivos MIDI heredados, pre-WDM y como dispositivos WDM. Para el dispositivo heredado, DirectMusic enumera un dispositivo MPU-401 que representa la ruta de acceso directa de DMusic.dll a Ihvaudio.dll. Para el dispositivo WDM, DirectMusic enumera el mismo dispositivo MPU-401 a través de una ruta de acceso circuitous que consta de la siguiente secuencia de componentes:
DMusic.dll
DMusic16.dll
MMSystem.dll
WDMAud.drv
WDMAud.sys
Controlador de minipuerto del proveedor
El sintetizador MIDI que aparece en el panel de control multimedia de Windows (Mmsys.cpl) tendrá el mismo nombre que el dispositivo WDM.
Varios controladores MIDI y DMus miniport proporcionados por el sistema están integrados en el controlador del sistema PortCls:
El controlador de miniporte FMSynth proporciona una interfaz a un dispositivo MIDI que implementa la síntesis FM de estilo OPL3.
El controlador de miniporte UART admite un dispositivo MIDI con una interfaz de hardware MPU-401, pero este controlador ahora está obsoleto (después de Windows 98 Gold) y solo se admite para controladores de adaptador existentes. En su lugar, el nuevo código del controlador de controlador de adaptador debe usar el controlador de miniporte DMusUART (en Windows 98 SE y Windows Me, y en Windows 2000 y versiones posteriores), que sustituye a UART e implementa un superconjunto de su funcionalidad.
Los controladores de adaptador pueden acceder a los controladores de minipuerto proporcionados por el sistema llamando a la función PcNewMiniport . Los controladores de miniporte FMSynth y DMusUART también se incluyen como controladores de audio de ejemplo en el Kit de controladores de Windows (WDK). Al modificar el código fuente de estos ejemplos, los proveedores de hardware pueden ampliar los controladores para administrar las características propietarias de sus dispositivos.
DMusUART es un ejemplo de un controlador de miniporte DMus que expone pins MIDI y DirectMusic, pero no admite descargas DLS o secuenciación de hardware. El pin de representación de DirectMusic del controlador de miniporte tiene un nodo de sintetizador (KSNODETYPE_SYNTHESIZER) que admite varias propiedades de KSPROPSETID_Synth . El controlador de minipuerto se incluye en categorías KSCATEGORY_RENDER y KSCATEGORY_CAPTURE, pero no en KSCATEGORY_SYNTHESIZER (porque no contiene un sintetizador interno). Para obtener más información, consulte el controlador de audio de ejemplo DMusUART en WDK.
Tenga en cuenta que en Windows XP y versiones posteriores, los controladores de puerto MIDI y DMus usan la misma implementación de software interna. Esto significa que los GUID de CLSID_PortMidi y CLSID_PortDMus son equivalentes al llamar a PcNewPort. Las aplicaciones escritas para versiones anteriores de Windows no deberían ver ningún cambio en el comportamiento resultante de la consolidación de los controladores de puerto MIDI y DMus.