ФИЛЬТРЫ MIDI и DirectMusic

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

Фильтр синтезатора 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 Creation показан этот процесс. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortMidi и IMiniportMidi .

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

Фильтр DirectMusic

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

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

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

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

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

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

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

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

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

В примере кода в Subdevice Creation показан этот процесс. Драйверы портов и минипортов взаимодействуют друг с другом через интерфейсы IPortDMus и IMiniportDMus .

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

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

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

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

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

Экземпляр пин-кода 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.

драйверы портов и минипортовSystem-Supplied

Несколько драйверов минипортов MIDI и DMus, поставляемых с системой, встроены в системный драйвер PortCls.

  • Драйвер минипорта 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.