Поделиться через


Фильтры MIDI и DirectMusic

Фильтры MIDI и DirectMusic представляют устройства, которые синтезировать, выводить или записывать музыкальные данные MIDI. Приложения обычно получают доступ к возможностям этих устройств через API DirectMusic или функции Microsoft Windows Multimedia midiOutXxx и midiInXxx . Дополнительные сведения об этих интерфейсах см. в документации по Microsoft Windows SDK.

Фильтр синтезатора MIDI или DirectMusic получает в качестве входных данных поток MIDI, состоящий из событий MIDI с метками времени. Фильтр выводит одно из следующих результатов:

  • Цифровой аудиопоток в волновом формате

  • Аналоговые звуковые сигналы, которые могут управлять набором динамиков

Фильтр вывода MIDI или DirectMusic получает в качестве входных данных поток MIDI, состоящий из событий MIDI с метками времени. Фильтр выводит необработанные сообщения MIDI во внешний звуковой модуль MIDI.

Фильтр записи MIDI или DirectMusic принимает в качестве входных данных ряд необработанных сообщений MIDI с клавиатуры MIDI или другого внешнего устройства MIDI. Фильтр выводит поток MIDI, состоящий из событий MIDI с метками времени.

Один фильтр MIDI или DirectMusic может выполнять сочетание трех функций — синтеза, вывода и записи — в зависимости от возможностей устройства, которое представляет фильтр. Например, чистое устройство MPU-401 выполняет вывод и запись, но не синтез.

Фильтр MIDI

Фильтр MIDI реализуется как пара драйверов порт/минипорт. Фабрика фильтров MIDI создает фильтр MIDI следующим образом:

  • Он создает экземпляр объекта драйвера мини-порта MIDI.

  • Он создает экземпляр объекта драйвера порта MIDI, вызывая PcNewPort со значением GUID CLSID_PortMidi.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание subdevice . Водители портов и минипортов взаимодействуют друг с другом через интерфейсы IPortMidi и IMiniportMidi .

Для поддержки устройств вывода MIDI и синтезатора драйвер порта MIDI содержит программный секвенсор, который выводит необработанные сообщения MIDI в драйвер мини-порта с разрешением таймера в одну миллисекунды.

Фильтр DirectMusic

Фильтр DirectMusic предоставляет надмножество функциональных возможностей фильтра MIDI. Супермножество включает следующие дополнительные возможности:

  • Ресурсы DLS (скачиваемый звук), содержащие данные о формах волн и артефактах, описывающие инструменты MIDI. Запрос KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property загружает ресурс DLS в фильтр.

  • Группы каналов для расширения количества выбираемых инструментов. Структура DMUS_KERNEL_EVENT , которая используется для упаковки каждого сообщения MIDI с меткой времени в потоке MIDI, указывает, какую группу каналов следует использовать для этого сообщения.

  • 64-разрядные метки времени с разрешением 100 наносекунд для поддержки аппаратного виртуализации MIDI. Структура DMUS_KERNEL_EVENT задает метку времени с высоким разрешением для сообщения MIDI.

При использовании групп каналов количество одновременно воспроизводимых заметок не ограничивается 16 каналами исходной спецификации MIDI. Он ограничен только количеством голосов, доступных в синтезаторе.

Фильтр DirectMusic реализуется в виде пары портов и мини-портов. Фабрика фильтров DirectMusic создает фильтр DirectMusic следующим образом:

  • Он создает экземпляр объекта драйвера мини-порта DMus (DirectMusic).

  • Он создает экземпляр объекта драйвера порта DMus, вызывая PcNewPort со значением GUID CLSID_PortDMus.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание subdevice . Водители портов и минипортов взаимодействуют друг с другом через интерфейсы IPortDMus и IMiniportDMus .

Для поддержки устройств синтезатора DirectMus драйвер порта DMus содержит программный секвенсор с низким разрешением (одна миллисекунда), который может выводить события MIDI с метками времени в буфер аппаратного секвенсора заранее, когда они запланированы для воспроизведения. Для поддержки устройств вывода DirectMusic программный секвенсор драйвера порта также можно настроить для вывода необработанных сообщений MIDI во время их воспроизведения.

Перечисление устройств MIDI и DirectMusic

При перечислении устройств ввода или вывода MIDI с помощью функций Windows Multimedia midiInXxx или midiOutXxx приложение может видеть только устройства WDM, драйверы минипорта которых предоставляют контакты MIDI. Это контакты, которые управляют необработанными потоками MIDI, но не поддерживают расширенные функции, такие как DLS и группы каналов. Однако при перечислении устройств с помощью DirectMusic приложение может видеть устройства WDM как с контактами MIDI, так и с контактами DirectMusic. Контакты DirectMusic управляют потоками MIDI с метками времени и поддерживают DLS и группы каналов.

