• 沒有找到結果。

第三章 系統架構

第二節 使用者端

圖 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=deacT =aadeacbΣ =

{

a,b,c,d,e

}

,現在 將Σ 改為兩兩字元相減後得到最大與最小的值分別做為 Σ 的 upper bound 與 lower

bound,即Σ =

{

-4,-3,-2,-1,0,1,2,3,4

}

,再將搜尋音符P 改為前面音符減掉後面 音符的差值,即P=-1 4 -2,而改變後的位元向量S 也就如圖 3-9 所示。 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

圖 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

相關文件