DirectMusic
這篇文檔包括了以下的Microsoft® DirectMusic™
應用程式接口 (API)的
主題:
* 關於 DirectMusic
* 為什麼使用DirectMusic?
* DirectMusic 基本要素
* DirectMusic 教程
* DirectMusic 參考手冊
* DirectMusic 例程
關於DirectMusic
默認的軟體實現是使用Microsoft® Software Synthesizer 創建波形樣本然後由DirectSound 輸出。樂器的聲音依照the downloadable sounds (DLS)標準來合成。
由於支持 MIDI格式, DirectMusic 可實現實時作曲。這種音樂不是由什麼算法生成的,而是有基於由人類作曲家作出的自然風格。它的曲風多變,且可對程式事件動態回響。
如同其他的DirectX組件,DirectMusic 提供了一套基於對象組件模型— Component Object Model (COM)的API。
為什麼使用 DirectMusic?
DirectMusic API 滿足了在
計算機平台上傳遞音樂的基本要求:
* 回放效果一致性。由於使用DLS標準,一個套用可以使其中的樂器聲在所有不同的機器上聽起來都是這件樂器本身不變的聲音。
* Jitter-free timing. 基於MIDI的音樂的回放可以精確到兩毫秒。
* 可擴展性。DirectMusic 沒有把開發商限制在一個基礎特性集之中。
還有,DirectMusic 為簡化程式開發和豐富用戶的體驗提供了重要的特性:
* 簡單的讀入和播放音樂機制,與具體的實現技術細節無關。DirectMusic 支持標準的MIDI 檔案,音樂段, 以及第三方技術。
* 多重播放機制。多個音樂片段可以用完全獨立的時間片、樂器集等同時播放。
* 超過16個MIDI 通道。通過把播放通道映射到通道組,DirectMusic 突破了16 通道的限制,可以同時播放任意數量的聲音,只取決於合成器的上限。.
* 對DLS 的自動管理。
* 動態、互動的回放。在DirectMusic Producer的幫助下,DirectMusic播放引擎可被用來生成動態音樂音軌和儲存創作素材。而且樂曲直到在被播放才會確認它的最終格式,在這以前都可以對程式時間作回響。
* 通過使用一個主時鐘控制,可以使所有的樂曲回放同步。
這一節介紹DirectMusic的各部分:
* 核心層和Performance層
* DirectMusic 對象和接口綜述
* DirectMusic 數據流綜述
* DirectMusic 訊息
* DLS
* Microsoft 軟體合成器
想獲知如何在套用中使用這些部件的信息,見DirectMusic 基本要素部分。
核心層和Performance層
DirectMusic 核心層管理時間分片和連線埠,以及為管理DLS collection提供服務。它支持緩衝的、被分為時間片的MIDI 輸入和輸出。預設情況下,DirectMusic 可以自己對MIDI數據序列化。
核心層包括Microsoft Software Synthesizer,它使用DLS標準從序列化的MIDI 數據中合成波形輸出。
DirectMusic performance層負責更高級的音樂回放,包括讀入、回放 MIDI 檔案和對基於用DirectMusic Producer 或別的類似的軟體的音樂的組合。
核心層的接口和相應的API 成員可在Dmusicc.h中找到,performance層的,可在Dmusici.h 中找到。
DirectMusic 對象和接口綜述
在 DirectMusic 中,把對象和它們的COM接口作一下區別是有好處的,因為許多對象有多個接口。例如,支持IDirectMusicCollection 接口的對象也支持標準的COM IPersistStream 接口和IdirectMusicObject。
在這篇文檔里,DirectMusic 對象通過它們主要的或唯一的名字被提及,但沒有打頭的“I”;這樣IDirectMusicCollection 表示的對象被稱為DirectMusicCollection 對象。對象也可能用短名表示,例如collection, performance, segment, 和 track.
接口
指針通常被當作指向它們的對象的指針來使用,這樣那些對象就可以通過別的接口的方法來訪問到。例如,有個 IdirectMusicDownloadedInstrument 接口,自己沒有一個方法而只是被當作別的接口的方法的一個參數來使用。
DirectMusic 由許多互相之間聯繫相當複雜的對象和接口組成。然而,還可以根據它們的功能來分成幾類,如下所示:
* 核心對象和接口
* 載入對象和接口
* 樂器(Instrument)對象和接口
* Tool對象和接口
* Performance對象和接口
* Composition對象和接口
* 合成器對象和接口
DirectMusic 對象
DirectMusic 對象由 IDirectMusic 接口表示,用來創建連線埠和緩衝、與DirectSound 聯繫和設定一個主時鐘。每個套用只能有此對象的一個實例。
許多套用從不需要直接使用IDirectMusic 接口。這點它與別的DirectX 基礎接口不同。例如, IDirectSound 是所有的 DirectSound 套用的起始點,完成一些基本的任務如設定協作優先權和創建聲音緩衝。而在DirectMusic中,大多數初始化工作由別的對象如DirectMusicPerformance 來做,而這些對象通過直接對CoCreateInstance的調用來獨立創建。
連線埠
每個傳送和接收音樂數據的設備都被一個DirectMusicPort 對象封裝起來。IDirectMusicPort 接口的方法允許直接對連線埠操作,但大多數套用是用不到這些方法的,因為連線埠由performance對象來管理。例如,你通過DirectMusicPerformance對象為一個連線埠分配了一個通道,那么在這通道內的數據就會被正確處理。
緩衝
IDirectMusicBuffer 接口表示了當前正準備從一個連線埠播出(或讀入)的數據。大多數的套用不直接處理緩衝對象,但它的方法能直接操縱其中的內容。
Thru
IDirectMusicThru 接口被用來建立從一個捕獲連線埠到另一個連線埠的數據直接傳輸。
參照時鐘
實現IReferenceClock接口的對象表示了對所有DirectMusic 活動進行同步的主時鐘和某個連線埠的隱含時鐘。
載入對象和接口
有些特定類型的對象,比如DirectMusicCollection 和DirectMusicStyle,必須在它們被組合進 一段音樂演奏之前載入(或從檔案中讀入)。另一些,比如DirectMusicSegment,可能要即時地載入和構造。這一節介紹的是關於載入的基本接口。
載入
DirectMusicLoader 對象,通過IDirectMusicLoader 接口管理對象的枚舉、高速緩衝和載入。
流
從某個檔案或資源中正在讀的數據用一個流對象表示。大多數套用不需要直接地處理流,因為它們由載入程式創建和管理。流對象實現了下列接口:
* IStream 讓數據從檔案或某個資源流向正被載入的對象,它通過自己的IPersistStream接口實現來分析這個被載入的對象。
* IDirectMusicGetLoader 只有一個返回指向創建流的DirectMusicLoader對象的指針的方法。它在一個流中發現了對其他對象的一個參照時被使用,正被載入的對象需要調用載入程式載入這個參照對象。
要更詳細地知道這些接口在載入過程中的使用,見 DirectMusic 載入程式。
對象
每個DirectMusic 對象代表了一個支持IDirectMusicObject接口的檔案或資源,這些都被載入程式當作一個普通
指針來使用。當套用獲得一個指向此接口的
指針後,IDirectMusicObject::QueryInterface 方法會被用來去獲得指向對象自己的接口如IdirectMusicCollection 或IDirectMusicStyle的指針。然而,你通常能通過調用IDirectMusicLoader::GetObject來獲得你想要的接口。
IDirectMusicObject 的方法被載入程式在其內部用來區分諸對象。
樂器 (instrument)對象和接口
instrument就是代表了一種基本音色或別的聲音的一種對象。除了已定義的硬體MIDI 連線埠,每個instrument都與它自己的Downloadable Sounds (DLS)集合相聯繫,這個集合必須在instrument 對象被使用前就下載到連線埠上。
DLS可以在三個抽象層上處理。在最高層,你從某個檔案裝入一個band並讓這個band對象處理為此instrument下載的DLS。接下去的一層,可以直接訪問在一個collection對象中的獨立的instrument並把它們下載到連線埠上。最低一層,只與DLS數據本身打交道。
下面的對象和接口用來管理instrument:
collection
instrument被存放在DirectMusicCollection 對象中,此對象表示了一個 DLS 檔案的實例。當DirectMusicCollection 對象被載入時,IDirectMusicCollection 接口可以被用來枚舉collection中的instrument和得到一個指向有給定的MIDI patch 數的instrument對象的
指針。
Instrument
一個collection中的某個instrument由指向IDirectMusicInstrument接口的一個指針來表示。這個指針可被傳送到IDirectMusicPerformance::DownloadInstrument 或 IDirectMusicPort::DownloadInstrument方法為一個連線埠下載DLS 數據。
當一個instrument被下載後,由一個IDirectMusicDownloadedInstrument接口
指針表示,這個指針只在調用IDirectMusicPort::UnloadInstrument反下載instrument時被用到。
需要為一個instrument下載自己的DLS數據的套用(比如collention 編輯工具)使用IDirectMusicPortDownload接口的方法(由連線埠對象實現)來把那些數據送往合成器。當這個接口被用來為vinstrument 數據申請緩衝時,一個 IDirectMusicDownload 接口指針被返回。這個接口的唯一一個方法是用來獲得指向緩衝自身的指針。
Band
DirectMusicBand 對象表示了一個instrument 集合和一個音樂段的MIDI program的變化。
IDirectMusicBand 接口可被用來下載和反下載 band。它還有一個從一個band中創建一個二級段的方法,這個段可被播放以用來影響MIDI program變化。
Collection對象和band 對象的主要區別如下:
* Collention是一組在任何段的回放中都能使用的instrument。Band是一組演奏特定段的instrument。
* Collection中的instrument包括了定義自身音色的DLS數據。Band中的instrument沒有這些數據但與一個或多個collection中的instrument相聯繫。
* Collection中的instrument並不是固有地和某個段的所有特定performance 通道(P通道)相聯繫。一個band為在段中的每個P通道分配了instrument的patch 數和一個聲音優先權。
* Collection並不包括instrument如何演奏的信息。Band包含了每個instrument的音量、均衡、移位的設定。
Tool對象和接口
Tool是那些截取音樂信息並在它們被傳送到連線埠之前進行處理的對象。所有的tool(除了DirectMusic自帶的輸出tool)是套用定義的。
Tool
IDirectMusicTool 接口代表了一個tool。此接口的方法由套用或DLL來完成以做到tool的通用性。
Graph
Tool被集中在一個Graph內,用IDirectMusicGraph 接口表示,這個接口由segment和performance對象共同完成。此接口被用來從一個tool到下一個指示訊息、往graph中加入tool、為獨立的tool取回指針,和關閉graph。
Performance對象和接口
下面的對象和接口用來對音樂數據的回放。擁有總數超過75個的方法,這一組的接口在任意一個DirectMusic套用中都起重要作用。
Performance對象
DirectMusicPerformance對象是音樂回放的總管理者。它通過IDirectMusicPerformance 接口、添加或刪除連線埠、下載instrument、連線graph (tool的集合)、管理眾多segment的通告事件、以及播放segment。
Segment對象
一個DirectMusicSegment 對象代表了一塊數據(通常是一個音樂片段,包括在一個或多個track中)。通常一個segment由檔案裝入或是由DirectMusicComposer 對象實時創建。播放segment時,套用往IDirectMusicPerformance::PlaySegment 方法傳遞IDirectMusicSegment 接口的指針。
IDirectMusicSegment 接口的方法用來管理時間分片和循環、事件通告、graph、和別的各種segment的參數。
一個正在播放的segment的實例由IDirectMusicSegmentState接口表示。這個接口的方法返回有關回放狀態的信息,指向此接口的指針被performance對象用來停止或刪除segment實例。
Track
一塊已被分時的特殊類型的數據由DirectMusicTrack 對象表示,可更簡單地被叫做track。IDirectMusicTrack 接口的方法用來設定和獲取數據、播放數據、以及設定通告。大多數套用並沒有直接使用到這個接口,因為通常track對象是由包含它們的DirectMusicSegment對象的方法來處理的。
注意
DirectMusicTrack 與一個instrument的track是不同的,DirectMusicTrack 可表示任意種類的分好時間片的數據,比如MIDI 訊息,一段chord progression(和音?)或band的變化。
Composition對象和接口
這一組的對象和接口用來進行樂曲的即時寫作。除去作曲者自身,它們表示了從如DirectMusic Producer那樣的軟體生成的檔案中載入的數據。想獲得每個對象的更詳細的信息,參見樂曲寫作(Music Composition)部分。
Composer
IDirectMusicComposer 接口的方法允許一個套用去作出樂曲段和過渡,同時使用到chordmap,style,和一個人類作者創建的摸板。
style
style包括了一段樂曲的基本信息,Styles 通常成為了segment 的一部分,在幕後做大多數的事。它們也能被用來即時作出全新的segment。Style用IDirectMusicStyle 接口來表示。
Chordmap
DirectMusicChordMap 對象表示了一個和音(chord)的集合,以及DirectMusicComposer 在在一段樂曲中判斷chord progression時用到的路徑。
IDirectMusicChordMap 接口由DirectMusicChordMap對象從一個檔案中載入時獲得。一個指向此接口的指針被傳如IDirectMusicComposer 以便一個段或樂曲過渡能實時地使用chordmap作出。你還能通過套用一個新的chordmap 來改變一個已存在的段的和音模式。
摸板
摸板是一種特殊的DirectMusicSegment 對象。它們從不被直接播放但被DirectMusicComposer 在實時構建基於style和chordmap的段時使用。
合成器對象和接口
合成器負責把MIDI信息轉化為波形格式數據並輸出到波形
輸出設備上去。雖然DirectMusic有自帶的軟體合成器,它也允許自定義合成器。而且它允許輸出到指定的不同設備。有關此主題的信息包含在DirectX Device Driver Kit(DDK)中。
合成器
一個由套用實現的合成器由IDirectMusicSynth 接口來表示。大多數套用沒有使用到這個接口,
合成槽(Synth Sink)
合成器把數據送入的波形流,例如 DirectSound 或 Win32 的波形格式音頻,用IDirectMusicSynthSink 接口表示。大多數套用並不使用此接口,所以DirectX 開發人員參考中也沒有提供它的文檔。
DirectMusic 數據流綜述
通常一個DirectMusic 套用從以下的一個或多個資源中獲得音樂數據:
* MIDI 檔案。
* 諸如DirectMusic Producer 等套用中創作的段檔案。
* 諸如DirectMusic Producer 等套用中的創作的組件檔案並用DirectMusicComposer對象轉化成一個完整的樂曲 。
從這些資源來的
數據封裝在DirectMusicSegment 對象中。每個segment 對象代表了從一個單獨的資源中來的數據。在演奏的任一刻可能有一個或多個segment在播放:一個主segment(primary segment)或可能有的多個次segmennt(secondary segments)。
資源檔案可以被混合,例如,一個基於MIDI 檔案的次segment可以和一個基於segment檔案的主segment一同播放。
每個segment包括多個track ,每個track含有某中特定類型的數據,如節拍的變化。
大多數 track在當segment被performance對象播放時產生訊息。而performance 對象向所有套用定義的tool傳送這些訊息,讓它們能有機會對訊息進行修改、傳送和刪除訊息、傳遞新的訊息。Tool 根據各個segment graphs 只處理從它們自己的segment發來的訊息來分組,一個 performance graph 可以接受從所有的segment發來的訊息。
最後,訊息被傳遞到輸出tool,它把數據在送往連線埠前轉化為MIDI格式。Channel-specific(專有通道?) 的MIDI 訊息被直接指向指定的以連線埠分組的通道。連線埠把把它們組合為一個聲音波形流向波形
輸出設備(通常是一個DirectSound 緩衝)。
下面的圖是音樂數據是如何從檔案到波形輸出設備經過的概況。為簡單起見,只顯示了一個segment。 注意這個segment 只從三個可能的資源中得到數據: MIDI 檔案、或一個寫好的segment檔案、或是由DirectMusicComposer 對象組合攏的component 檔案。
更詳細的在performance中的訊息的流程,參見DirectMusic 訊息部分
有關怎樣實現上述圖表所示的過程的信息,參見DirectMusic 基本要素章節,特別是DirectMusic 載入程式 和 播放音樂部分
關於segment 和 component file 更多的信息,見 Music Composition 部分。
DirectMusic 訊息
音樂數據以訊息的形式通過DirectMusic performance 引擎傳遞。大多數的 DirectMusic 套用不必直接去處理訊息,但知道訊息的一些基本知識能幫助你了解DirectMusic 是如何工作的。
DirectMusic 工作時用到兩類不同的訊息:
* Performance 訊息,基於DMUS_PMSG 結構。所有有序的數據都以這種格式通過performance 引擎。此類訊息包含了數據的分時(timing)和路由(routing)的詳細信息。
* 標準 MIDI 訊息。它們可以從MIDI檔案或設備中讀出並被直接傳送到另一個設備或在被傳送到performance 時轉化為DMUS_PMSG 格式。最終輸出到合成器的仍然是MIDI 訊息的格式。
* 通道(Channels)
* 訊息創建和傳遞( Creation and Delivery )
* Performance 訊息類型
* MIDI 訊息
Channels
Channel對一個指定到performance的訊息來說是它的目的地(destination)。例如,一個 channel 可能接收到一個note-on 訊息,此訊息引起在此channel上的instrument產生一個聲音;或者是一個
程式變換(program change)訊息為它指派了一個別的instrument。(見MIDI Channel 訊息)
按照MIDI 1.0 標準,可以有16個MIDI channels,以為意味著可以同時演奏有多於16個的instrument,為了支持這個標準且可同時為套用提供更多的channel,DirectMusic提出 channel組(channel groups )。最多可同時有 65,536 個channel 組,每個組可包括16個channel ,這樣總共可以有超過一百萬個channel。一個特定的連線埠(port)可以分配任意多個channel組而只受它的支持能力限制。傳統(legacy)的 MIDI 硬體連線埠只支持一個channel組。
系統獨占(System exclusive)訊息可在一個channel組內訪問所有的16 個channel,但不能訪問別的channel組。
在DirectMusic performance對象中的每個instrument都擁有一個單獨的performance channel, 或者說是 PChannel。 PChannel 表示了在一個特定(particular)的連線埠上的特定的組內的特定的MIDI channel。當一個band 被performance所選擇時,在band中的每個instrument 都被單獨映射到一個channel。
實際可以同時被演奏的note數目受到連線埠的可用的voice數的限制。(這個數字可以由DMUS_PORTPARAMS結構的dwVoices成員來決定。) Voice 其實是一個用於對在一個channel上正被演奏的note的合成(synthesis )的資源的集合。當有超過可行的note數的note演奏時,一個或多個的note不得不被合成器取消。這取決於當前演奏note的voice的優先權,而這又基於channel的優先權。默認的是,channel 是根據它們的索引值來排列的,除了channel 10,MIDI percussion channel,被賦予最高。然而套用和合成器可以設定自己的channel 優先權。
更多的channel 優先權的信息,見IDirectMusicPort::GetChannelPriority的說明,也可見DMUS_CHANNEL_PRIORITY_PMSG。
訊息的創建和傳遞
當一個segment 演奏時, 它的大多數track 會生成包含在回放過程中發生的事件的信息的訊息。(更多的信息,見Tracks。)
有些track 能傳送不止一種的訊息。例如, style track 可傳送note 訊息和time signature (
時間戳)訊息。這種情況下,套用可以禁用track中的一些訊息。更多的信息,見設定與獲取Track 參數。
套用也可以直接往
佇列中放入訊息。例如你可以這樣做來改變節拍(tempo)。例子源碼可見IDirectMusicPerformance::SendPMsg。
Performance 引擎決定了每個訊息何時將被實時地處理。對於channel 訊息,performance 還決定了此訊息指向哪個Pchannel。Message 結構的DMUS_PMSG 成員存放了有關訊息的信息,包括訊息類型、它的track來源、接收此訊息的第一個graph和tool的指針。
普通的訊息,如tempo 和 time signature 訊息,能立即被performance處理和釋放掉。另一些訊息,如note 和 patch change 訊息,被放到佇列中,按
時間戳順序處理。
注意
Tempo 訊息(DMUS_TEMPO_PMSG) 告知 performance怎樣把music time轉化為 reference time(譯者註:tempo 有“節拍”的意思,大概是告知performance 節拍與真實時間的比值關係)。 Time signature 訊息(DMUS_TIMESIG_PMSG) 是純信息的,因為time signature 建在segment裡面而不能被改變。
訊息首先被送往segment的graph中的每個tool 中,然後是performance 的graph中的每個tool中。(套用會負責創建著兩個graph或其中之一,並定義號tool。沒有預設的graph。)
Graph中的第一個tool 處理訊息後,如果要繼續把它傳下去,graph 把指向下一個tool的
指針給此訊息。 (向對此過程了解更清楚,見教程2:使用tool 。)
此時graph 還為這個訊息作上一個“遞送類型”的標誌,它決定了此訊息何時被遞送到下一個tool去。這個標誌取決於tool 希望得到何種遞送類型:
* DMUS_PMSGF_TOOL_IMMEDIATE,立即遞送到下個tool 。
* DMUS_PMSGF_TOOL_QUEUE,訊息將剛好在它要被播放之前遞送,這個時間是考慮適當的延時而推測出來的。(見延時和碰撞時間(Bumper Time))。
* DMUS_PMSGF_TOOL_ATTIME ,訊息將被確定在被處理時遞送。通告訊息就被賦予此種標誌,因為處理通告訊息不需要延時。
當前的tool 有在graph 往訊息上貼標誌後再改變遞送類型的機會。
最後,除非訊息被取消,它會到達DirectMusic 輸出 tool,它會把所有接收到的數據都轉化為標準的MIDI訊息並通過連線埠緩衝傳送到合成器(synthesizer)。
Performance訊息類型
訊息被存放在幾個從DMUS_PMSG派生而來的結構中。因為C 語言不支持繼承,DMUS_PMSG的成員以DMUS_PMSG_PART 宏的形式被包含在對每種訊息類型的定義中。這些成員包含了所有訊息的普通數據,包括訊息類型、
時間戳、訊息被送往的Pchannel、以及接下來要對它進行處理的是哪個graph 和tool。還有一些成員包含了某種訊息所特有的數據。
下面是定義的訊息結構:
DMUS_PMSG 簡單訊息,無額外參數。
DMUS_CHANNEL_PRIORITY_PMSG Channel 優先權改變。
DMUS_CURVE_PMSG Curve。
DMUS_MIDI_PMSG 任意的不屬於特殊訊息類的MIDI 訊息,例如控制改變訊息。
DMUS_NOTE_PMSG Music note。( MIDI note-on 與 note-off訊息也結合在這種訊息里。)
DMUS_NOTIFICATION_PMSG 通告。
DMUS_PATCH_PMSG MIDI patch 改變。
DMUS_SYSEX_PMSG MIDI 系統獨占訊息。
DMUS_TEMPO_PMSG Tempo 改變。
DMUS_TIMESIG_PMSG Time signature 改變。
DMUS_TRANSPOSE_PMSG 傳輸。
MIDI 訊息
這裡大致講一下標準的MIDI訊息以及它們如何從一個MIDI檔案中獲取並被DirectMusic所處理。多數套用直接處理MIDI訊息,因為 loader(載入程式)和performance 管理了所有的回放的細節。(見教程1:播放一個 MIDI 檔案。)
MIDI 輸入在被performance 路由到tool之前轉化成performance 訊息格式 (使用基於DMUS_PMSG的結構)。輸出tool 在把數據在傳送到synthesizer 前轉化為標準的MIDI訊息格式。
注意
不能保證MIDI訊息將以它們在檔案中的順序被處理。DirectMusic 訊息以時間戳順序傳遞,兩個有相同時間戳的MIDI訊息可能會不按照預定的次序傳遞。應該小心不要讓順序發生的事件得到相同的時間戳,
MIDI 訊息通常在一或兩個數據
位元組後有一個狀態位元組。系統獨占MIDI訊息的狀態
位元組是不定長的。狀態
位元組指出了訊息的類型,有些時候,還有接收訊息的channel。當檔案中順序有多個相同類型的事件時,狀態
位元組被省略,這稱為 running status。數據
位元組仍然是可以識別的,因為位元組的高位總是清空的,而狀態位元組的高位總是被置位。
MIDI事件從檔案中流出的時間是由一個位於每個訊息前的
數字控制的,這個數字表示了最多可以等待多少個tick 一個 tick 的真正的時間依賴與檔案頭部的時間格式。
MIDI 訊息分為主要的兩類:
* MIDI Channel Messages (MIDI 通道訊息)
* MIDI System Messages (MIDI
系統訊息)
MIDI 通道訊息
通道訊息被
定址到一個特定的、對應于樂曲中的一部分的MIDI通道。通道訊息既可是一個mode訊息,也可是一voice訊息。
Mode訊息決定了通道將如何處理隨後的voice訊息。例如,一個mode訊息可以通知通道保持沉默,忽略所有的note-on 訊息直到下一個通知。
大多數通道訊息為voice訊息:它們指揮通道開始和停止播放一個note或以某種方式修改這個note,或者通過為通道分配不同的MIDI patch數來改變 instrument。
Voice 訊息有下面幾類:
Voice 訊息 用途
Note-on 播放一個note。
Note-off 停止播放 note。
Control change 用取自pedal,lever等的
數據修改音調(tone);頁用來作各種諸如音量和bank選擇的控制。
Program patch) change 通過指派以patch數來為channel選擇一個 instrument。
Aftertouch 根據一個鍵(key)值的Aftertouch修改一個獨立的note,或是通道上的所有的note。
Pitch bend change 讓音調作一個以pitch作平滑的過度。
記住這些都只適用於標準的MIDI 訊息,而非已轉化成performance訊息格式的MIDI 數據。例如,一對啟動和停止播放note 的MIDI訊息會被DirectMusic 結合在一個獨立的DMUS_NOTE_PMSG 結構里。DirectMusic 訊息同時也包含了許多額外的關於timing 和 routing 的信息。
MIDI notes
Note-on訊息的數據位元組描述了pitch 與 速率。大多數時候,pitch值為0表示subcontra C以下的C (用 MIDI 符號表示為C0), 12 表示subcontra C (或 C1), 60 是中(middle)C (或 C5), 等等。對 drum kits 來說(譯者註:drum kits是什麼?不懂!drum 意思是‘鼓’,這裡大概是在說打擊樂器), 數據位元組表示了一個特殊的drum 聲音, 例如,只要遵照General MIDI (GM) 打擊樂器值映射,值60 表示一個高的 bongo 音。通道10 是為drum kits 保留的,所以synthesizer 知道在此通道上的note-on 訊息將被與在其它通道上的不同對待。
關於DirectMusic 如何轉化與形成MIDI note 的信息,見 Music Values 與 MIDI Notes。
Program changes
Program changes 和 patch 數在MIDI的回放以及DirectMusic中 都是一個重要的概念。一個 program change 為一個通道指派了特定的instrument (也稱作program 或 timbre(音質)) ,所以傳送到此通道上的note 能以適當的聲音播放出來。Instrument 用 patch數來鑑別。如果載入的是GM instrument 集,一個指定 patch數為1 的program change 將始終使通道象類似與三角鋼琴的聲音播放它的note 。(當然,在喇叭中產生的聲音依賴於這個 instrument 使如何被合成的。)
Bank selection
因為在一個program change中只用一個
位元組來選擇 patch 數,而且在MIDI 訊息中的每個位元組只有7位是有意義的,一個 program change 最多可以從128 個 instrument中選擇。為提供更多的選擇,MIDI 規範里允許最多使用16,384個instrument bank,每個都包含128 個instruments。
為了從不同的bank 中選出一個instrument , MIDI 序列器(sequencer)必須先傳送一個稱為bank select 的控制改變訊息(control change message)。此訊息的兩位元組分別叫作最大意義位元組(most significant byte (MSB))和(最小意義位元組least significant byte (LSB)), 它們一起確定了一個 bank。一旦選定了這個bank,隨後的program change 就從此bank里選instrument 。
DirectMusic patch 數
在DirectMusic 中,instrument patch 數不同於7位的MIDI patch 數而是一個32位值,它把選擇bank 時的 MSB、LSB以及為drum kit 而設的一個1 位標誌於 MIDI patch 數均包括在一起。這個擴展的patch 數可由IDirectMusicCollection::EnumInstrument、IDirectMusicCollection::GetInstrument、 和 IDirectMusicInstrument::GetPatch 方法返回。對摸個instrument可以通過使用IDirectMusicInstrument::SetPatch方法來改變。
DirectMusic patch 值如下組織:
位 用途
0-7 MIDI patch 數(位 7 總是 0)
8-15 LSB (位 15 總是 0)
16-23 MSB (位 23 總是 0)
24-30 沒使用
31 drum kit 的標誌
系統訊息對任一通道都不是獨占的。共有三類,如下所示:
訊息類型 用途
系統獨占訊息 設備指定的命令和數據。
系統實時訊息 使基於時鐘的MIDI設備同步。
不象別的MIDI訊息,系統獨占訊息可以包含多個數據位元組。在傳送好數據之後,
音序器會發出一個稱為EOX的系統通用訊息,表示系統獨占訊息的結束。在DirectMusic中, DMUS_SYSEX_PMSG 結構包含了數據的長度和指向數據位元組陣列的
指針。
Downloadable Sounds
一直以來,大多數
電腦音樂以兩種根本不同的方法中的一種來製作,這兩種方法各有優缺點:
*波形格式從數字採樣中複製,通常存放在 .wav 檔案里,或者以標準的 CD 音軌存放。數字採樣可以複製所有的聲音,在所有的音效卡上的輸出也非常相似。然而,它們需要大量的
存儲空間和資源。
*樂器聲效常常是硬體合成的,通常來自於MIDI檔案。MIDI 檔案很緊湊而且需要很少的資源,但輸出受限於General MIDI 集合和合成器中的可用的樂器的數量,而且在不同的系統上聽到的效果可能完全不一樣。
一個結合了數字採樣的優點和MIDI的緊湊與靈活性的方法是
波表合成器,從數字採樣中得到樂器音效的合成。這些採樣由記錄真實的樂器聲得到並儲存在硬體中。這些採樣被循環和調整以產生有不同音調和音量的任意長度的聲音。
波表W合成可以產生比調頻算法合成真實得多得音質,但它仍受限於固定的樂器集。而且,一種樂器會因為不同的硬體廠商對其的實現不同,從而聽起來因硬體而異。
DLS( downloadable sounds 不知如何譯) 標準由MIDI Manufacturers Association(MIDI 生產商協會)制訂。DLS 基本上是一種基於實時採樣啟動波表合成而不是把它固化在系統中的方法。描述樂器的數據被下載(download)到合成器中,然後這個樂器就完全能象別的MIDI樂器一樣演奏。因為 DLS 數據可以被作為套用的一部分,所以開發者們就能確信他們的音軌在任何一個系統上都能保持一致,而且,能不受限於他們所選擇的樂器。
DLS 樂器根據一個或多個數字採樣創建,典型地代表了一個音調(pitch),這個音調即將被合成器所修改以生成別的音調。使用多次採樣來使樂器能在大範圍的音調里聽起來都真實。當 DLS 樂器被下載後,每個採樣都對應於一定範圍的音調,叫做音區(region)。通常不會超過16個音區。
另外,採樣還需給出發音信息(articulation),它定義了譬如爆發(attach)(一個音符可多快達到最高音量),衰減(decay)(從最高音量下來可以由多快),和別的使聲音聽起來更象發自於真實的樂器的特徵。
Downloadable sounds 儲存在樂器集( instrument collections)中,從這兒它們被下載到合成器中。
DLS 樂器被指派好patch 數並象別的MIDI樂器一樣回響MIDI訊息。然而,DLS 樂器不用屬於通用MIDI集。事實上,它根本就不表示一個具體的樂器,一段語音或是一曲完整的樂曲,都可以變成DLS 樂器。
更多的關於 DLS 集合樂器如何被創建的信息,見DirectMusic Producer的文檔。關於如何在套用中使用DLS的信息,見使用Downloadable Sounds。
Microsoft Software Synthesizer(Microsoft軟體合成器)
Microsoft Software Synthesizer 由DirectMusic 提供且是預設的連線埠。Synthesizer 根據一段MIDI訊息流創建波形格式,使用了DSL採樣合成的樂器音色。這些採樣的預設值從Roland GS 集中得到,這也是DirectMusic 安裝的一部分。
注意
Roland GM/GS 集是不能被修改的。
在當前的DirectMusic發行版本中,合成器通過在一個想DirectSound
混音器傳送其輸出的DLL實現。
Microsoft軟體合成器包含混響功能,默認情況下處於打開狀態。Waves TrueVerb混響技術作為SimpleVerb實施授權給Microsoft。
微軟的direct music 自帶的microsoft synthesizer軟體波表合成器,支持win7 64位系統,自帶混響功能。雖然在win7下面已經不支持選擇波表,但是估計微軟默認也把這個軟體波錶帶進win7 系統中。奇怪的是,早期的midi播放軟體,甚至是win95和win31下面的播放軟體,可以調用這個系統自帶的軟體波表合成器,而且效果很好。