所示
表4.2.1 C调音符频率计数值T的关系
低音 频率 T Do Re Mi Fa So La Si
262 294 330 349 392 440 494
62018 62401 62491 62895 63184 63441 63506
中音 频率 T Do Re Mi Fa So La Si
523 587 659 698 784 880 988
63773 63965 64137 64215 64360 64488 64603
高音 频率 T Do Re Mi Fa So La Si
1046 64654 1175 64751 1318 64836 1397 64876 1568 64948 1760 65012 1976
65067
本设计中,在11.0592MHz频率下,中央C调1~7和高8度1~7的计数值T即初值的十六进制数数值为:
uchar code chuzhi[]={0xff,0xff,//占位
0xFC,0x8E,0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D, 0xFE,0x47,0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16}; 4.2.2 音乐节拍
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
在音乐中,最小的音符为十六分音符,即四分之一拍,所以只要延时函数设置为十六分音符的时间(165MS),其他的音符延时其的整数倍,就可得到相应的节拍。
十六分音符的延时函数为 void delay(uint z) { uint x,y;
for(x=z;x>0;x--)
for(y=19000;y>0;y--);}
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一
第 14 页 共 32 页
些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表4.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表4.3为1/4和1/8节拍的时间设定。
表4.2.2.1 节拍码的对照
节拍码 1
2 3 4 5 6 8 A C F
节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又1/2拍 2拍 2又1/2拍 3拍 3又3/4拍
节拍码 1 2 3 4 5 6 8 A C
1/8节拍的时间设定 曲调值 调4/4 调3/4 调2/4
DELAY 62毫秒 94毫秒 125毫秒
节拍数 1/8拍 1/4拍 3/8拍 2/1拍 5/8拍 3/4拍 1拍 1又1/4拍 1又1/2拍
表4.2.2.2 1/4和1/8节拍的时间设定
1/4节拍的时间设定 曲调值 调4/4 调3/4 调2/4
DELAY 125毫秒 187毫秒 250毫秒
4.2.3 移调
一般的歌曲有3/8、2/4、3/4、4/4等节拍类型,但不管有几拍,基本上是在C调下演奏的。如果是C调,则音名唱Do,音名D唱Re,音名E唱Mi,音名F唱Fa,音名G唱So,音名A唱La,音名B唱Ti等。但并不是所有的歌曲都是在C调下演奏的,还有D调,E调,F调,G调等。D调是将C调各音符上升一个频率实现的,即C调下的音名D在D调下唱Do,C调下的音名E在D调下唱Re,C大调各音名F在D调下升高半音符F#唱Mi,C调下的音名G在
第 15 页 共 32 页
D调下唱Fa,C调下的音名A在D调下唱So,C调下的音名B在D调下唱La,C调下的音名C在D调下升高半音符C#唱Ti。这种改变唱法成为移调。
E调是在D调的基础上进行移调的,而F调是在E调的基础上进行移调的??各大调音符与音名的关系如表4.4所示。
表4.2.3 各大调音符与音名的关系
音调 C调 D调 E调 F调 G调 A调 B调
Do C D E F G A B
Re D E F# G A B C
Mi E F# G# A B C# D
Fa F G A B C D E
So G A B C D E F
La A B C D E F# G
Ti B C D E F# G# A
4.2.4 音乐编码
本设计以音乐简谱进行编码。简谱中的1~7,分别编码为1~7,重音1~7,分别编码8、9、A、B、C、D、E。停顿编为0,结束标志为FF。
简谱节拍的对应关系也是编码的关键。在简谱中,全音符是在数字后面加三根延时线的音符,其时值等于四分音符的四倍,打满四拍就得一个全音符。若延时函数为165ms,即十六分音符的时间,则一个全音符需要16次延时。可分为两个8次延时。可编码为0x08,0x08。二分音符是在数字后面加了一根延时线的音符,分音符时值是四分音符的两倍,打两拍得一个二分音符。将其编码为8。而四分音符在简谱里就是不带延时线,没有减时线单单的一个音符,以四分音符为一拍,也就是手打一拍就是一个四分音符的时值。将其编码为4。八分音符是在数字下面划了一根减时线的音符;八分音符时值等于四分音符的一半,而以四分音符为一拍的话,那八分音符也就是半拍。 在本次设计中将其编码为2。十六分音符在简谱里是在数字下面划了两根减时线的音符;十六分音符时值等于四分音符的四分之一,也就是四分之一拍。将其编码为1。符点音符在音符后面加个符点,等于把这个音符的时值再延长它本身时值的一半。比如符点四分音符,时值等于四分音符加八分音符的时值。休止符最好的理解就是你把它当一个音符看待,但是是没有音高的音符,因为它时值也是跟一般音符一样标记的。可编码成0。
第 16 页 共 32 页
举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22 4.2.5 歌曲播放设计
将歌曲的简谱进行编码后,储存在一个数据类型为unsigned char 的数组中。音乐播放程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,这样就建立了音乐库。表4.5为简谱对应的简谱码、T值及节拍数。
表4.2.5 简谱对应的简谱码、T值和节拍数
简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5
发音 低音SO 低音LA 低音TI 中音DO 中音RE 中音MI 中音FA 中音SO 中音LA 中音TI 高音DO 高音RE 高音MI 高音FA 高音SO
简谱码 1 2 3 4 5 6 7 8 9 A B C D E F
T值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217
节拍码 1 2 3 4 5 6 8 A C F
节拍数 1/4拍 2/4拍 3/4拍 1拍
1又1/4拍 1又1/2拍 2拍
2又1/2拍 3拍
3又3/4拍
本次设计一共可播放4首歌曲,分别为《千年之恋》、《寂寞沙洲冷》、《七子之歌》和《感恩的心》,在这里我以《千年之恋》为例,说明一下简谱与编码的对应关系,其他四首歌曲的数据编码将在附录中显示。图4.2为歌曲《千年之恋》的简谱。
第 17 页 共 32 页
图4.2 歌曲《千年之恋》简谱
根据上述规则,《千年之恋》的简谱编码为 uchar code qnzl[]={ //千年之恋
0x12, 0x22, 0x34, 0x84, 0x74, 0x54, 0x38, 0x42, 0x32, 0x22, 0x42, 0x34, 0x84, 0x72, 0x82, 0x94, 0xA8, 0x08, //前奏
0x32, 0x31, 0x21, 0x32, 0x52, 0x32, 0x31, 0x21, 0x32, 0x62, //竹林的灯火 到过的沙漠
0x32, 0x31, 0x21, 0x32, 0x82, 0x71, 0x81, 0x71, 0x51, 0x32, 0x22, //七色的国度 不断飘逸风中
0x32, 0x31, 0x21, 0x32, 0x52, 0x32, 0x31, 0x21, 0x32, 0x62, //有一种神秘 灰色的旋涡
0x32, 0x31, 0x21, 0x32, 0x83, 0x82, 0x71, 0x72, 0x02, //将我卷入了迷雾中
0x63, 0xA1, 0xA2, 0x62, 0x92, 0x82, 0x52, //看不清的双手
0x31, 0x51, 0x63, 0x51, 0x63, 0x51, 0x63, 0x51, 0x62, 0x82, 0x7C, 0x02, //一朵花传来谁经过的温柔
0x61, 0x71, 0x82, 0x71, 0x62, 0xA2, 0x71, 0x76, //穿越千年的伤痛
0x61, 0x71, 0x82, 0x71, 0x62, 0x52, 0x31, 0x36, //只为求一个结果
第 18 页 共 32 页