音乐播放器软件设计
- 格式:doc
- 大小:67.00 KB
- 文档页数:5
软件设计
4.1音乐相关知识
在设计之前,我们还需要了解一些音乐的相关知识。在人类还没有产生语言时,就知道利用声音的高低、强弱等来表达自己的思想和感情。声带、琴弦等物体振动时会发出声波,声波通过空气传播进入人耳,人们就听到了声音。声音有噪音和乐音之分,振动有规律的声音是乐音,如人声带发出的歌声、由琴弦发出的琴音等。音乐中所用的声音主要是乐音。乐音听起来有的高,有的低,这就叫音高。音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低。比如,女人唱歌时声带振动频率高,男人唱歌时声带振动频率低,所以男声比女声低。
音乐中所用乐音的范围从每秒钟振动16次的最低音到每秒钟振动4186次的最高音,大约97个。现在最大的钢琴可以奏出其中的88个音,是音乐范围最大的乐器。人唱歌时因受生理限制,所能唱出的乐音仅是乐音范围中的一小部分。
不同音高的乐音是用C、D、E、F、G、A、B来表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫唱名。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”的,就叫“全音”。在钢琴等键盘乐器上,C-D、D-E、F-G、G-A、A-B两音之间隔着一个黑键,它们之间的距离就是全音;E-F、B-C两音之间没有黑键相隔,它们之间的距离就是半音。通俗地说,那些唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上#号(如#4、#1)或者b号(如b7、b3)的叫变化音。#叫升记号,表示把音在原来的基础上升高半音;b叫降记号,表示把音在原来的基础上降低半音。
音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
在设计中我将音乐的简谱编成音符表和节拍表。所谓简谱,是指一种简易的记谱法。有字母简谱和数字简谱两种。一般所称的科谱,系指数字简谱。数字简谱以可动唱名法为基础,用1、2、3、4、5、6、7代表音阶中的7个基本音级,读音为do、re、mi、fa、sol、la、si,休止以O表示。每一个数字的时值名相当于五线谱的4分音符
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲,不同频率的脉冲经滤波放大电路驱动喇叭,就会发出不同的音调。对于单片机而言,产生不同频率的脉冲非常方便,可以利用它的定时/计数器T0,工作模式1,设定计数值TH0和TL0,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平。因为定时参数不同,所以产生不同频率的脉冲信号。在此情况下,C调的各音符频率与在12Mz的单片机下的计数值T的对照表4.1所示。T的值决定了TH0和TL0的值,其关系如下。
TH0=T/256,TL0=T%256。
表4.1 C调各音符频率与计数值T(12Mz单片机,T0工作模式1)对照表
音符 频率 简谱码(T值) 音符 频率 简谱码(T值)
低1DO 262 63628 #4FA# 740 64860
#1DO# 277 63731 中5SO 784 64898
低2RE 294 63835 #5SO# 831 64934
#2RE# 311 63928 中6LA 880 64968
低3MI 330 64021 #6LA# 932 64994
低4FA 349 64103 中7SI 988 65030
#4FA# 370 64185 高1DO 1046 65058
低5SO 392 64260 #1DO# 1109 65085
#5SO# 415 64331 高2RE 1175 65110
低6LA 440 64400 #2RE# 1245 65134
#6LA# 466 64463 高3MI 1318 65157
低7LA 494 64524 高4FA 1397 65178
中1DO 523 64580 #4FA# 1480 65198
#1DO# 554 64633 高5SO 1568 65217
中2RE 587 64684 #5SO# 1661 65235
#2RE# 622 64732 高6LA 1760 65252 中3MI 659 64777 #6LA# 1865 65268
中4FA 698 64820 高7SI 1976 65283
除了音符以外,节拍也是音乐的关键组成部分。
节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现。如果1/4拍的延时设为0.1秒,则1拍的延时是0.4秒。只要知道1/4拍的延时时间,其余的节拍延时时间就是它的倍数。
表4.2所示的为1/4节拍和1/8节拍的延时时间设定。
表4.2 1/4节拍和1/8节拍的延时时间
曲调值(1/4节拍) 延时DELAY 曲调值(1/8节拍) 延时DELAY
调4/4 125ms 调4/4 62ms
调3/4 187ms 调3/4ms 94ms
调2/4 250ms 调2/4 125ms
⑵ 单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率 )
3) 其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
4) 每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数, 5) 建立音乐的步骤:
1、先把吧乐谱的音符找出,然后由上表建立T值表的顺序。
2、把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。
3、简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。
程序范例
ORG 0000H ;主程序起始地址
SJMP START ;跳至主程序
ORG 000BH ;TIMER0中断起 始地址
LJMP TIM0 ;跳至TIMER0中断子程序
START: MOV TMOD,#01H ;设T0在M1
MOV IE,#82H ;中断使能
START0:MOV 30H,#00 ;取简谱码指针
NEXT: MOV A,30H ;简谱码指针载入A
MOV DPTR,#TAB ;至TAB取简谱码
MOVC A,@A+DPTR ;
MOV R2,A ;渠道的简谱码暂存于R2
JZ END0 ;是否渠道00(结束码)
ANL A,#0FH ;不是,则取低4位(节拍码)
MOV R5,A ;将节拍码存入R5
MOV A,R2 ;将取到的简谱码再载入A
SWAP A ;高低4位交换
ANL A,#0FH ;取低4位(音符码)
JNZ SING ;取到的音符码是否为0?
CLR TR0 ;开始,则不发音
SJMP D1 ;跳至D1
SING: DEC A ;取到的音符码减1(不含0)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TAB1 ;至TABLE1取相对的高位字节计数值
MOVC A,@A+DPTR ;
MOV TH0,A ;取到的高位字节存入TH0
MOV 21H,A ;取到的高位字节存入(21H)
MOV A,22H ;在载入取到的音符码
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相对的低位字节计数值
MOV TL0,A ;取到的低位字节存入TL0
MOV 20H,A ;取到的低位字节存入(20H)
SETB TR0 ;启动TIMER0
D1: LCALL DELAY ;其本单位时间1/4拍187毫秒
INC 30H ;取简谱码指针加1 JMP NEXT ;取下一个简谱码
END0: CLR TR0 ;停止TIMER0
JMP START0 ;重复循环
TIM0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW ;将PSW的值暂存于堆栈
MOV TL0,20H ;重设计数值
MOV TH0,21H ;
CPL P3.0 ;将P3.0位反相,控制蜂鸣器发声
POP PSW ;至堆栈取回PSW的值
POP ACC ;至堆栈取回A的值
RETI
DELAY:MOV R7,#02
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
TAB1: ;决定节拍
DW 64260,64400,64521,64580
DW 64684,64777,64820,64898