在這個範例中,使用者可以使用下拉式選單來選取不同的聲音檔案,來顯示波形,並可播放聲音。
首先,我們可以擺置一個圖軸和一些 UI 控制物件,如下:
接著,我們可以使用滑鼠右鍵來點選每一個 UI 控制物件,並選取「Inspect Properties」,以改變其性質,每個物件所改變的性質如下:
完成這些工作後,下一步我們要定義每個 UI 控制物件的反應命令,MATLAB 會在這些 UI 控制物件被點選時,同時呼叫每個物件所對應的反應命令。首先,我們以滑鼠右鍵點選 Close 按鈕,並選取「View Callbacks/Callback」,即可開啟 MATLAB 程式編輯器。(如果你尚未存檔,MATLAB 會要求你先存檔,才能繼續。你可以將檔案儲存成 myGUI03.m。)此程式編輯器會顯示反應命令必須加入的位置,依本例而言,Close 按鈕的 Tag 是 closeButton,所以其反應命令也必須加在函數 closeButton_Callback 之內,所加進去的命令是 close(gcbf),如下:
在這一列程式碼中,gcbf 代表產生此反應命令的視窗,因此 close(gcbf) 即是代表關閉此 GUI 介面所在的視窗。這一類的指令相當好用,可整理如下:
- gcf: get current figure (取得目前視窗)
- gca: get current axes (取得目前圖軸)
- gco: get current object (取得目前物件)
- gcbf: get callback figure (取得發號反應指令之視窗)
- gcbo: get callback object (取得發號反應指令之物件)
使用上述方法,我們可以一一加入各 UI 物件所具有的反應命令。對於下拉式選單,我們在 soundFile_Callback() 函式內所加入的程式碼如下:
value=get(hObject, 'value'); % 取得此 UI 物件的選項 switch value % 依選項來載入聲音檔 case 1 load chirp.mat case 2 load handel.mat case 3 load laughter.mat end plot((1:length(y))/Fs, y); % 畫出聲音的波形 handles.y=y; % 紀錄聲音訊號 handles.Fs=Fs; % 紀錄取樣頻率 guidata(hObject, handles); % 儲存將用於其他函式之 handles 針對上述反應命令,說明如下:
- hObject 代表此下拉式選單的物件,因此value=get(hObject, 'value') 即是此物件被選到的選項。
- 我們依選項的不同,來載入不同的聲音檔案:chirp.mat(鳥叫聲)、handel.mat(歌聲)、laughter.mat(笑聲)。載入聲音資料後,y 就是聲音資料,而 Fs 是對應的取樣頻率。
- 由於這兩個變數會在其他 UI 物件的反應命令被用到,因此我們將這兩個變數儲存在 handles.y 和 handles.Fs,這個結構變數 handles 存在於每一個反應函式,其目的即是要提供在不同反應函式之間的資料互通。
- 一旦將資料加入 handles,我們就必須使用 guidata(hOject, handles) 來更新此 GUI 介面所擁有的 handles 變數。
對於「Play Sound」按鈕,我們在 playButton_Callback() 函式內所加入的程式碼如下:
if isfield(handles, 'y') y=handles.y; Fs=handles.Fs; sound(y, Fs); end 換句話說,我們先使用 isfield(handles, 'y') 來確認 y 是不是 handles 的一個性質,若是,代表相關聲音資料已經儲存在 handles 變數內,因此我們就抓出 y 和 Fs,並用 sound(y, Fs) 來播放聲音訊號。
加入這些反應命令後,即可儲存檔案並關閉 MATLAB 編輯器,然後按下 GUIDE 面版的工具列的三角形按鈕,即可開啟可使用的 GUI 介面,如下:
若在下拉式選單選取 handel,即可畫出相關的歌聲波形,此時再按下「Play Sound」,即可聽到動聽的歌聲,(記得要開喇叭),相關畫面如下:
上述範例收錄在本章範例程式目錄內的 gui03.m 和 gui03.fig。
如果我們希望一開啟畫面,圖軸就能顯示 chirp.mat 的鳥聲波形,那麼你可以直接修改 myGUI_OpeningFcn(),此函式在產生 GUI 畫面之後,就會被呼叫一次,因此我們可以在這個函式內,先讀入 chirp.mat,然後把波形畫出來,這樣就能讓 chirp.mat 的波形在 myGUI.m 被呼叫後,就能立刻顯示在視窗內。各位讀者可以試試看!
MATLAB程式設計:入門篇