MIDI 和 DirectMusic 篩選器

MIDI 和 DirectMusic 篩選器代表合成、輸出或擷取 MIDI 音樂資料的裝置。 應用程式通常會透過 DirectMusic API 或 Microsoft Windows Multimedia midiOutXxxmidiInXxx 函式來存取這些裝置的功能。 如需這些介面的詳細資訊,請參閱Microsoft Windows SDK檔。

MIDI 或 DirectMusic 合成器 篩選器會接收作為 MIDI 資料流程的輸入,其中包含時間戳記的 MIDI 事件。 篩選會輸出下列其中一項:

  • 波浪格式的數位音訊串流

  • 可驅動一組喇叭的類比音訊訊號

MIDI 或 DirectMusic 輸出 篩選會接收作為 MIDI 資料流程的輸入,其中包含時間戳記的 MIDI 事件。 篩選會將原始 MIDI 訊息輸出至外部 MIDI 音效模組。

MIDI 或 DirectMusic 擷取 篩選器會接受來自 MIDI 鍵盤或其他外部 MIDI 裝置的一系列原始 MIDI 訊息輸入。 篩選會輸出包含時間戳記 MIDI 事件的 MIDI 資料流程。

單一 MIDI 或 DirectMusic 篩選準則可以執行三個函式的組合--合成、輸出和擷取,視篩選所代表裝置的功能而定。 例如,純 MPU-401 裝置會執行輸出和擷取,但不會進行合成。

MIDI 篩選

MIDI 篩選器會實作為埠/迷你埠驅動程式配對。 MIDI 篩選處理站會建立 MIDI 篩選準則,如下所示:

  • 它會具現化 MIDI 迷你埠驅動程式物件。

  • 它會呼叫具有 GUID 值CLSID_PortMidi的 PcNewPort,以具現化 MIDI 埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation中的程式碼範例說明此程式。 埠和迷你埠驅動程式會透過其 IPortMidiIMiniportMidi 介面彼此通訊。

為了支援 MIDI 輸出和合成器裝置,MIDI 埠驅動程式包含一個軟體排序器,會將原始 MIDI 訊息輸出至迷你埠驅動程式,其計時器解析度為 1 毫秒。

DirectMusic 篩選

DirectMusic 篩選準則提供 MIDI 篩選功能的超集合。 超集合包含下列額外功能:

  • DLS (可下載的音效) 資源,其中包含描述 MIDI 檢測的電壓和表達資料。 KSPROPERTY_SYNTH_DLS_DOWNLOAD set-property 要求會將 DLS 資源下載至篩選。

  • 用來擴充可選取檢測數目的通道群組。 DMUS_KERNEL_EVENT結構,用來封裝 MIDI 資料流程中每個時間戳記的 MIDI 訊息,指定要用於該訊息的通道群組。

  • 支援硬體 MIDI 排序的 64 位時間戳記,具有 100 奈秒解析度。 DMUS_KERNEL_EVENT 結構會指定 MIDI 訊息的高解析度時間戳記。

使用通道群組時,可以同時播放的附注數目不再限於原始 MIDI 規格的 16 個通道。 它只會受限於合成器中可用的語音數目。

DirectMusic 篩選器會實作為埠/迷你埠驅動程式配對。 DirectMusic 篩選處理站會建立 DirectMusic 篩選準則,如下所示:

  • 它會具現化 DMus (DirectMusic) 迷你埠驅動程式物件。

  • 它會呼叫具有 GUID 值CLSID_PortDMus的 PcNewPort來具現化 DMus 埠驅動程式物件。

  • 它會呼叫埠驅動程式的 IPort::Init 方法,將迷你埠驅動程式系結至埠驅動程式。

Subdevice Creation中的程式碼範例說明此程式。 埠和迷你埠驅動程式會透過其 IPortDMusIMiniportDMus 介面彼此通訊。

為了支援 DirectMusic 合成器裝置,DMus 埠驅動程式包含低解析度 (一毫秒) 軟體排序器,可在排定播放事件之前將時間戳記 MIDI 事件輸出到硬體排序器的緩衝區。 為了支援 DirectMusic 輸出裝置,埠驅動程式的軟體排序器也可以設定為在播放原始 MIDI 訊息時輸出原始 MIDI 訊息。

列舉 MIDI 和 DirectMusic 裝置

透過 Windows Multimedia midiInXxxmidiOutXxx 函式列舉 MIDI 輸入或輸出裝置時,應用程式只能看到其迷你埠驅動程式公開 MIDI 針腳的WDM 裝置。 這些是管理原始 MIDI 資料流程但不支援 DLS 和通道群組等進階功能的針腳。 不過,透過 DirectMusic 列舉裝置時,應用程式可以看到具有 MIDI 針腳和 DirectMusic 針腳的 WDM 裝置。 DirectMusic 針腳可管理時間戳記的 MIDI 資料流程,並支援 DLS 和通道群組。

