MIDI 文件字节布局

MIDI file byte layout

基于this page,我开始学习 MIDI 是如何工作的,我下载了一个示例 MIDI 文件,看看我是否可以提取它的所有信息。

这是 MIDI 文件:

4D 54 68 64 00 00 00 06 00 01 00 03 00 04 4D 54
72 6B 00 00 00 A1 00 C0 69 00 90 3C 5A 01 41 5A ...

前14个字节是头信息,我没问题。

后面的字节表示track chunk的信息;前四个是4D 54 72 6B,在ascii中是Mtrk,它决定了一个track chunk;接下来的 4 个字节确定同一块中最后一个字节之后的字节数,因此 00 00 00 A1(十进制的 161)表示在同一轨道块中它后面有 161 个字节.

现在轮到跟踪事件

第一个字节是 00,它告诉我们增量时间是 0,下一个字节告诉我们这是一个 midi 事件(更准确地说,是一个 program- change 命令选择 MIDI 通道 0 中的程序 69 - 来自 here).

下一个字节是另一个轨道事件的开始,delta-time设置为0;这是通道 0 上的 note-on MIDI 事件,音符 3C 和速度 5A.

问题是,在下一个事件中,delta-time 设置为 01,事件键值为 41,它既不是 midi 事件、系统事件也不是元事件事件。

这里发生了什么?我做错了什么?

标准 MIDI 文件可以使用 Running Status 个字节 -- 在通道上发送的最后一个状态字节在另一个 status/etc 之前一直有效。 (你还显示的 5A 是第二个 Note On 事件的速度。)

在 31.25 kb/sec 通过电缆发送 MIDI 数据时,允许系统忽略冗余数据有效地增加了电缆上的可用带宽。