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 数据时,允许系统忽略冗余数据有效地增加了电缆上的可用带宽。
基于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 数据时,允许系统忽略冗余数据有效地增加了电缆上的可用带宽。