我正在尝试编写一个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文件。
答案 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.