基于MATLAB的音樂電子琴制作_第1頁
基于MATLAB的音樂電子琴制作_第2頁
基于MATLAB的音樂電子琴制作_第3頁
基于MATLAB的音樂電子琴制作_第4頁
基于MATLAB的音樂電子琴制作_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

..基于MATLAB的音樂電子琴制作簡述:電子琴的每個音階均對應(yīng)一個特定頻率的信號,通過調(diào)用數(shù)字信號發(fā)生器產(chǎn)生一系列指定的頻率的聲音,從而達到虛擬的電子琴的功能。本次設(shè)計是基于MATLABGUI程序?qū)崿F(xiàn)的一個音樂鍵盤仿真系統(tǒng)。1功能介紹總體設(shè)計框圖如下圖所示,其包括單音鍵盤發(fā)音模塊,音效長短的選擇模塊,包絡(luò)的選擇模塊,實現(xiàn)鍵盤代替鼠標(biāo)輸入模塊,雙音多頻模塊,演奏音樂模塊,播放歌曲,視頻模塊包括對文件播放的暫停,停止和復(fù)位,多鍵盤輸入對輸入后統(tǒng)一播放模塊和畫圖模塊。Matlab的數(shù)據(jù)采集工具箱<DAT>提供了一系列的函數(shù)和命令來實現(xiàn)實時模擬信號的輸出,通過調(diào)用這些函數(shù)和命令可以直接控制聲卡輸出虛擬信號。只需要一臺帶有普通多媒體聲卡并安裝了Matlab軟件的計算機就可以滿足要求實現(xiàn)虛擬信號的輸出,系統(tǒng)結(jié)構(gòu)簡單方便。交互界面如圖1所示:圖1程序的交互界面1.1功能模塊1單音鍵盤發(fā)音模塊設(shè)計一個帶參子函數(shù)實現(xiàn)鍵盤的發(fā)音功能,當(dāng)實現(xiàn)需要實現(xiàn)音階的播放時,只要調(diào)用這個子函數(shù),并根據(jù)不同音階、不同音調(diào)的頻率改變子函數(shù)的參數(shù)即可。2>音效長短的選擇模塊制作一個buttongroup的組控件分別選擇不同的控件實現(xiàn)不同的音效長短,音效的長短是通過改變播放一個音階的時間長短來實現(xiàn)的。3包絡(luò)的選擇模塊制作一個buttongroup的組控件分別選擇不同的控件實現(xiàn)不同的包絡(luò),在模塊一的基礎(chǔ)上,設(shè)置選中不同的控件分別對應(yīng)不同的包絡(luò),x為不同包絡(luò)〔如正弦波、三角波、指數(shù)等的表達形式,將x與模塊一中實現(xiàn)單音鍵盤發(fā)音的函數(shù)相乘時便可實現(xiàn)不同形式的衰減,實現(xiàn)音型的改變。4實現(xiàn)鍵盤代替鼠標(biāo)輸入模塊根據(jù)計算機鍵盤上的不同按鍵對應(yīng)不同的ASCII碼的值,利用函數(shù)get<>獲取當(dāng)前所按下的數(shù)字鍵對應(yīng)的ASCII碼的值,根據(jù)ASCII碼的值判斷對應(yīng)是按下鍵盤的值。并執(zhí)行相應(yīng)音階的功能鍵。5雙音多頻模塊通過設(shè)置一個radiobutton來實現(xiàn)雙音多頻的功能,設(shè)置一個全局變量,當(dāng)選中該控件時,全局變量的值改變,即在帶參的子函數(shù)中增加它的頻率分量。就可以實現(xiàn)雙音多頻功能。6演奏音樂模塊通過設(shè)置一個pushbutton鍵來實現(xiàn),按下該鍵時,可以選擇事先自己編好的txt的文檔,通過這個文檔就可以播放音樂。7播放歌曲,視頻模塊根據(jù)matlab提供的函數(shù),視頻時首先對文件的名字和路徑進行提起,直接對文件的播放。音樂的則是首先對文件的名字和路徑進行提起,得到名字和路徑后就對該文件進行采樣,使其離散化。最后實現(xiàn)對文件的播放。8多鍵盤輸入對輸入后統(tǒng)一播放模塊該功能實現(xiàn)先對鍵盤輸入內(nèi)容進行存儲,當(dāng)輸入完成后就可以按播放鍵對剛才的存儲內(nèi)容進行播放,本功能通過radiobutton鍵實現(xiàn)的鍵盤輸入的存儲,當(dāng)該建被選中時,則會不斷的掃描鍵盤是否有鍵盤按下,并對按下鍵進行存儲,直到該鍵沒有被選中為止,同時設(shè)置一個pushbutton鍵對存儲的信息進行播放,播放完成后自動清除存儲的內(nèi)容,以便下一次存儲。9畫圖模塊該模塊的功能是根據(jù)播放每一個音符的數(shù)組畫出每一個音符的波形,使我們對播放的音型可以一目了然,便于觀察與分析。2功能實現(xiàn)程序由兩個部分組成:MATLAB代碼〔.m文件和GUI圖形〔.fig。備注:軟件版本:MATLABR2011b2.1單音鍵盤發(fā)音模塊根據(jù)要求,首先利用pushbutton鍵作為單音鍵盤的發(fā)音鍵。1~7七個音階對應(yīng)高中低三種不同的音調(diào)共21個鍵,還有15個輔音,共36個按鍵。如圖2所示,白色的按鍵代表音調(diào)鍵,前7個是低音的七個音階,中間7個是中音的七個音階,后面7個是高音的七個音階,黑色的代表輔音。查閱相關(guān)資料可知,發(fā)音頻率對應(yīng)的表達式為f=440*2^<<s-49>/12>,當(dāng)所發(fā)音為低音時s的取值為31~37,發(fā)中音時s的取值為40~46,發(fā)高音時s的取值為49~55。為了程序設(shè)計簡化目的,設(shè)計一個名為gangqin<s>的子函數(shù)。有以上帶參的子函數(shù)后則每個鍵盤下面的程序非常簡單,然后在每個pushbutton鍵的callback函數(shù)中調(diào)用該子函數(shù)即可,如gangqin〔45;圖2單音鍵盤發(fā)音模塊具體代碼參見:functiongangqin<s>音效長短的選擇模塊制作一個buttongroup的組控件分別選擇不同的控件實現(xiàn)不同的音效長短,該組控件包括三個radiobutton分別對應(yīng)不同的音效長短〔長,中,短。音效長短的改變實質(zhì)上是改變其音階播放時間的長短,定義一個全局變量T通過改變T的值來改變音效的長度,gangqin的子函數(shù)如上面所示。界面如圖3所示:圖3音效長短的選擇模塊具體代碼參見:Functionyinxiao_Callback<hObject,eventdata,handles>2.2包絡(luò)的選擇模塊制作一個buttongroup的組控件分別選擇不同的控件實現(xiàn)不同的包絡(luò),該組控件包括三個radiobutton分別對應(yīng)不同的包絡(luò)。如圖4所示,定義了方波、三角波和正弦波三種不同形式的包絡(luò)可供選擇。圖4包絡(luò)的選擇模塊將組合鍵中的buttongroup鍵的Tag的值設(shè)置為"baol",三個radiobutton鍵分別對應(yīng)指數(shù)波、三角波、正弦波,相應(yīng)的Tag設(shè)"zhishu"、"sanjiao"、"zhengxian",def=get<de,'tag'>獲取三個RadioButton鍵中Tag的值,設(shè)置一個全局變量p,用switch函數(shù)實現(xiàn),當(dāng)case為'zhishu'時,p的值1;case為'sanjiao'時,p的值2;case為'zhengxian'時p的值為3。把p的值反應(yīng)到gangqin〔s的子函數(shù)中,在子函數(shù)中根據(jù)不同的p的值選用不同的包絡(luò),即可實現(xiàn)不同的包絡(luò),所發(fā)出的音型便不一樣。由于電子琴的實驗結(jié)果是聲音,難以用文字表達,在下面僅用幾張圖片展示一下結(jié)果。圖5正弦波包絡(luò)圖6方波包絡(luò)圖7三角波具體代碼參見:Functionbaoluo_Callback<hObject,eventdata,handles>2.3實現(xiàn)鍵盤代替鼠標(biāo)輸入模塊用一個radiobutton鍵便可實現(xiàn)該功能,可以根據(jù)不同的鍵盤按鍵發(fā)出不同的音樂。同時將該鍵的string改為"鍵盤",表示這個鍵是實現(xiàn)鍵盤的功能。如圖8所示:圖8鍵盤代替鼠標(biāo)輸入根據(jù)計算機鍵盤上不同鍵對應(yīng)的ASCII碼的值不同,利用函數(shù)get<>獲取當(dāng)前所按下的鍵對應(yīng)的ASCII碼的值,并執(zhí)行相應(yīng)播放音階。具體代碼參見:functionjianpan_KeyPressFcn<hObject,eventdata,handles>2.4雙音多頻模塊通過設(shè)置一個radiobutton來實現(xiàn)雙音多頻的功能,當(dāng)選中該按鈕時,則增加它的頻率分量。使其含有豐富頻率分量。如圖9所示:圖9雙音多頻模塊具體代碼參見:functionduopin_Callback<hObject,eventdata,handles>2.5演奏音樂模塊通過設(shè)置一個pushbutton鍵來實現(xiàn),如圖10所示:圖10播放譜曲按下該鍵時,界面會要求你選擇文檔,可以選擇事先自己編好的txt的文檔,選中該文檔,并按打開鍵就可以播放音樂。txt文件的內(nèi)容如圖11所示:圖11樂譜內(nèi)容Txt文件代表的意思是如‘441’,是表示頻率為44,延長的長度為1播放音樂不僅需要確定每個音符,還要確定每個音符延長的時間,音符延長的時間是有n的取值大小所確定的。因此這里就可以調(diào)用子函數(shù)的形式方便的實現(xiàn)。具體代碼參見:functionqinpu<a,b>functiondakai_Callback<hObject,eventdata,handles>2.6播放歌曲,視頻模塊本功能的實現(xiàn)是通過pushbutton鍵來實現(xiàn)的。界面如圖12所示:圖12播放歌曲視頻模塊通過按下播放歌曲鍵或者播放視頻鍵就可以選擇播放的文件,界面如圖13所示:按打開按鈕就可以播放音樂或視頻。圖13播放視頻視頻時首先對文件的名字和路徑進行提起,直接對文件的播放,用的是matlab自帶的函數(shù)implay〔。音樂的則是首先對文件的名字和路徑進行提起,得到名字和路徑后就對該文件進行采樣,使其離散化。最后實現(xiàn)對文件的播放。這里不僅可以對音樂的播放,還可以對音樂的暫停,復(fù)位和停止。分別用到matlab自帶的函數(shù):播放play〔,暫停pause〔,復(fù)位resume〔和停止stop〔。具體代碼參見:functionshipin_Callback<hObject,eventdata,handles>functionchangge_Callback<hObject,eventdata,handles>2.7多鍵盤輸入后統(tǒng)一播放模塊本功能通過radiobutton鍵實現(xiàn)的鍵盤輸入的存儲,當(dāng)該建被選中時,則會不斷的掃描鍵盤是否有鍵盤按下,并對按下鍵進行存儲,直到該鍵沒有被選中為止,同時設(shè)置一個pushbutton鍵對存儲的信息進行播放,播放完成后自動清除存儲的內(nèi)容,以便下一次存儲。界面如圖14所示:圖14多鍵盤輸入后播放該功能實現(xiàn)先對鍵盤輸入內(nèi)容進行存儲,當(dāng)輸入完成后就可以按播放鍵對剛才的存儲內(nèi)容進行播放,播放完成后對存儲的內(nèi)容進行清空。實現(xiàn)對鍵盤的輸入內(nèi)容進行存儲,并把存儲的值整合到數(shù)組y內(nèi),pushbutton鍵是對上述存儲的信息進行讀取,識別并播放。具體代碼參見:functionjianc_KeyPressFcn<hObject,eventdata,handles>functionbf_Callback<hObject,eventdata,handles>2.8畫圖模塊通過axse控件實現(xiàn)繪圖,繪出播放每個音階的波形,并把畫出的波形顯示到axse上,界面如圖15所示:圖15音階的波形該模塊的功能是根據(jù)播放每一個音符的數(shù)組畫出每一個音符的波形,并把其顯示在界面上。具體代碼參見:functionaxes1_CreateFcn<hObject,eventdata,handles>3程序總結(jié)本程序?qū)崿F(xiàn)簡單的音頻處理功能及便捷的圖形化交互界面。具有以下特點與缺陷:1、圖形化用戶交互界面簡潔明了。右側(cè)放置音頻視頻播放的各選項控件,且從上到下的排布體現(xiàn)操作步驟;上側(cè)顯示音頻文件的數(shù)據(jù)波形。提示信息豐富,方便操作。2、程序可擴展性好,方便功能擴展。未盡功能:〔1沒有調(diào)節(jié)音量大小的按鈕,可以優(yōu)化?!?聲音播放時,實時的顯示播放進度。〔3更為實際的音頻處理功能待加強。4課程總結(jié)整個制作和調(diào)試過程都是按模塊進行的,對每一個模塊功能的實現(xiàn)的情況下才對下一個功能進行制作。剛開始做模塊一時,由于沒有想到后面的一些功能所以就沒有寫子函數(shù),是在每一個按鍵下都寫了一個聲音播放的程序,這樣做不僅量大也很不方便。因此后面改成了子函數(shù)的形式,這樣的話程序不僅簡練也很好調(diào)用,非常方便。在調(diào)試過程中先將函數(shù)gangqin<s>中的全局變量p的不同數(shù)字代表不同的波形表達式,鼠標(biāo)點擊包絡(luò)組控件的不同按鈕,選擇不同的包絡(luò),聽起來的效果也相差較大,當(dāng)包絡(luò)為指數(shù)形式時較符合平時聽音樂的習(xí)慣。還有一個是gangqin〔s中的全局變量T,不同的值表示不同的音效長短。播放的時間是不一樣的,因此聽起來會有不同的感覺。調(diào)試過程中應(yīng)根據(jù)相關(guān)資料和自己的感覺不斷改變這兩個值的數(shù)字,最終選擇一個聽起來較為合適的取值。上述完成后就需要做鍵盤代替鼠標(biāo)按鍵的功能,首先需要了解按下鍵盤電腦獲得的是按鍵的ASCII值。所以我們必須把按鍵的ASCII的值對應(yīng)到播放不同音符的頻率上去,這樣才能靈活的控制每一個音符,每個音符要與鍵盤的按鍵形成一一對應(yīng)關(guān)系,不然的話程序很容易出錯。程序完成后,需要對程序進行調(diào)試,使得每一個鍵盤的按鈕按下對應(yīng)的音符會播放出來。接下來制作的是鍵盤的存儲功能,即實現(xiàn)對鍵盤的多輸入,輸入過程中音符是不會響的,當(dāng)輸入結(jié)束后可以控制對剛才輸入的按鍵對應(yīng)的音符進行播放聲音。剛開始是一直對數(shù)字的存儲個數(shù)會多很多,后面才知道但你按下鍵時程序已經(jīng)運行了好多遍了,每次按鍵是當(dāng)然就會存儲多個相同的值。改進后就一直只能對最后一次按鍵進行存儲,前面的被當(dāng)前的值覆蓋,后面設(shè)置了一個存儲數(shù)據(jù)的數(shù)組進行存儲,使得功能才能實現(xiàn)。本次課程設(shè)計,我花了大量的時間來做這些功能,但是做完后感覺功能又特別簡單,而且做的大部分時間都是做一些無用的工作,程序一直不夠簡單,經(jīng)常用一條很長的程序來實現(xiàn)一個簡單的功能,做完過后發(fā)現(xiàn)可以用簡單的程序就可以實現(xiàn),整個制作過程中大部分的時間都花在這樣的工作上,工作效率很低。同時感覺到自己對matlab的編程了解太少,很多基本功能多不了解。完成實踐后我深深的體會到了MATLAB功能的強大,它不但可以實現(xiàn)對聲音信號的處理,對圖像的處理,同時還可以對視頻,wav格式歌曲的播放以及還有很多我現(xiàn)在還不知道的很多強大的功能。在實驗過程中,遇到了很多問題。首先是資料的缺乏,沒能找到老師推薦的《信號與系統(tǒng)—MATLAB綜合實驗》,所以大部分的參考資料只能上網(wǎng)查找沒有什么權(quán)威性。還有自己對matlab的了解本來就很淺,很多知識都不懂,經(jīng)常需要問老師,同學(xué)或者上網(wǎng)查資料。在設(shè)計剛開始沒有什么明確的思路導(dǎo)致經(jīng)常改GUI界面,最后實在無法改了就重新設(shè)計,思路很不明確,希望在以后的學(xué)習(xí)和工作中能好好利用這次實踐的經(jīng)驗,要先想好總體思路,不能到臨時才改,這樣的話,不僅工作量大,還耗時多。本次實踐使我受益匪淺。附錄〔部分程序functiongangqin<s>%演奏音符globalr;globaln;globalff;globalT;globalp;f=440*2^<<s-49>/12>;%各音階的頻率n=0:1/8000:T;%各音階的長短ifp==1%選用包絡(luò)x=exp<-3*n>;elseifp==2x=exp<-3*n>.*sawtooth<2*pi*50*n>;elseifp==3x=exp<-3*n>.*sin<2*pi*n>;endifr==1%選用單頻還是多頻ff=x.*sin<f*2*pi*n>+0.2*x.*sin<f*4*pi*n>+0.05*x.*sin<f*8*pi*n>;elseff=x.*sin<f*2*pi*n>;endaxes1_CreateFcn<>;%畫圖soundsc<ff>;%播放音符Functionyinxiao_Callback<hObject,eventdata,handles>globalT;g=get<handles.yinxiao,'selectedobject'>;%獲得音效的選中對象gt=get<g,'tag'>;%把對象賦給gtswitchgt%確認(rèn)選中的對象case'duanyin'T=0.3;case'zhongyin'T=1;case'changyin'T=2;EndFunctionbaoluo_Callback<hObject,eventdata,handles>globalT;globaln;globalp;de=get<handles.baol,'selectedobject'>;%獲得包絡(luò)選中的對象def=get<de,'tag'>;%把選中對象的tag賦給defswitchdefcase'正弦波'x=0:0.001:1;y1=A*sin<2*f*pi*x+c>;plot<x,y1>;case'三角波’x=0:0.001:1;y2=A*sawtooth<2*pi*f*x+c>;plot<x,y2>;case'方波'x=0:0.001:1;y3=A*square<2*f*pi*x+c>;plot<x,y3>;endfunctionjianpan_KeyPressFcn<hObject,eventdata,handles>s=get<handles.jianpan,'value'>;%獲得按下鍵的值ifs==0%看radiobutton是否按下elseifget<gcf,'CurrentCharacter'>==48gangqin<28>;elseifget<gcf,'CurrentCharacter'>==49gangqin<29>;elseifget<gcf,'CurrentCharacter'>==50gangqin<30>;elseifget<gcf,'CurrentCharacter'>==51gangqin<31>;elseifget<gcf,'CurrentCharacter'>==52gangqin<32>;elseifget<gcf,'CurrentCharacter'>==53gangqin<33>;elseifget<gcf,'CurrentCharacter'>==54gangqin<34>;elseifget<gcf,'CurrentCharacter'>==55gangqin<35>;elseifget<gcf,'CurrentCharacter'>==56gangqin<36>;elseifget<gcf,'CurrentCharacter'>==57gangqin<37>;elseifget<gcf,'CurrentCharacter'>==65gangqin<38>;elseifget<gcf,'CurrentCharacter'>==66gangqin<39>;elseifget<gcf,'CurrentCharacter'>==67gangqin<40>;elseifget<gcf,'CurrentCharacter'>==68gangqin<41>;elseifget<gcf,'CurrentCharacter'>==69gangqin<42>;elseifget<gcf,'CurrentCharacter'>==70gangqin<43>;elseifget<gcf,'CurrentCharacter'>==71gangqin<44>;elseifget<gcf,'CurrentCharacter'>==72gangqin<45>;elseifget<gcf,'CurrentCharacter'>==73gangqin<46>;elseifget<gcf,'CurrentCharacter'>==74gangqin<47>;elseifget<gcf,'CurrentCharacter'>==75gangqin<48>;elseifget<gcf,'CurrentCharacter'>==76gangqin<49>;elseifget<gcf,'CurrentCharacter'>==77gangqin<50>;elseifget<gcf,'CurrentCharacter'>==78gangqin<51>;elseifget<gcf,'CurrentCharacter'>==79gangqin<52>;elseifget<gcf,'CurrentCharacter'>==80gangqin<53>;elseifget<gcf,'CurrentCharacter'>==81gangqin<54>;elseifget<gcf,'CurrentCharacter'>==82gangqin<55>;elseifget<gcf,'CurrentCharacter'>==83gangqin<56>;elseifget<gcf,'CurrentCharacter'>==84gangqin<57>;elseifget<gcf,'CurrentCharacter'>==85gangqin<58>;elseifget<gcf,'CurrentCharacter'>==86gangqin<59>;elseifget<gcf,'CurrentCharacter'>==87gangqin<60>;elseifget<gcf,'CurrentCharacter'>==88gangqin<61>;elseifget<gcf,'CurrentCharacter'>==89gangqin<62>;elseifget<gcf,'CurrentCharacter'>==90gangqin<63>;endfunctionduopin_Callback<hObject,eventdata,handles>globalr;r=get<handles.duopin,'value'>;%多頻的按鈕是否選中ifr==1%選單頻還是多頻ff=x.*sin<f*2*pi*n>+0.2*x.*sin<f*4*pi*n>+0.05*x.*sin<f*8*pi*n>;elseff=x.*sin<f*2*pi*n>;Endfunctionqinpu<a,b>%播放不同延長音的音符a表示音階的頻率b表示延長音的長度globalr;globaln;globalff;f=440*2^<<a-49>/12>;n=0:1/8000:b*0.5;%延長不同的長度x=exp<-2*n>;ifr==1%選用單頻還是多頻播放ff=x.*sin<f*2*pi*n>+0.2*x.*sin<f*4*pi*n>+0.05*x.*sin<f*8*pi*n>;elseff=x.*sin<f*2*pi*n>;endaxes1_CreateFcn<>;%畫圖soundsc<ff>;%播放音符functiondakai_Callback<hObject,eventdata,handles>[name,path]=uigetfile<'*.*',''>;%讀取文件file=sprintf<'%s%s',path,name>;de=importdata<file>;%讀取文件的數(shù)據(jù)fork=1:length<de>qinpu<de<k>,de<k+length<de>>>;%按文件數(shù)據(jù)播放音符endfunctionshipin_Callback<hObject,eventdata,handles>%播放視頻程序[name,path]=uigetfile<'*.*',''>;file=[path,name];implay<file>;functionchangge_Callback<hObject,eventdata,handles>globalyinl;[name,path]=uigetfile<'*.*',''>;%打開文件file=[path,name];[y,fs,bits]=wavread<file>;%對打開的wav文件進行采樣yinl=audiopl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論