Синтезаторы и волновые поглотители

Подсистема отрисовки состоит из двух частей:

  • Синтезатор, который принимает сообщения MIDI и преобразует их в звуковые образцы волн.

  • Приёмник волновых данных, который обеспечивает конечную точку для образцов волн и помогает синхронизировать выходной сигнал.

По умолчанию приложение DirectMusic использует Microsoft программный синтезатор (dmsynth.dll) в качестве синтезатора и DirectSound в качестве устройства вывода волн.

В DirectX 6.1 и DirectX 7 приложение DirectMusic может переопределить эти значения по умолчанию. Например, приложение может использовать синтезатор Программного обеспечения Майкрософт, но направить выходные данные в файл .wav или реализовать пользовательский синтезатор, который работает с приемником волн по умолчанию. Скорее всего, реализуется последний сценарий, так как приемник волнового сигнала по умолчанию должен хорошо работать для большинства синтезаторов.

В DirectX 8 и более поздних версиях DirectMusic всегда использует встроенный приемник волн для вывода данных из синтезатора в пользовательском режиме, но приложение может переопределить программный синтез по умолчанию. Это означает, что приложение DirectMusic может реализовать пользовательский синтезатор в пользовательском режиме, но синтезатор должен использовать встроенный приемник волны DirectMusic.

На рисунке ниже показано, как архитектура DirectMusic включает синтезаторы в пользовательском режиме и приемники волн. Обратите внимание, что блок с меткой DirectMusic Port на следующем рисунке не следует путать с драйвером порта DMus в режиме ядра в модуле системного драйвера PortCls, portcls.sys. Порт DirectMusic — это объект пользовательского режима с интерфейсом IDirectMusicPort (частью API DirectMusic) и реализован в dmusic.dll. Дополнительные сведения о портах DirectMusic см. в документации по пакету SDK для Microsoft Windows.

Схема, демонстрирующая архитектуру DirectMusic для синтезаторов в пользовательском режиме и приемников волн.

На предыдущем рисунке приложение отправляет данные в порт DirectMusic пользовательского режима, который передает эти данные (MIDI или DLS) программному синтезатору (dmsynth.dll по умолчанию), чтобы преобразовать ноты в звуковые данные. Волновой приемник управляет синхронизацией и передает синтезатору буфер для заполнения, когда он готов принять всплеск данных. Синта заполняет буфер (объект IDirectSoundBuffer по умолчанию) данными, чтобы его можно было передать в DirectSound. DirectSound либо воспроизводит данные через системный драйвер KMixer, либо через контакт DirectSound с аппаратным ускорением на звуковом устройстве, если он доступен (см. Обзор аппаратного ускорения DirectSound).

Эта же базовая архитектура также применяется к реализации режима ядра, за исключением того, что приемник волн передает буфер данных непосредственно к оборудованию или к драйверу системы KMixer. Драйвер порта DMus реализует волновой приемник для программного синтезатора в режиме ядра. Дополнительные сведения см. в статье "Приемник волны" для Kernel-Mode синтезаторов программного обеспечения.

После выполнения этих действий порт DirectMusic в пользовательском режиме должен быть открыт и активирован для использования. Как только этот код драйвера работает, можно начать реализацию функций. Используйте исходный код для синтезатора программного обеспечения в пользовательском режиме в качестве шаблона и приступить к добавлению новых функций.

Синтезатор программного обеспечения в пользовательском режиме можно реализовать как объект с интерфейсом IDirectMusicSynth. Приемник волн в пользовательском режиме можно реализовать как объект с интерфейсом IDirectMusicSynthSink. Дополнительные сведения см. в разделе IDirectMusicSynth и IDirectMusicSynthSink.