單片(pian)機播(bo)放音樂的(de)基本(ben)知識及設計原(yuan)理(li)解析
時(shi)間:2018-07-26 來源:未知
單片機播放(fang)音(yin)樂(le)的基本知識及設計原理解(jie)析,使用(yong)單片機播放(fang)音(yin)樂(le)或播放(fang)電子(zi)琴,實際上,根據(ju)特定(ding)的頻率(lv)輸(shu)出一系列方(fang)波。為了(le)輸(shu)出適當的方(fang)波,我們(men)首先要知道音(yin)符(fu)和頻率(lv)之間的關系。
1.音名
從常(chang)見的電(dian)子琴的鍵盤談(tan)起。
在下(xia)表(biao)中(zhong),可以(yi)看到一(yi)列(lie)黑白相間的琴(qin)鍵(示(shi)意)。主要分成低音、中(zhong)音和高音三(san)個區域,每(mei)個區域都(dou)有12個琴(qin)鍵。其中(zhong)的白鍵,簡(jian)譜音符標為1、2、3、4、5、6、7,大(da)家(jia)一(yi)般都(dou)讀成哆、來(lai)、咪(mi)、發(fa)、嗦、拉、西。
2.頻率
注意看一(yi)下(xia)幾(ji)個6(拉)的(de)(de)頻(pin)(pin)率,它(ta)們(men)是(shi)(shi)整數,容易(yi)看出規律――是(shi)(shi)成2倍的(de)(de)關系。其它(ta)的(de)(de)音符,也有同樣的(de)(de)規律。這些頻(pin)(pin)率,如(ru)220、440等(deng),它(ta)們(men)在琴鍵上的(de)(de)位置(zhi)是(shi)(shi)世界統(tong)一(yi)的(de)(de),無(wu)論是(shi)(shi)鋼(gang)琴、手風(feng)琴,還是(shi)(shi)電子(zi)琴,都是(shi)(shi)一(yi)樣的(de)(de)。
包括黑(hei)鍵和白(bai)鍵在內的全部音符的頻率數值(zhi),是成“等比數列”的關系,它們(men)之(zhi)間有個公比,可以按照(zhao)“2倍”的規律推算出來。
已知最低音(yin)的(de)6(拉)的(de)頻(pin)率是220,設公比為q,那(nei)么:7的(de)頻(pin)率就是220*q*q 。
乘了兩個q,是(shi)因為6、7之間(jian)隔了個黑鍵。以此(ci)類推,兩個6之間(jian),共有12個琴鍵,所以:
低音區的6(拉(la))的頻率就是:220*q*q*q*q*q*q*q*q*q*q*q*q = 440。
馬上就可以看出,12個q相乘,等于: 440 / 220 = 2。
那(nei)么就可(ke)以求出公比:q = 2的12次方根 = 1.059463094。
用(yong)這(zhe)個(ge)公比,和已知的220進行計算,可以得出全部琴鍵所對(dui)應的頻(pin)率,如下表中(zhong)所示。
3.定時初值
頻率的(de)倒數是周期,用單片機輸出(chu)方波,應該在(zai)半個周期的(de)時刻,將輸出(chu)取反。
設(she)單片機(ji)的晶(jing)振為(wei)12MHz,那么定時器(qi)將在1us進行一次加(jia)一,加(jia)到65536就會出現(xian)中斷(duan)。據此,就可計算出定時器(qi)定時半個周期所需(xu)的初值,如下表中所示(shi)。4.音調數據表
單片機發出不同頻(pin)率的(de)方(fang)波,人聽起來,就是不同的(de)音調。
上(shang)表中的(de)(de)頻率數(shu)值(zhi),有些過多,去掉不常用的(de)(de)黑(hei)鍵(jian)頻率,只是(shi)把白鍵(jian)對應的(de)(de)數(shu)據存放(fang)在單片(pian)機中,即可(ke)滿足絕大部分的(de)(de)應用需求(qiu)。
定義音調(diao)數據表的程序如下:
DW 63625, 63833, 64019, 64104, 64260, 64400, 64524 ;低(di)音區:1 2 3 4 5 6 7
DW 64580, 64685, 64778, 64820, 64898, 64968, 65030 ;中音區:1 2 3 4 5 6 7
DW 65058, 65110, 65157, 65178, 65217, 65252, 65283 ;高音區:1 2 3 4 5 6 7
DW 65297 ;超高音:1
把這(zhe)個數(shu)據表(biao),放在(zai)程序中(zhong)(zhong),需要播音(yin)的時(shi)(shi)候(hou),就從表(biao)中(zhong)(zhong)取(qu)出一個數(shu)據送到(dao)定時(shi)(shi)器,當定時(shi)(shi)器溢出中(zhong)(zhong)斷(duan)的時(shi)(shi)候(hou),再(zai)對輸(shu)出引腳(jiao)取(qu)反(fan),那么,在(zai)揚聲(sheng)器中(zhong)(zhong),即(ji)可聽到(dao)上表(biao)中(zhong)(zhong)頻率的聲(sheng)音(yin)。
單片機的基(ji)本(ben)發音實驗
我們知道,聲音的頻(pin)譜(pu)范圍(wei)約在幾十(shi)到幾千赫茲,若能利(li)用程序(xu)來控制單處機(ji)某個口(kou)線(xian)的“高”電平(ping)或低電平(ping),則在該口(kou)線(xian)上就(jiu)能產生(sheng)一定頻(pin)率(lv)的矩(ju)形波,接(jie)上喇(la)叭就(jiu)能發出一定頻(pin)率(lv)的聲音,若再利(li)用延時程序(xu)控制“高”“低”電平(ping)的持(chi)續(xu)時間,就(jiu)能改變(bian)輸出頻(pin)率(lv),從而(er)改變(bian)音調。
例如(ru),要產生200HZ的音頻信號,按(an)圖1接(jie)入喇叭(ba)(若屬臨時實(shi)(shi)驗,也可將喇叭(ba)直接(jie)接(jie)在P1口線(xian)上(shang)),實(shi)(shi)驗程序為:
其(qi)中(zhong)子程序(xu)DEL為延(yan)時(shi)(shi)(shi)(shi)(shi)子程序(xu),當(dang)(dang)R3為1時(shi)(shi)(shi)(shi)(shi),延(yan)時(shi)(shi)(shi)(shi)(shi)時(shi)(shi)(shi)(shi)(shi)間約為20us,R3中(zhong)存放延(yan)時(shi)(shi)(shi)(shi)(shi)常數,對200HZ音(yin)(yin)頻,其(qi)周期為1/200秒,即(ji)5ms。這(zhe)樣,當(dang)(dang)P1.4的(de)高(gao)電平或低電平的(de)持續時(shi)(shi)(shi)(shi)(shi)間為2.5ms,即(ji)R3的(de)時(shi)(shi)(shi)(shi)(shi)間常數取2500/20=125(7DH)時(shi)(shi)(shi)(shi)(shi),就能(neng)發出(chu)(chu)200HZ的(de)音(yin)(yin)調(diao)。將(jiang)上述程序(xu)鍵入學(xue)習機,并持續修改R3的(de)常數能(neng)感(gan)到(dao)音(yin)(yin)調(diao)的(de)變化。樂曲(qu)中(zhong),每一音(yin)(yin)符(fu)(fu)對應(ying)(ying)著確定的(de)頻率(lv),表(biao)1給(gei)出(chu)(chu)C調(diao)時(shi)(shi)(shi)(shi)(shi)各音(yin)(yin)符(fu)(fu)頻率(lv)及(ji)其(qi)對應(ying)(ying)的(de)時(shi)(shi)(shi)(shi)(shi)間常數。讀者能(neng)根(gen)據表(biao)1所供給(gei)的(de)常數,將(jiang)其(qi)16進制代碼(ma)送入R3,反復(fu)練習體會。根(gen)據表(biao)1能(neng)奏出(chu)(chu)音(yin)(yin)符(fu)(fu)。僅這(zhe)還不夠,要準確奏出(chu)(chu)一首(shou)曲(qu)子,必須準確地控制樂曲(qu)節奏,即(ji)一音(yin)(yin)符(fu)(fu)的(de)持續時(shi)(shi)(shi)(shi)(shi)間。
音符的(de)(de)節拍(pai)我們(men)能(neng)用定時器T0來(lai)控制(zhi),送入不(bu)一樣(yang)的(de)(de)初值,就能(neng)產生(sheng)不(bu)一樣(yang)的(de)(de)定時時間。便如某歌曲(qu)的(de)(de)節奏(zou)為每分鐘94拍(pai),即一拍(pai)為0.64秒。其它節拍(pai)與時間的(de)(de)對應關系見表2。
但(dan)時(shi),由于T0的(de)(de)最大定(ding)(ding)時(shi)時(shi)間(jian)只能為131毫(hao)秒(miao),因(yin)此不可能直接用(yong)改變T0的(de)(de)時(shi)間(jian)初值來實(shi)現不一樣節拍(pai)(pai)。我們(men)能用(yong)T0來產(chan)生(sheng)10毫(hao)秒(miao)的(de)(de)時(shi)間(jian)基準,然后設置一個(ge)中斷計數器(qi),通過判(pan)別(bie)中斷計數器(qi)的(de)(de)值來控制節拍(pai)(pai)時(shi)間(jian)的(de)(de)長短。表(biao)2中也給出了各種節拍(pai)(pai)所對應(ying)的(de)(de)時(shi)間(jian)常(chang)數。例如對1/4拍(pai)(pai)音符,定(ding)(ding)時(shi)時(shi)間(jian)為0.16秒(miao),對應(ying)的(de)(de)時(shi)間(jian)常(chang)數為16(即10H);對3拍(pai)(pai)音符,定(ding)(ding)時(shi)時(shi)間(jian)為1.92秒(miao),對應(ying)時(shi)間(jian)長數為192(即C0H)。
我們將(jiang)每一(yi)(yi)音(yin)符(fu)(fu)(fu)的(de)時(shi)間(jian)常數和其(qi)對應的(de)節(jie)拍常數作為(wei)(wei)一(yi)(yi)組,按(an)次序將(jiang)樂曲中的(de)所(suo)有常數排列成(cheng)一(yi)(yi)個(ge)(ge)表(biao)(biao),然后由(you)查表(biao)(biao)程序依(yi)次取出,產生音(yin)符(fu)(fu)(fu)并控制(zhi)節(jie)奏(zou),就能(neng)實現演奏(zou)效(xiao)果(guo)。此外(wai),結束符(fu)(fu)(fu)和體(ti)止符(fu)(fu)(fu)能(neng)分別用代碼00H和FFH來(lai)表(biao)(biao)示(shi),若查表(biao)(biao)結果(guo)為(wei)(wei)00H,則(ze)表(biao)(biao)示(shi)曲子終了(le);若查表(biao)(biao)結果(guo)為(wei)(wei)FFH,則(ze)產生對應的(de)停(ting)頓效(xiao)果(guo)。為(wei)(wei)了(le)產生手彈的(de)節(jie)奏(zou)感,在(zai)某些音(yin)符(fu)(fu)(fu)(例如兩個(ge)(ge)相(xiang)同音(yin)符(fu)(fu)(fu))音(yin)插入一(yi)(yi)個(ge)(ge)時(shi)間(jian)單(dan)位的(de)頻率略有不(bu)一(yi)(yi)樣的(de)音(yin)符(fu)(fu)(fu)。
下面給出(chu)程(cheng)序序清單,可(ke)直接在TD-III型學習(xi)機(ji)上演奏,對(dui)其(qi)它不一(yi)樣型號的學習(xi)機(ji),只需對(dui)應地(di)改變(bian)一(yi)下地(di)址即可(ke)。本程(cheng)序演奏的是民歌(ge)(ge)(ge)“八(ba)月桂花遍地(di)開”,C調,節奏為(wei)94拍/分。讀(du)者也(ye)能自行找出(chu)一(yi)首(shou)(shou)歌(ge)(ge)(ge),按表1和(he)表2給定(ding)的常數,將樂曲(qu)翻譯(yi)成碼表輸入機(ji)器(qi),而(er)程(cheng)序不變(bian)。本實驗辦法簡便,即使(shi)不懂音樂的人,將一(yi)首(shou)(shou)陌生(sheng)的曲(qu)子翻譯(yi)成代碼也(ye)是易事,和(he)著機(ji)器(qi)的演奏學唱一(yi)首(shou)(shou)歌(ge)(ge)(ge)曲(qu),其(qi)趣味無窮(qiong)。