實作自訂迷你埠驅動程式時,硬體廠商通常會撰寫 MIDI 迷你埠驅動程式或 DMus 迷你埠驅動程式,但不會同時寫入兩者。 MIDI 迷你埠驅動程式只能公開 MIDI 針腳。 不過,DMus 迷你埠驅動程式可以同時公開 MIDI 和 DirectMusic 針腳,這不需要撰寫個別的 MIDI 迷你埠驅動程式。 如需 DirectMusic 篩選器上 MIDI 針腳的範例,請參閱 Windows 驅動程式套件中的 Dmusuart 範例音訊驅動程式 (WDK) 。

指定 MIDI 或 DirectMusic 針腳的資料範圍時,MIDI 或 DMus 迷你埠驅動程式會指定類型為 KSDATAFORMAT_TYPE_MUSIC 的主要格式,以及 MIDI 針腳類型KSDATARANGE_SUBTYPE_MIDI的子格式,或 DirectMusic 針腳的KSDATARANGE_SUBTYPE_DIRECTMUSIC。 MIDI 和 DirectMusic 針腳的資料範圍描述項範例分別會出現在 MIDI 資料流程資料範圍DirectMusic Stream 資料範圍中。

MIDI 篩選器上的 MIDI 針腳實例會公開 IMiniportMidiStream 介面。 DirectMusic 篩選器上的 MIDI 或 DirectMusic 針腳實例會公開 IMXF 介面。

在 Windows Me/98 中,DirectMusic 有時會列舉相同的 MPU-401 裝置兩次。 原因是有些硬體廠商會將其 MPU-401 裝置公開為舊版、WDM MIDI 裝置和 WDM 裝置。 針對舊版裝置,DirectMusic 會列舉 MPU-401 裝置,代表從 DMusic.dll 到 Ihvaudio.dll 的直接路徑。 針對 WDM 裝置,DirectMusic 會透過由下列元件序列組成的線路路徑,列舉相同的 MPU-401 裝置:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. 廠商的迷你埠驅動程式

Windows 多媒體控制台 (Mmsys.cpl) 中顯示的 MIDI 合成器名稱會與 WDM 裝置相同。

系統提供的埠和迷你埠驅動程式

數個系統提供的 MIDI 和 DMus 迷你埠驅動程式內建于 PortCls 系統驅動程式中:

  • FMSynth 迷你埠驅動程式會為實作 OPL3 樣式 FM 合成的 MIDI 裝置提供介面。

  • UART 迷你埠驅動程式支援具有 MPU-401 硬體介面的 MIDI 裝置,但 Windows 98 Gold) 之後,此驅動程式現在已過時 (,且僅支援現有的介面卡驅動程式。 新的介面卡驅動程式程式碼應該改用 Windows 98 SE 和 Windows Me 中的 DMusUART 迷你埠驅動程式 (,並在 Windows 2000 和更新版本中) ,以取代 UART 並實作其功能的超集合。

配接器驅動程式可以藉由呼叫 PcNewMiniport 函式來存取系統提供的迷你埠驅動程式。 FMSynth 和 DMusUART 迷你埠驅動程式也隨附為 Windows 驅動程式套件中的範例音訊驅動程式, (WDK) 。 藉由修改這些範例中的原始程式碼,硬體廠商可以擴充驅動程式來管理其裝置的專屬功能。

DMusUART 是 DMus 迷你埠驅動程式的範例,可同時公開 MIDI 和 DirectMusic 針腳,但不支援 DLS 下載或硬體排序。 迷你埠驅動程式的 DirectMusic 轉譯針腳具有支援數個KSPROPSETID_Synth屬性的 synth-節點 (KSNODETYPE_SYNTHESIZER) 。 迷你埠驅動程式本身包含在類別KSCATEGORY_RENDER和KSCATEGORY_CAPTURE中,但不在KSCATEGORY_SYNTHESIZER (中,因為它不包含內部合成器) 。 如需詳細資訊,請參閱 WDK 中的 DMusUART 範例音訊驅動程式。

請注意,在 Windows XP 和更新版本中,MIDI 和 DMus 埠驅動程式使用相同的內部軟體實作。 這表示呼叫PcNewPort,CLSID_PortMidiCLSID_PortDMus GUID 相等。 針對舊版 Windows 所撰寫的應用程式應該不會看到因 MIDI 和 DMus 埠驅動程式的匯總而產生的行為變更。