|
樂(lè)曲聲音算法
一首音樂(lè)是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂(lè)了,當(dāng)然對(duì)于單片機(jī)來(lái)產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來(lái)產(chǎn)生這樣方波頻率信號(hào)
4.1音樂(lè)頻率的實(shí)現(xiàn):
1.要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時(shí)間,然后利用計(jì)時(shí)器計(jì)時(shí)此半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O反相,如此就可在I/O腳上得到此頻率的脈沖.
2.利用8051的內(nèi)部計(jì)時(shí)器讓其工作在計(jì)數(shù)模式MODE1下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同的頻率.
3.例如以6MHZ晶振為例:要產(chǎn)生頻率為523HZ,其周期T=1/523=1912us,其半周期為1912/2=956us,因此只要令計(jì)數(shù)器計(jì)時(shí)956us/1us=956.所以在每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523HZ).
計(jì)數(shù)脈沖值與頻率的關(guān)系公式如下:
N=Fi+2+Fr N:計(jì)數(shù)值
Fi:內(nèi)部計(jì)時(shí)一次2us,以6MHZ晶振為例,故其頻率為500000HZ
Fr:要產(chǎn)生的頻率
4.其計(jì)數(shù)值的求法如下:
T=65536-N=65536-Fi/2/Fr
例如:求低音DO(261HZ),中音DO(523HZ),高音DO(1046HZ) 的計(jì)數(shù)值?
設(shè)K=65536 F=500000=Fi=0.5MHZ
T=65536-N=65536-Fi/2/Fr=65536-500000/2/Fr=65536-250000/Fr
低音DO的 T=65536-250000/262=64582
中音DO的 T=65536-250000/523=65058
高音DO的 T=65536-250000/1047=65297
5. C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表:
音符 頻率HZ 6MHZ 十六進(jìn)制值 音符 頻率HZ 6MHZ 十六進(jìn)制值
低1DO 262 64582 FC46 #4FA# 740 65198 FEAE
#1DO# 277 64634 FC7A 中5SO 784 65217 FEC1
低2RE 294 64686 FCAE #5SO# 831 65235 FED3
#2RE# 311 64732 FCDC 中6LA 880 65252 FEE4
低3M 330 64779 FD0B #6LA# 932 65268 FEF4
低4FA 349 64820 FD34 中7SI 988 65283 FF03
#4FA# 370 64860 FD5C 高1DO 1046 65297 FF11
低5SO 392 64898 FD82 #DO# 1109 65311 FF1F
#5SO# 415 64934 FDA6 高2RE 1175 65323 FF2B
低6LA 440 64968 FDC8 #2RE# 1245 65335 FF37
#6LA# 466 65000 FDE8 高3M 1318 65346 FF42
低7SI 494 65030 FE06 高4FA 1397 65357 FF4D
中1DO 523 65058 FE22 #4FA# 1480 65367 FF57
#1DO# 554 65085 FE3D 高5SO 1568 65377 FF61
中2RE 578 65103 FE4F #5S0# 1661 65385 FF69
#2RE# 622 65134 FE6E 高6LA 1760 65394 FF72
中3M 659 65157 FE85 #6LA# 1865 65402 FF7A
中4FA 698 65178 FE9A 高7SI 1976 65409 FF81
"#"表示半音,用于上升或下降半個(gè)音
4.2音樂(lè)節(jié)拍的實(shí)現(xiàn):
每個(gè)音符使用1個(gè)字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,如果1拍節(jié)為0.4秒則1/4拍是0.1秒,只要設(shè)定延遲時(shí)間就可求得節(jié)拍的時(shí)間,再來(lái)我們假設(shè)1/4拍為1 DELY單位,則1拍應(yīng)為4個(gè)DELY,以此類(lèi)推,只要求得1/4拍的DELY單位時(shí)間,其余的節(jié)拍就是它的倍數(shù).
1/4拍的延遲時(shí)間=0.187秒
DELAY:MOV R7,#02H
D2:MOV R4,#31H
D3:MOV R3,#0F1H
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY ;R5存節(jié)拍數(shù)
RET
各調(diào)值1/4節(jié)拍的時(shí)間設(shè)定 各調(diào)值1/8節(jié)拍的時(shí)間設(shè)定
曲調(diào)值 DELAY 6MHZ(H) 曲調(diào)值 DELAY 6MHZ(H)
調(diào)4/4 125亳秒 3E 調(diào)4/4 62亳秒 1F
3/4 187 5D 3/4 94 2F
2/4 250 7D 2/4 125 3E
建立音樂(lè)的步驟: 1.先找出樂(lè)曲的最低音,最高音范圍,然后確定音符表首地址.
2.如把音符表建在 0151H,適用簡(jiǎn)譜范圍為 低音1 到 高音1. 3.簡(jiǎn)譜碼(音符)為高4位,節(jié)拍碼(節(jié)拍數(shù))為低4位,音符節(jié)拍碼放在程序的0300H處.本程序有關(guān)約定:根據(jù)不同曲調(diào),可以建立不同簡(jiǎn)譜音符表0151H- 為一簡(jiǎn)譜音符表首地址適用簡(jiǎn)譜范圍 低音1 到 高音10159H- 為一簡(jiǎn)譜音符表首地址適用簡(jiǎn)譜范圍 低音5 到 高音5 0300H- 為第一首歌曲首地址,字節(jié)高位為音符代碼,低位為節(jié)拍代碼組成簡(jiǎn)譜曲碼. 003EH 為歌曲DPH高位首地址,0041H為歌曲DPL低位首地址002FH 為節(jié)拍速度代碼; 0073H 為音符表低位地址 ,高位地址為01H,不可改動(dòng)0047H 內(nèi)容為該首放音二次,01為放音1次. 008DH 改為00H,則反復(fù)放該首曲(調(diào)試時(shí)用).樂(lè)曲存放約定:曲碼中00H表示上首曲結(jié)束標(biāo)記;接著為下首曲節(jié)拍速度值,再接著為該首曲音符表首地址,然后才是樂(lè)曲曲碼,全部樂(lè)曲結(jié)束標(biāo)記為連續(xù)兩個(gè)單元是00H 00H各調(diào)值節(jié)拍時(shí)間代碼表(6MHZ晶振時(shí))曲調(diào)值 節(jié)拍速度值4/4 3EH 3/4 5DH
因此,我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)系弄正確即可�,F(xiàn)在以單片機(jī)12MHZ晶振為例,例出高中低音符與單片機(jī)計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如下表所示
完整的Word格式文檔51黑下載地址:
基于單片機(jī)AT89C51的簡(jiǎn)易電子琴系統(tǒng)畢業(yè)設(shè)計(jì)(論文).doc
(413.5 KB, 下載次數(shù): 43)
2018-12-21 00:24 上傳
點(diǎn)擊文件名下載附件
|
|