從MIDI音樂文件中抽取旋律特征
目前,網(wǎng)絡上每天都會產(chǎn)生大量的音樂作品,音樂的推薦系統(tǒng)也種類繁多。但大多數(shù)都是根據(jù)用戶的喜好,或者是音樂的關聯(lián)來進行推薦的[1]??紤]到音樂特征本身的相似性,因此考慮從音樂本身的特征出發(fā),根據(jù)特征的相似度來給用戶推薦歌曲。然而金毅等人[2]通過研究得出結(jié)論:從聲音文件中提取旋律特征處理過程復雜、難度高,精度不如MIDI文件和模塊文件;模塊文件通用性較差,編碼格式繁多;對于MIDI文件,很多音樂的特征可以直接提取出來,這就為音樂特征的自動識別提供了極大的便利,所以采用MIDI樂曲作為提取音樂旋律的數(shù)據(jù)源。因此接下來從MIDI文件的分析入手,剖析如何從MIDI中提取特征。
MIDI(Musical Instrument Digital Interface)是一套消息的約定,它不產(chǎn)生聲音信號,而是在MIDI電纜上傳送各種MIDI消息,由接收MIDI消息的MIDI設備或其它電子裝置產(chǎn)生聲音或執(zhí)行動作[3]。
MIDI文件的格式有好多種,目前較為廣泛使用的存儲格式是后綴為.mid格式的文件,而且是標準的MIDI文件。MIDI文件通常有兩部分組成:頭塊和軌道塊。頭塊用MThd標記,軌道塊由MTrk標記,一個MIDI文件由一個頭塊和緊接的一個或者多個軌道塊組成[4]。結(jié)構(gòu)如表1所示。
2.1 頭塊(Header chunk)
頭塊出現(xiàn)在MIDI文件開頭,共有6字節(jié)組成,結(jié)構(gòu)如表2所示。
2.2 軌道塊(Track chunk)
頭塊之后是一個或多個音軌塊,軌道塊的結(jié)構(gòu)如表3所示。
表3 MIDI文件軌道塊結(jié)構(gòu)
一個MIDI事件由delta-time和MIDI消息組成,deltatime由可變長度編碼,它決定了其后MIDI消息的執(zhí)行時間。2.3 midi消息
一個MIDI消息由一個狀態(tài)字節(jié)和若干個數(shù)據(jù)字節(jié)組成。其中狀態(tài)字節(jié)最高位是1,因此值介于128到255之間;數(shù)據(jù)字節(jié)的最高位是0,因此值介于0到127之間。MIDI消息分為通道消息(Channel Message)和系統(tǒng)消息(System Message)兩類[5]。
通道消息對單一的通道起作用,利用狀態(tài)字節(jié)的低4為來表示,從0到15共有16個通道。通道消息分兩種:聲音消息和模式消息。聲音消息用于控制合成器的聲音產(chǎn)生,模式消息用于為16條通道分配聲音關系,設定單音模式和復音模式等。
表1 MIDI文件結(jié)構(gòu)
表2 MIDI文件頭塊結(jié)構(gòu)
系統(tǒng)消息應用于整個系統(tǒng)而不是特定的通道,不含有通道碼。系統(tǒng)消息分三種:公共消息、實時消息和專用消息。公共消息用于選擇歌曲、用拍子數(shù)來設定歌曲位置指針、向合成器發(fā)出旋律請求;實時消息用來設定系統(tǒng)的事實參數(shù),包括時鐘、啟動、停止定序器、從停止位置恢復定序器和系統(tǒng)復位;專用消息包含廠商特定的數(shù)據(jù),如標識、系列號、模型號及其他消息。
分析midi消息主要為了研究MIDI事件,常見的MIDI事件[6]如表4所示。
表4 常見MIDI事件
3.1 音軌名稱
對于MIDI數(shù)據(jù)文件中的每一個音軌,通常都會有一個音軌名稱標注字段,因此該音軌可以作為表征旋律音軌的特征量使用。音軌名稱可由以下事件格式中獲取”FF 03 length text”,text給出了音序器或者音軌的名稱,通常被放置在音軌的開頭。
3.2 通道號
所有的音軌消息中都帶有一個比特來記錄將本音軌的演奏送到哪個通道。MIDI有16個通道,在多音軌MIDI演奏數(shù)據(jù)中,多個通道被同時演奏。
3.3 左右聲道平衡度
每個音軌都記錄了一個Pan值,用來表示該音軌的音符在左右聲道中音量大小的比例。通常旋律音軌的發(fā)音基本處于左右聲道平衡的位置。Pan值可以由消息”0xBn 0A value”獲取,其中n表示通道號,value表示音軌的Pan值。Pan值得取值范圍是0至127,其中64代表左右聲道平衡,可以使用以下公式來定義音軌k的左右聲道平衡度:F1(k) = Pan(k)-64/127, k=1,2,3…
3.4 平均力度
通常情況下,主旋律聲部的全頻域平均能量要比其他的聲部的高,因此可以定義一個名為平均力度的特征量F2來表示音軌能量的大小。
式子中的k表示音軌號,N表示第k音軌的音符數(shù),V(k,i)表示第k音軌中第i音符的按鍵力度值,取值范圍為0-127。但是在統(tǒng)計的時候,只有那些力度值為非零的“音符開”才被計算在內(nèi)并進行排序。在同一音軌,如果出現(xiàn)同時發(fā)音的多個音符,則計算時取音高最高音符的力度值而刪除其余同時發(fā)音音符的力度值。
3.5 主音量
每個音軌都記錄了一個名為主音量的特征值,假設除了主音量特征,其他的特征值都相同,那么較好的方法是選取主音量較高的音軌作為主旋律。音量值可由“0xBn 07 size”來獲取。在該時間格式中,n表示通道號碼,size記錄該通道的主音量值,其范圍在0-127之間。結(jié)果用F3(k)來表示。
3.6 發(fā)音時間
音軌聲音消息通過在音符的開與關之間的相互切換來控制聲音,并且還能調(diào)整響度和音高等。該事件的格式如下:音符開,“0x9n note velocity”;音符關,“0x8n note velocity”。
在多音軌MIDI演奏數(shù)據(jù)中,每當多個音符在同一音軌中同時發(fā)音時,只計算其中一個音高較高的音符的發(fā)音時間。因為人們通常在同一時刻對音高較高的音符容易感知,而該音符通常是在主旋律線上的音符。
對于交叉發(fā)音,通常情況下采用從后一個音符的結(jié)束時間減去前一個音符的開始時間來表示總發(fā)音時間,而不是直接將兩個音符的持續(xù)時間相加來計算[8]。計算方法如下所示:
F4(k) = , k=1,2,…16
其中,k表示音軌號,n表示第k音軌的音符數(shù),note(i)表示音符i,note(i).end表示該音符的關時刻,note(i). start表示該音符的開時刻。
3.7 發(fā)音面積
選取音樂的特征時,音高信息也是關鍵的音符,結(jié)合音符的持續(xù)時間一起考慮在內(nèi),用發(fā)音面積的概念來表示其綜合效果。發(fā)音面積可用音高與音長的乘積來表示,而音軌的發(fā)音面積可以定義為每個音軌的發(fā)音面積之和。計算方法如下所示:
其中,note(i)表示音符i,note(i).pitch表示該音符的音高值,而note(i).duration表示該音符的音長。對于同時發(fā)音的音符,可以取音高較高的值乘以發(fā)音時間來計算發(fā)音面積。
3.8 確定主旋律
在MIDI音樂中,但音軌的比較少,更多的是多音軌的數(shù)據(jù)[9]?;谖墨I的方法可以得到不同音軌特征量對主旋律的貢獻量,因此可以從提取出的多音軌特征運算得出主旋律所在的音軌,成功率在83%以上[7]。
直接分析二進制文件較為困難,并且MIDI事件本身的復雜性和delta-time的不確定性,使程序處理起來比較困難。然而,借助于java的MIDI包的一些功能函數(shù),就可以很方便的分析MIDI文件。
MidiSystem 類提供了對已安裝的 MIDI 系統(tǒng)資源的訪問,包括諸如 synthesizer、sequencer 和 MIDI 輸入和輸出端口等設備。典型的簡單 MIDI 應用程序可通過調(diào)用一個或多個 MidiSystem 方法開始,這樣可了解已安裝的設備并獲得該應用程序中所需要的設備。通過加載midi文件可以得到一個sequence:Sequence seq = MidiSystem.getSequence(file)。通過這個sequence可以加載到軌道的數(shù)據(jù),然后對每一個軌道數(shù)據(jù)進行遍歷可以得到每個軌道的midi消息。按照如上圖所示的幾種MIDI時間以及幾個特征量的抽取方法來進行處理,可以得到比較完整的特征結(jié)果[10]。
分析MIDI文件的關鍵步驟如圖1所示,可以較為方便的得到相關的特征。
圖1 分析MIDI文件的關鍵步驟流圖
以“歌唱祖國”和“黃河頌”為例,得到的主旋律的結(jié)果數(shù)據(jù)如下表所示。
表5 “歌唱祖國”和“黃河頌”的音軌特征
在實際的操作中,主要以后五個特征按照一定的權(quán)重來進行運算。
按照java語言提供的一些功能函數(shù)可以較為方面的分析MIDI文件,然后從定義的幾個維度從MIDI文件中得到目標數(shù)據(jù),使處理MIDI文件的過程變得簡單高效。然而實際過程中大多數(shù)的MIDI文件為多音軌的,因此需要按照一定的方法從多音軌中找到能夠代表主旋律的音軌,然后分析該音軌的特征,確定MIDI音樂的特征。根據(jù)分析出來的特征向量,為后續(xù)基于特征的推薦做了準備。
[1]Alexandros Nanopoulos, Dimitrios Rafailidis, Panagiotis Symeonidis and Yannis Manolopoulos. MusicBox: Personalized Music Recommendation based on Cubic Analysis of Social Tags.
[2]金 毅, 黃 敏. 基于旋律的音樂檢索研究-旋律特征的表達和提取[J]. 信息檢索技術,2003.4,49-51.
[3]林福宗. 多媒體技術基礎[M]. 北京:清華大學出版社,2001.7,14-21.
[4]周明全, 耿國華, 王小鳳, 李鵬. 基于內(nèi)容的音頻檢索技術[M]. 北京:科學出版社,2014.8,97-99.
[5]楊軍. MIDI消息和標準MIDI文件格式剖析與應用[J].中南民族大學學報(自然科學版).2003.9:62-64 Vol. 22 Sup.
[6]潘曉利, 劉永志. 基于單片機的MIDI文件中delta-time的實現(xiàn). 現(xiàn)代計算機. 2008.1 總第二十七期.
[7]趙芳, 吳亞棟, 宿繼奎. 基于音軌特征量的多音軌MIDI主旋律抽取方法[J]. 計算機工程. 2007.1 Vol.33 No.2
[8]劉勇, 林景棟, 穆偉力. 基于H-K算法的MIDI音樂主旋律提取[J]. 計算機技術與發(fā)展. 2011.6 : 154-160 Vol.21 No.6
[9]李娟,周明全,李鵬. MIDI主旋律特征提取構(gòu)建音樂數(shù)據(jù)庫[J]. 計算機工程與應用,2011,47:124-128.
[10]秦丹. 利用C#從MIDI文件中獲取音樂旋律[J]. 電腦知識與技術. 2009.6:4281-4284 Vol.5 No.16