也许你不知道官方的 MIDI 规范是可用的,你可以下载文档 https://www.midi.org/specifications/item/the-midi-1-0-specification免费。 (您需要先注册为网站用户)。它包括详细的SMF 格式。
这是标题块的描述。
文件开头的标头块指定了有关文件中数据的一些基本信息。这是完整块的语法:
<Header Chunk> = <chunk type> <length> <format> <ntrks> <division>
如上所述,<chunk type>
是四个 ASCII 字符“MThd”;<length>
是数字 6 的 32 位表示(高字节在前)。
数据部分包含三个 16 位字,首先存储最高有效字节。
第一个词,<format>
,指定文件的整体组织。只有三个值<format>
指定:
0=文件包含单个多通道轨道
1=该文件包含一个或多个同步轨道(或 MIDI 输出)
顺序
2=该文件包含一个或多个顺序独立的单轨模式
下面提供了有关这些格式的更多信息。
下一句话,<ntrks>
,是文件中轨道块的数量。对于格式 0 文件,它始终为 1。
第三个字, <division>
,指定增量时间的含义。它有两种格式,一种用于公制时间,另一种用于基于时间码的时间:
|bits |
|15|14 ... 8|7 ... 0 |
|--|-----------------------|-----------------|
| 0| ticks per quarter-note |
| 1| negative SMPTE format | ticks per frame |
如果位 15<division>
是零,位 14 到 0 代表构成四分音符的增量时间“刻度”的数量。例如,如果<division>
是 96,则文件中两个事件之间的八分音符的时间间隔将为 48。如果<division>
是一个,文件中的增量时间对应于秒的细分,与 SMPTE 和 MIDI 时间代码一致。位 14 到 8 包含四个值 -24、-25、-29 或 -30 之一,对应于四种标准 SMPTE 和 MIDI 时间码格式(-29 对应于 30 个丢帧),并表示帧数每秒。这些负数以二进制补码形式存储。第二个字节(存储正值)是帧内的分辨率:典型值可能是 4(MIDI 时间码分辨率),
8、10、80(位分辨率)或 100。该系统允许精确指定基于时间码的轨道,但也通过指定 25 帧/秒和每帧 40 个单位的分辨率来允许基于毫秒的轨道。如果文件中的事件以 30 帧时间码的位分辨率存储,则除法字将为 E250 十六进制。
在您的示例中,您的第三个单词(十六进制 0078)意味着<division>
每个四分音符 120 个刻度。
文件中事件的增量时间以刻度为单位给出。拍号是另一件完全不同的事情。它是节奏的指示,是一种元事件类型。 (参见规范第 10 页)。