用不正确的轨道块大小解析MIDI?

时间:2013-10-29 02:11:57

标签: hex midi

我正在尝试编写一个C ++程序,它以十六进制格式读取MIDI并根据 this 教程推断必要的数据。在轨道块信息中,第一个信息是您正在查看轨道“MTrk”的事实。第二个4字节指的是块大小。

根据我的理解,块大小是指下一个轨道块开始之前的字节数,或者是文件的结尾。但是,在我一直在使用的midi文件中,我的块大小通常太小。也就是说,让我们说块大小是40个字节:下一个“MTrk”直到当前的70个字节之后才会发生(我确实考虑到“MTrk”和块大小本身不是块大小的一部分)。那么,这些额外的30个字节是什么?我应该截断块大​​小后发生的字节吗?或者我应该忽略块大小并继续阅读,直到遇到下一首曲目(或表示曲目结束的FF2F00)?

在读入MIDI文件后,我将以下内容录制为输出:

4D546864000000060001000300604D54726B0000000B00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F004D54726B

下面我将有意义的部分分开:

4D546864
00000006
0001
0003
0060 

(头顶)

4D54726B
0000000B

(CHUNK SIZE = 11个字节)

00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F00

(但在这里我们看到20个字节)

4D54726B

Here 是我使用的MIDI文件。

1 个答案:

答案 0 :(得分:0)

我从提供的链接下载了文件,这对我来说很正常。让我们分解它定义的块。

第一个块的大小为6个字节:00 01 00 03 60,它告诉我们它是一个带有3个轨道的MIDI类型1文件,时分为96

下一个块(MTrk)的长度为11个字节:00 ff 51 03 06 8a 1b 00 ff 2f 00。在这种情况下,它只包含一个节奏的MIDI元事件,然后是一个音轨结束消息。

之后是第二个音轨,其长度为02 92个字节(基数为10的658)。一些MIDI元事件定义了音轨名称和乐器,然后是常规的MIDI数据。终于来了最后一首歌......

我不确定你的计数到底在哪里,你确定你没有计算4字节标题(即MTrk)与块中的总字节数吗?块长度包括名称或长度所需的8个字节。

为了将来参考,hexdump实用程序对于查看此类文件非常有用,尤其是-C。对于此文件,它将显示如下数据:

$> hexdump -C ArminvanBuurenFerryCorsten_-_Bruteversion4__iCarroller_20130206094335.mid 
00000000  4d 54 68 64 00 00 00 06  00 01 00 03 00 60 4d 54  |MThd.........`MT|
00000010  72 6b 00 00 00 0b 00 ff  51 03 06 8a 1b 00 ff 2f  |rk......Q....../|
00000020  00 4d 54 72 6b 00 00 02  92 00 ff 03 0c 53 61 77  |.MTrk........Saw|
... etc.