无法读取midi文件? [扩展规格?]

时间:2012-10-16 21:07:20

标签: c++ binaryfiles midi

我正在尝试用C ++读取midi文件而且我遇到了一个错误,这个错误似乎是标准midi规范中未定义的事件(从许多网站中检索到,包括:http://www.sonicspot.com/guide/midifiles.html)< / p>

我在HEX编辑器中打开了midi,并确定了错误。它发生在第一个“注意事件”事件之前。该文件是使用Sibelius 6软件生成的,我想知道如果我在这里发布文件部分,有人会帮我解决这个问题。

这是第三首曲目的开头:

4D 54 72 6B (MTrk magic number)
00 00 1F F5 (track size in bytes - 8181)
00 FF 03 04 (4 bytes follows) (track sequence name)
00 FF 04 0B (11 bytes follows) (instrument name)
00 C0 34 (program change event)
00 B0 79 00 (controller event)
00 5B <- (what the heck is that?!)

它不能是delta刻度,因为第一个值是00(没有MSB设置为1),它也不是可识别的事件。 10个字节后我识别出“note on”事件 它是:

00 5B 30 00 40 00 00 07 64 00 0A 10 00 90 3E 47 &lt; - 注意

我不知道“note on”之前的那12个字节代表什么,因此无法读取文件。我知道第一个音符很长很可能是因为这个原因。我也注意到我找不到代表“酒吧”停顿的事件。也许这是一个酒吧+长度的代码?我应该把它们读作蜱吗?

1 个答案:

答案 0 :(得分:6)

MIDI文件的一个复杂因素是Running Status。如果存在相同类型和通道的消息序列(例如所有控制器或所有音符),则MIDI可以通过省略状态字节来保存多个字节。如果这不使用运行状态,那么您将看到的字节是:

00 B0 79 00 - controller 121: controller reset
00 B0 5B 00 - controller 91: reverb
00 B0 40 00 - controller 64: sustain
00 B0 07 64 - controller 7: volume
00 B0 0A 10 - controller 10: pan
00 90 3E 47 - note message

因为所有控制器消息都是连续的并且是针对同一个通道的,所以可以省略状态字节。一旦消息类型发生变化,就必须再次添加状态字节。

如果您正在尝试理解MIDI文件,那么我会建议使用单独的工具,例如Python-MIDIGNMidi作为理智检查器,只要有MIDI事件就无法理解的。这些可以将其显示为文本,以便您可以模仿它正在做的事情。

编辑:另一个需要注意的是,任何带有长度或持续时间参数的MIDI消息(例如,MIDI文件中事件之间的PPQN时间,或者sysex消息或元事件的长度)都使用可变长度,所以不要假设所有长度字段总是固定长度。

免责声明:我在Sibelius 6中编写了MIDI导出代码......