实现将MIDI文件和数字波形音频文件合成播放的方法及装置转让专利

申请号 : CN200510098781.3

文献号 : CN1731506B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙丰强赵原

申请人 : 北京中星微电子有限公司

摘要 :

本发明公开了一种实现将MIDI文件和数字波形音频文件合成播放的方法,包括:A、将数字波形音频文件分别按照MIDI指令格式,编码为一个伪MIDI指令,将伪MIDI指令和该数字波形音频文件的数据一一对应,并进行标识;将MIDI文件中的指令进行标识后,与伪MIDI指令和数字波形数据存储在一个MIDI/数字波形混合音频文件中;B、在播放该混合音频文件时,确定时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列;C、按排列顺序,将MIDI指令、伪MIDI指令和数字波形数据发送给发声单元进行播放。本发明还公开了实现该方法的装置,包含文件合成模块、文件解析模块和发声单元。应用本发明能够同时获得MIDI和数字波形文件的效果。

权利要求 :

1.一种实现将MIDI文件和数字波形音频文件合成播放的方法,其特征在于,包含以下步骤:A、将需要进行合成的各个数字波形音频文件分别按照MIDI指令格式,编码为一个伪MIDI指令,将伪MIDI指令和该数字波形音频文件的数据一一对应,并进行标识;将MIDI文件中的MIDI指令进行标识后,与伪MIDI指令和数字波形数据存储在一个MIDI/数字波形混合音频文件中;其中,所述将数字波形音频文件编码为一个伪MIDI指令的方法为:根据用户输入的播放数字波形混合音频文件相对于播放MIDI文件的起始时间,确定时间信息、事件编号和数据编号,按照MIDI指令格式存储为一个伪MIDI指令;

B、在播放MIDI/数字波形混合音频文件时,确定时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列;

C、按排列顺序,将MIDI指令、伪MIDI指令和数字波形数据发送给发声单元进行播放。

2.如权利要求1所述的方法,其特征在于,所述步骤A中:

将伪MIDI指令及其数字波形数据存储在一个数字波形文件块中;将各个MIDI指令存储在一个MIDI文件块中;并将块的总数量存储在一个头块中;对数字波形文件块、MIDI文件块和头块分别进行标识后组成MIDI/数字波形混合音频文件。

3.如权利要求2所述的方法,其特征在于,

所述将伪MIDI指令及其数字波形数据存储在一个数字波形文件块中的方法为:将所有伪MIDI指令内容存储到一个事件子块中;将数字波形数据存储到对应的一个数据子块中;对事件子块和数据子块分别进行标识;并存储数字波形文件块包含子块的信息;

将各个MIDI指令存储在一个MIDI文件块中的方法为:将所有MIDI指令内容存储到一个事件子块中,对事件子块采用与伪MIDI指令相同的标识;并存储MIDI文件块包含子块的信息。

4.如权利要求3所述的方法,其特征在于,所述步骤B中:根据头块标识找到头块,获得该MIDI/数字波形混合音频文件总块数;按照该块数读取后续的块;

再根据MIDI文件块标识找到MIDI文件块,并进一步找到其后的事件子块,获得其中的MIDI指令,且根据数字波形文件块标识找到数字波形文件块,并进一步找到其后的事件子块和数据子块,记录数据子块位置,获得事件子块中的伪MIDI指令;然后按照MIDI指令或伪MIDI指令中的时间信息,读取各个MIDI指令或伪MIDI指令进行排序。

5.如权利要求3所述的方法,其特征在于,所述根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形文件,并按时间轴将MIDI指令和伪MIDI指令顺序排列的方法包括:B1、将MIDI事件子块的第一个MIDI指令,标记为当前MIDI message;将数字波形文件块中的事件子块中的第一个伪MIDI指令,标记为当前数字波形文件message;

B2、提取当前MIDI message和数字波形文件message的起始播放时间,选取时间最早的事件子块进行解析;

B3、读取该事件子块中MIDI指令或伪MIDI指令放入输出队列,如果是伪MIDI指令,进一步读取其后的数据子块,记录数据子块的位置;

B4、调整该事件子块后事件子块中MIDI指令或伪MIDI指令的时间信息;

B5、将该事件子块中的下一个MIDI指令或伪MIDI指令标记为当前message;返回步骤B2,直到读取完所有的事件子块。

