APP下载

从MIDI音乐文件中抽取旋律特征

2016-07-31刘高军,郭校培

数码世界 2016年3期
关键词:音轨音符发音

从MIDI音乐文件中抽取旋律特征

1 背景

目前,网络上每天都会产生大量的音乐作品,音乐的推荐系统也种类繁多。但大多数都是根据用户的喜好,或者是音乐的关联来进行推荐的[1]。考虑到音乐特征本身的相似性,因此考虑从音乐本身的特征出发,根据特征的相似度来给用户推荐歌曲。然而金毅等人[2]通过研究得出结论:从声音文件中提取旋律特征处理过程复杂、难度高,精度不如MIDI文件和模块文件;模块文件通用性较差,编码格式繁多;对于MIDI文件,很多音乐的特征可以直接提取出来,这就为音乐特征的自动识别提供了极大的便利,所以采用MIDI乐曲作为提取音乐旋律的数据源。因此接下来从MIDI文件的分析入手,剖析如何从MIDI中提取特征。

2 MIDI文件的结构

MIDI(Musical Instrument Digital Interface)是一套消息的约定,它不产生声音信号,而是在MIDI电缆上传送各种MIDI消息,由接收MIDI消息的MIDI设备或其它电子装置产生声音或执行动作[3]。

MIDI文件的格式有好多种,目前较为广泛使用的存储格式是后缀为.mid格式的文件,而且是标准的MIDI文件。MIDI文件通常有两部分组成:头块和轨道块。头块用MThd标记,轨道块由MTrk标记,一个MIDI文件由一个头块和紧接的一个或者多个轨道块组成[4]。结构如表1所示。

2.1 头块(Header chunk)

头块出现在MIDI文件开头,共有6字节组成,结构如表2所示。

2.2 轨道块(Track chunk)

头块之后是一个或多个音轨块,轨道块的结构如表3所示。

表3 MIDI文件轨道块结构

一个MIDI事件由delta-time和MIDI消息组成,deltatime由可变长度编码,它决定了其后MIDI消息的执行时间。2.3 midi消息

一个MIDI消息由一个状态字节和若干个数据字节组成。其中状态字节最高位是1,因此值介于128到255之间;数据字节的最高位是0,因此值介于0到127之间。MIDI消息分为通道消息(Channel Message)和系统消息(System Message)两类[5]。

通道消息对单一的通道起作用,利用状态字节的低4为来表示,从0到15共有16个通道。通道消息分两种:声音消息和模式消息。声音消息用于控制合成器的声音产生,模式消息用于为16条通道分配声音关系,设定单音模式和复音模式等。

表1 MIDI文件结构

表2 MIDI文件头块结构

系统消息应用于整个系统而不是特定的通道,不含有通道码。系统消息分三种:公共消息、实时消息和专用消息。公共消息用于选择歌曲、用拍子数来设定歌曲位置指针、向合成器发出旋律请求;实时消息用来设定系统的事实参数,包括时钟、启动、停止定序器、从停止位置恢复定序器和系统复位;专用消息包含厂商特定的数据,如标识、系列号、模型号及其他消息。

分析midi消息主要为了研究MIDI事件,常见的MIDI事件[6]如表4所示。

表4 常见MIDI事件

3 旋律相关的音轨特征量

3.1 音轨名称

对于MIDI数据文件中的每一个音轨,通常都会有一个音轨名称标注字段,因此该音轨可以作为表征旋律音轨的特征量使用。音轨名称可由以下事件格式中获取”FF 03 length text”,text给出了音序器或者音轨的名称,通常被放置在音轨的开头。

3.2 通道号

所有的音轨消息中都带有一个比特来记录将本音轨的演奏送到哪个通道。MIDI有16个通道,在多音轨MIDI演奏数据中,多个通道被同时演奏。

3.3 左右声道平衡度

每个音轨都记录了一个Pan值,用来表示该音轨的音符在左右声道中音量大小的比例。通常旋律音轨的发音基本处于左右声道平衡的位置。Pan值可以由消息”0xBn 0A value”获取,其中n表示通道号,value表示音轨的Pan值。Pan值得取值范围是0至127,其中64代表左右声道平衡,可以使用以下公式来定义音轨k的左右声道平衡度:F1(k) = Pan(k)-64/127, k=1,2,3…

3.4 平均力度

通常情况下,主旋律声部的全频域平均能量要比其他的声部的高,因此可以定义一个名为平均力度的特征量F2来表示音轨能量的大小。

式子中的k表示音轨号,N表示第k音轨的音符数,V(k,i)表示第k音轨中第i音符的按键力度值,取值范围为0-127。但是在统计的时候,只有那些力度值为非零的“音符开”才被计算在内并进行排序。在同一音轨,如果出现同时发音的多个音符,则计算时取音高最高音符的力度值而删除其余同时发音音符的力度值。

3.5 主音量

每个音轨都记录了一个名为主音量的特征值,假设除了主音量特征,其他的特征值都相同,那么较好的方法是选取主音量较高的音轨作为主旋律。音量值可由“0xBn 07 size”来获取。在该时间格式中,n表示通道号码,size记录该通道的主音量值,其范围在0-127之间。结果用F3(k)来表示。

3.6 发音时间

