如何解析/忽略标准MIDI文件中未指定的命令?

时间:2011-11-05 22:25:15

标签: parsing midi smf

我试图解析MIDI文件,但是我的解析器无法解析来自互联网的大多数MIDI文件,因为它一直绊到SMF规范中未指定的命令字节。使用FL Studio导出的MIDI文件工作正常,但几乎所有其他MIDI似乎都会破坏。

例如,来自this midi file
00 B0 20 02 | 00 00 00 | 00 C0 00
第一部分很容易解析。它是根据MIDI规范进行的控制变更。但第二部分毫无意义。 0蜱后,究竟做了什么?之后我可以期待多少字节? 0x00未在SMF中指定为命令。然而,之后的部分是可识别的,因此您可以看到第二部分有1个数据字节。

但是,如果我只是解决上一个问题,那么以后就会变成一个真正的混乱:
00 C0 00 | 00 B0 07 6E | 00 0A 40 00 5B 46 00 5D 00 00 5E 19 86 70 90 41 6E 00 45 6E 48 45 00 00 41 00 00 43 6E 48 43 00 00 48 6E 60 48 00 00 3C 6E 00 35 6E 30 35 00 [等]
好的,让我们看看。补丁更改,检查。控制器更改,检查。 0A? 0A到底怎么办?在0A部分之后尝试识别任何命令也不起作用,它只是一大堆,我不知道什么属于那个0A命令或者下一个实际的SMF命令启动时。我不知道如何在这场混乱之后解析剩下的赛道。

然而,像Winamp和FL Studio这样的程序可以打开那些MIDI文件。他们是如何做到的呢?我如何知道垃圾数据何时结束以及正确的命令何时开始?

1 个答案:

答案 0 :(得分:2)

这不是垃圾数据。这是运行状态。如果在处理命令后,下一个字节小于$ 80,则假定与上一个命令的状态字节相同。 Here's a description of running status.