При реализации пользовательского драйвера минипорта поставщик оборудования обычно записывает драйвер miniport MIDI или драйвер мини-порта DMus, но не оба. Драйвер midi miniport может предоставлять только контакты MIDI. Однако драйвер DMus miniport может предоставлять как midi, так и directMusic pins, что избавляет от необходимости писать отдельный драйвер midi miniport. Пример pin-кода MIDI в фильтре DirectMusic см. в разделе Пример звукового драйвера Dmusuart в комплекте драйверов Windows (WDK).

При указании диапазона данных для контакта MIDI или DirectMus драйвер мини-порта MIDI или DMus задает основной формат типа KSDATAFORMAT_TYPE_MUSIC и подчиненный формат типа KSDATARANGE_SUBTYPE_MIDI для контакта MIDI или KSDATARANGE_SUBTYPE_DIRECTMUSIC для контакта DirectMusic. Примеры дескрипторов диапазона данных для контактов MIDI и DirectMusic отображаются в диапазоне данных MIDI Stream и диапазоне данных DirectMusic Stream соответственно.

Экземпляр закрепления MIDI в фильтре MIDI предоставляет интерфейс IMiniportMidiStream . Экземпляр закрепления MIDI или DirectMusic в фильтре DirectMusic предоставляет интерфейс IMXF .

В Windows Me/98 DirectMusic иногда дважды перечисляет одно и то же устройство MPU-401. Причина заключается в том, что некоторые поставщики оборудования предоставляют свои устройства MPU-401 как устаревшие устройства MIDI до WDM и как устройства WDM. Для устаревшего устройства DirectMusic перечисляет устройство MPU-401, представляющее прямой путь от DMusic.dll к Ihvaudio.dll. Для устройства WDM DirectMusic перечисляет одно и то же устройство MPU-401 по каналу, состоящему из следующей последовательности компонентов:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. Драйвер минипорта поставщика

Синтезатор MIDI, который отображается на панели управления мультимедиа Windows (Mmsys.cpl), будет иметь то же имя, что и устройство WDM.

Системные драйверы портов и минипортов

В системный драйвер PortCls встроено несколько системных драйверов MIDI и DMus miniport:

  • Драйвер мини-порта FMSynth предоставляет интерфейс для устройства MIDI, которое реализует синтез FM в стиле OPL3.

  • Драйвер мини-порта UART поддерживает устройство MIDI с аппаратным интерфейсом MPU-401, но теперь этот драйвер устарел (после Windows 98 Gold) и поддерживается только для существующих драйверов адаптера. Новый код драйвера адаптера должен вместо этого использовать драйвер мини-порта DMusUART (в Windows 98 SE и Windows Me, а также в Windows 2000 и более поздних версиях), который заменяет UART и реализует надмножество его функций.

Драйверы адаптера могут получить доступ к системным драйверам минипорта, вызвав функцию PcNewMiniport . Драйверы мини-порта FMSynth и DMusUART также включены в комплект драйверов Windows (WDK) в качестве примеров аудиодрайверов. Изменяя исходный код в этих примерах, поставщики оборудования могут расширить возможности драйверов для управления собственными функциями своих устройств.

DMusUART — это пример драйвера мини-порта DMus, который предоставляет контакты MIDI и DirectMusic, но не поддерживает загрузки DLS или виртуализацию оборудования. Контакт отрисовки DirectMusic драйвера мини-порта имеет узел синтезатора (KSNODETYPE_SYNTHESIZER), который поддерживает несколько свойств KSPROPSETID_Synth . Драйвер минипорта включает себя в категории KSCATEGORY_RENDER и KSCATEGORY_CAPTURE, но не в KSCATEGORY_SYNTHESIZER (поскольку он не содержит внутреннего синтезатора). Дополнительные сведения см. в примере звукового драйвера DMusUART в WDK.

Обратите внимание, что в Windows XP и более поздних версиях драйверы портов MIDI и DMus используют одну и ту же внутреннюю реализацию программного обеспечения. Это означает, что идентификаторы GUID CLSID_PortMidi и CLSID_PortDMus эквивалентны при вызове PcNewPort. Приложения, написанные для предыдущих версий Windows, не должны видеть никаких изменений в поведении в результате консолидации драйверов портов MIDI и DMus.