Filtros MIDI e DirectMusic

Os filtros MIDI e DirectMusic representam dispositivos que sintetizam, geram ou capturam dados de música MIDI. Os aplicativos normalmente acessam os recursos desses dispositivos por meio da API DirectMusic ou por meio das funções MidiOutXxx e midiInXxx do Microsoft Windows. Para obter mais informações sobre essas interfaces, consulte a documentação do SDK do Microsoft Windows.

Um filtro sintetizador MIDI ou DirectMusic recebe como entrada um fluxo MIDI que consiste em eventos MIDI com carimbo de data/hora. O filtro gera uma das seguintes saídas:

  • Um fluxo de áudio digital formatado em onda

  • Sinais de áudio analógicos que podem conduzir um conjunto de alto-falantes

Um filtro de saída MIDI ou DirectMusic recebe como entrada um fluxo MIDI que consiste em eventos MIDI com carimbo de data/hora. O filtro gera mensagens MIDI brutas para um módulo de som MIDI externo.

Um filtro de captura MIDI ou DirectMusic usa como entrada uma série de mensagens MIDI brutas de um teclado MIDI ou outro dispositivo MIDI externo. O filtro gera um fluxo MIDI que consiste em eventos MIDI com carimbo de data/hora.

Um único filtro MIDI ou DirectMusic pode executar uma combinação das três funções: síntese, saída e captura, dependendo dos recursos do dispositivo que o filtro representa. Por exemplo, um dispositivo MPU-401 puro executa a saída e a captura, mas não a síntese.

Filtro MIDI

Um filtro MIDI é implementado como um par de driver de porta/miniport. Uma fábrica de filtros MIDI cria um filtro MIDI da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporto MIDI.

  • Ele cria uma instância de um objeto de driver de porta MIDI chamando PcNewPort com o valor guid CLSID_PortMidi.

  • Ele chama o método IPort::Init do driver de porta para associar o driver de miniporto ao driver de porta.

O exemplo de código na Criação de Subdispositivos ilustra esse processo. Os drivers de porta e de miniporto se comunicam entre si por meio de suas interfaces IPortMidi e IMiniportMidi .

Para dar suporte a dispositivos de saída MIDI e sintetizador, o driver de porta MIDI contém um sequenciador de software que gera mensagens MIDI brutas para o driver de miniporto com uma resolução de temporizador de um milissegundo.

Filtro DirectMusic

Um filtro DirectMusic fornece um superconjunto da funcionalidade de um filtro MIDI. O superconjunto inclui estes recursos adicionais:

  • Recursos DLS (som baixável) que contêm dados de forma de onda e articulação que descrevem instrumentos MIDI. Uma solicitação KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property baixa um recurso DLS em um filtro.

  • Grupos de canais para expandir o número de instrumentos selecionáveis. A estrutura DMUS_KERNEL_EVENT , que é usada para empacotar cada mensagem MIDI com carimbo de data/hora em um fluxo MIDI, especifica qual grupo de canais usar para essa mensagem.

  • Carimbos de data/hora de 64 bits com resolução de 100 nanossegundos em suporte ao sequenciamento MIDI de hardware. A estrutura DMUS_KERNEL_EVENT especifica o carimbo de data/hora de alta resolução para uma mensagem MIDI.

Com grupos de canais, o número de anotações que podem ser reproduzidas simultaneamente não está mais limitado aos 16 canais da especificação MIDI original. Ele é limitado apenas pelo número de vozes disponíveis no sintetizador.

Um filtro DirectMusic é implementado como um par de driver de porta/miniport. Uma fábrica de filtros DirectMusic cria um filtro DirectMusic da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporte DMus (DirectMusic).

  • Ele cria uma instância de um objeto de driver de porta DMus chamando PcNewPort com o valor guid CLSID_PortDMus.

  • Ele chama o método IPort::Init do driver de porta para associar o driver de miniporto ao driver de porta.

O exemplo de código na Criação de Subdispositivos ilustra esse processo. Os drivers de porta e de miniporto se comunicam entre si por meio de suas interfaces IPortDMus e IMiniportDMus .

Para dar suporte a dispositivos sintetizadores DirectMusic, o driver de porta DMus contém um sequenciador de software de baixa resolução (um milissegundo) que pode gerar eventos MIDI com carimbo de data/hora para o buffer do sequenciador de hardware antes de quando eles estão programados para serem reproduzidos. Para dar suporte a dispositivos de saída DirectMusic, o sequenciador de software do driver de porta também pode ser configurado para gerar mensagens MIDI brutas nos momentos em que devem ser reproduzidas.

Enumerando dispositivos MIDI e DirectMusic

