4

我正在尝试从 .mid 文件中读取信息,但我不断看到似乎不属于任何 midi 消息的额外字节。我不确定如何预测/处理这些,它把我项目中的其他所有东西都扔掉了。有什么建议么?这里有几个例子:

4d 54 72 6b 00 00 04 48 轨道头
00 c0 19 程序变更
00 ff 03 07 54 72 61 63 6b 20 31 曲目标题
00 b0 05 00 控制器事件
00 64 00 00 06 0c 00 26 00 ????
00 b0 20 00 控制器事件

00 ff 58 04 0c 03 0c 08 拍号
81 89 ????
50 ff 51 03 0f 42 40 速度
00 ff 2f 00 曲目结束

00 ff 21 01 00 未知元事件
30 b0 79 00 控制器事件
00 07 64 01 0a 32 01 5b ????
14 01 5d 11 01 20 00 00 00 ????
00 c0 23 程序变更
8c 7c 90 23 ????

我怀疑我什至在这里有故障,因为其中一些似乎毫无理由地具有非零增量时间。

4

3 回答 3

2

MIDI 事件中的增量时间是可变长度的,因此每个事件使用 1 个或更多字节来编码从上一个事件开始应该经过的时间。看到这个

每个 MIDI 事件都有一个增量时间,要么是 0(表示它与前一个事件发生在完全相同的时间),要么是某个正值(表示它应该在前一个事件之后发生)。

于 2009-07-25T02:34:13.267 回答
2

MusiGenesis 猜对了一半——您没有正确解析可变长度增量。但是您看到的其他事件是running status,这是一种通过在发送多个相同类型的消息时省略状态字节来节省带宽的技术。

以下是该转储的解析方式:

4d 54 72 6b 00 00 04 48 轨道头
00 c0 19 程序变更
00 ff 03 07 54 72 61 63 6b 20 31 曲目标题
00 b0 05 00 控制器事件
00 64 00 运行状态(控制器事件)
00 06 0c 运行状态(控制器事件)
00 26 00 运行状态(控制器事件)
00 b0 20 00 控制器事件

等等。但我不明白的是,为什么一大堆额外的事件会出现在下一个音轨标题之前的音轨消息结束之后?您是否完整地粘贴了您的 MIDI 文件?

于 2009-07-26T12:02:03.037 回答
1

看起来你甚至没有开始正确。前八个字节应该是

4D 54 68 64 00 00 00 06

我的猜测是文件被冲洗了,或者您没有正确读取它?

编辑:没关系。你没有说这是文件的开头。您拥有的四个字节是一个块头。

于 2009-07-25T01:29:45.057 回答