浅谈嵌入式MIDI文件格式解析设计与实现
扫描二维码
随时随地手机看文章
1 前言
随着计算机与电子科学的发展,传统的阅读方式正在发生着天翻地覆的变化。乐谱是一种以印刷或手写制作,用符号来记录音乐的方法。不同的文化和地区发展了不同的记谱方法。记谱法可以分为记录音高和记录指法的两大类。五线谱和简谱都属于记录音高的乐谱。吉他的六线谱和古琴的减字谱都属于记录指法的乐谱。传统的乐谱主要以纸张抄写,现在亦有电脑程式可以制作乐谱。在音乐领域,由于纸质乐谱本身具有如不宜保存、查找和携带以及翻页不便等缺点,也促使许多作曲家使用作曲软件制作音乐,使用打谱软件来生成乐谱;但是,虽然制作音乐和生成乐谱的软件很多,相应的阅读乐谱的软硬件设备却很少。
为了可以把现有的音乐数字化工作扩展到乐谱的阅读,又可以克服纸质乐谱本身的缺点,设计一个跨平台的、便携的、用户友好的电子乐谱阅读器,嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY 智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。利用嵌入式的阅读系统代替传统的纸质乐谱与谱架的组合,无疑是一个不错的选择。
当前可以获得的电子版的乐谱可以分为两种,一种是基于图片格式的,另一种是基于数字音乐格式的。前一种主要包括jpg图,gif图等图片格式,以及主要由图片构成的pdf,chm等文档格式,在此本文不作为重点;后一种主要包括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)乐器数字接口 ,是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,怎么做, 如演奏哪个音符、多大音量等。它们被统一表示成MIDI 消息(MIDI Message) 。传输时采用异步串行通信, 标准通信波特率为31.25×( 1±0.01) KBaud。MIDI仅仅是一个通信标准,它是由电子乐器制造商们建立起来的,用以确定电脑音乐程序、合成器和其他电子音响的设备互相交换信息与控制信号的方法。MIDI系统实际就是一个作曲、配器、电子模拟的演奏系统。从一个MIDI设备转送到另一个MIDI设备上去的数据就是MIDI信息。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%以上。
由于MIDI中没有音符的概念,因此要通过将对应的音符开启和关闭事件配对形成一个音符,称之为原始音符,之后还需要将音符开始时间戳和结束时间戳转换成音符开始时间戳和音符持续长度。
Meta事件的读取
MIDI中的Meta事件中描述的信息在五线谱显示中基本上都是有用的,有些信息还起着至关重要的作用。例如很多说明性的文字信息,需要直接添加到五线谱和各音轨的属性中。当这些说明性信息重复出现时,可以把两段信息的文字连起来,作为一条长的信息出现。
调号和拍号信息是Meta信息中非常关键的两条。调号决定了每个音符在五线谱上显示的确切位置及其升降号标志,拍号决定了小节的长度还同时影响合成音符组的规则。
3.2.2 整合分析器
文件分析器只能够读出MIDI文件中直接说明的音符,如果直接显示这样的音符,得到的五线谱将非常难看。整合分析器的任务就是接收原始音符表与其它如拍号调号等信息进行排列重组,生成一个正确美观的五线谱。
确定谱号
Meta信息里只提供了调号和拍号的信息,而同样重要的谱号信息却没有提供。由于在整合分析器中的许多工作都要使用谱号信息,所以对音符的统计工作必须在进入整合分析器之前就进行完毕。
确定谱号需要统计音轨中最高和最低音符的音高。得到了这两个值后,便可以决定使用低音谱号和高音谱号中的一种。如果最高音和最低音相差太多,以至于使用无论使用低音谱号还是使用高音谱号都不能满足要求,可以考虑将一个音轨拆成两条五线显示。
添加休止符
休止符是五线谱中与音符同样重要的符号元素,而在原始音符表中只有实在的音符而没有休止符。用以记录不同长短音的进行的符号叫做音符。 音值的基本相互关系:每个较大的音值和它最近的较小的音值的比例是2与1之比。例如:全音符等于两个二分音符;全休止符等于两个二分休止符等。由于谱面狭窄及其他种种原因,不可能遵守上述规则时,适当缩短或伸长符干长度是完全可以的。附点写在音符符头和休止符右边的间内,而不记在线上。休止符在单符干记谱中,永远记在第三线上,或靠近第三线的地方。二分休止符写在第三线的上面,全休止符写在第四线的下面。在双符干记谱中,各声部共同休止时,休止符的记法与单符干记谱相同。个别声部休止时,休止符写在五线谱的边缘,或五线谱之外。这时全休止符和二分休止符要使用加线。全休止符写在加线的下面,二分休止符写在加线的上面。
小节划分与音符的拆分组合
五线谱中的小节划分对显示来说具有两个作用,方便上下同步声部乐谱对齐和在换行时保持末端对齐。由于原始音符可能完全属于某一个小节,又或跨越若干个小节,因此就要把音符拆分成多个小的音符,并用延音符号连接他们,或者把一个小节中的几个音符组合在一起构成和弦或者共尾音符组等情况。图5例举出了一种比较简单的情况。
完成这一部分工作需要将原始音符表转换为有序栈。有序栈的特点保证了虽然每个音符都有可能被反复插入,但是它插入的次数与整体栈规模无关,只与音符的复杂度有关。在音符复杂度一定的情况下,每个栈元素被反复操作的次数接近一个常量。
为了降低运算量,可以利用只含有一个和弦的共尾音符组和只含有一个音符的和弦统一各种符号间的比较,把3x3=9步比较合并为两步,降低了比较的代价,大大减少了代码量。另一个优化之处是利用了有序栈,把时间复杂度降低到nlog(n)。
图6展示了MIDI文件的显示效果,限于篇幅,本文对于多连音、倚音,装饰音等格式解析,在这里不做更详细的说明了。
4 总结与展望
本文讨论的电子乐谱阅读器嵌入式开发平台采用了基于Celeron-M的ECX平台,显示模块采用了Linux平台下的QT开发框架。实践证明,本文所讨论的解析方法是完全可行的,系统的运行速度也是令人满意的。
随着计算机与嵌入式系统的普及,人们的生活方式正在发生了巨大的变化,虽然本文提到的嵌入式乐谱阅读器还没有形成产品,但势必取代现有的纸质乐谱。另外,本系统目前只有阅读功能,还可以增加音乐播放功能,这样就可以进行五线谱的学习,对于正处于学习阶段的学生来说,是一个非常好的助手。
本文作者创新点:本文所作的研究弥补了乐谱数字化的最后一个环节——数字化阅读。尽管存在着各种打谱软件、作曲软件、播放软件,但演奏者目前还没有一个适合的阅读器。本文尝试将数字化乐谱通过嵌入式阅读设备显示给演奏者,替代传统笨重的纸质乐谱,极大的减轻了演奏者的负担。同时由于互联网上存在大量的MIDI格式的文件,但五线谱格式的文件很少而且格式不公开,需要配备价格昂贵的专业软件。
QICK