5

我正在尝试编写一些函数来读取 MIDI 文件。我一直在参考许多提供规范的网站,但主要是这个: http: //www.sonicspot.com/guide/midifiles.html

我一直在为我下载的超级马里奥兄弟主题的 MIDI 文件测试它,我得到了一些意想不到的数据。可能是文件格式错误,但我认为更有可能是我做错了什么。这是我遇到问题的数据(来自十六进制编辑器),以及我认为我所知道的:

4D 54 72 6B 00 00 00 19 00 FF 51 03 05 7B 71 00 FF 58 
|---------| |---------| || || || |------| || ||
    MTrk    Chunk size  || || ||  Tempo   || ||
             (25 bytes) || || ||(ms per   || ||
                        \/ || ||1/4 note) || ||
                VLen value || ||          \/ ||
          (Event at time 0)|| ||  VLen value ||
                           \/ || (event at   ||
                 Beginning of ||  time 113)  ||
                 meta-event   ||             ||
                              \/             \/
                 Meta-event type:           ????
                      set tempo

如您所见,如果之前的一切0x00都是正确的,那么它在那里做什么?之前的 VLen 值具有二进制值,01110001因此不期望 VLen 值的另一部分,因此,AFAIK应该是事件类型。但是,没有与 关联的事件类型0x0。谁能看到我哪里出错了?

4

1 回答 1

5

我发现了问题:元事件代码(在我的例子0x51中)像正常事件一样按块大小进行。我之所以这么认为是因为,对于 set tempo 元事件,tempo 数据大小始终为 3。因此51 03 05 7B 71实际上是 set tempo 事件代码(51),速度数据的大小(03)然后是实际速度(05 7B 71),然后00只是另一个可变长度值,告诉我下一个事件是在时间 0。

我希望这可以帮助别人。我还为 MIDI 格式找到了更好的文档,这使得这一点更加清晰:http ://www.omega-art.com/midi/mfiles.html

于 2012-12-06T13:40:12.083 回答