6.如权利要求4所述的方法,其特征在于,该方法进一步包括:在读取MIDI/数字波形混合音频文件的块过程中,如果找到头块或MIDI文件块或数字波形文件块,其后没有事件子块或数据子块,则该MIDI/数字波形混合音频文件错误,向用户输出错误信息。

7.如权利要求1或4所述的方法,其特征在于,所述步骤C为:按排列顺序,将MIDI指令、伪MIDI指令输出给发声单元,并在输出伪MIDI指令同时,读取对应的数字波形数据输出给发声单元进行播放。

8.如权利要求1~6任一权利要求所述的方法,其特征在于,所述的数字波形音频文件为:MP3文件、WAV文件或WMA文件。

9.一种实现将MIDI文件和数字波形音频文件合成播放的装置,包括发声单元,其特征在于,该装置还包含文件合成模块和文件解析模块;

所述的文件合成模块,分别接收MIDI文件和数字波形音频文件,将接收的各个数字波形音频文件分别按照MIDI指令格式,编码为一个伪MIDI指令,将伪MIDI指令和该数字波形音频文件的数据一一对应,并进行标识;将MIDI文件中的MIDI指令进行标识后,与伪MIDI指令和数字波形数据存储在一个MIDI/数字波形混合音频文件中;其中,将数字波形音频文件编码为一个伪MIDI指令包括:根据用户输入的播放数字波形混合音频文件相对于播放MIDI文件的起始时间,确定时间信息、事件编号和数据编号,按照MIDI指令格式存储为一个伪MIDI指令;

所述的文件解析模块,确定时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列,按排列顺序,将MIDI指令、伪MIDI指令和数字波形数据发送给发声单元;

所述的发声单元,按照MIDI指令发声或伪MIDI指令,从文件解析模块接收数字波形数据进行播放。

10.如权利要求9所述的装置,其特征在于:所述的发声单元包含指令转换模块和发声装置;

所述的指令转换模块,接收文件解析模块按排序顺序发送的MIDI指令和伪MIDI指令,将接收的MIDI指令和伪MIDI指令转换为发声装置能够识别的格式发送给发声装置;

发声装置,按照MIDI指令发声或按照伪MIDI指令,接收数字波形数据进播放。

说明书 :

技术领域

本发明涉及实现数字音乐合成的技术,特别涉及一种实现将MIDI文件和数字波形音频文件合成播放的方法及装置。

背景技术

MIDI的全称是Musical Instruments Digital Interface,即音乐设备数字接口。它自80年代初诞生以来在专业音乐制作领域得到了相当广泛的引用。MIDI文件本身非常小,一般小的就是20多K字节,甚至几K字节,大的也就100K字节左右。
MIDI文件本身不记录任何声音波形,只记录如下信息:某个MIDI通道于某个时间向MIDI合成器等发声装置发送某个乐器需要以某个状态,包括音高、力度、音量、混响等状态来发声。整个发声过程,称之为一个MIDI事件(EVENT)。MIDI文件就是一个个事件信息的集合体,各个事件发送给发声装置用来控制发声也可以称为MIDI指令,MIDI文件很小,由于它的播放效果直接由硬件资源获得,因此音质不够丰富。
而MP3、WAV以及、WMA等数字波形音频文件对声音的波形进行采样、记录为数字信息,回放的时候则由数字采样还原波形,输出给发声装置进行播放。也就是说,MP3、WAV以及、WMA等数字波形音频是通过真实的采样数据压缩来存储声音信息,这样音质丰富,但同时文件容量也会变大。
MIDI和MP3是非常普及的音频文件,很多具有发声功能的电子设备都可以采用MIDI文件或MP3文件来播放音乐,特别是现在手机这一通讯设备广泛应用的时代,更是广泛用于手机铃声播放。
MIDI文件尺寸小,占用内存空间小,所以很方便于手机终端播放。MP3已经是非常普及一种文件格式,几乎所有的歌曲都有MP3文件存储形式,那么手机终端支持MP3播放,用户将很容易将pc或其它播放器上的MP3歌曲直接传输的手机上播放,更便于手机音乐播放的推广。
手机中播放MIDI或MP3可以由一个发声单元来实现,其结构参见图1,图1为现有技术发声单元的结构示意图。其中指令转换模块101接收MIDI指令或MP3播放指令,将其转换为发声装置102能够识别的格式分别发送给发声装置102。发声装置102按照MIDI指令发声或按照MP3播放指令,接收MP3数据进行播放。
虽然,目前手机等具有发声功能的电子设备都能提供单独的播放MIDI或MP3等数字波形音频文件的功能,但MIDI文件和MP3文件是两种单独的不同格式的文件,因此目前不能把MIDI文件和数字波形音频文件合成进行播放。

