HI,欢迎来到起点商标网!
24小时服务QQ:2880605093

基于单片机的MIDI音乐播放电路和方法与流程

2021-01-28 15:01:11|355|起点商标网
本申请涉及音乐播放领域,具体涉及基于单片机的midi音乐播放电路和方法。
背景技术:
::midi(musicalinstrumentdigitalinterface,乐器数字接口)是20世纪80年代初为解决电声乐器之间的通信问题而提出的。另外,可以把midi理解成是一种协议、一种标准、或是一种技术。midi是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。它用音符的数字控制信号来记录音乐。midi传输的不是声音信号,而是音符、播放时间、播放时长、控制参数等指令。因midi文件本身并不包含声音波形数据,所以midi文件非常小巧,且易于编辑,被广泛应用。现在有技术中,播放midi文件需要用到声卡。硬声卡价格昂贵,软声卡需要对midi进行合成,目前主要使用调频(frequencymodulation,fm)合成法或波形表(wavetable)合成法,上述两种合成法对硬件的运算等资源要求高,一般需运行于linux、windows、安卓等操作系统,即采用操作系统加音频处理软件的播放方式。这种播放方式虽然能够带来较高的音乐体验,但是不适用于单片机,对于低端消费者而言,成本太高。技术实现要素:本申请的目的在于提出一种改进的基于单片机的midi音乐播放电路和方法,来解决以上
背景技术:
:部分提到的技术问题。第一方面,本申请提供了一种基于单片机的midi音乐播放电路,所述电路包括:单片机、midi芯片、功率放大电路、扬声器,其中,所述单片机与所述midi芯片电连接,所述midi芯片与所述功率放大器电连接,所述功率放大器与所述扬声器电连接;所述单片机解析midi消息,确定通道的个数及各个通道内音符的播放时间,然后,循环执行如下步骤:定时器的值每增加1,则将定时器当前的值依次与各个通道待播放音符的播放时间进行比较,如果相等,向所述midi芯片发送控制指令,所述midi芯片根据所述控制指令,确定播放的音频信号,并将所述音频信号发送给所述功率放大器进行功率放大,所述功率放大器用放大后的音频信号驱动所述扬声器发声。在一些实施例中,所述单片机确定通道的个数及各个通道内音符的播放时间后,为每个通道创建一个任务,然后,循环执行如下步骤:定时器的值每增加1,依次执行各个任务,每个任务被配置用于:如果所述定时器当前的值小于当前任务中待播放音符的播放时间,跳转下一个任务;如果所述定时器当前的值等于当前任务中待播放音符的播放时间,则向所述midi芯片发送控制指令,然后跳转下一个任务。在一些实施例中,所述单片机的每个任务还被配置用于:如果所述定时器当前的值大于当前任务中待播放音符的播放时间,则选取下一个待播放音符的播放时间与定时器当前的值进行比较。在一些实施例中,所述单片机的型号为stm32f103。在一些实施例中,所述midi芯片的型号为isd9160。第二方面,本申请提供了一种基于单片机的midi音乐播放方法,所述方法包括:解析midi消息,确定通道的个数及各个通道内音符的播放时间;循环执行如下步骤:定时器的值每增加1,则将定时器当前的值依次与各个通道待播放音符的播放时间进行比较,如果相等,则向midi芯片发送控制指令,所述midi芯片根据所述控制指令,确定播放的音频信号,并将所述音频信号发送给功率放大器进行功率放大,所述功率放大器用放大后的音频信号驱动扬声器发声。在一些实施例中,在确定通道的个数及各个通道内音符的播放时间后,为每个通道创建一个任务,然后,循环执行如下步骤:定时器的值每增加1,依次执行各个任务,每个任务被配置用于:如果所述定时器当前的值小于当前任务中待播放音符的播放时间,跳转下一个任务;如果所述定时器当前的值等于当前任务中待播放音符的播放时间,则向所述midi芯片发送控制指令,然后跳转下一个任务。在一些实施例中,每个任务还被配置用于:如果所述定时器当前的值大于当前任务中待播放音符的播放时间,则选取下一个待播放音符的播放时间与定时器当前的值进行比较。在一些实施例中,所述控制指令包括:所述待播放音符所在通道的唯一标识、所述待播放音符的唯一标识、播放时长、播放音量。在一些实施例中,所述midi芯片储存音色库。本申请提供的基于单片机的midi音乐播放电路和方法,单片机解析midi消息,确定通道的个数及各个通道内音符的播放时间,单片机中定时器的值每增加1,轮询各个通道一次,选取待播放的音符,生成控制指令。midi芯片每接收一条控制指令,确定待播放的音频信号,经功率放大器放大后,驱动扬声器发声。实现了按照midi消息连续不断的播放音符,重现midi音乐,效果好,且成本低。附图说明通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:图1是根据本申请的基于单片机的midi音乐播放电路的一个实施例的结构示意图;图2是根据本申请的基于单片机的midi音乐播放方法的一个实施例的流程图。具体实施方式下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器cpu,随机存储器ram,只读存储器rom,uart、plc、dma等i/o接口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。又称微控制单元(microcontrollerunit,mcu)。低成本的单片机具有的资源有限,运算能力有限,不能对midi进行合成。但单片机广泛应用于机器人、无人飞机、玩具车等设备上。参考图1,该图是本申请的基于单片机的midi音乐播放电路一个实施例的结构示意图,如图所示,电路包括:单片机101、midi芯片102、功率放大器103、扬声器104。本实施例中单片机的型号为stm32f103,midi芯片的型号为isd9160。单片机与midi芯片通过uart接口通信。在本实施例中,单片机101中存储着多个midi文件,单片机101根据不同的场景或命令选择播放不同的midi文件。因为midi文件中的数据是一套音乐符号的定义,而不是实际的音乐波形,因此midi文件的内容被称为midi消息。单片机101根据midi的标准、格式,解析midi消息,确定midi消息中包含的通道的数量,其中,要使音源按音乐制作人的意图发出不同声部的声音,就必须使用midi的通道功能。即:将不同的声部交给不同的通道去处理和演奏。例如,不同的乐器对应不同的通道。在本实施例中,单片机101内置定时器,也称为计数器。设置定时器的时间间隔,例如,设置定时器的时间间隔为四分音符或八分音符,即定时器的值每四分音符或八分音符的时间间隔增1。或根据大量试验的结果,设定定时器的时间间隔。之后,将各通道中各音符的播放时间换算成定时器的值。即当定时器的值到达某个具体值时,播放某个音符。在本实施例中,单片机101被配置为定时器的值每增加1,则将定时器当前的值依次与各个通道待播放音符的播放时间进行比较,如果相等,向midi芯片102发送控制指令,midi芯片102根据上述控制指令,确定播放的音频信号,并将音频信号发送给功率放大器103进行功率放大,功率放大器103用放大后的音频信号驱动扬声器104发声。具体的:单片机101为每个通道创建一个对应的任务,相当于为每个乐器创造一个任务。该任务详细的依次记载了midi消息中属于该乐器的每个音符的播放时间、播放时长、播放音量等控制信息。每个任务被配置为:定时器的值每增加1,取该任务中待播放音符的播放时间,将该播放时间与定时器当前的值进行比较,如果音符的播放时间大于定时器当前的值,表示目前还没有到播放该音符的时间。跳转执行下一个任务。如果音符的播放时间等于定时器当前的值,表示现在正是播放该音符的时间,则生成控制指令,并将该控制指令发送给midi芯片102,其中,控制指令包含:通道的唯一标识、待播放音符的唯一标识、播放时长、播放音量等参数。midi芯片102存储着各个乐器各个音符对应的音色波形,即存储一个音色库。midi芯片102收到单片机101发送的控制指令后,根据控制指令读取上述待播放音符对应的音色波形,然后再根据播放时长、播放音量等控制参数,生成模拟的音频信号。然后,将该音频信号发送给功率放大器103。功率放大器103对接收的音频信号,进行功率放大,之后,用该放大后的音频信号驱动扬声器104发声。其中,功率放大器103为如下一种:a类功率放大器、b类功率放大器、ab类功率放大器、d类功率放大器。在本实施例中,定时器的值每增加1,就依次判断各个任务中,是否有需要播放的音符,如果有,则依序播放各个音符,如果没有,就等待,等待定时器的值增加1,循环执行上述步骤。美中不足的地方是:本申请提供的方案没有声音合成这一步,音符是依次播放的,如果midi消息中相邻的音符有段时间是重叠播放的,但采用本申请的技术方案后,即使前一个音符正在播放,还没有播放对应的播放时长,此时,会被后一个音符冲掉,单独播放后一个音符对应的声音。所以本申请的技术方案适合播放音符重叠时间较少的midi音乐。另外,单片机101采用定时器中断的处理机制,既只要定时器的值增加1,就依次判断各个任务中是否有需要播放的音符,如果有需要播放的音符,为保证音乐的节奏,即使上一轮循环中还存在没有被播放的音符,也会中断上一轮的播放,转而播放这一轮中待播放的音符。所以单片机的每个任务还被配置用于:如果判断定时器当前的值大于当前任务中待播放音符的播放时间,则表示已经过了该待播放音符的播放时间,丢弃该待播放音符,选取本任务中下一个待播放音符的播放时间与定时器当前的值进行比较,如果相等,则播放该待播放音符,如果大于,则跳转一下任务,如果小于,重复上述步骤。综上所述,本申请的技术方案适合播放复音数较少的音乐。所谓的“复音”是指midi乐曲在1秒钟内发出的最大声音数目。如果复音数较大,会出现丢失音符的情况,影响播放效果。在本实施例中,单片机创建多个任务,每个任务对应一个通道,定时器的值每增加1,就依次轮询各个任务中是否有待播放的音符,任务间切换的速度特别快,达到微秒级别,整个过程中,程序处理、程序执行所占的时间极短,大部分时间被预留给播放待播放音符,所以即使采用低配置的单片机,播放低复音数的midi音乐的音乐效果也非常好。降低了设备的成本,满足了低端消费者的需求。在本实施例的其他可选的实现方式中,单片机只创建一个任务,该任务被配置用于:确定通道的个数及各个通道内音符的播放时间,然后,循环执行如下步骤:定时器的值每增加1,则将定时器当前的值依次与各个通道待播放音符的播放时间进行比较,如果相等,则向midi芯片发送控制指令。继续参考图2,该图是本申请基于单片机的midi音乐播放方法的一个实施例的流程图。如图所示,所述方法包括如下步骤:步骤201,解析midi消息,确定通道的个数及各个通道内音符的播放时间。由于早期的midi设备在乐器的音色排列上没有统一的标准,造成不同型号的设备回放同一首乐曲时也会出现音色偏差。为了弥补这一不足,便出现了gs、gm和xg这类音色排列方式的标准。在本实施例中,单片机根据midi的标准、格式解析midi消息,确定通道的数量及各个通道内音符的播放时间,本实施例中,通道的数量为3,不同的通道代表不同的乐器。步骤202,为每个通道创建一个任务。在本实施例中,为每个通道创建一个任务。将各通道中各音符的播放时间换算成定时器的值。即当定时器的值到达某个具体值时,播放某个音符。步骤203,任务调度。在本实施例中,采用任务调度算法协调执行各个任务。本实施例中有3个任务。任务1执行的操作为步骤20411、步骤20412、步骤20413,任务2执行的操作为步骤20421、步骤20422、步骤20423,任务3执行的操作为步骤20431、步骤20432、步骤20433。任务调度算法为:定时器的值每增加1,就依次执行各个任务。在每个任务中,通过将待播放音符的播放时间与定时器当前的值比较,判断是否到达播放音符的时间,如果达到,则生成并发送控制指令,用于控制播放音符对应的声音。任务结束,执行下一个任务;如果还没有到达播放音符的播放时间,则执行下一个任务。下面具体的说下任务调度的一个例子:定时器的值增加1,则执行任务1的步骤20411,即读取任务1中待播放音符的播放时间。然后,执行步骤20412,比较定时器当前的值与上述待播放音符的播放时间,如果定时器当前的值小于上述待播放音符的播放时间,则表示还未到达该音符的播放时间,则跳转执行步骤203,任务调度,切换资源,执行任务2对应的步骤。即执行步骤20421,读取任务2中待播放音符的播放时间。然后,执行步骤20422,如果定时器当前的值等于待播放音符的播放时间,则表示正好到达播放时间,则执行步骤20423,生成播放该音符的控制指令,并向midi芯片发送该控制指令。之后,执行步骤205,表示该任务执行完成。此时会形成两个分支,该两个分支是并行执行的。一个分支是执行步骤206、步骤207,播放该音符对应的声音。另一个分支是跳转到步骤203任务调度中,切换资源,执行任务3对应的各步骤。即执行步骤20431,读取任务3中待播放音符的播放时间,然后,执行步骤20432,比较定时器当前的值与待播放音符的播放时间,如果到达播放时间,则执行步骤20433,生成播放该音符的控制指令,并向midi芯片发送控制指令,最后,执行步骤205,表示该任务执行完成。任务完成后,又分成两个分支,一个分支是执行步骤206、207控制播放该音符;另一个分支跳转执行步骤203任务调度,等待定时器的值加1,然后依次执行各个任务。步骤206,midi芯片根据控制指令,确定播放的音频信号,并将音频信号发送给功率放大器进行功率放大。在本实施例中,midi芯片接收各个任务发送的控制指令,再依次根据控制指令中通道的唯一标识、音符的唯一标识,读取该音符对应的音色波形,再根据播放时长、播放音量生成音频信号,之后,将该音频信号发送给功率放大器进行功率放大。步骤206,功率放大器用放大后的音频信号驱动扬声器发声。在本实施例中,功率放大器先将音频信号进行放大,然后,用放大后的音频信号驱动扬声器发声,播放该音符的声音。本申请的上述实施例,单片机先解析midi消息,确定通道的个数及各个通道内音符的播放时间,创建任务,每个通道对应一个任务,然后,定时器的值每增加1,依次执行各个任务一次,每个任务判断本通道是否存在当下需要播放的音符,如果存在,生成控制指令。控制midi芯片生成对应的音频信号,经功率放大后,进行播放。每个任务的步骤简练,执行速度快,采用上述任务调度算法,可快速的切换任务,使用极短的时间选出当下需要播放的音符。随着时间的推移,连续不断的播放音符。加之通道数少,midi消息中音符的播放时间重叠少,不会出现漏播音符等情况。完美重现midi音乐,成本低,且效果好。在其他实施例中,为处理漏播音符的情况,在各任务的判断是否到达播放时间的步骤后,增加一个跳转,即如果定时器当前的值大于待播音符的播放时间,则表示已经过了该音符的播放时间,该音符被漏播,忽略该音符,为不妨碍播放下一个音符,需跳转执行本任务的第一个步骤,即读取下一个待播音符的播放时间,然后按顺序执行接下来的步骤。本申请的技术方案采用低成本的单片机,将midi消息中音符按照不同的乐器或者演奏划分成不同的通道,定时器的值每增加1,轮询各个通道一次,选取待播放的音符播放。算法简单,适用于低配置的单片机。高质量的播放独奏、音符并发不高的midi音乐。上述电路和算法适用于机器人、玩具车等设备,降低设备成本,降低了消费者的门槛。以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。当前第1页1 2 3 当前第1页1 2 3 

起点商标作为专业知识产权交易平台,可以帮助大家解决很多问题,如果大家想要了解更多知产交易信息请点击 【在线咨询】或添加微信 【19522093243】与客服一对一沟通,为大家解决相关问题。

此文章来源于网络,如有侵权,请联系删除

tips