当前位置:文档之家› (精品)基于单片机控制的MP3音乐播放器的设计冉玉毕业论文

(精品)基于单片机控制的MP3音乐播放器的设计冉玉毕业论文

目录

1引言 (1)

2硬件设计 (2)

2.1硬件电路的设计框图 (2)

2.2硬件电路设计模块的选定 (2)

2.2.1中心模块 (2)

2.2.2播放模块 (3)

2.2.3显示模块 (4)

2.2.4电子琴模块 (4)

2.3各硬件电路的具体设计 (5)

2.3.1 AT89S52控制模块的设计 (5)

2.3.2按键模块的设计 (6)

2.3.3扬声器播放模块的设计 (7)

2.3.4 LCD显示电路的设计 (7)

2.3.5彩灯伴奏电路的设计 (8)

3软件设计 (9)

3.1单片机发声的基本原理 (9)

3.2设计的相关音乐说明 (9)

3.3切换原理 (10)

3.4音乐播放器软件程序设计 (10)

3.4.1按键扫描子程序设计 (10)

3.4.2 1ms延时程序设计 (14)

3.4.3 LCD显示子程序设计 (15)

3.4.4函数初始化子程序设计 (16)

3.4.5系统主程序设计 (17)

4结论 (19)

参考文献 (20)

附录一硬件原理图 (21)

附录二软件主程序 (22)

致谢 (32)

摘要

目前流行的MP3播放器的音质已相当好,但略感遗憾的是除了选择歌曲和显示歌名外,绝大部分播放器没有诸如随意弹奏乐曲、乐曲节奏跳动等功能。而随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一。要为现代人工作、生活提供更好的更方便的服务就需要从单片机技术着手,一切向着数字化控制、智能化控制方向发展。

本设计是采用单片机为核心设计的数字音乐播放器。本设计在实现音乐的播放及歌曲名显示等基本功能的基础上进行了扩展,添加了彩灯伴奏、按键弹奏、显示音乐节拍等功能。

本论文给出了系统方案的建立、硬件电路的详细设计及软件的程序实现。并通过软硬件的联立调试,验证了设计方案的可行性。

关键词:多功能;MP3音乐播放器;单片机;按键弹奏

Abstract

The current popular MP3 player sound quite good, but feel regretful slightly is in addition to the choice of songs and display the song name, most players without such as random play music rhythm, music and other functions. But as people living standard rise ceaselessly, SCM control is one of the goals that people pursue. For the modern life of work, to provide better and more convenient service needs from proceed toward the SCM technology, all digital control, intelligent control direction.

This design is the use of single-chip microcomputer as the core design of the digital music player. The design in the implementation of music playing and the song name display and other basic functions based on the expansion, adding lights accompaniment, play button, display the beat of the music and other functions.

This paper gives a system scheme, and software program. And through the software and scheme.

Key words: multi function; MP3 music player; single chip microcomputer; play button

1引言

二十世纪九十年代以来,计算机、信息、电子、控制、通信等技术得到迅速发展,促使了社会生产力的提高,也使人们的生产方式和生活方式产生了日新月异的变化。随着人们生活水平的提高及对音乐的喜爱,对音乐播放器的品质,功能,品种等提出了越来越多的要求,表现在对控制系统性能、可靠性等要求越来越高。而品质的提高,功能的更新,可靠性的增强,品种的变化无不与产品的核心控制部分水平的提高密不可分。家用音乐播放器产品及其它有关消费电器产品都是一些开环或闭环控制系统,都由核心控制部分,执行部分与人机界面三部分组成。而最为重要的控制部分一般是由单片机来执行完成的,这就必将导致和促进单片机在音乐领域应用的发展。现在这些由单片机实现的音乐播放器的功能越来越强、费用越来越低。例如,就目前市场上的MP3的功能越来越强大体积却越来越小,价格也逐渐便宜,被大多数人所能接受。但这些音乐播放器也或多或少的存在着一些问题,解决这些问题,非智能化的单片机莫属。

