標(biāo)題: 單片機(jī)編曲程序中音樂(lè)頻率和節(jié)拍時(shí)長(zhǎng)代碼表怎么確定? [打印本頁(yè)]
作者: 七七四十九 時(shí)間: 2019-3-23 19:54
標(biāo)題: 單片機(jī)編曲程序中音樂(lè)頻率和節(jié)拍時(shí)長(zhǎng)代碼表怎么確定?
麻煩問(wèn)一下51編曲里面,音樂(lè)頻率還有節(jié)拍時(shí)間長(zhǎng)度代碼表如何確定
附上一個(gè)好的程序
- /************************************************************************
- [文件名] C51音樂(lè)程序(八月桂花)
- [功能] 通過(guò)單片機(jī)演奏音樂(lè)
-
- /**********************************************************************/
- #include <REG52.H>
- #include <INTRINS.H>
- //本例采用89C52, 晶振為12MHZ
- //關(guān)于如何編制音樂(lè)代碼, 其實(shí)十分簡(jiǎn)單,各位可以看以下代碼.
- //頻率常數(shù)即音樂(lè)術(shù)語(yǔ)中的音調(diào),而節(jié)拍常數(shù)即音樂(lè)術(shù)語(yǔ)中的多少拍;
- //所以拿出譜子, 試探編吧!
- sbit Beep = P1^5;
-
- unsigned char n=0; //n為節(jié)拍常數(shù)變量
- unsigned char code music_tab[] ={
- 0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數(shù), 節(jié)拍常數(shù), 頻率常數(shù), 節(jié)拍常數(shù),
- 0x20, 0x40, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x10,
- 0x1C, 0x10, 0x18 , 0x40,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x1C, 0x20, 0x18 , 0x20,
- 0x20, 0x80, 0xFF , 0x20,
- 0x30, 0x1C, 0x10 , 0x18,
- 0x20, 0x15, 0x20 , 0x1C,
- 0x20, 0x20, 0x20 , 0x26,
- 0x40, 0x20, 0x20 , 0x2B,
- 0x20, 0x26, 0x20 , 0x20,
- 0x20, 0x30, 0x80 , 0xFF,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x80,
- 0x20, 0x30, 0x1C , 0x10,
- 0x20, 0x10, 0x1C , 0x10,
- 0x20, 0x20, 0x26 , 0x20,
- 0x2B, 0x20, 0x30 , 0x20,
- 0x2B, 0x40, 0x20 , 0x15,
- 0x1F, 0x05, 0x20 , 0x10,
- 0x1C, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x30,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x40, 0x1C , 0x20,
- 0x20, 0x20, 0x26 , 0x40,
- 0x13, 0x60, 0x18 , 0x20,
- 0x15, 0x40, 0x13 , 0x40,
- 0x18, 0x80, 0x00
- };
-
- void int0() interrupt 1 //采用中斷0 控制節(jié)拍
- { TH0=0xd8;
- TL0=0xef;
- n--;
- }
-
- void delay (unsigned char m) //控制頻率延時(shí)
- {
- unsigned i=3*m;
- while(--i);
- }
-
- void delayms(unsigned char a) //豪秒延時(shí)子程序
- {
- while(--a); //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結(jié)果就知道了!
- }
-
- void main()
- { unsigned char p,m; //m為頻率常數(shù)變量
- unsigned char i=0;
- TMOD&=0x0f;
- TMOD|=0x01;
- TH0=0xd8;TL0=0xef;
- IE=0x82;
- play:
- while(1)
- {
- a: p=music_tab[i];
- if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結(jié)束符,延時(shí)1秒,回到開(kāi)始再來(lái)一遍
- else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時(shí)100ms,繼續(xù)取下一音符
- else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數(shù) 和 節(jié)拍常數(shù)
- TR0=1; //開(kāi)定時(shí)器1
- while(n!=0) Beep=~Beep,delay(m); //等待節(jié)拍完成, 通過(guò)P1口輸出音頻(可多聲道哦!)
- TR0=0; //關(guān)定時(shí)器1
- }
- }
復(fù)制代碼
作者: yzwzfyz 時(shí)間: 2019-3-24 07:57
依據(jù)樂(lè)理定義的時(shí)間和你使用的晶振,計(jì)算后定出。
作者: HC6800-ES-V2.0 時(shí)間: 2019-3-24 09:53
標(biāo)準(zhǔn)A = 440 Hz
高8度音的頻率為原來(lái)音頻率的2倍
根據(jù)12平均律,高一個(gè)八度頻率高一倍,中間的12個(gè)音使用對(duì)數(shù)關(guān)系
音高 中央C D E F G A B 高音C
純律 264 297 330 352 396 440 495 528
十二平均律 261.6 293.7 329.6 349.3 392.1 440 493.9 523.2
根據(jù)十二平均律作的音階頻率表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
c4 | #c4 | d4 | #d4 | e4 | f4 | #f4 | g4 | #g4 | a4 | #a4 | b4 |
2095.1 | | | | | | | | | | | |
c3 | #c3 | d3 | #d3 | e3 | f3 | #f3 | g3 | #g3 | a3 | #a3 | b3 |
1047.1 | | | | | | | | | | | |
c2 | #c2 | d2 | #d2 | e2 | f2 | #f2 | g2 | #g2 | a2 | #a2 | b2 |
523.31 | | | | | | | | | | | |
c1 | #c1 | d1 | #d1 | e1 | f1 | #f1 | g1 | #g1 | a1 | #a1 | b1 |
261.63 | | | | | | | | | | | |
c | #c | d | #d | e | f | #f | g | #g | a | #a | b |
138.541 | | | | | | | | | | | |
C | #C | D | #D | E | F | #F | G | #G | A | #A | A |
69.2413 | | | | | | | | | | | |
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |