Componenti MIDI e DirectMusic

I programmi dell'applicazione si basano su una combinazione di componenti in modalità utente e kernel per acquisire e riprodurre i flussi MIDI e DirectMusic.

Un'applicazione può usare una delle interfacce software seguenti per la riproduzione e l'acquisizione MIDI:

  • Funzioni MidiOutxxx e midiInXxx di Microsoft Windows Multimedia

  • DirectMusic API

Il comportamento delle funzioni midiOutXxx e midiInXxx si basa sulle funzionalità dei driver e dei dispositivi MIDI legacy. A partire da Windows 98, il driver di sistema WDMAud converte le chiamate a queste funzioni in comandi ai driver audio WDM. Tuttavia, simulando il comportamento di software e hardware meno recenti, le funzioni midiOutXxx e midiInXxx sacrificano la precisione e le funzionalità avanzate ora disponibili tramite l'API DirectMusic. Per altre informazioni sulle funzioni DirectMusic e Windows Multimedia MIDI, vedere la documentazione di Microsoft Windows SDK.

DirectMusic e le funzioni MIDI multimediali di Windows sono client del driver di sistema SysAudio, che compila i grafici dei filtri audio che elaborano i flussi MIDI e DirectMusic. La compilazione di Graph è trasparente per le applicazioni che usano queste interfacce software.

Componenti MIDI

La figura seguente illustra i componenti in modalità utente e in modalità kernel usati da un'applicazione MIDI per riprodurre i dati MIDI. Questa applicazione si interfaccia ai driver audio WDM tramite le funzioni midiOutXxx , implementate nel componente di sistema WinMM, Winmm.dll.

Diagramma che illustra i componenti in modalità utente e in modalità kernel di riproduzione MIDI.

L'applicazione MIDI nella figura precedente legge gli eventi MIDI con timestamp da un file MIDI e li riproduce. I driver miniport MIDI e DMus vengono visualizzati come caselle oscurate per indicare che possono essere componenti forniti dal fornitore. Se appropriato, un fornitore potrebbe scegliere di usare uno dei driver miniport forniti dal sistema--FMSynth, UART o DMusUART-anziché scrivere un driver miniport personalizzato. Tutti gli altri componenti della figura sono forniti dal sistema.

Il ciclo principale di un'applicazione di riproduzione MIDI tipico chiama timeSetEvent per pianificare l'evento note-on o note-off successivo. Questa chiamata accetta come uno dei relativi parametri un puntatore di funzione alla routine di callback dell'applicazione. Quando si verifica l'evento e il sistema operativo chiama la routine di callback, questa routine chiama midiOutShortMsg per attivare o disattivare una o più note pianificate. La funzione midiOutShortMsg archivia i messaggi MIDI nei buffer di dati bloccati dalla pagina per eliminare la necessità di pagina in questa memoria durante una chiamata. Per altre informazioni sulle chiamate timeSetEvent e midiOutShortMsg, vedere la documentazione di Microsoft Windows SDK.

WDMAud, costituito sia da componenti in modalità utente che da kernel (Wdmaud.drv e Wdmaud.sys), registra i tempi in cui arrivano i messaggi MIDI non elaborati dalle chiamate midiOutShortMsg . WDMAud combina questi timestamp con i messaggi MIDI per generare il flusso MIDI che invia a uno dei componenti in modalità kernel che appaiono sotto WDMAud nella figura.

Quando si compila il grafico del filtro audio per l'applicazione MIDI, SysAudio seleziona solo una delle tre possibili connessioni, ad SWMidi, alla porta MIDI o al driver di porta DMus, che vengono visualizzate nella figura precedente. Se l'applicazione seleziona il dispositivo MIDI predefinito, SysAudio cerca innanzitutto un dispositivo sintetizzatore il cui driver MIDI o DMus miniport ha un pin MIDI. Se non trova alcun dispositivo nel Registro di sistema, SysAudio userà invece il driver di sistema SWMidi (Swmidi.sys). SWMidi è un filtro KS che implementa un synth wavetable nel software e richiede solo un dispositivo che può eseguire il rendering di un flusso audio di onda.

