2009-07-25 31 views
4

我正在尝试从.mid文件中读取信息,但我一直看到似乎不属于任何MIDI信息的额外字节。我不知道如何预测/处理这些问题,并且将其他所有内容都抛弃在我的项目中。有什么建议么?下面是几个例子:.mid文件中的额外字节

 
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      ???? 

我很怀疑,我甚至有故障就在这里,因为其中的一些似乎有非零增量时间没有任何理由可言。

回答

1

看起来你甚至没有开始正确的。包括8个字节should be

4D 54 68 64 00 00 00 06

我的猜测是,该文件的大清洗,或者你没有正确地阅读呢?

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

2

MIDI事件中的增量时间是可变长度的,因此每个事件使用1个或更多字节来编码从上一个事件开始流逝的时间。见this

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

2

MusiGenesis得到它的一半正确 - 你没有正确解析可变长度的delta。但是您看到的其他事件是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文件?

+0

对不起,我应该指定。这只是件,整个文件是巨大的,我无法发布所有的字节。尽管如此,仍然有一些事情我不了解。这是一个连续的文件。 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 73 0d 23这是其次是A LOT更多的字节,这必须是控制器的变化。整个赛道没有注释或注释事件,7f以上的数值只在delta时间出现。 – Skunkwaffle 2009-07-27 18:47:46