如何在Matlab中使用GUI做一個簡易音樂播放器? ---- (五)Callback(下)

這一篇寫音量的實時調節!

開始讓我做這個功能,我是拒絕的;

因為audioplayer結構體中沒有和音量掛鉤的屬性,要做到實時調節音量,只能「曲線救國」:

調用系統的音量調節看似可行,但那樣就不是純粹的matlab實現了;而使用純matlab實現,就需要改變原信號振幅,並用player = audioplayer()重新定義player;

當時的我想:讀取歌曲信息初始化播放器時都要花上好幾秒,這樣對信號加工再重定義播放豈不是很慢?用戶體驗豈不是很糟糕?用戶體驗糟糕的功能我們當然是選擇拒絕了啊;

直到一次 @蔣挺 蔣老師讓我對程序用tic,toc的計時中duang地一下發現:

對三個語句分別進行計時(單位:s)

可以看見,原來讀取歌曲時的主要時間都用在了第一句上,後面兩部分佔用時間較少,而實時調節音量按之前最初的想法實現也主要只需要後面兩個語句;想到這裡,是不是突然感覺可行性變高了?

那開始嘗試實現這個功能:

六、音量的實時調節

開啟復讀機模式,再說一遍這個控制項的思路:

  1. 當滑動音量滑動條時,觸發volumeSlider的CallBack
  2. 觸發後,第一件事是獲取歌曲的原信號信息(記得在前面的回調函數中在讀取歌曲信息時將這個信息傳遞出來哦
  3. 對原信號振幅進行加工(其實就是將信號信息直接進行乘除...
  4. 用新信號重新用audioplayer()定義player(記得在後面@playertimerfcn哦
  5. 播放,這樣就完成了。

乍一看好像運行起來還是很慢,實際用tictoc結構操作運行一下試一下調整音量的運行時間能否達到要求?

(以下四個msgbox是在四次調整音量中不同的運行時間(單位:s),個人認為這個反應速度已經達到合適的用戶體驗了

平均響應時間不超過0.6s

附上整個volumeSlider控制項的代碼和tictoc起始位置(真正使用時記得把這部分計時器和msgbox刪掉

function VolumeSlider_Callback(hObject, ~, handles)
global player
tic %開始計時
%獲取當前播放位置
currentSample = get(player,CurrentSample);
%這是讀取前面存儲的信息!要存了這裡才能讀取
songinfo = getappdata(0,songinfo);
%加工歌曲信號信息
volumeC = get(hObject,value)/songinfo.ref_volume;%我的ref_volume默認為50
%這裡可以乘一遍,也可以乘兩遍,乘兩遍調節範圍更大一些
yC = volumeC*volumeC*songinfo.y;
set(handles.VolumeEdit,String,round(get(hObject,Value)));
pause(player);%stop和pause都可以
player = audioplayer(yC,songinfo.fs);
set(player,TimerFcn,{@PlayerTimerFcn, handles});
%斷點播放
play(player,currentSample);
tt= toc; %計時結束
msgbox(num2str(tt)); %彈出記載所用時間的文本框

根據個人使用體驗,調整速度和斷點續播的位置的精確度都是達到了使用體驗的要求的。

(旁邊為了使用體驗,還添加了一個edit控制項,同樣用於輸入音量;或者也用於在滑動volumeSlider後具體反映當前音量大小。由於這個控制項對於實施音量調節並不是必要的,而且實現起來的難度更小一些,這裡就不說了。

到此為止,所有基礎的使用過的控制項都有了實現方法,將各個部分組合起來,就組成了像第一篇文章標題那樣的一個音樂播放器;大象就裝進冰箱里了。


另外,關於信號處理的問題:

因為人耳所能感受到的聲音與聲壓或信號振幅的數學關係是指數關係(關於更多這方面的信息有興趣的可以看下面這一篇維基百科的中文翻譯

Decibel - Wikipedia?

en.wikipedia.org圖標

圖via維基百科,dB是分貝,右邊是振幅

也就意味著,當信號振幅變大兩倍時,通過人耳,人並沒有感覺到聲音變大了兩倍,而大概只有一點幾倍,也就意味著對信號振幅只能由0到2倍的調節是遠遠不足的。

為了能通過播放器調整更大的聲音,就將變動幅度做了一個平方處理,也就是將原信號振幅的調節幅度變為了0到4倍,算是為用戶體驗做出了一定的貢獻(?)

callback篇就到此為止了,其中如果有不懂的小細節也可以來問我

(本篇的參考那一篇寫在上面了


推薦閱讀:

TAG:MATLAB | GUI設計 | 音樂播放器(軟體) |