发明内容

有鉴于此,本发明的主要目的在于提供一种实现将MIDI文件和数字波形音频文件合成播放的方法,获得更好的音乐效果。
本发明的另一个主要目的在于提供一种实现将MIDI文件和数字波形音频文件合成播放的装置,该装置能够输出较好的音乐效果。
为达到上述目的的一个方面,本发明提供了一种实现将MIDI文件和数字波形音频文件合成播放的方法,该方法包括以下步骤:
A、将需要进行合成的各个数字波形音频文件分别按照MIDI指令格式,编码为一个伪MIDI指令,将伪MIDI指令和该数字波形音频文件的数据一一对应,并进行标识;将MIDI文件中的MIDI指令进行标识后,与伪MIDI指令和数字波形数据存储在一个MIDI/数字波形混合音频文件中;其中,所述将数字波形音频文件编码为一个伪MIDI指令的方法为:根据用户输入的播放数字波形混合音频文件相对于播放MIDI文件的起始时间,确定时间信息、事件编号和数据编号,按照MIDI指令格式存储为一个伪MIDI指令;
B、在播放MIDI/数字波形混合音频文件时,确定时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列;
C、按排列顺序,将MIDI指令、伪MIDI指令和数字波形数据发送给发声单元进行播放。
所述步骤A中:可以将伪MIDI指令及其数字波形数据存储在一个数字波形文件块中;将各个MIDI指令存储在一个MIDI文件块中;并将块的总数量存储在一个头块中;对数字波形文件块、MIDI文件块和头块分别进行标识后组成MIDI/数字波形混合音频文件。
所述将伪MIDI指令及其数字波形数据存储在一个数字波形文件块中的方法可以为:将所有伪MIDI指令内容存储到一个事件子块中;将数字波形数据存储到对应的一个数据子块中;对事件子块和数据子块分别进行标识;并存储数字波形文件块包含子块的信息;
将各个MIDI指令存储在一个MIDI文件块中的方法为:将所有MIDI指令内容存储到一个事件子块中,对事件子块采用与伪MIDI指令相同的标识;并存储MIDI文件块包含子块的信息。
所述步骤B中:根据头块标识找到头块,获得该MIDI/数字波形混合音频文件总块数;按照该块数读取后续的块;
再根据MIDI文件块标识找到MIDI文件块,并进一步找到其后的事件子块,获得其中的MIDI指令,且根据数字波形文件块标识找到数字波形文件块,并进一步找到其后的事件子块和数据子块,记录数据子块位置,获得事件子块中的伪MIDI指令;然后按照MIDI指令或伪MIDI指令中的时间信息,读取各个MIDI指令或伪MIDI指令进行排序。
所述根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形文件,并按时间轴将MIDI指令和伪MIDI指令顺序排列的方法可以包括:
B1、将MIDI事件子块的第一个MIDI指令,标记为当前MIDI message;将数字波形文件块中的事件子块中的第一个伪MIDI指令,标记为当前数字波形文件message;
B2、提取当前MIDI message和数字波形文件message的起始播放时间,选取时间最早的事件子块进行解析;
B3、读取该事件子块中MIDI指令或伪MIDI指令放入输出队列,如果是伪MIDI指令,进一步读取其后的数据子块,记录数据子块的位置;
B4、调整该事件子块后事件子块中MIDI指令或伪MIDI指令的时间信息;
B5、将该事件子块中的下一个MIDI指令或伪MIDI指令标记为当前message;返回步骤B2,直到读取完所有的事件子块。
该方法可以进一步包括:在读取MIDI/数字波形混合音频文件的块过程中,如果找到头块或MIDI文件块或数字波形文件块,其后没有事件子块或数据子块,则该MIDI/数字波形混合音频文件错误,向用户输出错误信息。
所述步骤C可以为:按排列顺序,将MIDI指令、伪MIDI指令输出给发声单元,并在输出伪MIDI指令同时,读取数字波形数据输出给发声单元进行播放。
所述的数字波形音频文件可以为:MP3文件、WAV文件或WMA文件。
为达到上述目的的另一个方面,本发明提供了一种实现将MIDI文件和数字波形音频文件合成播放的装置,该装置包括:发声单元、文件合成模块和文件解析模块;
所述的文件合成模块,分别接收MIDI文件和数字波形音频文件,将接收的各个数字波形音频文件分别按照MIDI指令格式,编码为一个伪MIDI指令,将伪MIDI指令和该数字波形音频文件的数据一一对应,并进行标识;将MIDI文件中的MIDI指令进行标识后,与伪MIDI指令和数字波形数据存储在一个MIDI/数字波形混合音频文件中;其中,将数字波形音频文件编码为一个伪MIDI指令包括:根据用户输入的播放数字波形混合音频文件相对于播放MIDI文件的起始时间,确定时间信息、事件编号和数据编号,按照MIDI指令格式存储为一个伪MIDI指令;
所述的文件解析模块,确定以播放MIDI或数字波形为时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及数字波形数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列,按排列顺序,将MIDI指令、伪MIDI指令和数字波形数据发送给发声单元;
所述的发声单元,按照MIDI指令发声或伪MIDI指令,从文件解析模块接收数字波形数据进行播放。
其中,所述的发声单元包含可以指令转换模块和发声装置;
所述的指令转换模块,接收文件解析模块按排序顺序发送的MIDI指令和伪MIDI指令,将接收的MIDI指令和伪MIDI指令转换为发声装置能够识别的格式发送给发声装置;
发声装置,按照MIDI指令发声或按照伪MIDI指令,接收数字波形数据进播放。
由上述的技术方案可见,本发明的这种实现将MIDI文件和数字波形音频文件合成播放的方法及装置,将MIDI文件打散为单个MIDI指令,并将数字波形音频文件转换为一个MIDI指令格式的MIDI伪指令,合成为混合音频文件,在播放过程中,对混合音频文件中的伪MIDI指令和MIDI指令进行排序,按排好的顺序将伪MIDI指令和MIDI指令输出给发声单元进行播放。这样,发声单元播放的音乐就是MIDI和数字波形音频文件合成的音乐了,播放的音乐即有MIDI的效果,也有数字波形音频文件的效果。

