嵌入式MIDI文件格式解析设计与实现
扫描二维码
随时随地手机看文章
关键字:MIDI格式解析;五线谱生成;电子乐谱
1 前言
随着计算机与电子科学的发展,传统的阅读方式正在发生着天翻地覆的变化。在音乐领域,由于纸质乐谱本身具有如不宜保存、查找和携带以及翻页不便等缺点,也促使许多作曲家使用作曲软件制作音乐,使用打谱软件来生成乐谱;但是,虽然制作音乐和生成乐谱的软件很多,相应的阅读乐谱的软硬件设备却很少,由于没有可行的方法把乐谱显示出来,演奏者必须把已数字化的乐谱再打印到纸上,这说明了在音乐领域数字化工作进行的并不彻底。
为了可以把现有的音乐数字化工作扩展到乐谱的阅读,又可以克服纸质乐谱本身的缺点,设计一个跨平台的、便携的、用户友好的电子乐谱阅读器,利用嵌入式的阅读系统代替传统的纸质乐谱与谱架的组合,无疑是一个不错的选择。
当前可以获得的电子版的乐谱可以分为两种,一种是基于图片格式的,另一种是基于数字音乐格式的。前一种主要包括jpg图,gif图等图片格式,以及主要由图片构成的pdf,chm等文档格式,在此本文不作为重点;后一种主要包括MIDI文件格式和一些打谱软件所使用的专用格式。现在常用的打谱软件有很多,但分别属于不同的公司,使用不同的且非公开的格式,本文将着重介绍如何支持公开与标准化的MIDI文件格式的显示。
2 系统分析
图1是一个简单的五线谱的一部分,它具有两个声部,每个声部都对应一组五线。五线谱上有各种标记,表示出五线谱的各种属性。
属性作用的对象包括:乐谱、声部、跨越多声部的音乐段落、单声部的音乐段落与音符等。而从属性作用的方法来看,属性可以划分成几类:有的属性依靠符号的水平位置或垂直位置来体现,有的属性则依靠符号的形状变化体现。
某些情况下,同一个属性必须一致的出现五线谱的许多不同的地方,例如不同声部的调号和、拍号在小节数相同时必须也是相同的,并且要分别标注在每个声部。另外,有些属性并不直接以符号的形式表示在谱上,它作用于其他的属性上,人们可以根据其他属性的变化推断出来。
为了描述五线谱复杂的结构,同时考虑到结构的简洁性以及把这种数据结构绘制到屏幕的便捷性,本文建立了如下几个类:Staff类描述一个五线谱,Track类描述一个声部,Measure类描述一个小节,Notation类是所有符号的基类,Note、Chord、Noteblock、Rest、Tie分别描述了单个音符、和弦、音符组、休止符、延音符等符号。图2直观的表述了类间的关系。
图2 五线谱数据结构组织形式
考虑到五线谱不同声部的小节号相同的小节具有的许多属性都是一致的。为了降低冗余度和方便程序调用,本文为五线谱类设立了不含有音符的虚拟声部,来保存实际声部中的公共小节信息。虚拟声部中的小节声明为VMeasure类,每个声部的Measure类都保存指向对应VMeasure类的指针,方便小节信息的获取。图3显示了虚拟声部在五线谱类中的结构。
3 MIDI文件格式解析
乐器数字接口MIDI(Musical Instrument Digital Interface)是数字音乐国际的标准,定义了计算机音乐程序、合成器及其他电子设备交换信息和电子信号的方式,解决不同电子乐器之间不兼容的问题。MIDI文件中包含音符、定时和多达16个通道的演奏定义。文件包括每个通道的演奏音符信息:键通道号、音长、音量和力度等。由于MIDI文件是一系列指令,而不是波形,它需要的磁盘空间非常少,此外对MIDI数据的编辑和修改非常灵活,可以方便地增加或删除某个音符,或者改变音符的属性。
3.1 格式说明
MIDI文件中的数据划分为若干个块(chunk),块是由块标记、块长度和块数据组成的。其中块标记为4个字节的ACSII码,块长度为4个字节的数值,表示块数据域的长度。如表1所示。
表1 MIDI文件组成
3.2 MIDI文件格式解析模块的结构与解析流程
由于MIDI文件格式解析模块需要完成的任务主要有理解MIDI信息、分析MIDI信息、生成五线谱信息几大部分,因此可以将MIDI文件解析分作两大块。第一块称为文件分析器,主要负责按顺序阅读MIDI文件,将各数据成分分离并分别储存,完成底层面向文件的数据读入和错误处理,保证向上层提供完整的正确的排列有序的音符信息。第二块称为整合分析器,主要负责有选择的使用文件分析器从MIDI文件中获得的原始信息,参照一系列的规则,找出音符之间的组合关系,生成五线谱的逻辑内容。整体结构与处理流程如图4所示。
3.2.1 文件分析器
头块中表明了MIDI文件类型、包含轨道数和四分音符的时间增量数。头块的解析相对简单,但其中的文件类型和四分音符时间增量数对解析流程影响很大。
MIDI文件类型不同,MIDI文件内部的复杂度会有较大差别。不过MIDI文件的三种类型之间是复杂度递增的关系,而且前一种类型总可以近似的看作后一种类型的特例,所以只要面向最复杂的类型2做好各种处理,相对简单的类型0和1只要稍作修改即可支持。
MIDI文件中一般把四分音符的时间增量数设置为120,但MIDI文件也支持更改这个值。由于这种情况在实际应用中比较少见,因此可以通过统一转换为120的方式,在不影响正确性的前提条件下,降低解析的复杂度。
MIDI事件的读取
MIDI消息的种类很丰富,而且没有统一的格式,这意味着只能把每一种消息单独处理。值得庆幸的是,不是所有的MIDI消息都跟五线谱有关,所以要真正理解的MIDI消息实际上不是很多。要面对的最多的消息是音符打开消息(Note-On),它的实际使用量占了所有消息的总使用量的95%以上。音符关闭消息(Note-Off)也是必须要处理的,如果不处理这种消息,会造成漏音(打开的音符没有对应的关闭信号而一直打开)。
由于MIDI中没有音符的概念,因此要通过将对应的音符开启和关闭事件配对形成一个音符,称之为原始音符,之后还需要将音符开始时间戳和结束时间戳转换成音符开始时间戳和音符持续长度。
为了完成上述两个任务,使用一个大数组缓存16个通道里的128个音的状态。在接收到音符打开与关闭消息时进行记录,并同时计算开始时间与持续时间。
Meta事件的读取
MIDI中的Meta事件中描述的信息在五线谱显示中基本上都是有用的,有些信息还起着至关重要的作用。例如很多说明性的文字信息,需要直接添加到五线谱和各音轨的属性中。当这些说明性信息重复出现时,可以把两段信息的文字连起来,作为一条长的信息出现。
调号和拍号信息是Meta信息中非常关键的两条。调号决定了每个音符在五线谱上显示的确切位置及其升降号标志,拍号决定了小节的长度还同时影响合成音符组的规则。这些信息都是整合分析器不可缺少的重要信息。
3.2.2 整合分析器
文件分析器只能够读出MIDI文件中直接说明的音符,如果直接显示这样的音符,得到的五线谱将非常难看。整合分析器的任务就是接收原始音符表与其它如拍号调号等信息进行排列重组,生成一个正确美观的五线谱。由于要分析的信息非常多,本小节仅列举了一些相对重要的工作。
确定谱号
Meta信息里只提供了调号和拍号的信息,而同样重要的谱号信息却没有提供。由于在整合分析器中的许多工作都要使用谱号信息,所以对音符的统计工作必须在进入整合分析器之前就进行完毕,即把对音符的统计穿插到文件分析器中。
确定谱号需要统计音轨中最高和最低音符的音高。得到了这两个值后,便可以决定使用低音谱号和高音谱号中的一种。如果最高音和最低音相差太多,以至于使用无论使用低音谱号还是使用高音谱号都不能满足要求,可以考虑将一个音轨拆成两条五线显示。
添加休止符
休止符是五线谱中与音符同样重要的符号元素,而在原始音符表中只有实在的音符而没有休止符。休止符是指在一定的时间范围内音轨上没有任何音处于打开状态,所以只要监视文件分析器中的音状态矩阵就可以判断是非存在休止符。
小节划分与音符的拆分组合
五线谱中的小节划分对显示来说具有两个作用,方便上下同步声部乐谱对齐和在换行时保持末端对齐。由于原始音符可能完全属于某一个小节,又或跨越若干个小节,因此就要把音符拆分成多个小的音符,并用延音符号连接他们,或者把一个小节中的几个音符组合在一起构成和弦或者共尾音符组等情况。图5例举出了一种比较简单的情况,三个音符被拆分组合成了两个和弦。
完成这一部分工作需要将原始音符表转换为有序栈。有序栈的特点保证了虽然每个音符都有可能被反复插入,但是它插入的次数与整体栈规模无关,只与音符的复杂度有关。在音符复杂度一定的情况下,每个栈元素被反复操作的次数接近一个常量,故整体函数仍停留在nlog(n)级别,是可以接受的。
为了降低运算量,可以利用只含有一个和弦的共尾音符组和只含有一个音符的和弦统一各种符号间的比较,把3x3=9步比较合并为两步,降低了比较的代价,大大减少了代码量。另一个优化之处是利用了有序栈,把时间复杂度降低到nlog(n)。
图6展示了MIDI文件的显示效果,限于篇幅,本文对于多连音、倚音,装饰音等格式解析,在这里不做更详细的说明了。
4 总结与展望
本文讨论的电子乐谱阅读器嵌入式开发平台采用了基于Celeron-M的ECX平台,显示模块采用了Linux平台下的QT开发框架。实践证明,本文所讨论的解析方法是完全可行的,系统的运行速度也是令人满意的。
随着计算机与嵌入式系统的普及,人们的生活方式正在发生了巨大的变化,虽然本文提到的嵌入式乐谱阅读器还没有形成产品,但势必取代现有的纸质乐谱。另外,本系统目前只有阅读功能,还可以增加音乐播放功能,这样就可以进行五线谱的学习,对于正处于学习阶段的学生来说,是一个非常好的助手。
本文作者创新点:本文所作的研究弥补了乐谱数字化的最后一个环节——数字化阅读。尽管存在着各种打谱软件、作曲软件、播放软件,但演奏者目前还没有一个适合的阅读器。本文尝试将数字化乐谱通过嵌入式阅读设备显示给演奏者,替代传统笨重的纸质乐谱,极大的减轻了演奏者的负担。同时由于互联网上存在大量的MIDI格式的文件,但五线谱格式的文件很少而且格式不公开,需要配备价格昂贵的专业软件。而本系统可以直接将其转换为五线谱阅读,为使用者的学习工作提供了方便。
参考文献:
[1]袁慧梅,宋宇.基于CPLD的MIDI音乐播放器的设计[J].微计算机信息,2006,11:143-145
[2]《基本乐理》,李重光,高等教育出版社,2000年1月
[3]MIDITrans - A MIDI File Transform Language Roger T.Hartley,1998
[4]Standard MIDI File(SMF) Format ,MIDI Manufacturer's Association,1999
[5]MIDI Specification version1.0, MIDI Manufacturer's Association,1999
[6]General MIDI Level 1, MIDI Manufacturer's Association,1999