複製鏈接
請複製以下鏈接發送給好友

DirectMusic

鎖定
DirectMusic™ 是DirectX® API的音樂部分。與DirectSound® API對數字音頻採樣的捕獲和回放不同, DirectMusic 處理基於消息機制的、在硬件或軟件合成器中轉換為波形樣本的音樂數據。
外文名
DirectMusic
定    義
DirectX® API的音樂部分

目錄

DirectMusicDirectMusic

這篇文檔包括了以下的Microsoft® DirectMusic™ 應用程序接口 (API)的主題:
* 關於 DirectMusic
* 為什麼使用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 兼容於 Windows® 95, Windows 98, 和 Windows 2000.
為什麼使用 DirectMusic?
DirectMusic API 滿足了在計算機平台上傳遞音樂的基本要求:
* 回放效果一致性。由於使用DLS標準,一個應用可以使其中的樂器聲在所有不同的機器上聽起來都是這件樂器本身不變的聲音。
* Jitter-free timing. 基於MIDI的音樂的回放可以精確到兩毫秒。
* 可擴展性。DirectMusic 沒有把開發商限制在一個基礎特性集之中。
還有,DirectMusic 為簡化程序開發和豐富用户的體驗提供了重要的特性:
* 簡單的讀入和播放音樂機制,與具體的實現技術細節無關。DirectMusic 支持標準的MIDI 文件,音樂段, 以及第三方技術。
* 多重播放機制。多個音樂片段可以用完全獨立的時間片、樂器集等同時播放。
* 超過16個MIDI 通道。通過把播放通道映射到通道組,DirectMusic 突破了16 通道的限制,可以同時播放任意數量的聲音,只取決於合成器的上限。.
* 對DLS 的自動管理。
* 動態、交互的回放。在DirectMusic Producer的幫助下,DirectMusic播放引擎可被用來生成動態音樂音軌和儲存創作素材。而且樂曲直到在被播放才會確認它的最終格式,在這以前都可以對程序時間作響應。
* 通過使用一個主時鐘控制,可以使所有的樂曲回放同步。
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 消息,被放到隊列中,按時間戳順序處理。

DirectMusic注意

不能保證有相同時間戳的消息將以特定的順序處理。
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下面的播放軟件,可以調用這個系統自帶的軟件波表合成器,而且效果很好。