本设计由硬件电路设计和软件程序设计两大部分组成。整个硬件电路是由中心控制、播放、选曲、显示、电子琴和彩灯等模块组成,中心控制模块采用AT89S52单片机,播放模块是由8550 NPN三极管和电磁蜂鸣器组成,采用LCD1602显示模块,电子琴设有8个按键,其中7个作为音符输入,另外1个作为模式转换按键,实现用户自弹作曲。软件程序运用C语言编程实现。

2 硬件设计

2.1 硬件电路的设计框图

硬件电路如图1所示由控制模块、按键模块、LCD显示模块、扬声器播放模块、彩灯伴奏模块组成。

按键模块共由8个按键组成,其中1个键用于实现播放器自动播放和自行弹奏两模式间的转换,其余7个键作为音符的输入或音乐的播放选择。LCD显示模块利用LCD1602对当前播放的歌曲名称进行显示。彩灯伴奏模块则是LED通过控制模块的控制伴随音乐节奏闪亮。扬声器播放模块由三极管及无源蜂鸣器组成,通过控制模块的控制对当前音乐进行播放。

2.2硬件电路设计模块的选定

2.2.1 中心模块

目前应用较为流行的单片机有A VR和51单片机。

51系列的单片机优点之一在于,它从内部硬件到软件有着一套完整的按位操作系统,即位处理器,也称布尔处理器,它的处理对象不是字或字节,而是位,这就意味着它不仅能对片内某些特殊功能寄存器的某位进行处理,例如传送、置位、清零、测试等,还能进行位的逻辑运算,这一点使其他种类单片机很难实现的。

51系列的单片机的另一个优点便是具备了乘法和除法指令,其中八位除以八位的除法指令商为八位,精度显得有些不足,因此在应用方面不是很多,但八位乘以八位的乘法指令积为十六位,这样的精度已经足以满足大部分应用的要求了,更为重要的是,直接具备了乘法与除法指令,这就使得在实际应用时,使用者不必额外编写相应的子程序以备调用,与其他系列单片机相比,51系列的单片机在编程操作方面的简便与实用性无疑上了一个新台阶。而同属指令系统规范完整这一范畴所带来的便利还包括了二进制—十进制调整指令DA,可将二进制变为BCD码,这使得十进制的计量更为快捷简便,省去了其他系列单片机还需要编写调用相应子程序的冗余过程,节省了大量的劳动力和时间。

A VR单片机作为一个新兴起的系列,也具有了大多数新兴事物的特点,即在原有系列的基础上,拥有高性能、高速度、甚至是更低的功耗,但这些优化与更新的性能背后,

也存在着一些问题,例如其价格相比之下显得较为昂贵,此外,它的32个通用寄存器中前16个寄存器都不能直接与立即数打交道,而不像51系列的单片机中所有的通用寄存器均可直接与立即数打交道,因而A VR系列的单片机在通用性方面无疑有所下降。由此可见,较高的价格、较低的适用性,这两点便是A VR单片机进行市场推广所存在的最大制约。

所以,从本系统设计的功能需求及成本考虑,51单片机性价比更高,AT89S52是拥有2个外部中断,2个16位定时器,2个可编程串行UART的单片机。中心控制模块采用AT89S52单片机已完全满足设计需要,实现整个系统控制。

2.2.2 播放模块

播放模块是由8050 NPN三极管和电磁蜂鸣器组成。AT89S52输出高电平控制信号,启动8050 NPN三极管使信号放大,从而启动电磁蜂鸣器。与LM386和喇叭的组合相比较,该播放模块存在一定噪声,音响效果较差。但由于所需驱动功率较小,驱动器件要求不高,并能降低设计成本。因此,必须选用8050 NPN三极管和电磁蜂鸣器则能满足系统要求[1]。

2.2.3 显示模块

LED数码管是一种数显器件。我们知道,发光二极管(英文缩写为LED)是由半导体材料制成的、能将电信号转换成光信号的结型电致发光器件。如果把发光二极管制成条状,再按照一定方式连接,组成数字“8”,就构成LED数码管,简称LED。使用时按规定使某些笔段上的发光二极管发光,即可组成0 ~ 9的一系列数字。