附图说明

图1为现有技术发声单元的结构示意图。
图2为本发明一较佳实施例中将MIDI文件与MP3文件合成播放的流程示意图;
图3为图2所示实施例中对2个block时间重排的示意图;
图4为实现图2所示流程的一种MIDI/MP3合成播放装置的结构和连接关系示意图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
本发明的这种实现将MIDI文件和数字波形音频文件合成播放的方法及装置,将MIDI文件和数字波形音频文件合成为混合音频文件,在播放过程中,按照音效需要,对混合音频文中的伪MIDI指令和MIDI指令进行排序,按排好的顺序将伪MIDI指令和MIDI指令输出给发声单元进行播放。
本发明方法适用与将MIDI与MP3、WAV以及、WMA等多种数字波形音频文件进行合成播放,其中MP3音频文件是目前在具有发声功能的电子设备中应用最多的一种音频文件。以下就以将MIDI文件与MP3文件合成播放为例进行详细说明。
首先分别介绍一下MIDI文件和MP3文件的格式。
一个MIDI文件就是由很多个chunk组成的集合,通常包含一个“头”和多个“轨”。头中包含了MIDI文件的一些基本信息,而每一轨中包含具体的message。如下图示:
其中各个message都是以形式存在,指当前消息与上一个消息间的时间间隔,则表示一个具体的MIDI消息。
MIDI文件格式如表1所示:

表1
MP3文件格式如表2所示:
  Head(32)  CRC(16)   Slide information(17,32)   Data
表2
其中,Head为4byte的帧头信息,存储整个帧的相关信息。
CRC为校验码,它的存在与否由head中相关信息决定。
Slide information中存储与解码相关的信息。
Data区即为压缩的MP3数据。
参照MIDI文件格式,本发明设置了MIDI/MP3混合音频文件的格式,如表3所示,MIDI/MP3混合音频文件是以数据块的形式保存的,其包括以下3种块(Block):
Head Block
  Block ID   Block Size   File Version   Block Hum
