Binary .mid文件中的额外字节

Binary .mid文件中的额外字节,binary,messages,midi,byte,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

我试图从一个.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 ???? 4d 54 72 6b 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 c0 23程序更改 8c 7c 90 23????
我甚至怀疑这里是否有故障,因为有些故障似乎毫无原因地具有非零的增量时间。

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

4D 54 68 64 00 06

我猜是文件被冲洗了还是你没有正确读取


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

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


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

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

下面是应该如何解析该转储:

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 4d 54 72 6b 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文件了吗?

对不起,我应该指定。它只是个片段,整个文件都是巨大的,我不可能发布中间的所有字节。不过,有些事情我还是不明白。这是一个连续的文件。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 c0 23程序更改8c 7c 90 23 73 0d 23这之后是大量必须更改控制器的字节。在整条赛道中没有记录打开或记录关闭事件,7f以上的几个值仅在增量时间中显示。