我正在尝试解析MIDI文件,但是我的解析器无法解析来自互联网的大多数MIDI文件,因为它一直在SMF规范中未指定的命令字节上绊倒。用FL Studio导出的MIDI文件工作得很好,但几乎所有其他MIDI文件似乎都坏了。
例如,从这个midi文件:
00 00 00 00 02 | 00 00 00 | 00 c00 00
第一部分很容易解析。这是根据MIDI规格的控制变更。但第二部分没有意义。在0个刻度之后,具体做什么?之后会有多少字节?在SMF中没有将0x00指定为命令。然而,它之后的部分是可识别的,因此您可以看到第二部分有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 000 000 41 000 000 43 6E 48 43 000 000 48 6E 60 48 000 000 3C 6E 00 35 6E 30 35 00[等]
好的,让我们看看。补丁变更,检查完毕。控制器更换,检查完毕。0一个?0A到底是干什么的?试图识别0A部分之后的任何命令也不起作用,这是一个大混乱,我不知道什么属于那个0A命令,也不知道下一个实际的SMF命令何时开始。我根本不知道如何解析这首歌曲的其余部分。
然而,像Winamp和FL Studio这样的程序可以很好地打开这些MIDI文件。他们是怎么做到的?我如何知道垃圾数据何时结束,正确的命令何时开始?
这不是垃圾数据。这是运行状态。如果在处理命令后,下一个字节小于$80,则假定与前一个命令的状态字节相同。下面是运行状态的描述