SWMidi combina tutte le voci per produrre un singolo flusso PCM a onda singola, che restituisce il driver di sistema KMixer. KMixer, a sua volta, passa un flusso di onda formattato PCM a un dispositivo WaveCyclic o WavePci, i cui driver porta e miniport appaiono nell'angolo inferiore sinistro della figura. In alternativa, KMixer può passare il flusso di output a un dispositivo audio USB controllato dal driver di sistema della classe USBAudio (non illustrato nella figura).

Nella figura precedente, il driver porta MIDI accetta il flusso MIDI con timestamp da WDMAud e lo converte in messaggi MIDI non elaborati, che il driver miniport MIDI gioca attraverso il dispositivo di sintetizzatore. Il driver della porta MIDI contiene un sequencer, implementato nel software ed è in grado di pianificare i messaggi MIDI non elaborati con una risoluzione timer di un millisecondo.

Il driver di porta DMus è in grado di ottenere un'accuratezza di intervallo molto più elevata rispetto al driver di porta MIDI se il dispositivo di sintetizzatore contiene un sequencer hardware. In questo caso, il driver miniport DMus deve specificare un buffer hardware sufficientemente grande per assorbire il jitter risultante dalla concorrenza per il tempo della CPU con le routine del servizio di interruzione e altre operazioni con priorità elevata. I timestamp nel flusso MIDI che il driver di porta DMus restituisce al driver miniport sono valori a 64 bit con risoluzione a 100 nanosecondi.

Se il synth DMusic non ha un sequencer hardware, deve basarsi sul software sequencer del driver della porta DMus, che, come il driver della porta MIDI, ha una risoluzione timer di un millisecondo.

Un driver di adattatore crea rispettivamente un driver di porta MIDI o DMus chiamando PcNewPort con un valore GUID di CLSID_PortMidi o CLSID_PortDMus. In Windows XP e versioni successive i driver di porta MIDI e DMus condividono la stessa implementazione software.

Nella parte inferiore della figura precedente vengono visualizzati i nomi dei driver miniport forniti dal sistema FMSynth, UART e DMusUART, inclusi in Portcls.sys. Un driver di adattatore crea uno di questi driver miniport chiamando PcNewMiniport. FMSynth e UART forniscono interfacce IMiniportMidi e DMusUART offre un'interfaccia IMiniportDMus . Si noti che UART è ora obsoleto (dopo Windows 98 Gold) ed è supportato solo per i driver esistenti. I nuovi driver della scheda devono invece usare DMusUART (in Windows 98 SE e versioni successive e in Windows 2000 e versioni successive), che implementa un superset delle funzionalità di UART. DMusUART è un esempio di driver miniport DMus che supporta né download DLS né sequenziamento hardware. Il codice sorgente per i driver miniport FMSynth e DMusUART è disponibile nei driver audio di esempio in Windows Driver Kit (WDK).

La figura seguente illustra i componenti in modalità utente e in modalità kernel usati da un programma applicazione MIDI per acquisire dati MIDI. Questa applicazione si interfaccia ai driver audio WDM tramite le funzioni midiInXxx .

Diagramma che mostra i componenti in modalità utente e in modalità kernel dell'acquisizione MIDI.

Nella figura precedente, i driver miniport MIDI e DMus vengono visualizzati come caselle oscurate per indicare che possono essere componenti forniti dal fornitore. Se appropriato, un fornitore potrebbe invece scegliere di usare uno dei driver miniport forniti dal sistema, UART o DMusUARTCapture. Tutti gli altri componenti della figura sono forniti dal sistema.

L'origine dei dati MIDI è in genere un dispositivo MPU-401. Chiamando PcNewMiniport, un driver di adattatore può creare uno dei driver miniport forniti dal sistema, UART o DMusUARTCapture, per acquisire dati MIDI da un dispositivo MPU-401. Anche in questo caso, UART è obsoleto e i nuovi driver devono usare DMusUARTCapture (in Windows 98 SE e versioni successive e in Windows 2000 e versioni successive).

Ogni volta che si verifica una nota MIDI o un evento not-off, il driver miniport di acquisizione MIDI o DMusic (nella parte inferiore della figura precedente) aggiunge un timestamp al messaggio MIDI prima di aggiungerlo al flusso MIDI che passa al driver di porta MIDI o DMus.

