• 沒有找到結果。

主旋律的萃取與表示法

第二章 相關研究

3.1 主旋律的萃取與表示法

MIDI 檔案是以 Binary 的格式儲存資料,在 1.3 中我們已經詳加介紹過 MIDI 的儲存格 式。Binary 的格式並不容易直接處理,所以我們利用 MIDI parser 將 MIDI 檔案剖析成其他 較容易使用的資料格式。如圖 3.2 所示,我們所使用的 MIDI parser 會將 MIDI 檔案的 Binary 資料轉換成文字型態的資料。

MIDI 檔案並不是直接紀錄音符的資訊,而是紀錄許多個 Events,包含 MIDI 的系統資 訊與音符的資訊等。一個音符利用兩種特定的Events,Onset event 與 Offset event 分別來表 示開始演奏與結束演奏。所以,我們將Events 的資訊,轉換成音符的資訊,以音符的序列 表達音樂。我們將MIDI 檔案轉成以音符表示的序列<note1, note2, …, notem>,每個 notei表 示一個音符,包含有(onseti, pitchi, di)。onseti表示音符開始發聲的時間;pitchi代表音高;di

代表音長。

Track 1:

tick 0: Sequence/Track Name: Right Hand tick 0: channel 2: program change 3

tick 386: channel 2: note On 60 velocity: 127 tick 435: channel 2: note Off 60 velocity: 0 tick 576: channel 2: note On 60 velocity: 127 tick 769: channel 2: note Off 60 velocity: 0 tick 770: channel 2: note On 64 velocity: 127 tick 943: channel 2: note Off 64 velocity: 0 圖 3.2:經過 Parser 處理後的 MIDI 資料。

例如圖 3.2 經過 MIDI Parser 處李後的資料,我們以音符表示的結果為<(386, 60, 49), (576, 60, 193), (770, 64, 173) >。針對(386, 60, 49),圖 3.2 中我們可以找出 tick 386 是音高

60 開始發音的時間,接著 tick 435 是音高 60 結束發音的時間,所以我們可以計算出 60 這 個音的音長為49 個 Tick time。另外兩個音符(576, 60, 193)與 (770, 64, 173)分別是由 tick 576、tick769 與 tick770、tick 943 所決定。圖 3.2 中的兩個 Tick 0 events 與音樂內容沒有直 接關係的資訊。

一般音樂包含的內容有主旋律以及伴奏。為了能夠探勘出音樂的主題,我們必須針對 主旋律的部分做擷取。因此,我們需要將主旋律從原始音樂資料中擷取出來。而且,音樂 的主旋律不完全固定在同一個MIDI track 中演奏,可能會再多個 MIDI tracks 裡輪流出現。

所以我們在轉換MIDI events 表示法成音符表式的序列時,同時對音樂做主旋律擷取。主旋 律是作曲家希望呈現的主題,而伴奏只是為了襯托或修飾主旋律的部分。通常主旋律會比 伴奏明顯,因此我們要將音樂中較明顯的音符擷取出來當作主旋律。由於大部分的音樂會 同時包含主旋律與伴奏,我們在對音樂主題資料做分析時,不需要去考慮伴奏的部分。

主旋律擷取是參考Uitdenbogerd [46] 等人擷取主旋律的方法,她們提出了 All-mono、

Entropy-channel、Entropy-part 與 Top-channel。All-mono 的方法將一首音樂的所有 MIDI tracks 資料結合成一個,此時會有許多音符有重疊在一起。然後保留同時開始發音中,音高最高 的音符作為主旋律。Entropy-channel 方法是計算各別 MIDI track 的 Entropy,保留 Entropy 最高的MIDI track 當作主旋律。Entropy-part 的方法是將每一個 MIDI track 以固定長度,如:

一個小節,切成多個部份,擷取主旋律時,選擇Entropy 最高的部份。Top-channel 的方法 與前面一個方法相似,同樣將每一個MIDI track 以固定長度切成多個部份,選擇平均音高 最高的部份當作主旋律。根據Uitdenbogerd 實驗的結果,以 All-mono 方法擷取出來主旋律 效果最好。所以,我們修改All-mono 的方法來做主旋律的擷取。

原本All-mono 的擷取方法是不考慮發聲音符音長,而我們修改成考慮發音的音長。如 圖 3.3 所示,a 的部份表示兩個聲部,以原本 All-mono 的方法從這兩個聲部擷取出主旋律,

最後會得到b 的結果。由圖 3.3 第二與第三小節我們可以觀察到,這個方法並沒有考慮一 個音符持續發音的情形。舉例來說,a 的兩個聲部中,高音的聲部在第二小節的第一個音符 為兩拍的音符,這個音符會持續發音至第二小節的第二個音開始發音為止。All-mono 的方 法並不會考慮持續發音的狀況,只考慮同一時開始發音的音符。這樣一來主旋律會被其他 伴奏的聲部影響。

我們修改原本的方法加入考慮持續發音的情形,原本 a 的兩個聲部擷取主旋律的結 果,會如圖 3.3 中 c 的結果。圖 3.4,長條代表一個音符,虛線處代表新的 Event 發生。一 個音樂序列,如果以我們修改的 All-mono 方法做主旋律擷取時,必須考慮虛線上,所有 Event 所發生的改變。經過我們修改的 All-mono 方法,最後找出的主旋律為圖 3.4 中,有 顏色的部分。

我們修改後的做法如下。首先,將一首MIDI 檔案的所有 MIDI Tracks 合成一個 MIDI Track。接著我們依時間順序處理 MIDI Track 中 Event 的資料。只要有新的 Onset event 或 Offset event 發生時,就必須重新檢查目前的最高音,並且記錄下來。如圖 3.4 所示,每一 個長條代表一個音符,虛線的地方代表Onset 或 Offset Events 發生處,最高音的改變都只 會在新的Event 發生處。如此,我們對同一時間的 Event 做處理,也將每一個發音的音長考 慮進去。最後,我們可以得到一個序列 S = <note1, note2, …, notem>表示音樂的主旋律。圖 3.5 是我們所修改的All-mono 演算法,我們依時間的順序,處理經過 MIDI parser 剖析的資料,

圖 3.3:All-mono 的範例。

圖 3.4:All-mono 主旋律擷取示意圖。

a

b

c

Pitch

Time

找出屬於主旋律的音符。我們先選擇出目前發音的音符中,最高的音。然後用目前 Onset 與Offset 的 Events 去設定發音音符的狀態。如果最高的音符已經結束發音或者最高的音符 改變,則輸出前面我們所選擇的最高音符到結果的序列中。

擷取出來的主旋律,我們又分別以兩個不同的旋律表達方法做處裡。第一種,用原始 音長表示主旋律節奏資訊的Original duration representation。第二種,用 Inter Onset Interval 的方法表示主旋律節奏資訊的IOI duration representation。在擷取主旋律的步驟之後,我們 計算主旋律中,連續兩個音發生的時間間距。以<(386, 60, 49), (576, 60, 193), (770, 64, 173) >

為例,(386, 60, 49)與(576, 60,193)兩個音的開始發生時間間距為 576 – 386 = 190。所以,我 們原本音符的資料(386, 60, 49),以 IOI duration representation 的表達方法表示為(386, 60, 190)。

相關文件