Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los programas de aplicación se basan en una combinación de componentes en modo kernel y usuario para capturar y reproducir secuencias MIDI y DirectMusic.
Una aplicación puede usar cualquiera de las siguientes interfaces de software para la reproducción y captura MIDI:
Funciones midiOutXxx y midiInXxx de Microsoft Windows Multimedia
DirectMusic API
El comportamiento de las funciones midiOutXxx y midiInXxx se basa en las funcionalidades de los controladores y dispositivos MIDI heredados. A partir de Windows 98, el controlador del sistema WDMAud traduce las llamadas a estas funciones en comandos a controladores de audio WDM. Sin embargo, al simular el comportamiento de software y hardware antiguos, las funciones midiOutXxx y midiInXxx sacrifican el tiempo de precisión y la funcionalidad mejorada que ahora están disponibles a través de DirectMusic API. Para obtener más información sobre directMusic y las funciones MIDI multimedia de Windows, consulta la documentación de Microsoft Windows SDK.
Las funciones DirectMusic y Windows Multimedia MIDI son clientes del controlador del sistema SysAudio, que crea los gráficos de filtros de audio que procesan las secuencias MIDI y DirectMusic. La creación de grafos es transparente para las aplicaciones que usan estas interfaces de software.
Componentes MIDI
En la ilustración siguiente se muestran los componentes en modo de usuario y modo kernel que usa una aplicación MIDI para reproducir datos MIDI. Esta aplicación interactúa con los controladores de audio WDM a través de las funciones midiOutXxx , que se implementan en el componente del sistema WinMM, Winmm.dll.
La aplicación MIDI de la figura anterior lee eventos MIDI con marca de tiempo de un archivo MIDI y los reproduce. Los controladores de miniporte MIDI y DMus se muestran como cuadros oscuros para indicar que pueden ser componentes suministrados por el proveedor. Si procede, un proveedor podría optar por usar uno de los controladores de miniporte proporcionados por el sistema--FMSynth, UART o DMusUART--en lugar de escribir un controlador de miniport personalizado. Todos los demás componentes de la figura se suministran por el sistema.
El bucle principal de una aplicación típica de reproducción MIDI llama a timeSetEvent para programar el siguiente evento de nota o apagado. Esta llamada toma como uno de sus parámetros un puntero de función a la rutina de devolución de llamada de la aplicación. Cuando se produce el evento y el sistema operativo llama a la rutina de devolución de llamada, esta rutina llama a midiOutShortMsg para activar o desactivar una o varias notas programadas. La función midiOutShortMsg almacena los mensajes MIDI en búferes de datos bloqueados por páginas para eliminar la necesidad de paginar esta memoria durante una llamada. Para obtener más información sobre las llamadas timeSetEvent y midiOutShortMsg, consulte la documentación de Microsoft Windows SDK.
WDMAud, que consta de componentes en modo de usuario y kernel (Wdmaud.drv y Wdmaud.sys), registra las horas en las que llegan los mensajes MIDI sin procesar de las llamadas midiOutShortMsg . WDMAud combina estas marcas de tiempo con los mensajes MIDI para generar la secuencia MIDI que envía a uno de los componentes del modo kernel que aparecen debajo de WDMAud en la figura.
Al compilar el gráfico de filtros de audio para la aplicación MIDI, SysAudio selecciona solo una de las tres posibles conexiones - a SWMidi, el puerto MIDI o el controlador de puerto DMus - que aparecen en la ilustración anterior. Si la aplicación selecciona el dispositivo MIDI predeterminado, SysAudio busca primero un dispositivo sintetizador cuyo controlador midi o DMus miniport tiene un pin MIDI. Si no encuentra este dispositivo en el registro, SysAudio usará en su lugar el controlador del sistema SWMidi (Swmidi.sys). SWMidi es un filtro KS que implementa un sintetizador de onda en software y solo requiere un dispositivo que pueda representar una secuencia de audio de onda.
SWMidi combina todas sus voces para producir una secuencia PCM de onda única, que genera al controlador del sistema KMixer. KMixer, a su vez, pasa una secuencia de onda con formato PCM a un dispositivo WaveCíclico o WavePci, cuyo puerto y miniportadores aparecen en la esquina inferior izquierda de la figura. Como alternativa, KMixer puede pasar su flujo de salida a un dispositivo de audio USB controlado por el controlador del sistema de clase USBAudio (no se muestra en la figura).
En la ilustración anterior, el controlador de puerto MIDI toma la secuencia MIDI con marca de tiempo de WDMAud y la convierte en mensajes MIDI sin procesar, que el controlador de miniporte MIDI reproduce a través del dispositivo sintetizador. El controlador de puerto MIDI contiene un secuenciador, que se implementa en software y es capaz de programar los mensajes MIDI sin procesar con una resolución de temporizador de un milisegundo.
El controlador de puerto DMus puede lograr una precisión de tiempo mucho mayor que el controlador de puerto MIDI si el dispositivo sintetizador contiene un secuenciador de hardware. En este caso, el controlador de miniporte DMus debe especificar un búfer de hardware lo suficientemente grande como para absorber el vibración resultante de la competencia para el tiempo de CPU con ISR (rutinas de servicio de interrupción) y otras operaciones de prioridad alta. Las marcas de tiempo en la secuencia MIDI que el controlador de puerto DMus genera en el controlador de miniporte son valores de 64 bits con resolución de 100 nanosegundos.
Si la synth DMusic no tiene un secuenciador de hardware, debe confiar en el secuenciador de software del controlador de puerto DMus, que, al igual que el controlador de puerto MIDI, tiene una resolución de temporizador de un milisegundo.
Un controlador de adaptador crea un controlador de puerto MIDI o DMus llamando a PcNewPort con un valor GUID de CLSID_PortMidi o CLSID_PortDMus, respectivamente. En Windows XP y versiones posteriores, los controladores de puerto MIDI y DMus comparten la misma implementación de software.
Aparecen en la parte inferior de la ilustración anterior los nombres de los controladores de miniporte proporcionados por el sistema FMSynth, UART y DMusUART, que se incluyen en Portcls.sys. Un controlador de adaptador crea uno de estos controladores de minipuerto llamando a PcNewMiniport. FMSynth y UART proporcionan interfaces IMiniportMidi y DMusUART proporciona una interfaz IMiniportDMus . Tenga en cuenta que UART ahora está obsoleto (después de Windows 98 Gold) y solo se admite para controladores existentes. En su lugar, los nuevos controladores de adaptador deben usar DMusUART (en Windows 98 SE y versiones posteriores, y en Windows 2000 y versiones posteriores), que implementa un superconjunto de la funcionalidad de UART. DMusUART es un ejemplo de un controlador DMus miniport que no admite descargas DLS ni secuenciación de hardware. El código fuente de los controladores de miniporte FMSynth y DMusUART está disponible en los controladores de audio de ejemplo en el Kit de controladores de Windows (WDK).
En la ilustración siguiente se muestran los componentes en modo de usuario y modo kernel que usa un programa de aplicación MIDI para capturar datos MIDI. Esta aplicación interactúa con los controladores de audio WDM a través de las funciones midiInXxx .
En la ilustración anterior, los controladores de miniporte MIDI y DMus se muestran como cuadros oscuros para indicar que pueden ser componentes proporcionados por el proveedor. Si procede, un proveedor podría optar por usar uno de los controladores de miniporte suministrados por el sistema, UART o DMusUARTCapture. Todos los demás componentes de la figura se suministran por el sistema.
El origen de los datos MIDI suele ser un dispositivo MPU-401. Al llamar a PcNewMiniport, un controlador de adaptador puede crear uno de los controladores de miniporte suministrados por el sistema, UART o DMusUARTCapture, para capturar datos MIDI de un dispositivo MPU-401. De nuevo, UART está obsoleto y los nuevos controladores deben usar DMusUARTCapture (en Windows 98 SE y versiones posteriores, y en Windows 2000 y versiones posteriores).
Cada vez que se produce un evento midi note-on o note-off, el controlador de miniporte midi o DMusic (en la parte inferior de la figura anterior) agrega una marca de tiempo al mensaje MIDI antes de agregarlo a la secuencia MIDI que fluye al controlador de puerto MIDI o DMus.
El controlador de puerto de captura MIDI o DMusic genera una secuencia MIDI con marca de tiempo para Wdmaud.sys, la mitad del modo kernel del controlador del sistema WDMAud. La mitad del modo de usuario, Wdmaud.drv, genera la secuencia MIDI con marca de tiempo en el programa de aplicación a través de las funciones midiInXxx , que se implementan en Winmm.dll.
La aplicación MIDI en la parte superior de la figura escribe eventos MIDI con marca de tiempo en un archivo MIDI. En el momento en que la aplicación llama a midiInOpen para abrir el flujo de entrada MIDI, pasa un puntero de función a su rutina de devolución de llamada. Cuando se produce un evento note-on o note-off, el sistema operativo llama a la rutina de devolución de llamada con un bloque de datos que incluye uno o varios mensajes MIDI con marca de tiempo. Las marcas de tiempo en estos mensajes son esencialmente las mismas que el controlador de miniporte MIDI o DMus originalmente generado.
Componentes de DirectMusic
En la ilustración siguiente se muestran los componentes de modo kernel y usuario que usa un programa de aplicación directMusic para reproducir o capturar datos MIDI.
Los componentes de reproducción se muestran en la mitad izquierda de la ilustración anterior y los componentes de captura aparecen a la derecha. Los controladores de miniporte DMus se muestran como cuadros oscuros para indicar que pueden ser componentes proporcionados por el proveedor. Si procede, un proveedor puede usar uno de los controladores de minipuerto proporcionados por el sistema, DMusUART o DMusUARTCapture. Los demás componentes de la ilustración se suministran por el sistema.
En la esquina superior izquierda de la figura, una aplicación DirectMusic dirige una secuencia MIDI con marca de tiempo desde un archivo al componente del sistema DirectMusic en modo de usuario (DMusic.dll), que a su vez dirige la secuencia a un controlador de puerto DMus. Este controlador se puede enlazar al controlador de minipuerto para un dispositivo de synth de DirectMusic o MPU-401, si hay alguno disponible. Como alternativa, el controlador de puerto se puede enlazar al controlador del sistema DMusic (Dmusic.sys), que es un controlador de miniporte DMus suministrado por el sistema que implementa un sintetizador de onda compatible con DLS en software y que solo requiere un dispositivo que pueda representar una secuencia de audio de onda.
Al igual que SWMidi, el controlador DMusic, Dmusic.sys, mezcla todas sus voces para producir un único flujo de onda con formato PCM, que genera en KMixer. KMixer, a su vez, puede pasar una secuencia de onda a un dispositivo de onda, cuyos controladores de puerto y minipuerto aparecen en la esquina inferior izquierda de la figura, o a un dispositivo de audio USB controlado por el controlador del sistema USBAudio, que no aparece en la figura.
Los componentes de captura de DirectMusic aparecen en la mitad derecha de la figura anterior. El controlador de miniporte de captura DMusic en la esquina inferior derecha de la figura controla el hardware de captura y las marcas de tiempo cada mensaje MIDI que registra. El controlador de puerto DMus dirige la secuencia MIDI con marca de tiempo al componente DirectMusic en modo de usuario, DMusic.dll. La aplicación accede a esta secuencia a través de directMusic API y escribe los datos MIDI con marca de tiempo en un archivo.
Un controlador de adaptador puede usar el controlador de miniporte DMusUARTCapture proporcionado por el sistema para controlar un dispositivo de captura MPU-401. El controlador del adaptador crea este controlador de minipuerto llamando a PcNewMiniport con el valor GUID CLSID_DMusUARTCapture. El objeto de controlador de miniport resultante admite una interfaz IMiniportDMus . El código fuente del controlador DMusUARTCapture miniport está disponible en los controladores de audio de ejemplo del Kit de controladores de Windows (WDK).
Una aplicación DirectMusic también puede ejecutarse a través de un dispositivo midiOutXxx como SWMidi (Swmidi.sys) si lo elige. Para simplificar, esta ruta de acceso se omite de la ilustración anterior. El controlador DMusic (Dmusic.sys) requiere una descarga de DLS inicial para funcionar correctamente; el uso de SWMidi evita este requisito.