Sintetizzatori e sink wave

Il motore di rendering ha due parti:

  • Il sintetizzatore, che accetta i messaggi MIDI e li converte in campioni audio a onda.

  • Il sink di onda, che fornisce una destinazione per gli esempi di onda e consente di sincronizzare l'output.

Per impostazione predefinita, un'applicazione DirectMusic usa Microsoft Software Synthesizer (dmsynth.dll) come sintetizzatore e DirectSound come dispositivo wave-output.

In DirectX 6.1 e DirectX 7 un'applicazione DirectMusic può eseguire l'override di queste impostazioni predefinite. Ad esempio, l'applicazione potrebbe usare Microsoft Software Synr, ma indirizzare l'output a un file con estensione wav oppure implementare un sintetizzatore personalizzato che funziona con il sink di onda predefinito. Quest'ultimo scenario è più probabile perché il sink di onda predefinito dovrebbe funzionare bene per la maggior parte dei sintetizzatori.

In DirectX 8 e versioni successive DirectMusic usa sempre il sink wave predefinito per restituire i dati da un synth in modalità utente, ma un'applicazione può eseguire l'override del synth software predefinito. Ciò significa che un'applicazione DirectMusic può implementare un sintetizzatore in modalità utente personalizzato, ma il sintetizzatore deve usare il sink predefinito di DirectMusic.

La figura seguente mostra come l'architettura DirectMusic incorpora sintetizzatori in modalità utente e sink a onda. Si noti che il blocco etichettato "DirectMusic Port" nella figura seguente non deve essere confuso con il driver di porta DMus in modalità kernel nel modulo driver di sistema PortCls, portcls.sys. Una porta DirectMusic è un oggetto in modalità utente con un'interfaccia IDirectMusicPort (parte dell'API DirectMusic) e viene implementata in dmusic.dll. Per altre informazioni sulle porte DirectMusic, vedere la documentazione di Microsoft Windows SDK.

Diagramma che illustra l'architettura DirectMusic per i sintetizzatori in modalità utente e i sink wave.

Nella figura precedente l'applicazione invia dati alla porta DirectMusic in modalità utente, che passa i dati (MIDI o DLS) fino al synth software (dmsynth.dll per impostazione predefinita) in modo che possa eseguire il rendering delle note in dati di onda. Il sink di onda gestisce la tempistica e mani il synth di un buffer da riempire quando è pronto per ricevere un burst di dati. Il synth riempie il buffer (un oggetto IDirectSoundBuffer per impostazione predefinita) con dati in modo che possa essere passato a DirectSound. DirectSound riproduce i dati tramite il driver di sistema KMixer o lo riproduce tramite un pin di rendering accelerato dell'hardware DirectSound nel dispositivo audio, se disponibile (vedere Panoramica dell'accelerazione hardware DirectSound).

Questa stessa architettura di base si applica anche alle implementazioni in modalità kernel, ad eccezione del fatto che il sink onda mani il buffer di dati direttamente all'hardware o al driver di sistema KMixer. Il driver di porta DMus implementa il sink di onda per un sintetizzatore software in modalità kernel. Per altre informazioni, vedere Un sink wave per Kernel-Mode sintetizzatori software.

Al termine di questi passaggi, la porta DirectMusic in modalità utente deve essere aperta e attivata per l'uso. Non appena funziona gran parte del codice driver, è possibile iniziare a implementare le funzionalità. Usare il codice sorgente per Microsoft Software Synr in modalità utente come modello e iniziare ad aggiungere la nuova funzionalità.

Un sintetizzatore software in modalità utente può essere implementato come oggetto con un'interfaccia IDirectMusicSynth. Un sink a onda in modalità utente può essere implementato come oggetto con un'interfaccia IDirectMusicSynthSink. Per altre informazioni, vedere IDirectMusicSynth e IDirectMusicSynthSink.