液晶显示器,简称LCD(Liquid Crystal Display),是一种液晶利用光调制的受光型显示器件。LCD的特点是体积小、形状薄、重量轻、耗能少(1~10微瓦平方厘米)、低发热、工作电压低(1.5~6伏)、无污染,无辐射、无静电感应,尤其是视域宽、显示信息量大、无闪烁,并能直接与CMOS集成电路相匹配,同时还是真正的“平板”式显示设备。

常见的基于单片机设计的音乐播放器基本不能显示歌曲信息。该音乐播放系统设计上增加液晶显示器,可为使用者提供曲目信息。由于LED数码管只能显示数字而无法显示其他中英文字符,从设计的成本及功能的角度考虑,采用LCD1602显示模块,它可以显示每首曲目的英文名字。LCD1602驱动电路简单,可以由单片机直接输出命令驱动[2]。

2.2.4 电子琴模块

电子琴设有8个按键,其中7个作为音符输入,另外1个作为模式转换按键,实现用户自弹作曲。7个按键分别代表7个音符,包括中音段的全部音符。通过软硬件设计,模式转换按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程序人口,实现自编歌曲。当需要取消电子琴编曲功能时,再次按下模式转换按键引起外部中断.即可退出电子琴功能而返回到原来音乐播放处。

2.3 各硬件电路的具体设计

2.3.1 AT89S52控制模块的设计

AT89S52控制模块如图2所示,由核心芯片AT89S52单片机、单片机复位电路及外接晶振组成。

如图2所示,电容C5、C9和12M晶振与单片机引脚XTAL1和XTAL2相连构成外接晶振电路。AT89S51单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入和输出端。在XTAL1和XTAL2两端跨接晶体就构成了稳定的自激振荡器,其发出的脉冲直接送入内部的时钟电路,为单片机的工作提供时序。而XTAL1端和XTAL2端将电容C5和C5与内部的反相放大器连接起来组成并联谐振电路,C5、C9取31pF,对频率有微调作用。

AT89S51单片机有一个复位引脚,复位条件是:在时钟电路工作后,当外部电路在RST引脚施加持续2个机器周期以上的高电平时,使系统复位。一般只要保持正脉冲的宽度为10微秒,就可是单片机安全复位。本系统采用按键手动复位,在上电瞬间,RST 引脚电位与VCC相同,随着电容上充电电压的增加,RST引脚电位逐渐下降。在单片机运行期间,按下按键电容瞬间放电,RST引脚电位与VCC相同,系统复位;随着按键的断开,电容又开始充电,RST引脚电位电位逐渐下降,系统开始正常工作。

21

22232425262728293032333435363738393140VC 2.3.2 按键模块的设计

键盘在系统中作用在于手动切换播放器模式、音乐弹奏时音符的输入以及曲目的选择。因在本系统中需要的按键并不多,单片机的IO 数完全可以满足,所以采用了独立式键盘设计,如图3所示。如图示,按键均低电平有效。此外,上拉电阻保证了按键断开时,IO 口线有确定的高电平。在设计键盘的时候,还要考虑去抖问题。常见的去抖的方法有两种:硬件方法和软件方法。单片机中常用软件法,因此在硬件方面将不做处理。

如图3所示,键盘输入电路中共用到八个按键,S1键用于播放器模式的切换,在软件中计算S1键按下的次数,一次为播放模式,二次为自行弹奏模式;S2~S8键在播放器为自动播放模式时为曲目选择键,即七个按键依次对应一首歌曲,按下其中一个键就播放对应的歌曲。而在播放器为自行弹奏模式时,七个键就对应着七个音符,即按下某一按键,播放器就发出对应音符的节奏[3]。 2.3.3 扬声器播放模块的设计

