我正在尝试解析 MIDI 文件,但我的解析器无法解析来自 Internet 的大多数 MIDI 文件,因为它不断遇到 SMF 规范中未指定的命令字节。使用 FL Studio 导出的 MIDI 文件可以正常工作,但几乎所有其他 MIDI 似乎都会中断。
例如,从这个 MIDI 文件:
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 3 等 [3C 3 0 350 E 00 3C 30 350 E
好的,让我们看看。补丁更改,检查。控制器更改,检查。0A?0A到底是做什么的?尝试识别 0A 部分之后的任何命令也不起作用,这都是一团糟,我不知道该 0A 命令属于什么,也不知道下一个实际 SMF 命令何时开始。在这场混乱之后,我根本不知道如何解析轨道的其余部分。
然而,像 Winamp 和 FL Studio 这样的程序可以很好地打开这些 MIDI 文件。他们是如何做到的呢?我如何知道垃圾数据何时结束以及正确的命令何时开始?