Midi Block
  Block ID   Block Size   Trunk Hum
  Event Trunk ID   Trunk Size   Event Data
Mp3 Block
  Block ID   Block Size   Trunk Hum
  Event Trunk ID   Trunk Size   Event Data
  Data Trunk ID   Trunk Size   Mp3 Data
表3
头块(Head Block),一个混合文件包含一个头块,该块存储了由VMHB标识的头块标识(Block ID)、头块大小(Block Size)、文件版本(File Version)、本文件包含的块总数(Block Num)。
MIDI块(MIDI Block),包含两类块:一个MIDI文件块,该块存储了由VMMB标识的MIDI文件块标识(Block ID)、MIDI文件块大小(BlockSize)、MIDI文件块包含的事件子块总数(Trunk Num)。一个事件子块,每个事件子块存储了一个由ERrk标识的事件子块标识(Event Trunk ID)、事件子块大小(Trunk Size)、事件数据(Event Data)。其中,事件数据中存储的就是MIDI文件所有的message,每个message的格式与原MIDI文件相同。
MP3块(MP3Block),包含三类块:一个MP3文件块,该块存储了由VM3B标识的MP3文件块标识(Block ID)、MP3文件块大小(Block Size)、MP3文件块包含的事件子块总数(Trunk Num)。一个事件子块,每个事件子块存储了一个由ETrk标识的事件子块标识(Event Trunk ID)、事件子块大小(Trunk Size)、事件数据(Event Data)。这里事件数据中存储的就是所有需要合并的MP3文件编码的MIDI伪指令也就是所有的MP3message。一个数据子块,其存储了一个由DTrk标识的数据子块标识(Data Trunk ID)、数据子块大小(Trunk Size)、所有需要合并的MP3文件的MP3数据(MP3Data)。
参见图2,图2为本发明一较佳实施例中将MIDI文件与MP3文件合成播放的流程示意图。该流程包括以下步骤:
步骤200,将准备合成的MIDI文件中的MIDI指令存储到MIDI Block中,并计算出播放该MIDI文件总的时间长度。
具体来说,本步骤中,将MIDI文件打散,获得共包含多少个MIDI指令,以及每个MIDI指令的数据内容和数据长度。将统计每个MIDI指令数据长度计算出所有MIDI指令总数据长度,将总数据长度、所有的MIDI指令的内容和事件标识存储到一个MIDI事件子块中的Trunk Size、Event Data和Event Trunk ID中。再将MIDI事件子块总个数1、计算出的总数据长度、与Block标识存储到一个MIDI Block中的Trunk Num、Block Size和Block ID中。本实施例中,对于MIDI文件,Block ID为VMMB;Event Trunk ID为ETrk。
本步骤中,如果准备合成的MIDI文件中只包含一个Chunk,也就是说该文件中的MIDI指令已经按先后顺序排列好的,则直接按照该顺序,将各个包含MIDI指令的message添加到MIDI Block的Event Trunk中。如果准备合成的MIDI文件中包含多个Chunk,也就是说不是所有的MIDI指令都按先后顺序排列好的,这种情况下,则先确定一个绝对时间,根据各个Chunk中各个message中的Delta time信息,将各个MIDI指令按先后顺序排列好,组成一个MIDI Block。例如:有两个Chunk,Chunk0和Chunk1,Chunk0包含3个事件它们的时间信息分别为0、100、200;Chunk1包含2个事件它们的时间信息分别为50、300,排序时,确定以Chunk0时间为绝对时间,则排序后5个事件的时间信息分别为:0、50、50、200、50。
由于合成文件中midi、mp3block中的时间delta time都是相对时间,如chunk0中的0,100,200,表示chunk0中有三个message,message0在一开始就播放,message 1在message0播放100ms后播放,故message 1的绝对起始播放时间为100,message2在message1播放200ms后播放,故message2的绝对起始播放时间为300ms。
两个或多个block时间重排的方法包括如下步骤:
步骤1,将相对时间转换成绝对时间;
对于上述例子来说就转换为:
Chunk0  0, 100,300
Chunk1  50,350
步骤2,依据绝对时间排序;
步骤3,再转换成相对时间生成新的时间序列。
上述例子中时间重排的过程如图3所示,图3为图2所示实施例中对2个block时间重排的示意图,最终的时间排列为0,50,50,200,50。
由上述表1可知,MIDI文件中,通过可以把MIDI文件中所有“轨”按照时间先后合并成一个“轨”。MIDI时间计算的方法很清晰简单,即:按照对MIDI文件中所有message排队,在此过程中累加,MIDI文件中所有message排列完毕,的最终累加值就是MIDI文件的播放时间。
步骤201,计算出准备进行合成的一个或多个MP3文件的播放时间长度,并根据用户选择,确定播放MP3文件与播放MIDI文件相对的起始播放时间,将各个文件的相对播放时间作为对应的MP3 Block和MIDI Block的Event Trunk中Event Data的第一个message的时间信息存储。
假设本实施例中,用户选择先播放MIDI文件,20ms后开始播放第一个MP3文件,再过100ms后开始播放第二个MP3文件。则将该MIDI Block中Event Trunk的第一个message的delta_time写为0。MP3Block的EventTrunk的第一个message的delta_time写为20,第二个message的delta_time写为100。
参考表2的MP3数据格式,计算MP3的播放时间可以采用如下公式:
帧大小:FrameSize=144*BitRate/SampleRate+pad;
播放时间:Time=FrameSize*8/BitRate;
计算所有帧的播放时间,累加求和即MP3文件的播放时间。
其中,BitRate、SampleRate、pad均存在于head中。
本实施例中,由于计算出了各个MIDI文件和MP3的播放时长,因此可以将MIDI文件播放时长和MP3播放时长分别以条形图像与时间轴并列显示给用户,根据用户移动MP3文件或MIDI文件的条形图像的位置来确定播放MP3文件与播放MIDI文件相对的起始时间。
步骤202,将1个或多个MP3文件分别转换为MIDI伪指令,也就是MP3message,存储到MP3Block的Event Trunk中,将MP3数据存储到MP3Block的Data Trunk中。转换为MIDI伪指令的方法为:将MP3文件转换为如表4格式:
  Delta time   MessageID   DataID
