Filtri MIDI e DirectMusic

I filtri MIDI e DirectMusic rappresentano i dispositivi che sintetizzano, output o acquisiscino dati musicali MIDI. Le applicazioni accedono in genere alle funzionalità di questi dispositivi tramite l'API DirectMusic o tramite le funzioni midiOutXxx emidiInXxx di Microsoft Windows Multimedia. Per altre informazioni su queste interfacce, vedere la documentazione di Microsoft Windows SDK.

Un filtro di sintetizzatore MIDI o DirectMusic riceve come input un flusso MIDI costituito da eventi MIDI con timestamp. Il filtro restituisce uno dei seguenti elementi:

  • Flusso audio digitale con formattazione onda

  • Segnali audio analogici che possono guidare un set di altoparlanti

Un filtro di output MIDI o DirectMusic riceve come input un flusso MIDI costituito da eventi MIDI con timestamp. Il filtro restituisce messaggi MIDI non elaborati in un modulo audio MIDI esterno.

Un filtro di acquisizione MIDI o DirectMusic accetta come input una serie di messaggi MIDI non elaborati da una tastiera MIDI o da un altro dispositivo MIDI esterno. Il filtro restituisce un flusso MIDI costituito da eventi MIDI con timestamp.

Un singolo filtro MIDI o DirectMusic può eseguire una combinazione delle tre funzioni, dell'output e dell'acquisizione, a seconda delle funzionalità del dispositivo rappresentato dal filtro. Ad esempio, un dispositivo MPU-401 puro esegue l'output e l'acquisizione, ma non la sintesi.

Filtro MIDI

Un filtro MIDI viene implementato come coppia di driver porta/miniport. Una fabbrica di filtri MIDI crea un filtro MIDI come indicato di seguito:

  • Crea un'istanza di un oggetto miniport MIDI.

  • Crea un'istanza di un oggetto driver di porta MIDI chiamando PcNewPort con il valore GUID CLSID_PortMidi.

  • Chiama il metodo IPort::Init del driver di porta per associare il driver miniport al driver della porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver porta e miniport comunicano tra loro tramite le loro interfacce IPortMidi e IMiniportMidi.

Per supportare i dispositivi di output MIDI e sintetizzatore, il driver della porta MIDI contiene un sequencer software che restituisce messaggi MIDI non elaborati al driver miniport con una risoluzione timer di un millisecondo.

Filtro DirectMusic

Un filtro DirectMusic fornisce un superset delle funzionalità di un filtro MIDI. Il superset include queste funzionalità aggiuntive:

  • Risorse DLS (audio scaricabili) che contengono dati waveform e di articolazione che descrivono gli strumenti MIDI. Una richiesta di KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property scarica una risorsa DLS in un filtro.

  • Gruppi di canali per espandere il numero di strumenti selezionabili. La struttura DMUS_KERNEL_EVENT , utilizzata per creare un pacchetto ogni messaggio MIDI con timestamp in un flusso MIDI, specifica il gruppo di canali da usare per tale messaggio.

  • Timestamp a 64 bit con risoluzione a 100 nanosecondi in supporto della sequenza MIDI hardware. La struttura DMUS_KERNEL_EVENT specifica il timestamp ad alta risoluzione per un messaggio MIDI.

Con i gruppi di canali, il numero di note che possono essere riprodotte simultaneamente non è più limitato ai 16 canali della specifica MIDI originale. È limitato solo dal numero di voci disponibili nel sintetizzatore.

Un filtro DirectMusic viene implementato come coppia di driver porta/miniport. Una factory di filtro DirectMusic crea un filtro DirectMusic come indicato di seguito:

  • Crea un'istanza di un oggetto driver miniport DMus (DirectMusic).

  • Crea un'istanza di un oggetto driver di porta DMus chiamando PcNewPort con il valore GUID CLSID_PortDMus.

  • Chiama il metodo IPort::Init del driver di porta per associare il driver miniport al driver della porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver porta e miniport comunicano tra loro tramite le interfacce IPortDMus e IMiniportDMus.

Per supportare i dispositivi di sintetizzatore DirectMusic, il driver di porta DMus contiene un sequencer software a bassa risoluzione (un millisecondo) che può restituire eventi MIDI con timestamp al buffer del sequencer hardware in anticipo quando vengono pianificati per la esecuzione. Per supportare i dispositivi di output DirectMusic, è anche possibile configurare il software sequencer del driver di porta per l'output di messaggi MIDI non elaborati al momento in cui vengono riprodotti.

Enumerazione di dispositivi MIDI e DirectMusic

