单片机产生音乐原理说明Word文档格式.docx
《单片机产生音乐原理说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机产生音乐原理说明Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
FR
其中N——计数值;
FI——内部计时一次为1us,故其频率为1MHz;
FR——要产生的频率。
其计数值的求法为:
T=65536-N=65536-FI÷
2÷
FR
则标准音高A(频率f=440Hz)的计数值为:
T=65536-N=65536-FI÷
=65536-1000000÷
FR=65536-500000/440=65536-1136=64400=0FB90H
面给出C调各音符频率值和定时器定时初值:
(晶振频率f0=12Mhz,定时器在工作
方式1)
表1C调各音符频率值和定时初值对照表
C调
1
1#
2
2#
3
4
4#
5
5#
6
6#
7
音符
频率
262
277
293
311
329
349
370
392
415
440
466
494
Hz
1.90ms
1.81
1.7ms
1.61
1.51ms
1.43ms
1.35
1.28ms
1.20
1.14ms
1.07
1.01ms
TH/TL
F88B
F8F2
F95B
F9B7
FA14
FA66
FAB9
FB03
FB4A
FB8F
FBCF
FC0B
F894
F95C
FA1A
FA6A
FB00
FB8C
FC0E
Stm8:
076C
0712
06A4
064A
05E6
0596
0546
0500
04B0
0474
042E
03F2
523
553
586
621
658
697
739
783
830
879
931
987
0.95ms
0.91
0.85
0.81
0.76ms
0.72ms
0.68
0.64ms
0.60
0.57ms
0.54
0.51ms
FC43
FC78
FCAB
FCDB
FD08
FD33
FD5B
FD81
FDA5
FDC7
FDE7
FE05
FC4A
FCAE
FD30
FD80
FDC6
FE02
03B6
038E
0352
032A
02F8
02D0
02A8
0280
0258
023A
021C
01FE
.#
1045
1106
1171
1241
1316
1393
1476
1563
1658
1755
1860
1971
0.47ms
0.45
0.42ms
0.40
0.38ms
0.36ms
0.34
0.32ms
0.30
0.28ms
0.27
0.25ms
FB21
FE3C
FE55
FE6D
FE84
FE99
FEAD
FEC0
FEE3
FEF3
FF02
FE2A
FE5C
FE98
FEE8
FF06
01D6
01C2
01A4
0190
017C
0168
0154
0140
012C
0118
010E
00FA
对于非C调的歌曲,要对各音符的频率做相应的变化
调号——音乐上指用以确定乐曲主音高度的符号。
升C调:
1=#C,也就是降D调:
1=bD;
277(频率)升D调:
1=#D,也就是降E调:
1=bE;
升F调:
1=#F,也就是降G调:
1=bG;
369
升G调:
1=#G,也就是降A调:
1=bA;
升A调:
1=#A,也就是降B调:
1=bB。
所谓1=A,就是说,这首歌曲的“导”(即作为基调的中音DO)要唱得同A音符一样高,其它各音符依次向后递推,通常把这首歌曲叫做A调歌曲,或叫“唱A调”。
1=C,就是说,这首歌曲的“导”要唱得同C一样高,或者说“这歌曲唱C调”。
同样是“导”,不同的调唱起来的高低是不一样的。
在递推的时候要严格按各音符间音程关系进行(全音还是半音,只有3—4和7—i之间是半音关系,其它音之间都是全音关系),下面以1=D调进行说明。
参照上面的钢琴键盘图和表1,确定出D调各音符对应的频率值为:
(到后来制表时就以各音符对应的新频率值确定定时初值)
C调
中
C
D
E
F
G
A
B
1高C
1高
4F
6A
7B
频
587
659
740
880
988
1175
1318
1480
1760
率
调
1高
二、节拍音符的节拍我们可以举例来说明。
在一张乐谱中,我们经常会看到这样的表达式,如1=C4、1=G3⋯⋯等等,这里1=C,1=G表示乐谱的曲调,和我们前44
面所谈的音调有很大的关联,4、3就是用来表示节拍的。
以3为例加以说明,444
它表示乐谱中以四分音符为节拍,每一小结有三拍。
比如:
其中1、2为一拍,3、4、5为一拍,6为一拍共三拍。
1、2的时长为四分音符的一半,即为八分音符长,3、4的时长为八分音符的一半,即为十六分音符长,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符长。
那么一拍到底该唱多长呢?
一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms。
我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。
若乐谱有特别说明则另行对待。
如有乐谱中注明每分钟86拍,则一
拍时间为60/86s=698ms。
可见,在单片机上控制一个音符唱多长可采用循环延时的方法来
节拍码
节拍数
实现。
首先,我们确定一个基本时长的延时程序,比如说以十六分音符的时长为基本延时时间,那么,对于一个音符,如果它为十六分音符,则只需调用一次延时程序,如果它为八分音符,则只需调用二次延时程序,如果它为四分音符,则只需调用四次延时程序,依次类推。
具体来说,
Ⅰ.每个音符使用一个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,节拍与节拍码的对照,如下表所示
1(十六分音符)
1/4拍为1DELAY
1/8拍
2(八分音符)
2/4拍
1/4拍
3/4拍
3/8拍
4(四分音符)
1拍
1/2拍
1又1/4拍
5/8拍
1又1/2拍
8(二分音符)
2拍
8
1拍
10A
2又1/2拍
12C
3拍
15F
3又3/4拍
16(全音符)
4拍
表2节拍与节拍码对照注:
上表中各音符时值的倍数关系是确定不变的,具体制表时关键要正确确定其值。
Ⅱ.以1/4拍(十六分音符)为一个基准定时单位(1DELAY),
则2/4拍(八分音符)为2DELAY,
1拍(四分音符)为4DELAY,
2拍(二分音符)为8DELAY,
4拍(全音符)为16DELAY。
1/4和1/8节拍的时间设定,如下表所示。
表3各调节拍时间设定表
1/4节拍的时间设定
1/8节拍的时间设定
曲调值
DELAY
调4/4
125ms
62ms
调3/4
187ms
94ms
调2/4
250ms
实现方法
通过上面介绍的音符音调和节拍的相关知识,以及它们在单片机系统中的确
定方法,我们就可以在单片机上实现演奏音乐了。
具体的实现方法为:
1.将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数
2.将他们做成数据表格,存放在存储器中
3.通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数⋯⋯,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。
请注意,用单片机上实现音乐演奏关键在于,根据乐谱制作出数据表格,编程在其次,这个过程很耗费时间和精力。
另外,对于乐曲中的休止符,一般将其音调参数设为FFH或00H,其节拍参数与其它音符的节拍参数确定方法一致,乐曲结束用节拍参数为00H来表示。
实例说明
建立音乐的方法
(1)建立简谱对应的简谱码、T值及节拍数表,画在草稿纸上。
①先对照歌曲的简谱把其中所有出现的音符找出,从低音到高音依次排序,确定各音的数值(编写查表程序时将此值减1,即得对应音符相对于TABL1表头的偏移量)。
对于不是C调的歌曲,要对各音符的频率做相应的变化。
②对照歌曲的简谱确定各音符的节拍数相对于基准定时单位的倍数,从小到大排列。
各音符时值的倍数关系是确定不变的,关键要正确确定其值。
这需要懂一
点简谱知识才能准确的确定出乐谱中音符节拍数。
以歌曲兰花草为例,如下表:
简谱
发音(这一列知道就行不必写出)
简谱码
T值
低3
低音MI
64021
低4
低音FA
64103
低5
低音SO
64260
低6
低音LA
64400
低7
低音TI
64254
1又1/4拍
中1
中音DO
64580
1又1/2拍
中2
中音RE
64684
中3
中音MI
64777
中4
中音FA
9
64820
中5
中音SO
64898
中6
中音LA
64968
16
中7
中音TI
65030
休止符
不发音
关定时器
注:
以四分音符为一拍,现在以1/4拍为定时的基准单位,为1DELAY。
则1拍应为4倍DELAY,依次类推。
所以只要求得1/4拍的DELAY时间,其余的节拍数就是它的倍数。
(2)把各音符频率对应的定时T值建立在TABLE1表。
TABLE1:
;
各音符频率对应的定时值表
DW64021,64103,64260,64400
DW64524,64580,64684,64777
DW64820,64898,64968,65030
(3)根据第一步建立的表,建立乐曲对应音符节拍码表TABLE,其中简谱码(音符)在高4位(但是此种方法只能排16个音,若乐谱中音符较多可占一个字节来表示),节拍码(节拍数)在低4位(但此种方法也只能最大延时15个基准定时单位的时间)。
TABLE:
歌曲兰花草的音符与节拍码表
;
高4位为简谱码(音符),低4位为该音符对应的节拍数
DB42H,82H,82H,82H,84H,02,72H
DB62H,72H,62H,52H,48H
DB0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H
DB12H,0A2H,0D2H,92H,88H
DB82H,0B2H,0B2H,0A2H,84H,02H,72H
DB62H,72H,62H,52H,44H,02H,12H
DB12H,62H,62H,52H,44H,02H,82H
DB72H,62H,52H,32H,48H
DB00H至此,需要建立的表都已完成,只需编写主程序的查表指令即可。
小结:
在程序中的实现,重点就在于音符、节拍,建好表后,编程则很简单。
编写时间:
2009-8-19