扬声器播放模块是由8050 NPN 三极管和无源蜂鸣器组成,如图4所示。无源蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。无源蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO 引脚输出的电流较小,单片机输出的TTL 电平基本上驱动不了蜂鸣器,因此设计过程中增加一个由8050 NPN 三极管组成的电流放大电路。如图所示,蜂鸣器的负极直接接地,蜂鸣器的正极接到三极管的发射极E 上,三极管的基级B 经过限流电阻R9后由单片机的P22引脚控制,当P22输出高电平时,三极管 Q1截止,没有电流流过线圈,蜂鸣器不发声;当P22输出低电平时,三极管导通,这样蜂鸣器的电流形成

回路,发出声音。因此,我们可以通过程序控制P22脚的电平来使蜂鸣器发出声音和关闭。

2.3.4 LCD显示电路的设计

LCD显示电路由单片机P0及P3.0-P3.2端口控制。我们选用的是工业字符型液晶显示屏LCD1602,能同时显示16*2即32个字符(16列2行)。硬件连接如图5所示。其中变位器是为调节LCD对比度而设计。LCD的显示驱动在软件中完成,硬件中不做处理。

2.3.5 彩灯伴奏电路的设计

根据设计要求,本设计中设计了彩灯伴奏电路,彩灯采用普通发光二级管。播放器工作时,发光二级管根据音乐节拍闪亮。当播放器发出duo音时,D1亮;当播放器发出ruai音时,D2亮;当播放器发出mi音时,D3亮;当播放器发出fa音时,D4亮;当播放器发出suo音时,D1、D4亮;当播放器发出la音时,D2、D3亮;当播放器发出xi 音时,D3、D4亮。在程序执行过程中,单片机对发出的音符进行检测,再输出对应的彩灯信号。硬件电路较简单,如图6所示。

3 软件设计

3.1单片机发声的基本原理

我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制高、低电平的持续时间,就能改变输出频率,从而改变音调。音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。但是,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不同节拍。我们可以用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。例如对14拍音符,定时时间为0.16秒,相应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,相应时间长数为192(即C0H)。我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。此外,结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。为了产生手弹的节奏感,在

某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符[4]。

3.2 设计的相关音乐说明

要产生音频脉冲,只要算出某一音频的周期(1频率),然后将此周期除以2,即为半周期时间。利用半周期时间定时这个半周期时间,每当计时到后就将输出的IO反向,然后重复计时此半周期再对IO反向,就可以在IO脚上得到此频率的脉冲。

记数脉冲值与频率的关系公式如:N=Fi2Fr。N:记数值;Fi:内部计时依次为1us,故其频率为1 MHZ;Fr:要产生的频率。

其记数值的求法如:T=65536-N=65536-Fi2Fr。例:设K=65536,F==Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的记数值。

每个音符使用1个音节,字节的高四位代表音符的高低,低四位代表音符的节拍。如果1拍为0.4秒,14拍为0.1秒,假设14拍为DELAY,则1拍为4 DELAY。

3.3 切换原理

播放器具有手动弹奏和自行播放两种模式,对于这两种模式的切换,本设计是通过软件判断模式转换按键按下的次数来实现的。当模式转换按键按下一次时,播放器为自动播放模式;当按键连续按下两次时,播放器为手动弹奏模式。在软件中的流程图大致如图7所示。

3.4 音乐播放器软件程序设计

3.4.1按键扫描子程序设计

本设计中采用的独立式键盘,按键的闭合与否直接反应在口线的电平上,即口线的电平是呈现的高电平还是低电平。因此可以通过口线的电平高、低状态检测,来确认按键是否按下。但如果在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误的认为是多次操作,为克服按键点机械抖动所致的检测错误,确保CPU对一次按键动作只确认一次按键,必须采取去抖动的措施。软件中去抖动的措施即在第一次检测到有键按下时,执行一段延时10ms的子程序,然后再次检测该键的电平状态,如果该键电平仍保持闭合状态电平,则确认为真正有键按下[5]。

一般把按键扫描程序设计成子程序,以便其他程序调用[6]。程序流程图如图8所示:程序如下:

void key_scan()

{

if(key1==0) ---key1为模式转换键)

