MIDI(樂器數(shù)字接口)是一種電子樂器之間以及電子樂器與電腦等設(shè)備之間的統(tǒng)一交流協(xié)議。該協(xié)議是一個(gè)二進(jìn)制形式的音樂描述語言,每一個(gè)描述樂器演播動(dòng)作的字都賦給一個(gè)特定的二進(jìn)制代碼,通過它指示樂器即MIDI設(shè)備做什么和怎樣做,如演奏音符、加大音量、生成音響效果等。
由于MIDI本身不是聲音信號(hào),而只是讓聲音設(shè)備產(chǎn)生聲音的一系列的指令,所以MIDI文件本身非常小,特別適用于對(duì)存儲(chǔ)容量有限制的手持設(shè)備,如手機(jī)和掌上電腦。本文將著重介紹如何在手持信息終端嵌入式系統(tǒng)平臺(tái)上實(shí)現(xiàn)MIDI的播放。
MIDI的基本原理
MIDI文件主要由MIDI消息組成。MIDI消息又可分成通道消息和系統(tǒng)消息兩大類,如圖1所示。
圖1 MID I消息的組成 從上面的描述中,
可以看到MIDI實(shí)際上只是一組數(shù)字信號(hào),并不包括聲音信號(hào),它記錄的是音樂在什么時(shí)間用什么音色發(fā)多長的音等等。MIDI音樂每個(gè)樂音是由三個(gè)要素組成的:音色、音高(音調(diào))和音長??梢园迅鞣N樂器的音色先錄下來,然后給每個(gè)音色編號(hào),如鋼琴編為00;再給音高編號(hào),如C5編為49;然后是音符播放的時(shí)間的編碼,如把8分音符編號(hào)為60。此時(shí),數(shù)字串“00 49 60”就表示演奏的是鋼琴的C5音,演奏時(shí)間為8分音符。MIDI在播放時(shí),會(huì)根據(jù)MIDI文件紀(jì)錄的樂曲信息向預(yù)先錄制好的樂器(如鋼琴)的波表發(fā)出指令,從波表中找出對(duì)應(yīng)的聲音信息,經(jīng)過合成、加工后再回放出來,就形成了美妙的音樂。
手持信息終端軟硬件平臺(tái)
手持信息終端包括手機(jī)、個(gè)人數(shù)字助理(PDA)、掌上電腦(HPC)等等,它們可以實(shí)現(xiàn)多種功能,如PIM(電話簿、日程安排、備忘錄、記事本、時(shí)鐘)、計(jì)算器、錄音、辭典、游戲和播放音樂等功能;也可以加入無線通信的功能,如電話、短信、無線Email等等;還可以通過數(shù)據(jù)線與PC相連,互通數(shù)據(jù)、進(jìn)行備份和數(shù)據(jù)交換。
該手持信息終端平臺(tái)采用的是業(yè)界流行的Motorola公司的MC68EZ328處理器;存儲(chǔ)模塊由4M字節(jié)的Flash閃存和2M字節(jié)的EDO DRAM組成;顯示模塊采用160×240的16級(jí)灰度的黑白屏,屏上合成有四線電阻式觸摸屏。音頻處理模塊的作用是用來播放音樂,它由兩部分構(gòu)成:濾波電路和音頻功率放大電路。該模塊接受來自處理器內(nèi)部輸出的PWM脈沖信號(hào)和音頻模塊的開啟關(guān)閉的控制信號(hào)。硬件平臺(tái)的結(jié)構(gòu)如圖2所示。
圖2 手持信息終端的硬件平臺(tái)結(jié)構(gòu)
該手持信息終端是以自主研發(fā)的多任務(wù)嵌入式操作系統(tǒng)AsixOS為基礎(chǔ),包括操作系統(tǒng)(Asix OS)、驅(qū)動(dòng)程序包(Driver)、應(yīng)用程序包(Application)、圖形用戶接口(AsixWIN)、圖形庫軟件包(AsixGPC)、嵌入式數(shù)據(jù)庫(AsixDB)、嵌入式文件系統(tǒng)(AsixFS)、網(wǎng)絡(luò)協(xié)議軟件包(Asixnet)等等。Asix模塊原理框圖如圖3所示。
圖3 Asix模塊原理框圖
由圖可以看出,音頻驅(qū)動(dòng)模塊是播放MIDI音樂的基礎(chǔ),它控制硬件設(shè)備的打開關(guān)閉等等操作;音頻服務(wù)層是連接應(yīng)用程序和底層驅(qū)動(dòng)的樞紐,它包含了對(duì)底層操作的接口;應(yīng)用程序是整個(gè)手持終端產(chǎn)品的具體功能的體現(xiàn),MIDI播放器是其中一個(gè)用來測(cè)試MIDI播放的小應(yīng)用程序,它是建立在音頻服務(wù)模塊和音頻驅(qū)動(dòng)模塊基礎(chǔ)之上的。
MIDI播放的實(shí)現(xiàn)
MIDI的播放需要軟硬件協(xié)同工作,要播放MIDI文件,首先必須對(duì)MIDI文件進(jìn)行解碼:若是控制信息(如節(jié)拍、時(shí)間格式等等),則進(jìn)行相應(yīng)的控制;若遇到音符信息,則將相應(yīng)的數(shù)據(jù)(音符代碼、時(shí)間值)存儲(chǔ)在音頻緩沖區(qū)。
解碼完成后,聲音處理程序?qū)?duì)音頻緩沖區(qū)中的音頻數(shù)據(jù)進(jìn)行處理,根據(jù)音符代碼從各個(gè)軟波表中取出相應(yīng)音符的真實(shí)采樣值送往音頻設(shè)備,再由音頻設(shè)備的濾波電路進(jìn)行濾波排除電路中的高低頻干擾,然后再經(jīng)過音頻放大電路對(duì)音頻信號(hào)進(jìn)行放大,驅(qū)動(dòng)喇叭放出音樂,音樂時(shí)間的長短則根據(jù)音頻緩沖區(qū)中記錄音符長短的數(shù)據(jù)來控制音頻設(shè)備的開啟和關(guān)閉來實(shí)現(xiàn)。
由于手持信息終端存儲(chǔ)容量的限制,該手持信息終端的軟波表只包含了大鋼琴(Acoustic Grand Piano)的一種音色,具有3階音色(12×3個(gè)音符)。該軟波表采用16kb/s和8bit的采樣率進(jìn)行錄制,每個(gè)音符采樣0.5秒,即每個(gè)音符占有8000個(gè)字節(jié),所以整個(gè)軟波表的大小為12×3×8000=288K字節(jié),這樣的大小對(duì)于手持信息終端來說應(yīng)該是可以承受的。
聲音處理程序是利用MC 68EZ328的定時(shí)功能和PWM輸出功能來實(shí)現(xiàn)的。PWM具有三種工作模式:回放(playback)模式、單音調(diào)(tone)模式、D/A模式。由于tone模式發(fā)出的聲音的頻率比較單一,不能達(dá)到真實(shí)樂器的效果,所以采用了回放模式?;胤拍J绞抢密洸ū韥韺?shí)現(xiàn)的,它根據(jù)真實(shí)樂器的采樣值進(jìn)行回放,從而能達(dá)到比較真實(shí)的效果。
MIDI播放的實(shí)現(xiàn)在硬件上是由兩部分組成的:M68EZ328內(nèi)部的PWM模塊和外部濾波放大電路。具體原理如下:
PWM(脈沖寬度調(diào)制)是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過對(duì)方波的占空比調(diào)制來對(duì)一個(gè)模擬信號(hào)的電平進(jìn)行編碼。
音頻處理的外圍電路比較簡單,它主要用來處理由PWM輸出的MIDI音樂,由濾波電路和音頻功率放大電路組成。MC68EZ328內(nèi)部具有PWM輸出電路,經(jīng)過一個(gè)由兩級(jí)運(yùn)算放大器構(gòu)成的濾波電路,濾除噪聲后取出音樂信號(hào);濾波后的信號(hào),在經(jīng)過功率放大電路放大后,推動(dòng)揚(yáng)聲器發(fā)出音樂聲。為了減小功耗,音頻功率放大電路和濾波電路都有使能控制信號(hào)控制,當(dāng)需要播放音樂時(shí)將電路使能,平常關(guān)閉該模塊。
軟件的實(shí)現(xiàn)
通過對(duì)軟件平臺(tái)的介紹,可以知道Asix OS是一個(gè)嵌入式的多任務(wù)實(shí)時(shí)操作系統(tǒng),所有應(yīng)用程序都是通過任務(wù)調(diào)度機(jī)制來實(shí)現(xiàn)的。因此要實(shí)現(xiàn)MIDI的播放需要軟件在以下三個(gè)層次給予支持:音頻驅(qū)動(dòng)模塊、音頻服務(wù)模塊、應(yīng)用程序(MIDI播放器)。當(dāng)點(diǎn)擊應(yīng)用程序(如MIDI播放器)后,操作系統(tǒng)就會(huì)進(jìn)行任務(wù)調(diào)度,然后啟動(dòng)相應(yīng)的服務(wù)模塊(音頻服務(wù)模塊),通過服務(wù)模塊再調(diào)用底層驅(qū)動(dòng)來播放MIDI音樂。下面將具體闡述一下各模塊的功能和實(shí)現(xiàn):
該模塊是MIDI能夠播放聲音的基礎(chǔ),它直接和底層硬件相關(guān),通過CPU中PWM模塊的一些寄存器來實(shí)現(xiàn)聲音設(shè)備的打開關(guān)閉等操作。它通過聲音服務(wù)模塊被所有的需要發(fā)音的程序所調(diào)用,是所有發(fā)音程序得以正常工作的基礎(chǔ)。
它由以下幾個(gè)子模塊組成:PWM音頻設(shè)備初始化模塊;PWM音頻設(shè)備回放率配置模塊;PWM音頻設(shè)備啟動(dòng)模塊和關(guān)閉模塊;PWM音頻設(shè)備工作模式選擇模塊。
該模塊屏蔽了底層的驅(qū)動(dòng),為應(yīng)用程序訪問音頻設(shè)備提供了統(tǒng)一的接口,使用戶無需關(guān)心底層的具體實(shí)現(xiàn)即可以完成聲音設(shè)備的控制,使之具有較好的移植性。它主要通過消息機(jī)制來實(shí)現(xiàn),為應(yīng)用程序和底層驅(qū)動(dòng)模塊的通信提供了一個(gè)橋梁,從而避免了直接和硬件打交道。服務(wù)層主要由定時(shí)播放模塊、定長播放模塊和配置模塊組成。
音頻服務(wù)模塊是播放MIDI的關(guān)鍵,它處于承上啟下的作用,用于連接上層的應(yīng)用程序和底層的設(shè)備驅(qū)動(dòng)。該模塊中MIDI解碼子模塊完成對(duì)MIDI文件的解釋,并得到最終要播放的音符信息和各種控制信息鏈表,由于MIDI的解碼涉及到MIDI文件的規(guī)范協(xié)議和具體的算法,這里不作詳細(xì)的描述。
音頻服務(wù)模塊提供兩個(gè)層次的接口,面向應(yīng)用程序的接口和面向底層的接口。
服務(wù)模塊的接口工作原理如圖4所示。
圖4 服務(wù)模塊接口
MIDI播放模塊包括MIDI播放器(用來測(cè)試MIDI播放的應(yīng)用程序之一),此外還可以在手機(jī)鈴聲、信息提示音、筆觸音等等程序中實(shí)現(xiàn)MIDI的播放,但其實(shí)現(xiàn)原理基本上都是一樣的。除了界面上的設(shè)計(jì),主要就是調(diào)用MIDI服務(wù)模塊提供的幾個(gè)接口函數(shù)即可實(shí)現(xiàn)MIDI的播放,這里不作詳細(xì)介紹。
結(jié)語
本文的手持信息終端平臺(tái)經(jīng)過實(shí)際測(cè)試,播放效果令人滿意,能夠和一般的手機(jī)鈴聲相媲美。由于MIDI文件的體積較小,正好可以彌補(bǔ)手持信息終端存儲(chǔ)容量小的缺陷,因此它具有廣闊的應(yīng)用前景。