Sintetizadores y receptores de onda
El motor de representación tiene dos partes:
El sintetizador, que toma mensajes MIDI y los convierte en muestras de audio de onda.
Receptor de onda, que proporciona un destino para las muestras de onda y ayuda a sincronizar la salida.
De forma predeterminada, una aplicación DirectMusic usa el sintetizador de software de Microsoft (dmsynth.dll) como sintetizador y DirectSound como dispositivo de salida de onda.
En DirectX 6.1 y DirectX 7, una aplicación directMusic puede invalidar estos valores predeterminados. Por ejemplo, la aplicación podría usar el sintetizador de software de Microsoft, pero dirigir la salida a un archivo .wav, o podría implementar un sintetizador personalizado que funcione con el receptor de onda predeterminado. Este último escenario es más probable porque el receptor de onda predeterminado debería funcionar bien para la mayoría de los sintetizadores.
En DirectX 8 y versiones posteriores, DirectMusic siempre usa su receptor de ondas integrado para generar datos de un sintetizador en modo de usuario, pero una aplicación puede invalidar el sintetizador de software predeterminado. Esto significa que una aplicación DirectMusic puede implementar un sintetizador en modo usuario personalizado, pero el sintetizador debe usar el receptor de onda integrado de DirectMusic.
En la ilustración siguiente se muestra cómo la arquitectura de DirectMusic incorpora sintetizadores en modo de usuario y receptores de onda. Tenga en cuenta que el bloque con la etiqueta "Puerto de DirectMusic" en la ilustración siguiente no debe confundirse con el controlador de puerto DMus en modo kernel en el módulo del controlador del sistema PortCls, portcls.sys. Un puerto de DirectMusic es un objeto en modo de usuario con una interfaz IDirectMusicPort (parte de directMusic API) y se implementa en dmusic.dll. Para obtener más información sobre los puertos de DirectMusic, consulte la documentación de Microsoft Windows SDK.
En la ilustración anterior, la aplicación envía datos al puerto directMusic en modo de usuario, que pasa los datos (MIDI o DLS) a la síntesis de software (dmsynth.dll de forma predeterminada) para que pueda representar las notas en datos de onda. El receptor de onda administra el tiempo y entrega el synth un búfer para rellenar cuando está listo para recibir una ráfaga de datos. El sintetizador rellena el búfer (un objeto IDirectSoundBuffer de forma predeterminada) con datos para que se pueda pasar a DirectSound. DirectSound reproduce los datos a través del controlador del sistema KMixer o lo reproduce a través de un pin de representación acelerada por hardware de DirectSound en el dispositivo de audio, si hay alguno disponible (consulte Introducción a la aceleración de hardware de DirectSound).
Esta misma arquitectura básica también se aplica a las implementaciones en modo kernel, con la excepción de que el receptor de onda entrega el búfer de datos directamente al hardware o al controlador del sistema KMixer. El controlador de puerto DMus implementa el receptor de onda para un sintetizador de software en modo kernel. Para obtener más información, vea Un receptor de onda para Kernel-Mode sintetizadores de software.
Una vez completados estos pasos, el puerto directMusic en modo de usuario debe estar abierto y activado para su uso. En cuanto este gran parte del código de controlador funciona, puede empezar a implementar características. Use el código fuente para el sintetizador de software de Microsoft en modo de usuario como plantilla y comience a agregar la nueva funcionalidad.
Un sintetizador de software en modo de usuario se puede implementar como un objeto con una interfaz IDirectMusicSynth. Un receptor de onda en modo de usuario se puede implementar como un objeto con una interfaz IDirectMusicSynthSink. Para obtener más información, consulta IDirectMusicSynth e IDirectMusicSynthSink.