Quando enumera i dispositivi di input o output MIDI tramite le funzioni midiInXxx o midiOutXxx di Windows, un'applicazione può visualizzare solo i dispositivi WDM i cui driver miniport espongono pin MIDI. Questi sono pin che gestiscono flussi MIDI non elaborati, ma non supportano funzionalità avanzate, ad esempio DLS e gruppi di canali. Tuttavia, quando enumera i dispositivi tramite DirectMusic, un'applicazione può visualizzare dispositivi WDM con pin MIDI e pin DirectMusic. I pin DirectMusic gestiscono flussi MIDI con timestamp e supportano gruppi di canali e DLS.

Quando si implementa un driver miniport personalizzato, un fornitore hardware scrive in genere un driver miniport MIDI o un driver miniport DMus, ma non entrambi. Un driver miniport MIDI può esporre solo pin MIDI. Tuttavia, un driver miniport DMus può esporre pin MIDI e DirectMusic, che elimina la necessità di scrivere un driver miniport MIDI separato. Per un esempio di pin MIDI su un filtro DirectMusic, vedere il driver audio di esempio Dmusuart in Windows Driver Kit (WDK).

Quando si specifica un intervallo di dati per un pin MIDI o DirectMusic, un driver MIDI o DMus miniport specifica un formato principale di tipo KSDATAFORMAT_TYPE_MUSIC e un sottoformat di tipo KSDATARANGE_SUBTYPE_MIDI per un pin MIDI o KSDATARANGE_SUBTYPE_DIRECTMUSIC per un pin DirectMusic. Esempi di descrittori dell'intervallo di dati per i pin MIDI e DirectMusic vengono visualizzati rispettivamente nell'intervallo di dati di flusso MIDI e nell'intervallo di dati di flusso DirectMusic.

Un'istanza di pin MIDI su un filtro MIDI espone un'interfaccia IMiniportMidiStream . Un'istanza del pin MIDI o DirectMusic in un filtro DirectMusic espone un'interfaccia IMXF .

In Windows Me/98 DirectMusic a volte enumera lo stesso dispositivo MPU-401 due volte. Il motivo è che alcuni fornitori di hardware espongono i dispositivi MPU-401 come dispositivi MIDI legacy, pre-WDM e come dispositivi WDM. Per il dispositivo legacy, DirectMusic enumera un dispositivo MPU-401 che rappresenta il percorso diretto da DMusic.dll a Ihvaudio.dll. Per il dispositivo WDM, DirectMusic enumera lo stesso dispositivo MPU-401 tramite un percorso circuito costituito dalla sequenza seguente di componenti:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. Driver miniport del fornitore

Il sintetizzatore MIDI visualizzato nel pannello di controllo multimediale windows (Mmsys.cpl) avrà lo stesso nome del dispositivo WDM.

Driver porta e miniport forniti dal sistema

Diversi driver miniport MIDI e DMus forniti dal sistema sono integrati nel driver di sistema PortCls:

  • Il driver miniport FMSynth fornisce un'interfaccia a un dispositivo MIDI che implementa la sintesi FM in stile OPL3.

  • Il driver miniport UART supporta un dispositivo MIDI con un'interfaccia hardware MPU-401, ma questo driver è ora obsoleto (dopo Windows 98 Gold) ed è supportato solo per i driver di adattatori esistenti. Il nuovo codice driver della scheda deve invece usare il driver miniport DMusUART (in Windows 98 SE e Windows Me e in Windows Me e in Windows 2000 e versioni successive), che sostituisce UART e implementa un superset della sua funzionalità.

I driver dell'adattatore possono accedere ai driver miniport forniti dal sistema chiamando la funzione PcNewMiniport . I driver miniport FMSynth e DMusUART sono inclusi anche come driver audio di esempio in Windows Driver Kit (WDK). Modificando il codice sorgente in questi esempi, i fornitori di hardware possono estendere i driver per gestire le funzionalità proprietarie dei dispositivi.

DMusUART è un esempio di driver miniport DMus che espone pin MIDI e DirectMusic, ma non supporta download DLS o sequenziamento hardware. Il pin di rendering DirectMusic del driver miniport ha un nodo synth (KSNODETYPE_SYNTHESIZER) che supporta diverse proprietà KSPROPSETID_Synth . Il driver miniport si include in categorie KSCATEGORY_RENDER e KSCATEGORY_CAPTURE, ma non in KSCATEGORY_SYNTHESIZER (perché non contiene un sintetizzatore interno). Per informazioni dettagliate, vedere il driver audio di esempio DMusUART in WDK.

Si noti che in Windows XP e versioni successive i driver di porta MIDI e DMus usano la stessa implementazione software interna. Ciò significa che i GUID CLSID_PortMidi e CLSID_PortDMus sono equivalenti quando si chiama PcNewPort. Le applicazioni scritte per le versioni precedenti di Windows non dovrebbero modificare il comportamento risultante dal consolidamento dei driver di porta MIDI e DMus.