{

delay_ms(9);延时,用于消抖动

if(key1==0)延时后再次确认按键按下

{

while(!key1);

set++;

if(set==3)

set=1;模式转换按键选择模式

} }

if(key2==0) ---key2为曲目2或音符duo){

delay_ms(9);延时,用于消抖动

if(key2==0)延时后再次确认按键按下

{

duo=1;

while(!key2);

}

}

if(key3==0) ---key3为曲目3或ruai)

{

delay_ms(9);延时,用于消抖动

if(key3==0)延时后再次确认按键按下

{

ru=1;

while(!key3);

}

}

if(key4==0) ---key4为曲目4或mi){

delay_ms(9);延时,用于消抖动

if(key4==0)延时后再次确认按键按下{

mi=1;

while(!key4);

}

}

if(key5==0) ---key5为曲目5或fa){

delay_ms(9);延时,用于消抖动

if(key5==0)延时后再次确认按键按下{

fa=1;

while(!key5);

}

}

if(key6==0) ---key6为曲目6或suo){

delay_ms(9);延时,用于消抖动

if(key6==0)延时后再次确认按键按下{

suo=1;

while(!key6);

}

}

if(key7==0) ---key7为曲目7或la){

delay_ms(9);延时,用于消抖动

if(key7==0)延时后再次确认按键按下

{

la=1;

while(!key7);

}

}

if(key8==0) ---key8为曲目8或xi)

{

delay_ms(9);延时,用于消抖动

if(key8==0)延时后再次确认按键按下

{

xi=1;

while(!key8);

}

}

}

3.4.2 1ms延时程序设计

延时程序一般是通过一层或多层循环实现,整个过程延时的时间是程序执行的指令总条数乘以执行每条指令所用的时间。由于该系统的晶振选用的是12M,所以执行每条指令所所用时间为2us,程序执行流程如图9所示[7]。

程序如下:

void delay_ms(uint xms)延时函数,有参函数

{

uint x,y;

for(x=xms;x>0;x--)

for(y=110;y>0;y--);

}

3.4.3 LCD显示子程序设计

本设计中利用LCD1602显示当前播放曲目名称以及弹奏时的音符。LCD开始工作是靠软件来实现的[8]。整个显示过程中的程序工作流程图如图10所示:程序如下:

void lcd_display ( )

{

WriteCMD(0x80);

for(y=0;y<7;y++)

{WriteData(name[y]); mydelay(5); }

mydelay(2);

WriteCMD(0x80+0x40);

for(z=0;z<12;z++)

{ WriteData(num[z]); mydelay(5); }

for(x=0;x<19;x++)

{WriteCMD(0x18); mydelay(5);}}

3.4.4 函数初始化子程序设计

函数初始化程序即把在主函数内对某些参数和标记位赋初值编写成一个函数,这样

使程序更具有条理化,清晰易懂。由于整个程序要用到定时器0和定时器1,所以初始化程序主要是对定时器相关内容作说明,程序的简单框图如图11所示。

程序如下:

void InitialSound(void)

{

Sound_Temp_TH1 = (65536-(11200)*SYSTEM_OSC)256; 计算TL1应装入的初值(10ms的初装值)

Sound_Temp_TL1 = (65536-(11200)*SYSTEM_OSC)%256; 计算TH1应装入的初值

TH1 = Sound_Temp_TH1;

TL1 = Sound_Temp_TL1;

TMOD = 0x11;

ET0 = 1; ET1 = 0; TR0 = 0; TR1= 0; EA = 1;

}

3.4.5系统主程序设计

播放器工作时,程序工作流程图如图12所示,先对在程序过程中所需的各种标记位及参数进行初始化赋值,再执行按键扫描子程序并计算及保存键值,根据其中的模式转换键的按键次数进行模式判断,按键次数为1时播放器处于自动播放模式,扬声器播放模块开始工作,同时彩灯伴奏模块随着单片机端口高低电平的变换闪烁达到伴奏的效果,另一方面显示模块进入工作状态对当前曲目的曲目名进行显示;按键次数为2时播放器处于手动弹奏模式,再次对按键进行扫描,对按下的键值进行分析,单片机输出相应的音符,彩灯伴奏模块也伴随音符闪亮,同时LCD显示模块对当前音符进行显示。

