第三章 系統架構
第二節 使用者端
圖 3-8 使用者端程式介面
I
II III
IV V
VI
VII
我們用 Borland C++ Builder 撰寫一個程式,提供使用者端做音樂檢索,其介 面如圖 3-8 所示。在圖 3-8 中有標示羅馬數字的說明如下:
I. 連線前需輸入比對端的 IP 位址。
II. 可讓使用者選擇要容許幾個錯誤,目前此系統允許 0~10 個錯誤可供選 擇。
III. 輸入想要搜尋的音樂內容,目前最多能輸入 32 個搜尋音符,輸入完後 點擊下面的試聽按鈕可供試聽。
IV. 輸入音樂檢索內容的格式說明,這裡是用簡譜的形式輸入。
V. 可開啟 MIDI 檔來讀入要檢索的音樂片段。
VI. 使用者除了可用簡譜輸入之外,也能利用程式上面的鋼琴介面來彈奏音 樂片段。
VII. 接收比對完的結果之後將 match 的歌曲列出,依照錯誤數目由小到大排 列,在列出的歌曲上方點擊左鍵兩下即可撥放試聽歌曲。
在前一節中有提到,使用者端會利用公式(2.2)將查詢樣本 P 轉換為位元向量
|
| ..., 1, ,k = Σ
Sk ,同樣為了符合「音調無關」,我們必需將Σ 重新定義成兩兩字元 的差值,只是因為Σ 的變動我們需將資料庫的建置,以及位元向量S 稍作修改。k 這裡我們簡單以實例說明,假設P=deac、T =aadeacb則Σ =
{
a,b,c,d,e}
,現在 將Σ 改為兩兩字元相減後得到最大與最小的值分別做為 Σ 的 upper bound 與 lowerbound,即Σ =
{
-4,-3,-2,-1,0,1,2,3,4}
,再將搜尋音符P 改為前面音符減掉後面 音符的差值,即P=-1 4 -2,而改變後的位元向量S 也就如圖 3-9 所示。 kSymbol sk s1 = -4 s2 = -3 s3 = -2 s4 = -1 s5 = 0 s6 = 1 s7 = 2 s8 = 3 s9 = 4
Bit Vector Sk S1[i] S2[i] S3[i] S4[i] S5[i] S6[i] S7[i] S8[i] S9[i]
1 0 0 0 1 0 0 0 0 0
2 0 0 0 0 0 0 0 0 1 i
3 0 0 1 0 0 0 0 0 0
圖 3-9 為了符合「音調無關」而改變的位元向量S k
最後我們再將資料庫也改成前面字元減去後面字元的差值,建立新的資料庫,即 T = 0 -3 -1 4 -2 1
若以完全比對為例,我們可以簡單判斷在T 中-1 4 -2 的地方是有 match 的,所 以用 difference 就可以解決音調不同但所搜尋的旋律卻相同的問題。
延續上面的例子,接著說明如何將查詢片段的長度與位元向量S 一併傳送至k 比對端。在圖 3-9 的位元向量S 產生之後,由上而下從k 2 、0 2 、……、1 2|P|−1將位 元向量S 的值記錄起來如圖 3-10。 k
Symbol sk s1 = -4 s2 = -3 s3 = -2 s4 = -1 s5 = 0 s6 = 1 s7 = 2 s8 = 3 s9 = 4
Bit Vector Sk S1[i] S2[i] S3[i] S4[i] S5[i] S6[i] S7[i] S8[i] S9[i]
1 0 0 0 1 0 0 0 0 0
2 0 0 0 0 0 0 0 0 1 i
3 0 0 1 0 0 0 0 0 0
0 0 4 1 0 0 0 0 2
圖 3-10 記錄位元向量S 的值 k
然後將圖 3-10 產生的數值(也就是一維陣列)前面加上查詢片段的長度之後以圖
3-11 的一維陣列傳送至 Server 端。
3 0 0 4 1 0 0 0 0 2 圖 3-11 查詢片段長度與位元向量S 合併後的一維陣列 k
由於 MIDI 格式將音符的表示以一個 byte 儲存,也就是總共有 128(0~127)個 音,如圖 3-12,而根據實驗多首歌的結果,發現在我們的系統中,所有歌曲用到 的音符不會低於 48(如圖 3-12,第四音階的 Do),最高不會超過 95(如圖 3-12,第 七音階的 Si),因此在我們的系統中,Σ 就是 ASCII code 48~95 的字元,其兩兩字 元相減後得到最大與最小的值,即Σ = {‘-47’、‘-46’、‘-45’、……、‘45’、‘46’、‘47’}。
位元向量S k 查詢片段的長度
音階
圖 3-14 查詢片段長度與位元向量S 合併後的一維陣列 k m S1 S2 S3 …… S93 S94 S95
查詢片段的長度 位元向量S k