Ao enumerar dispositivos de entrada ou saída MIDI por meio das funções midiInXxx ou midiOutXxx do Windows Multimídia, um aplicativo pode ver apenas dispositivos WDM cujos drivers de miniporto expõem pinos MIDI. Esses são pinos que gerenciam fluxos MIDI brutos, mas não têm suporte para recursos avançados, como DLS e grupos de canais. No entanto, ao enumerar dispositivos por meio do DirectMusic, um aplicativo pode ver dispositivos WDM com pinos MIDI e pinos DirectMusic. Os pinos do DirectMusic gerenciam fluxos MIDI com carimbo de data/hora e dão suporte a DLS e grupos de canais.

Ao implementar um driver de miniporto personalizado, um fornecedor de hardware normalmente grava um driver de miniporto MIDI ou um driver de miniporto DMus, mas não ambos. Um driver de miniporto MIDI pode expor apenas pinos MIDI. No entanto, um driver de miniporto DMus pode expor pinos MIDI e DirectMusic, o que elimina a necessidade de gravar um miniportor MIDI separado. Para obter um exemplo de um pino MIDI em um filtro DirectMusic, consulte o driver de áudio de exemplo Dmusuart no WDK (Kit de Driver do Windows).

Ao especificar um intervalo de dados para um pino MIDI ou DirectMusic, um driver de miniporto MIDI ou DMus especifica um formato principal do tipo KSDATAFORMAT_TYPE_MUSIC e um subformulário do tipo KSDATARANGE_SUBTYPE_MIDI para um pin MIDI ou KSDATARANGE_SUBTYPE_DIRECTMUSIC para um pino DirectMusic. Exemplos de descritores de intervalo de dados para pinos MIDI e DirectMusic aparecem no Intervalo de Dados de Fluxo MIDI e no Intervalo de Dados de Fluxo DirectMusic, respectivamente.

Uma instância de pino MIDI em um filtro MIDI expõe uma interface IMiniportMidiStream . Uma instância de pino MIDI ou DirectMusic em um filtro DirectMusic expõe uma interface IMXF .

No Windows Me/98, o DirectMusic às vezes enumera o mesmo dispositivo MPU-401 duas vezes. O motivo é que alguns fornecedores de hardware expõem seus dispositivos MPU-401 como dispositivos MIDI herdados, pré-WDM e como dispositivos WDM. Para o dispositivo herdado, o DirectMusic enumera um dispositivo MPU-401 que representa o caminho direto de DMusic.dll para Ihvaudio.dll. Para o dispositivo WDM, o DirectMusic enumera o mesmo dispositivo MPU-401 por meio de um caminho tortuoso que consiste na seguinte sequência de componentes:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. O driver de miniporto do fornecedor

O sintetizador MIDI que aparece no painel de controle multimídia do Windows (Mmsys.cpl) terá o mesmo nome que o dispositivo WDM.

Drivers de porta e miniportores fornecidos pelo sistema

Vários drivers de miniporte MIDI e DMus fornecidos pelo sistema são integrados ao driver do sistema PortCls:

  • O driver de miniporto FMSynth fornece uma interface para um dispositivo MIDI que implementa a síntese FM no estilo OPL3.

  • O driver de miniporto UART dá suporte a um dispositivo MIDI com uma interface de hardware MPU-401, mas esse driver agora está obsoleto (após o Windows 98 Gold) e tem suporte apenas para drivers de adaptador existentes. Em vez disso, o novo código do driver do adaptador deve usar o driver de miniporto DMusUART (no Windows 98 SE e no Windows Me e no Windows 2000 e posterior), que substitui o UART e implementa um superconjunto de sua funcionalidade.

Os drivers do adaptador podem acessar os drivers de miniporto fornecidos pelo sistema chamando a função PcNewMiniport . Os drivers de miniporte FMSynth e DMusUART também são incluídos como drivers de áudio de exemplo no WDK (Windows Driver Kit). Ao modificar o código-fonte nesses exemplos, os fornecedores de hardware podem estender os drivers para gerenciar os recursos proprietários de seus dispositivos.

DMusUART é um exemplo de um driver de miniporto DMus que expõe os pinos MIDI e DirectMusic, mas não dá suporte a downloads de DLS ou sequenciamento de hardware. O pino de renderização DirectMusic do driver de miniport tem um nó de sintetizador (KSNODETYPE_SYNTHESIZER) que dá suporte a várias propriedades KSPROPSETID_Synth . O driver de miniporte inclui-se em categorias KSCATEGORY_RENDER e KSCATEGORY_CAPTURE, mas não em KSCATEGORY_SYNTHESIZER (porque ele não contém um sintetizador interno). Para obter detalhes, consulte o driver de áudio de exemplo DMusUART no WDK.

Observe que, no Windows XP e posterior, os drivers de porta MIDI e DMus usam a mesma implementação de software interno. Isso significa que os GUIDs de CLSID_PortMidi e CLSID_PortDMus são equivalentes ao chamar PcNewPort. Os aplicativos gravados para versões anteriores do Windows não devem ver nenhuma alteração no comportamento resultante da consolidação dos drivers de porta MIDI e DMus.