4 结论

本设计以MSC-51系列单片机为核心,充分利用了AT89C51芯片的IO引脚,以独立式键盘作为琴键输入及曲目的选择键,采用LCD1602对当前曲目及音符进行显示,并利用发光二级管进行音乐伴奏。本文从理论上分析了该设计方案的可行性,并预计能达到设计要求,主要体现在:

拥有彩灯伴奏功能;

具有音频DA转换功能,可以输出音频模拟信号并能播放音频文件;

显示歌曲信息功能;

播放器具有手动弹奏和自动播放两个模式。

在做此毕业设计中遇到不少的难点,有的原理,根本就不知道怎样去实现。最后通过自己仔细查资料,一点一点的就慢慢懂了。在实验中发现,其实再难编写的程序都是由一些基础程序模块构成的,很多的基础模块前人就已经做好了,只要我们拼凑就行了,当然拼凑的工作也不是很简单,最重要的还是要自己的基础扎实,同时,自己的思路要非常的清晰。设计完后,感觉到平时掌握的东西实在太少了,要真正实现学有所成、学有所用还有很长的路要走。

现在电子信息技术发展迅速,我们现在学的东西在社会上也许已经或即将被淘汰。因此在学校要学的不仅是书本上的东西,更重要的是自学的能力、独立思考的能力和动手的能力。要想在竞争异常激烈的现代社会立足,就必须有实力。在学校的时间是最好的学习机会,一定要珍惜好这有限的时间,多学知识,尽量充实自己,为以后进入社会多做准备。

参考文献

[1] 张红梅,王磊杰.AT89S52与LED驱动S6B0724的应用[J].电子质量,2008(5):13-16.

[2] 赵亮.液晶显示模块LCD1602应用[J],电子制作,2007(3):58-59.

[3] 张春峰,邹新杰,余张国.基于ATMEGA16的智能控制器的开发研制[J],微计算机信息,2007,,23(8):.

[4] 侯振鹏.嵌入式C语言程序设计-使用MCS-51[M],北京:人民邮电出版社,2006:117,119.

[5] 李朝青.单片机原理及接口技术[M],北京:北京航空航天大学出版社,2005:.

[6] 华南农业大学工程学院.Lab2000 系列单片机实验系统实验指导[M],广州:华南农业大学出版社,2006:19,65.

[7] Konrad King.SQL编程实用大全[J].杜大鹏,译,北京:中国水利水电出版社,2005,35(257):1-2.

[8] T.Parsons. The Social System. New York: Free Press, 1961: P36-45.

附录一硬件原理图

附录二软件主程序

#include

#include

for(i=0;i<12;i++) 根据调号及升降八度来生成新的频率表

{j = i + Signature;

if(j > 11)

{j = j-12; NewFreTab[i] = FreTab[j]*2;

}

else

NewFreTab[i] = FreTab[j];

if(Octachord == 1)

NewFreTab[i]>>=2;

else if(Octachord == 3)

NewFreTab[i]<<=2;

}

SoundLength = 0;

while(Sound[SoundLength] != 0x00) 计算歌曲长度

{SoundLength+=2;}Point = 0; Tone = Sound[Point];

Length = Sound[Point+1]; 读出第一个音符和它时时值

LDiv0 = 12000Speed; 算出1分音符的长度(几个10ms)

LDiv4 = LDiv04; 算出4分音符的长度

LDiv4 = LDiv4-LDiv4*SOUND_SPACE; 普通音最长间隔标准

TR0 = 0;TR1 = 1;

while(Point < SoundLength)

{SL=Tone%10; 计算出音符

SM=Tone10%10; 计算出高低音

SH=Tone100; 计算出是否升半

CurrentFre = NewFreTab[SignTab[SL-1]+SH]; 查出对应音符的频率

相关主题
文本预览
相关文档 最新文档