我正在尝试从.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时间。
答案 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
我的猜测是该文件已经被软管或您没有正确读取它?
编辑:没关系。你没有说这是文件的开头。你拥有的四个字节是一个块头。