.mid文件中的额外字节

时间:2009-07-25 01:09:10

标签: binary messages midi byte

我正在尝试从.mid文件中读取信息,但我一直看到额外的字节似乎不是任何midi消息的一部分。我不确定如何预测/处理这些并且它在我的项目中抛弃了所有其他东西。有什么建议?以下是一些例子:

4d 54 72 6b 00 00 04 48           Track Header
00 c0 19                          Program Change
00 ff 03 07 54 72 61 63 6b 20 31  Track Title
00 b0 05 00                       Controller Event
00 64 00 00 06 0c 00 26 00        ????
00 b0 20 00                       Controller Event

00 ff 58 04 0c 03 0c 08           Time Signature
81 89                             ????
50 ff 51 03 0f 42 40              Tempo
00 ff 2f 00                       End of Track

00 ff 21 01 00                    Unknown Meta Event
30 b0 79 00                       Controller Event
00 07 64 01 0a 32 01 5b           ????
14 01 5d 11 01 20 00 00 00        ????
00 c0 23                          Program Change
8c 7c 90 23                       ????

我怀疑我甚至在这里有细分,因为其中一些似乎没有任何理由的非零delta时间。

3 个答案:

答案 0 :(得分:2)

MIDI事件中的增量时间是可变长度的,因此每个事件使用1个或多个字节来编码从最后一个事件开始经过的时间。请参阅this

每个MIDI事件的增量时间为0(表示它与上一个事件完全相同)或某个正值(表示它应该在上一个事件之后发生)。

答案 1 :(得分:2)

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

以下是解析转储的方法:

4d 54 72 6b 00 00 04 48           Track Header
00 c0 19                          Program Change
00 ff 03 07 54 72 61 63 6b 20 31  Track Title
00 b0 05 00                       Controller Event
00 64 00                          Running status (controller event)
00 06 0c                          Running status (controller event)
00 26 00                          Running status (controller event)
00 b0 20 00                       Controller Event

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

答案 2 :(得分:1)

看起来你甚至没有开始正确。前八个字节should be

4D 54 68 64 00 00 00 06

我的猜测是该文件已经被软管或您没有正确读取它?

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