音轨声音消息通过在音符的开与关之间的相互切换来控制声音,并且还能调整响度和音高等。该事件的格式如下:音符开,“0x9n note velocity”;音符关,“0x8n note velocity”。

在多音轨MIDI演奏数据中,每当多个音符在同一音轨中同时发音时,只计算其中一个音高较高的音符的发音时间。因为人们通常在同一时刻对音高较高的音符容易感知,而该音符通常是在主旋律线上的音符。

对于交叉发音,通常情况下采用从后一个音符的结束时间减去前一个音符的开始时间来表示总发音时间,而不是直接将两个音符的持续时间相加来计算[8]。计算方法如下所示:

F4(k) = , k=1,2,…16

其中,k表示音轨号,n表示第k音轨的音符数,note(i)表示音符i,note(i).end表示该音符的关时刻,note(i). start表示该音符的开时刻。

3.7 发音面积

选取音乐的特征时,音高信息也是关键的音符,结合音符的持续时间一起考虑在内,用发音面积的概念来表示其综合效果。发音面积可用音高与音长的乘积来表示,而音轨的发音面积可以定义为每个音轨的发音面积之和。计算方法如下所示:

其中,note(i)表示音符i,note(i).pitch表示该音符的音高值,而note(i).duration表示该音符的音长。对于同时发音的音符,可以取音高较高的值乘以发音时间来计算发音面积。

3.8 确定主旋律

在MIDI音乐中,但音轨的比较少,更多的是多音轨的数据[9]。基于文献的方法可以得到不同音轨特征量对主旋律的贡献量,因此可以从提取出的多音轨特征运算得出主旋律所在的音轨,成功率在83%以上[7]。

4 实验结果

直接分析二进制文件较为困难,并且MIDI事件本身的复杂性和delta-time的不确定性,使程序处理起来比较困难。然而,借助于java的MIDI包的一些功能函数,就可以很方便的分析MIDI文件。

MidiSystem 类提供了对已安装的 MIDI 系统资源的访问,包括诸如 synthesizer、sequencer 和 MIDI 输入和输出端口等设备。典型的简单 MIDI 应用程序可通过调用一个或多个 MidiSystem 方法开始,这样可了解已安装的设备并获得该应用程序中所需要的设备。通过加载midi文件可以得到一个sequence:Sequence seq = MidiSystem.getSequence(file)。通过这个sequence可以加载到轨道的数据,然后对每一个轨道数据进行遍历可以得到每个轨道的midi消息。按照如上图所示的几种MIDI时间以及几个特征量的抽取方法来进行处理,可以得到比较完整的特征结果[10]。

分析MIDI文件的关键步骤如图1所示,可以较为方便的得到相关的特征。

图1 分析MIDI文件的关键步骤流图

以“歌唱祖国”和“黄河颂”为例,得到的主旋律的结果数据如下表所示。

表5 “歌唱祖国”和“黄河颂”的音轨特征

在实际的操作中,主要以后五个特征按照一定的权重来进行运算。

5 结束语

按照java语言提供的一些功能函数可以较为方面的分析MIDI文件,然后从定义的几个维度从MIDI文件中得到目标数据,使处理MIDI文件的过程变得简单高效。然而实际过程中大多数的MIDI文件为多音轨的,因此需要按照一定的方法从多音轨中找到能够代表主旋律的音轨,然后分析该音轨的特征,确定MIDI音乐的特征。根据分析出来的特征向量,为后续基于特征的推荐做了准备。

[1]Alexandros Nanopoulos, Dimitrios Rafailidis, Panagiotis Symeonidis and Yannis Manolopoulos. MusicBox: Personalized Music Recommendation based on Cubic Analysis of Social Tags.

[2]金 毅, 黄 敏. 基于旋律的音乐检索研究-旋律特征的表达和提取[J]. 信息检索技术,2003.4,49-51.

[3]林福宗. 多媒体技术基础[M]. 北京:清华大学出版社,2001.7,14-21.

[4]周明全, 耿国华, 王小凤, 李鹏. 基于内容的音频检索技术[M]. 北京:科学出版社,2014.8,97-99.

[5]杨军. MIDI消息和标准MIDI文件格式剖析与应用[J].中南民族大学学报(自然科学版).2003.9:62-64 Vol. 22 Sup.

[6]潘晓利, 刘永志. 基于单片机的MIDI文件中delta-time的实现. 现代计算机. 2008.1 总第二十七期.

[7]赵芳, 吴亚栋, 宿继奎. 基于音轨特征量的多音轨MIDI主旋律抽取方法[J]. 计算机工程. 2007.1 Vol.33 No.2

[8]刘勇, 林景栋, 穆伟力. 基于H-K算法的MIDI音乐主旋律提取[J]. 计算机技术与发展. 2011.6 : 154-160 Vol.21 No.6

[9]李娟,周明全,李鹏. MIDI主旋律特征提取构建音乐数据库[J]. 计算机工程与应用,2011,47:124-128.

[10]秦丹. 利用C#从MIDI文件中获取音乐旋律[J]. 电脑知识与技术. 2009.6:4281-4284 Vol.5 No.16

猜你喜欢

音轨音符发音
AI在线分离歌曲中的伴奏
美妙音符
春天的音符
Playing with h
Playing with /eI/
Playing with u_e
新手进阶:追求卓越录音品质
穷“屌丝”也玩情侣对唱
变脸
酷品社区