Magenta魔改记-2:数据格式与数据集
数据格式:MusicXML与MIDI
上一节我们主要提到了两种数据格式:MIDI(.mid/.midi)和MusicXML(.xml/.mxl)。其实他们二者,包括提到的ABC notation,都是在计算机中用于记谱的文件格式。
在这其中,ABC notation是以文本形式储存的,更接近于简谱。并且,ABC notation也应用的不广泛,更不用说和打谱软件对接了,因此在此就不详细展开了,感兴趣的可以看https://en.wikipedia.org/wiki/ABC_notation 。
而对于MIDI与MusicXML二者,他们表达的内容很相似,但差别在文件储存的格式上。
MIDI
MIDI,全称为Musical Instrument Digital Interface。而现如今对于MIDI这个名称的含义有三重意思:
- 连接音乐设备的物理接口(Musical Instrument Digital Interface)
- 存储和回放音乐的文件格式(Standard MIDI File)
- 通用MIDI(General MIDI)
对于MIDI的历史,最早可以追溯到八世纪水力驱动的自动乐器,到后来的八音盒、自动钢琴等。
而我们重点关注的是第二个含义,标准MIDI文件(SMF)。
关于标准MIDI文件的格式,https://www.csie.ntu.edu.tw/~r92092/ref/midi/ 有着很详尽的介绍。
MIDI文件是一种二进制文件,其中绝大部分由一个个事件(Events)组成,每个事件都有其相对应的时间戳。这其中最普遍的时间就是音符(Note)。音符又可分为按下(Note on)和抬起(Note off)。这二者的参数都是(通道,音高,力度),其中通道指的是?,而音高就是MIDI中以八位二进制数相对应的音高(中央C对应60,各音高按十二平均律依次加减)。
其他的常见事件包括time_signature(节拍标记,例如4/4拍)、key_signature(调式标记,例如B小调)、以及control_changes(控制器输入变化,如踩踏板)。
因此,我们在上一节中,可以看到Magenta利用pretty_midi库将MIDI文件转化成了一个一个事件列表,其中音符事件又合并成了Note(start,end,key,instrument,programe),其中program又指的是这个音符应当播放的音色。
然而,我们可以发现,在MIDI文件中,音符的start和end的绝对时间非常不整,通常都是很多位小数。这是由于:
- 在相对节拍到绝对时间戳的转换时,很容易会有除不尽的情况。因此start的时间戳很容易就会是很多位的小数。
- 在真实演奏中,一个音和下一个音很少是完全连接的,人们会或故意或无意的对两个音进行间隔,例如在钢琴中弹奏一个音之后若要再弹奏下一个距离远的音,需要切换手的位置,因此两个音不可避免的会有间隔。MIDI文件是可以直接根据音符的start和end进行播放的,因此很多MIDI文件在导出时,为了让每个音符的结尾听起来更自然,都不