Il driver di acquisizione MIDI o DMusic restituisce un flusso MIDI con timestamp per Wdmaud.sys, la metà del driver di sistema WDMAud. La metà della modalità utente, Wdmaud.drv, restituisce il flusso MIDI timestampato al programma dell'applicazione tramite le funzioni midiInXxx , implementate in Winmm.dll.

L'applicazione MIDI nella parte superiore della figura scrive eventi MIDI con timestamp in un file MIDI. Al momento in cui l'applicazione chiama midiInOpen per aprire il flusso di input MIDI, passa un puntatore di funzione alla routine di callback. Quando si verifica un evento note-on o note-off, il sistema operativo chiama la routine di callback con un blocco di dati che include uno o più messaggi MIDI con timestamp. I timestamp su questi messaggi sono essenzialmente gli stessi generati dal driver miniport MIDI o DMus.

Componenti DirectMusic

La figura seguente illustra i componenti in modalità utente e kernel usati da un programma applicazione DirectMusic per riprodurre o acquisire dati MIDI.

Diagramma che illustra la riproduzione directMusic e acquisisce componenti in modalità utente e in modalità kernel.

I componenti di riproduzione vengono visualizzati nella metà sinistra della figura precedente e i componenti di acquisizione vengono visualizzati a destra. I driver miniport DMus vengono visualizzati come caselle scure per indicare che possono essere componenti forniti dal fornitore. Se appropriato, un fornitore può invece usare uno dei driver miniport forniti dal sistema, DMusUART o DMusUARTCapture. Gli altri componenti della figura sono forniti dal sistema.

Nell'angolo superiore sinistro della figura, un'applicazione DirectMusic indirizza un flusso MIDI timestamped da un file al componente di sistema DirectMusic in modalità utente (DMusic.dll), che a sua volta indirizza il flusso a un driver di porta DMus. Questo driver può essere associato al driver miniport per un dispositivo DirectMusic synth o MPU-401, se disponibile. In alternativa, il driver di porta può essere associato al driver di sistema DMusic (Dmusic.sys), che è un driver DMus fornito dal sistema che implementa un synth wavetable compatibile con DLS nel software e che richiede solo un dispositivo che può eseguire il rendering di un flusso audio wave.

Come SWMidi, il driver DMusic, Dmusic.sys, combina tutte le sue voci insieme per produrre un singolo flusso di onda formattato da PCM, che restituisce a KMixer. KMixer, a sua volta, può passare un flusso di onda a un dispositivo wave, i cui driver porta e miniport appaiono nell'angolo inferiore sinistro della figura o a un dispositivo audio USB controllato dal driver di sistema USBAudio, che non appare nella figura.

I componenti di acquisizione DirectMusic vengono visualizzati nella metà destra della figura precedente. Il driver miniport di acquisizione DMusic nell'angolo inferiore destro della figura controlla l'hardware di acquisizione e i timestamp ogni messaggio MIDI che registra. Il driver di porta DMus indirizza il flusso MIDI con timestamp al componente DirectMusic in modalità utente, DMusic.dll. L'applicazione accede a questo flusso tramite l'API DirectMusic e scrive i dati MIDI con timestamp in un file.

Un driver di adattatore può usare il driver DMusUARTCapture fornito dal sistema per controllare un dispositivo di acquisizione MPU-401. Il driver della scheda crea questo driver miniport chiamando PcNewMiniport con il valore GUID CLSID_DMusUARTCapture. L'oggetto driver miniport risultante supporta un'interfaccia IMiniportDMus . Il codice sorgente per il driver miniport DMusUARTCapture è disponibile nei driver audio di esempio in Windows Driver Kit (WDK).

Un'applicazione DirectMusic può anche essere eseguita tramite un dispositivo midiOutXxx , ad esempio SWMidi (Swmidi.sys) se sceglie di. Per semplicità, questo percorso viene omesso dalla figura precedente. Il driver DMusic (Dmusic.sys) richiede un download DLS iniziale per funzionare correttamente; usando SWMidi evita questo requisito.