表4
其中,Delta time是该MP3事件与上一个事件间的时间间隔。该时间信息根据步骤201确定的MP3初始时间确定,如果只有一个MP3用来合成,则是与MIDI文件播放的起始时间的时间间隔,如果有多个MP3则是与上一个MP3起始播放的时间间隔。
其中Message ID:是MP3的事件编号,可以指定,比如0xAB。
DataID:是MP3的数据编号本实施例中,可以导入很多个MP3文件,分别存储在MP3 Block中的Data Trunk中,通过Data Trunk ID索引,此处DataID就是Data Trunk ID。
将所有转换后的MIDI伪指令的相关信息存储在一个事件子块和一个数据子块中。将伪指令的数据长度和事件子块标识,分别存储到事件子块中的Event Data、Trunk Size和Event Trunk ID中。并将该事件子块中的MP3数据对应的数据子块中,存储伪指令的Data Trunk ID、Trunk Size和MP3 Data,MP3 Data存储的就是真正的MP3数据。
计算出各个MP3事件子块和数据子块的数据长度以及子块总数,存储到MP3 Block中的Block Size和Trunk Num中,并添加上Block ID。本实施例中,对于MP3文件,Block ID为VM3B;Event Trunk ID为ETrk;DataTrunk ID为DTrk。
步骤203,将MIDI文件和MP3文件合成为MIDI/MP3混合音频文件。
具体的方法为:计算出MIDI Block和MP3 Block的总数量、总数据量、添加上头块标识Block ID和文件版本(File Version)形成一个头块(HeadBlock),本实施例中该Block ID为VMHB。将Head Block和各个MIDI Block、各个MP3 Block存储在一个文件中,即将MIDI文件和MP3文件合成为MIDI/MP3混合音频文件。
步骤204,在播放MIDI/MP3混合音频文件时,读取该文件,先找到Head Block,对其进行解析,获得该文件中Block的总数量。
本步骤中,可以根据Head Block的Block ID是否为VMHB来查找HeadBlock。
步骤205,将MIDI Block的Trunk中第一个message,标记为当前MIDImessage;将MP3 Block的Trunk中第一个message,标记为当前MP3 message。
本步骤中,可以先根据Block ID为VMMB还是VM3B,确定该Block是MIDI Block还是MP3 Block。如果是VMMB,则读取MIDI Block后面的MIDI Event Trunk的内容,获得其中Event Data存储的MIDI指令,也就是MIDI message。
如果是VM3B,则读取MP3Block后面的MP3Event Trunk的内容,根据Event ID是ETrk的Trunk获得其中Event Data存储的伪MIDI指令,也就是MP3 message。
步骤206,读取各个Block的Trunk中当前message的起始播放时间,选取时间最早的Block的Trunk进行解析。
本实施例中,根据步骤201中,MIDI Trunk中的Event Data的第一个message起始播放时间最早,则本步骤中先对MIDI Trunk进行解析。本步骤中,确定了起始播放时间,即确定了时间轴。
步骤207,读取该Trunk中MIDI指令或伪MIDI指令放入输出队列。
本步骤中,如果读取的是MIDI Trunk中的MIDI指令,则只需将该MIDI指令放入输出队列即可。
如果读取的是MP3 Trunk中的伪MIDI指令,则将该伪MIDI指令放入输出队列的同时,根据Event ID是DTrk得到该伪MIDI指令对应的DataTrunk的MP3 Data数据内容,并记录该伪MIDI指令对应的数据的位置。
步骤208,调整各个Trunk中其他message时间信息。
具体的调整方法与上述步骤200中的时间重排的方法相同,本步骤中,仍以MIDI的起始播放时间为绝对时间,具体在这里不再重复说明。
步骤209,将该Trunk中的下一个mssage标记为当前message。
如果该Trunk是MIDI Trunk,就将下一个MIDI mssage标记为当前MIDImessage;如果该Trunk是MP3 Trunk,就将下一个MP3 mssage标记为当前MP3 message。
步骤210,根据各个Block中的Trunk的总数量判断是否读取完所有的Trunk,如果是,则执行步骤212;否则返回步骤205,读取下一个Trunk进行解析。
步骤211,按照队列顺序,将MIDI指令、伪MIDI指令和MP3数据发送给发声单元。其中在发送伪MIDI指令时,根据记录的该伪指令对应的数据位置,找到该MP3数据同时发送给发声单元。
在上述过程中,每一个Block或Trunk标识后面都有一个表征长度的数据,表示它后面的数据有多长,这样就可以在找到ETrk后,根据长度找到接下来的ETrk或者DTrk了。
另外,如果在上述过程中找到Head Block或MIDI Block或MP3 Block后发现后面没有数据了,这就表明该合成文件有问题了,则向用户输出错误信息,也样就验证了文件的正确性。
另外,本发明还提供了一种实现将MIDI文件和数字波形音频文件合成播放的装置,以下仍以实现MIDI文件与MP3文件合成播放为例进行详细说明。
参见图4,图4为实现图2所示流程的一种MIDI/MP3合成播放装置的结构和连接关系示意图。该装置包括发声单元410,文件合成模块401和文件解析模块402。
其中,文件合成模块401,分别接收MIDI文件和MP3文件,将接收的各个MP3文件分别按照MIDI指令格式,编码为一个伪MIDI指令,并进行标识;将MIDI文件中的MIDI指令进行标识后,与伪MIDI指令和MP3数据存储在一个MIDI/数字波形混合音频文件中。具体的实现方法与图2中的步骤200~203相同,这里不再重复
文件解析模块402,确定以播放MIDI或MP3为时间轴,本实施例是以MIDI为时间轴,根据不同标识分别读取MIDI指令和伪MIDI指令及MP3数据,并按时间轴将MIDI指令和伪MIDI指令顺序排列,按排列顺序,将MIDI指令、伪MIDI指令和MP3数据发送给发声单元410。
本实施例中,发声单元410包含指令转换模块411和发声装置412。指令转换模块411,接收文件解析模块402按排序顺序发送的MIDI指令和伪MIDI指令,将接收的MIDI指令和伪MIDI指令转换为发声装置412能够识别的格式发送给发声装置412。发声装置412按照MIDI指令发声或按照伪MIDI指令,从文件解析模块402接收MP3数据进播放。
这样,合成时就可以选MIDI做为背景音乐,选取简短的MP3穿插在MIDI播放过程中,达到作曲者预期的效果。将MIDI文件与其他数字波形文件合成播放的方法与本实施例相同,这里不再重复说明。
由上述的实施例可见,应用本发明的这种实现将MIDI文件和数字波形音频文件合成播放的方法及装置,播放的音乐即有MIDI的效果,也有数字波形音频文件的效果。