嵌入式MIDI文件格式解析設計與實(shí)現
關(guān)鍵字:MIDI格式解析;五線(xiàn)譜生成;電子樂(lè )譜
1 前言
隨著(zhù)計算機與電子科學(xué)的發(fā)展,傳統的閱讀方式正在發(fā)生著(zhù)天翻地覆的變化。在音樂(lè )領(lǐng)域,由于紙質(zhì)樂(lè )譜本身具有如不宜保存、查找和攜帶以及翻頁(yè)不便等缺點(diǎn),也促使許多作曲家使用作曲軟件制作音樂(lè ),使用打譜軟件來(lái)生成樂(lè )譜;但是,雖然制作音樂(lè )和生成樂(lè )譜的軟件很多,相應的閱讀樂(lè )譜的軟硬件設備卻很少,由于沒(méi)有可行的方法把樂(lè )譜顯示出來(lái),演奏者必須把已數字化的樂(lè )譜再打印到紙上,這說(shuō)明了在音樂(lè )領(lǐng)域數字化工作進(jìn)行的并不徹底。
為了可以把現有的音樂(lè )數字化工作擴展到樂(lè )譜的閱讀,又可以克服紙質(zhì)樂(lè )譜本身的缺點(diǎn),設計一個(gè)跨平臺的、便攜的、用戶(hù)友好的電子樂(lè )譜閱讀器,利用嵌入式的閱讀系統代替傳統的紙質(zhì)樂(lè )譜與譜架的組合,無(wú)疑是一個(gè)不錯的選擇。
當前可以獲得的電子版的樂(lè )譜可以分為兩種,一種是基于圖片格式的,另一種是基于數字音樂(lè )格式的。前一種主要包括jpg圖,gif圖等圖片格式,以及主要由圖片構成的pdf,chm等文檔格式,在此本文不作為重點(diǎn);后一種主要包括MIDI文件格式和一些打譜軟件所使用的專(zhuān)用格式?,F在常用的打譜軟件有很多,但分別屬于不同的公司,使用不同的且非公開(kāi)的格式,本文將著(zhù)重介紹如何支持公開(kāi)與標準化的MIDI文件格式的顯示。
2 系統分析
圖1是一個(gè)簡(jiǎn)單的五線(xiàn)譜的一部分,它具有兩個(gè)聲部,每個(gè)聲部都對應一組五線(xiàn)。五線(xiàn)譜上有各種標記,表示出五線(xiàn)譜的各種屬性。
屬性作用的對象包括:樂(lè )譜、聲部、跨越多聲部的音樂(lè )段落、單聲部的音樂(lè )段落與音符等。而從屬性作用的方法來(lái)看,屬性可以劃分成幾類(lèi):有的屬性依靠符號的水平位置或垂直位置來(lái)體現,有的屬性則依靠符號的形狀變化體現。
某些情況下,同一個(gè)屬性必須一致的出現五線(xiàn)譜的許多不同的地方,例如不同聲部的調號和、拍號在小節數相同時(shí)必須也是相同的,并且要分別標注在每個(gè)聲部。另外,有些屬性并不直接以符號的形式表示在譜上,它作用于其他的屬性上,人們可以根據其他屬性的變化推斷出來(lái)。
為了描述五線(xiàn)譜復雜的結構,同時(shí)考慮到結構的簡(jiǎn)潔性以及把這種數據結構繪制到屏幕的便捷性,本文建立了如下幾個(gè)類(lèi):Staff類(lèi)描述一個(gè)五線(xiàn)譜,Track類(lèi)描述一個(gè)聲部,Measure類(lèi)描述一個(gè)小節,Notation類(lèi)是所有符號的基類(lèi),Note、Chord、Noteblock、Rest、Tie分別描述了單個(gè)音符、和弦、音符組、休止符、延音符等符號。圖2直觀(guān)的表述了類(lèi)間的關(guān)系。
圖2 五線(xiàn)譜數據結構組織形式
考慮到五線(xiàn)譜不同聲部的小節號相同的小節具有的許多屬性都是一致的。為了降低冗余度和方便程序調用,本文為五線(xiàn)譜類(lèi)設立了不含有音符的虛擬聲部,來(lái)保存實(shí)際聲部中的公共小節信息。虛擬聲部中的小節聲明為VMeasure類(lèi),每個(gè)聲部的Measure類(lèi)都保存指向對應VMeasure類(lèi)的指針,方便小節信息的獲取。圖3顯示了虛擬聲部在五線(xiàn)譜類(lèi)中的結構。
3 MIDI文件格式解析
樂(lè )器數字接口MIDI(Musical Instrument Digital Interface)是數字音樂(lè )國際的標準,定義了計算機音樂(lè )程序、合成器及其他電子設備交換信息和電子信號的方式,解決不同電子樂(lè )器之間不兼容的問(wèn)題。MIDI文件中包含音符、定時(shí)和多達16個(gè)通道的演奏定義。文件包括每個(gè)通道的演奏音符信息:鍵通道號、音長(cháng)、音量和力度等。由于MIDI文件是一系列指令,而不是波形,它需要的磁盤(pán)空間非常少,此外對MIDI數據的編輯和修改非常靈活,可以方便地增加或刪除某個(gè)音符,或者改變音符的屬性。
3.1 格式說(shuō)明
MIDI文件中的數據劃分為若干個(gè)塊(chunk),塊是由塊標記、塊長(cháng)度和塊數據組成的。其中塊標記為4個(gè)字節的ACSII碼,塊長(cháng)度為4個(gè)字節的數值,表示塊數據域的長(cháng)度。如表1所示。
表1 MIDI文件組成
3.2 MIDI文件格式解析模塊的結構與解析流程
由于MIDI文件格式解析模塊需要完成的任務(wù)主要有理解MIDI信息、分析MIDI信息、生成五線(xiàn)譜信息幾大部分,因此可以將MIDI文件解析分作兩大塊。第一塊稱(chēng)為文件分析器,主要負責按順序閱讀MIDI文件,將各數據成分分離并分別儲存,完成底層面向文件的數據讀入和錯誤處理,保證向上層提供完整的正確的排列有序的音符信息。第二塊稱(chēng)為整合分析器,主要負責有選擇的使用文件分析器從MIDI文件中獲得的原始信息,參照一系列的規則,找出音符之間的組合關(guān)系,生成五線(xiàn)譜的邏輯內容。整體結構與處理流程如圖4所示。
3.2.1 文件分析器
頭塊中表明了MIDI文件類(lèi)型、包含軌道數和四分音符的時(shí)間增量數。頭塊的解析相對簡(jiǎn)單,但其中的文件類(lèi)型和四分音符時(shí)間增量數對解析流程影響很大。
MIDI文件類(lèi)型不同,MIDI文件內部的復雜度會(huì )有較大差別。不過(guò)MIDI文件的三種類(lèi)型之間是復雜度遞增的關(guān)系,而且前一種類(lèi)型總可以近似的看作后一種類(lèi)型的特例,所以只要面向最復雜的類(lèi)型2做好各種處理,相對簡(jiǎn)單的類(lèi)型0和1只要稍作修改即可支持。
MIDI文件中一般把四分音符的時(shí)間增量數設置為120,但MIDI文件也支持更改這個(gè)值。由于這種情況在實(shí)際應用中比較少見(jiàn),因此可以通過(guò)統一轉換為120的方式,在不影響正確性的前提條件下,降低解析的復雜度。
MIDI事件的讀取
MIDI消息的種類(lèi)很豐富,而且沒(méi)有統一的格式,這意味著(zhù)只能把每一種消息單獨處理。值得慶幸的是,不是所有的MIDI消息都跟五線(xiàn)譜有關(guān),所以要真正理解的MIDI消息實(shí)際上不是很多。要面對的最多的消息是音符打開(kāi)消息(Note-On),它的實(shí)際使用量占了所有消息的總使用量的95%以上。音符關(guān)閉消息(Note-Off)也是必須要處理的,如果不處理這種消息,會(huì )造成漏音(打開(kāi)的音符沒(méi)有對應的關(guān)閉信號而一直打開(kāi))。
由于MIDI中沒(méi)有音符的概念,因此要通過(guò)將對應的音符開(kāi)啟和關(guān)閉事件配對形成一個(gè)音符,稱(chēng)之為原始音符,之后還需要將音符開(kāi)始時(shí)間戳和結束時(shí)間戳轉換成音符開(kāi)始時(shí)間戳和音符持續長(cháng)度。
為了完成上述兩個(gè)任務(wù),使用一個(gè)大數組緩存16個(gè)通道里的128個(gè)音的狀態(tài)。在接收到音符打開(kāi)與關(guān)閉消息時(shí)進(jìn)行記錄,并同時(shí)計算開(kāi)始時(shí)間與持續時(shí)間。
Meta事件的讀取
MIDI中的Meta事件中描述的信息在五線(xiàn)譜顯示中基本上都是有用的,有些信息還起著(zhù)至關(guān)重要的作用。例如很多說(shuō)明性的文字信息,需要直接添加到五線(xiàn)譜和各音軌的屬性中。當這些說(shuō)明性信息重復出現時(shí),可以把兩段信息的文字連起來(lái),作為一條長(cháng)的信息出現。
調號和拍號信息是Meta信息中非常關(guān)鍵的兩條。調號決定了每個(gè)音符在五線(xiàn)譜上顯示的確切位置及其升降號標志,拍號決定了小節的長(cháng)度還同時(shí)影響合成音符組的規則。這些信息都是整合分析器不可缺少的重要信息。
3.2.2 整合分析器
文件分析器只能夠讀出MIDI文件中直接說(shuō)明的音符,如果直接顯示這樣的音符,得到的五線(xiàn)譜將非常難看。整合分析器的任務(wù)就是接收原始音符表與其它如拍號調號等信息進(jìn)行排列重組,生成一個(gè)正確美觀(guān)的五線(xiàn)譜。由于要分析的信息非常多,本小節僅列舉了一些相對重要的工作。
確定譜號
Meta信息里只提供了調號和拍號的信息,而同樣重要的譜號信息卻沒(méi)有提供。由于在整合分析器中的許多工作都要使用譜號信息,所以對音符的統計工作必須在進(jìn)入整合分析器之前就進(jìn)行完畢,即把對音符的統計穿插到文件分析器中。
確定譜號需要統計音軌中最高和最低音符的音高。得到了這兩個(gè)值后,便可以決定使用低音譜號和高音譜號中的一種。如果最高音和最低音相差太多,以至于使用無(wú)論使用低音譜號還是使用高音譜號都不能滿(mǎn)足要求,可以考慮將一個(gè)音軌拆成兩條五線(xiàn)顯示。
添加休止符
休止符是五線(xiàn)譜中與音符同樣重要的符號元素,而在原始音符表中只有實(shí)在的音符而沒(méi)有休止符。休止符是指在一定的時(shí)間范圍內音軌上沒(méi)有任何音處于打開(kāi)狀態(tài),所以只要監視文件分析器中的音狀態(tài)矩陣就可以判斷是非存在休止符。
小節劃分與音符的拆分組合
五線(xiàn)譜中的小節劃分對顯示來(lái)說(shuō)具有兩個(gè)作用,方便上下同步聲部樂(lè )譜對齊和在換行時(shí)保持末端對齊。由于原始音符可能完全屬于某一個(gè)小節,又或跨越若干個(gè)小節,因此就要把音符拆分成多個(gè)小的音符,并用延音符號連接他們,或者把一個(gè)小節中的幾個(gè)音符組合在一起構成和弦或者共尾音符組等情況。圖5例舉出了一種比較簡(jiǎn)單的情況,三個(gè)音符被拆分組合成了兩個(gè)和弦。
完成這一部分工作需要將原始音符表轉換為有序棧。有序棧的特點(diǎn)保證了雖然每個(gè)音符都有可能被反復插入,但是它插入的次數與整體棧規模無(wú)關(guān),只與音符的復雜度有關(guān)。在音符復雜度一定的情況下,每個(gè)棧元素被反復操作的次數接近一個(gè)常量,故整體函數仍停留在nlog(n)級別,是可以接受的。
為了降低運算量,可以利用只含有一個(gè)和弦的共尾音符組和只含有一個(gè)音符的和弦統一各種符號間的比較,把3x3=9步比較合并為兩步,降低了比較的代價(jià),大大減少了代碼量。另一個(gè)優(yōu)化之處是利用了有序棧,把時(shí)間復雜度降低到nlog(n)。
圖6展示了MIDI文件的顯示效果,限于篇幅,本文對于多連音、倚音,裝飾音等格式解析,在這里不做更詳細的說(shuō)明了。
4 總結與展望
本文討論的電子樂(lè )譜閱讀器嵌入式開(kāi)發(fā)平臺采用了基于Celeron-M的ECX平臺,顯示模塊采用了Linux平臺下的QT開(kāi)發(fā)框架。實(shí)踐證明,本文所討論的解析方法是完全可行的,系統的運行速度也是令人滿(mǎn)意的。
隨著(zhù)計算機與嵌入式系統的普及,人們的生活方式正在發(fā)生了巨大的變化,雖然本文提到的嵌入式樂(lè )譜閱讀器還沒(méi)有形成產(chǎn)品,但勢必取代現有的紙質(zhì)樂(lè )譜。另外,本系統目前只有閱讀功能,還可以增加音樂(lè )播放功能,這樣就可以進(jìn)行五線(xiàn)譜的學(xué)習,對于正處于學(xué)習階段的學(xué)生來(lái)說(shuō),是一個(gè)非常好的助手。
本文作者創(chuàng )新點(diǎn):本文所作的研究彌補了樂(lè )譜數字化的最后一個(gè)環(huán)節――數字化閱讀。盡管存在著(zhù)各種打譜軟件、作曲軟件、播放軟件,但演奏者目前還沒(méi)有一個(gè)適合的閱讀器。本文嘗試將數字化樂(lè )譜通過(guò)嵌入式閱讀設備顯示給演奏者,替代傳統笨重的紙質(zhì)樂(lè )譜,極大的減輕了演奏者的負擔。同時(shí)由于互聯(lián)網(wǎng)上存在大量的MIDI格式的文件,但五線(xiàn)譜格式的文件很少而且格式不公開(kāi),需要配備價(jià)格昂貴的專(zhuān)業(yè)軟件。而本系統可以直接將其轉換為五線(xiàn)譜閱讀,為使用者的學(xué)習工作提供了方便。
參考文獻:
[1]袁慧梅,宋宇.基于CPLD的MIDI音樂(lè )播放器的設計[J].微計算機信息,2006,11:143-145
[2]《基本樂(lè )理》,李重光,高等教育出版社,2000年1月
[3]MIDITrans - A MIDI File Transform Language Roger T.Hartley,1998
[4]Standard MIDI File(SMF) Format ,MIDI Manufacturer's Association,1999
[5]MIDI Specification version1.0, MIDI Manufacturer's Association,1999
[6]General MIDI Level 1, MIDI Manufacturer's Association,1999
評論