MATLAB 是科學(xué)計(jì)算軟件,同時(shí)也提供了圖形、聲音等多媒體展示特性和人機(jī)交互特性。利用這些特性,很容易完成復(fù)雜的任務(wù),例如寫(xiě)一個(gè)鋼琴 APP,將電腦的鍵盤(pán)當(dāng)成鋼琴的琴鍵,發(fā)出悅耳的聲音。
實(shí)現(xiàn)以上功能的核心代碼和語(yǔ)法知識(shí)包括:
腳本和函數(shù)的概念
全局變量
switch流程
sound函數(shù)
figure的屬性和回調(diào)函數(shù)
這些都可以在 MATLAB 基本語(yǔ)法的幫助文檔(中文)中找到詳細(xì)說(shuō)明:
將代碼打包成 App 需要用到 MATLAB Compiler:
首先,要知道 MATLAB 中“發(fā)聲”的方法,最簡(jiǎn)單的是 sound 函數(shù)。這里將聲音的采樣頻率設(shè)為和一般 mp3 文件一樣的 44100 Hz,將一個(gè)音符的時(shí)間設(shè)定為 0.4 s,以音階 do 的頻率 261.63 Hz 為例,發(fā)出一段聲音。聲音的包絡(luò)線,其目的在于模擬一個(gè)音符漸響和漸輕的過(guò)程。
Fs=44100; %mp3標(biāo)準(zhǔn)采樣品頻率
T=0:Fs^-1:4e-1; %假定每個(gè)聲音持續(xù)0.4s
A=sin(2*pi/8e-1*T); %聲音振幅包絡(luò)
a=A.*sin(2*pi*261.63*T); %do的時(shí)域波形
sound(a,Fs)
也可以用 plot(T,a) 觀察波形。
對(duì)于其他音階,設(shè)定不同的頻率,于是就可以獲得一系列的音符,他們隨時(shí)可以放進(jìn) sound 中進(jìn)行發(fā)聲。
a=A.*sin(2*pi*261.63*T);
s=A.*sin(2*pi*293.66*T);
d=A.*sin(2*pi*329.63*T);
其次,要知道 MATLAB 中怎么用鍵盤(pán)實(shí)時(shí)控制,這樣才是一個(gè)真正的鋼琴 App。較為簡(jiǎn)單的方法是利用 figure 的 KeyPressFcn 屬性。建立一個(gè)圖形,在選中圖形的情況下,只要鍵盤(pán)被按下,就會(huì)執(zhí)行一個(gè)函數(shù)(通常稱為回調(diào)函數(shù)),在這個(gè)函數(shù)中通過(guò) sound 發(fā)聲。
fig=figure('KeyPressFcn','sound(a,Fs)');
再次,要在回調(diào)函數(shù)中判斷剛才按下的是哪個(gè)鍵,并決定讓 sound 發(fā)出哪個(gè)聲音。這是一個(gè)典型的 switch 流程。而 switch 的判斷依據(jù)則是 figure 的 'CurrentChar' 屬性,可以通過(guò) get 函數(shù)來(lái)獲得。
args=get(fig,'CurrentChar');
switch args
case'a'
sound(a,Fs)
case's'
sound(s,Fs)
此時(shí),顯然回調(diào)函數(shù)不會(huì)那么簡(jiǎn)單,需要單獨(dú)封裝并命名,例如叫mysound。而為了使剛才定義的Fs等變量可以在mysound中使用,需要聲明他們?yōu)槿肿兞?,即?/p>
function mysound
global Fs z x c ……
最后,進(jìn)行適當(dāng)?shù)拿阑ㄟ^(guò) rectangle 函數(shù)畫(huà)出矩形琴鍵,通過(guò) text 函數(shù)標(biāo)注音階和鍵盤(pán)的對(duì)應(yīng)。同時(shí),在回調(diào)函數(shù)中,根據(jù)不同的鍵盤(pán)輸入,對(duì)矩形進(jìn)行一定的顯示變化,通過(guò) pause 函數(shù)控制這種變化的持續(xù)時(shí)間,就很像一個(gè)鋼琴 App 了。
附件使用方法:在 MATLAB 工作路徑中,放置 mymusic 腳本和 mysound 函數(shù)兩個(gè)文件,在 Command Window 中運(yùn)行 mymusic,按鍵盤(pán)發(fā)聲。
當(dāng)然,也可以繼續(xù)在 Command Window 中運(yùn)行。
sound([a a g g h h g zeros(size(a)) f f d d s sa],Fs)
來(lái)聽(tīng)一小段音樂(lè),enjoy~
App 如何脫離 MATLAB 運(yùn)行?這里需要用到 MATLAB Compiler,僅需點(diǎn)擊幾次鼠標(biāo)即可:
點(diǎn)擊:APPS -> Application Compiler
點(diǎn)擊:Add main file,選擇 mymusic
點(diǎn)擊:Files required for your application to run,選擇 mysound
這兩步的目的是告訴 MATLAB 需要打包的腳本和這個(gè)腳本調(diào)用的函數(shù)。
點(diǎn)擊:package,一路確定即可。
軟件打包完成后,可以關(guān)閉 MATLAB。在彈出的 for_testing 目錄下找到 mymusic 的 exe 文件,雙擊即可執(zhí)行。
這樣就完成了一個(gè)鋼琴 App,可以分享給其他小伙伴。
-
人機(jī)交互
+關(guān)注
關(guān)注
12文章
1246瀏覽量
56411 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28938
發(fā)布評(píng)論請(qǐng)先 登錄
基于Matlab與FPGA的雙邊濾波算法實(shí)現(xiàn)

OptiSystem應(yīng)用:用MATLAB組件實(shí)現(xiàn)振幅調(diào)制
通過(guò)御控APP實(shí)現(xiàn)PLC遠(yuǎn)程調(diào)試與遠(yuǎn)程監(jiān)控
普源示波器如何連接MATLAB實(shí)現(xiàn)數(shù)據(jù)采集與分析
MATLAB如何助力全球巨頭實(shí)現(xiàn)智能化突破

如何使用MATLAB實(shí)現(xiàn)一維時(shí)間卷積網(wǎng)絡(luò)

如何運(yùn)用MATLAB來(lái)控制DLP4500?
有沒(méi)有什么方案能實(shí)現(xiàn)直接用matlab或python調(diào)用D4100_usb.dll?
如果pattern是32*32的,用matlab怎么選擇dmd的活躍區(qū)域?
OptiSystem應(yīng)用:用MATLAB組件實(shí)現(xiàn)振幅調(diào)制
用MATLAB或者C語(yǔ)言開(kāi)發(fā)FPGA有什么問(wèn)題嗎
分享兩則MATLAB和Simulink助力教學(xué)案例

評(píng)論