1 总观一个mid文件主要包括两部分,标头数据和音轨数据。简介的第二部分介绍标头数据,第三部分介绍音轨数据。mid文件包含仅一个标头数据来描述文件格式等,和任意数量的音轨数据。一个音轨可以被理解为多声道磁带的磁轨你可以指定一个音轨为一个声音,一段填充空白,一个乐器或你希望的什么东西。2 标头数据标头数据出现在文件的开头,描述文件的三个部分。标头数据总向这样:4D 54 68 64 00 00 00 06 ff ff nn nn dd dd前4比特等价于ASCII字符“MThd”。在这4比特头标签之后,总是00 00 00 06,因为头信息总是六比特。(译者按:这六比特头信息是4D 54 68 64 00 00,最后两比特用0填充。之后是的00 06而不是06,是因为整型变量要占两个字节。这就是数字6前面多出来一个字节的原因。下同。)ff ff是文件类型,一共有3种类型:0 - 单音轨1 - 多音轨,同步音轨2 - 多音轨,异步音轨单音轨,顾名思义,只有一条音轨。同步多音轨是说所有的音轨并行播放,通俗地说,同时开始播放,这样可以在音乐中代表不同的声部。异步多音轨不一定在音乐开始时播放。它们可以完全异步。nn nn是mid文件的音轨数量。dd dd是每个四分音占用的时间片(这个以后再详细说明)。(译者按:这两个比特越大,音乐节奏越快。)3 音轨数据标头数据之后,文件剩下的部分是音轨数据。每个音轨都有一个标头,和你需要的数个命令。就像文件的标头数据,音轨标头是这样的:4d 54 72 6b xx xx xx xx这里的前4比特等价于ASCII字符的“MTrk”。之后的4个字节说明了这个音轨长度,音轨字节数(不包括音轨标头)。标头之后的是midi事件。这些事件实际上是送向midi合成器接口的数据和一个附加数据:时间片。时间片表示经过多少tick之后事件开始被运行。每四分音之后的时间片被预先定义在标头数据里。这里的时间片是可变长度的编码数据。这种格式尽管有些混乱,却可以使大数字使用随意的字节数,不用浪费被填成0的字节。这些数被转换为7比特的字节,每个字节最特殊的最高有效位(MSB),除了数字的末字节是0外,其他字节是1。这样,读取数字每次读一字节,当你看到最高有效位是0时,你就会知道这是数字的最后一个字节。根据mid规格,整个时间片最多占4字节。时间片之后是mid事件,每个mid事件(除了运行事件)有一个最高位是1的命令字节(字节数值>=128)附录列表A是大部分命令。每个命令有不同的参数和长度,但命令后的数据必须是最高位为0的字节(字节数值)。以上规则有一个例外,是meta事件,它可以包含最高位是1的数据字节。然而,meta事件要求有一个长度参数,这样能减轻你的困惑。一个可能带来混乱的细节(subtlety)是运行模式。实际上这里是mid命令被疏忽,最近的mid命令发行物被假设的地方。这意味着mid事件可以由时间片和和参数构成,这参数会转到可能存在的命令。4 总结如果这些解释只能增加本文的混乱,那么附录的例子可能使本文清晰一些。