MIDI 和 DirectMusic 元件
應用程式程式依賴使用者和核心模式元件的組合來擷取和播放 MIDI 和 DirectMusic 資料流程。
應用程式可以使用下列其中一個軟體介面來進行 MIDI 播放和擷取:
Microsoft Windows 多媒體 midiOutXxx 和 midiInXxx 函式
DirectMusic API
midiOutXxx和midiInXxx函式的行為是以舊版 MIDI 驅動程式和裝置的功能為基礎。 從 Windows 98 開始, WDMAud 系統驅動程式 會將這些函式的呼叫轉譯成 WDM 音訊驅動程式的命令。 不過,藉由模擬舊版軟體和硬體的行為, midiOutXxx 和 midiInXxx 函式會犧牲現在可透過 DirectMusic API 取得的有效時間與增強功能。 如需 DirectMusic 和 Windows 多媒體 MIDI 函式的詳細資訊,請參閱Microsoft Windows SDK檔。
DirectMusic 和 Windows 多媒體 MIDI 函式是 SysAudio 系統驅動程式的用戶端,其會建置處理 MIDI 和 DirectMusic 資料流程的音訊篩選圖形。 圖形建置對使用這些軟體介面的應用程式而言是透明的。
MIDI 元件
下圖顯示 MIDI 應用程式用來 播放 MIDI 資料的使用者模式和核心模式元件。 此應用程式會透過在WinMM 系統元件中實作的midiOutXxx函式來介面 WDM 音訊驅動程式,Winmm.dll。
上圖中的 MIDI 應用程式會從 MIDI 檔案讀取時間戳記的 MIDI 事件,並播放它們。 MIDI 和 DMus 迷你埠驅動程式會顯示為深色方塊,表示它們可以是廠商提供的元件。 如果適當,廠商可能會選擇使用其中一個系統提供的迷你埠驅動程式--FMSynth、UART 或 DMusUART--而不是撰寫自訂迷你埠驅動程式。 圖中的其他所有元件都是系統提供的。
一般 MIDI 播放應用程式的主要迴圈會呼叫 timeSetEvent ,以排程下一個記事或記事事件。 此呼叫會採用其其中一個參數,做為應用程式回呼常式的函式指標。 當事件發生且作業系統呼叫回呼常式時,此常式會呼叫 midiOutShortMsg 來開啟或關閉一或多個排程筆記。 midiOutShortMsg函式會將 MIDI 訊息儲存在頁面鎖定的資料緩衝區中,以避免在呼叫期間需要分頁到此記憶體中。 如需timeSetEvent和midiOutShortMsg呼叫的詳細資訊,請參閱Microsoft Windows SDK檔。
WDMAud 是由使用者和核心模式元件所組成, (Wdmaud.drv 和 Wdmaud.sys) ,會記錄來自 midiOutShortMsg 呼叫的原始 MIDI 訊息抵達的時間。 WDMAud 會將這些時間戳記與 MIDI 訊息結合,以產生 MIDI 資料流程,該資料流程會傳送至圖中 WDMAud 下方的其中一個核心模式元件。
建置 MIDI 應用程式的音訊篩選圖形時,SysAudio 只會選取三個可能連線的其中一個-- 與 SWMidi、MIDI 埠或 DMus 埠驅動程式 -- 出現在上圖中。 如果應用程式選取預設 MIDI 裝置,SysAudio 會先尋找 MIDI 或 DMus 迷你埠驅動程式有 MIDI 針腳的合成器裝置。 如果在登錄中找不到這類裝置,SysAudio 會改用 SWMidi 系統驅動程式 (Swmidi.sys) 。 SWMidi 是一種 KS 篩選器,可在軟體中實作可波浪的合成,而且只需要可轉譯波音訊串流的裝置。
SWMidi 會將其所有聲音混合在一起,以產生單一波 PCM 串流,它會輸出至 KMixer 系統驅動程式。 KMixer 接著會將 PCM 格式的波浪資料流程傳遞至 WaveCyclic 或 WavePci 裝置,其埠和迷你埠驅動程式會出現在圖形左下角。 或者,KMixer 可以將輸出資料流程傳遞至由 USBAudio 類別系統驅動程式 控制的 USB 音訊裝置, (如圖) 所示。
在上圖中,MIDI 埠驅動程式會從 WDMAud 取得時間戳記的 MIDI 資料流程,並將它轉換成原始 MIDI 訊息,MIDI 迷你埠驅動程式會透過合成器裝置播放。 MIDI 埠驅動程式包含在軟體中實作的 Sequencer,而且能夠使用計時器解析 1 毫秒來排程原始 MIDI 訊息。
如果合成器裝置包含硬體排序器,DMus 埠驅動程式能夠達到比 MIDI 埠驅動程式更高的計時精確度。 在此情況下,DMus 迷你埠驅動程式應該指定夠大的硬體緩衝區,以便利用 ISR 競爭 CPU 時間所產生的抖動, (插斷服務常式) 和其他高優先順序作業。 MIDI 資料流程中 DMus 埠驅動程式輸出至迷你埠驅動程式的時間戳記是 64 位值,解析度為 100 奈秒。
如果 DMusic synth 沒有硬體排序器,它必須依賴 DMus 埠驅動程式的軟體排序器,例如 MIDI 埠驅動程式的軟體排序器,其計時器解析度為 1 毫秒。
介面卡驅動程式會分別呼叫 GUID 值為CLSID_PortMidi或CLSID_PortDMus的PcNewPort,以建立 MIDI 或 DMus 埠驅動程式。 在 Windows XP 和更新版本中,MIDI 和 DMus 埠驅動程式會共用相同的軟體實作。
出現在上圖底部是系統提供的迷你埠驅動程式 FMSynth、UART 和 DMusUART 的名稱,包含在 Portcls.sys 中。 配接器驅動程式會藉由呼叫 PcNewMiniport來建立其中一個迷你埠驅動程式。 FMSynth 和 UART 提供 IMiniportMidi 介面,而 DMusUART 則提供 IMiniportDMus 介面。 請注意,UART 現在在 Windows 98 Gold) 之後已經過時 (,且僅支援現有的驅動程式。 新的介面卡驅動程式應該改用 Windows 98 SE 和更新版本中的 DMusUART (,以及 Windows 2000 和更新版本中的) ,以實作 UART 功能的超集合。 DMusUART 是 DMus 迷你埠驅動程式的範例,其不支援 DLS 下載或硬體排序。 FMSynth 和 DMusUART 迷你埠驅動程式的原始程式碼可在 Windows 驅動程式套件的範例音訊驅動程式中取得, (WDK) 。
下圖顯示 MIDI 應用程式用來 擷取 MIDI 資料的使用者模式和核心模式元件。 此應用程式會透過 midiInXxx 函式來介面 WDM 音訊驅動程式。
在上圖中,MIDI 和 DMus 迷你埠驅動程式會顯示為變深的方塊,以指出它們可以是廠商提供的元件。 如果適當,廠商可能會改為選擇使用其中一個系統提供的迷你埠驅動程式、UART 或 DMusUARTCapture。 圖中的其他所有元件都是系統提供的。
MIDI 資料的來源通常是 MPU-401 裝置。 藉由呼叫 PcNewMiniport,配接器驅動程式可以建立其中一個系統提供的迷你埠驅動程式 UART 或 DMusUARTCapture,以從 MPU-401 裝置擷取 MIDI 資料。 同樣地,UART 已過時,而新的驅動程式應該改用 Windows 98 SE 和更新版本中的 DMusUARTCapture (,以及 Windows 2000 和更新版本) 。
每次發生 MIDI 記事或記事事件時,MIDI 或 DMusic 擷取迷你埠驅動程式會在上圖底部 () 將時間戳記新增至 MIDI 訊息,再將其新增至流向 MIDI 或 DMus 埠驅動程式的 MIDI 資料流程。
MIDI 或 DMusic 擷取埠驅動程式會將時間戳記的 MIDI 資料流程輸出至 Wdmaud.sys,這是 WDMAud 系統驅動程式的核心模式一半。 使用者模式半 Wdmaud.drv 會透過 Winmm.dll 中實作的 midiInXxx 函式,將時間戳記 MIDI 資料流程輸出至應用程式程式。
圖頂端的 MIDI 應用程式會將時間戳記的 MIDI 事件寫入 MIDI 檔案。 在應用程式呼叫 midiInOpen 以開啟 MIDI 輸入資料流程時,它會將函式指標傳遞至其回呼常式。 發生記事或記事事件時,作業系統會呼叫回呼常式,其中包含一或多個時間戳記 MIDI 訊息的資料區塊。 這些訊息上的時間戳記基本上與 MIDI 或 DMus 迷你埠驅動程式原本產生的時間戳記相同。
DirectMusic 元件
下圖顯示 DirectMusic 應用程式程式用來 播放 或 擷取 MIDI 資料的使用者和核心模式元件。
播放元件會顯示在上圖的左半部,而擷取元件會出現在右側。 DMus 迷你埠驅動程式會顯示為深色方塊,以指出它們可以是廠商提供的元件。 如果適當,廠商可以改用其中一個系統提供的迷你埠驅動程式 DMusUART 或 DMusUARTCapture。 圖中的其他元件是系統提供的。
在圖形左上角,DirectMusic 應用程式會將時間戳記 MIDI 資料流程從檔案導向至使用者模式 DirectMusic 系統元件 (DMusic.dll) ,進而將資料流程導向至 DMus 埠驅動程式。 如果有的話,此驅動程式可以系結至 DirectMusic synth 或 MPU-401 裝置的迷你埠驅動程式。 或者,埠驅動程式可以系結至 DMusic 系統驅動程式 (Dmusic.sys) ,這是系統提供的 DMus 迷你埠驅動程式,可實作軟體中支援 DLS 的波狀合成,而且只需要可轉譯波音訊串流的裝置。
如同 SWMidi,DMusic 驅動程式 Dmusic.sys 會將其所有聲音混合在一起,以產生單一 PCM 格式的波浪串流,它會輸出至 KMixer。 KMixer 接著可以將波浪串流傳遞至波浪裝置,其埠和迷你埠驅動程式會出現在圖形左下角,或傳送到 USBAudio 系統驅動程式所控制的 USB 音訊裝置,該驅動程式不會出現在圖中。
DirectMusic 擷取元件會出現在上圖右半部。 圖形右下角的 DMusic 擷取迷你埠驅動程式會控制其記錄的每個 MIDI 訊息擷取硬體和時間戳記。 DMus 埠驅動程式會將時間戳記 MIDI 資料流程導向至使用者模式 DirectMusic 元件,DMusic.dll。 應用程式會透過 DirectMusic API 存取此資料流程,並將時間戳記的 MIDI 資料寫入檔案。
配接器驅動程式可以使用系統提供的 DMusUARTCapture 迷你埠驅動程式來控制 MPU-401 擷取裝置。 配接器驅動程式會呼叫具有 GUID 值CLSID_DMusUARTCapture的 PcNewMiniport來建立此迷你埠驅動程式。 產生的迷你埠驅動程式物件支援 IMiniportDMus 介面。 DMusUARTCapture 迷你埠驅動程式的原始程式碼可在 Windows 驅動程式套件的範例音訊驅動程式中取得, (WDK) 。
DirectMusic 應用程式也可以在選擇時執行 midiOutXxx 裝置,例如 SWMidi (Swmidi.sys) 。 為了簡單起見,此路徑會從上圖中省略。 DMusic 驅動程式 (Dmusic.sys) 需要初始 DLS 下載才能正確運作;使用 SWMidi 可避免此需求。