Hex 使用不正确的曲目块大小解析MIDI? 我试图编写一个C++程序,它通过十六进制格式读取MIDI,并根据教程推断必要的数据。在轨迹块信息中,第一个信息是您正在查看轨迹“MTrk”。第二个4字节表示块大小

Hex 使用不正确的曲目块大小解析MIDI? 我试图编写一个C++程序,它通过十六进制格式读取MIDI,并根据教程推断必要的数据。在轨迹块信息中,第一个信息是您正在查看轨迹“MTrk”。第二个4字节表示块大小,hex,midi,Hex,Midi,据我所知,块大小是指在下一个曲目块开始之前或文件结束之前的字节数。然而,在我一直使用的midi文件中,我的块大小通常太小。也就是说,假设区块大小为40字节:下一个“MTrk”直到当前的70字节之后才会出现(我确实解释了“MTrk”和区块大小本身不是区块大小的一部分这一事实)。那么,这些额外的30字节是什么?我应该截断块大小之后出现的字节吗?或者我应该忽略块大小并继续阅读,直到遇到下一个曲目(或FF2F00,表示曲目结束) 读入MIDI文件后,我记录了以下内容作为输出: 4D54686400000

据我所知,块大小是指在下一个曲目块开始之前或文件结束之前的字节数。然而,在我一直使用的midi文件中,我的块大小通常太小。也就是说,假设区块大小为40字节:下一个“MTrk”直到当前的70字节之后才会出现(我确实解释了“MTrk”和区块大小本身不是区块大小的一部分这一事实)。那么,这些额外的30字节是什么?我应该截断块大小之后出现的字节吗?或者我应该忽略块大小并继续阅读,直到遇到下一个曲目(或FF2F00,表示曲目结束)

读入MIDI文件后,我记录了以下内容作为输出:

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

4D546864
00000006
0001
0003
0060 
(收割台末端)

(块大小=11字节)

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


是我使用的MIDI文件。

我从提供的链接下载了该文件,我觉得它很正常。让我们分解它定义的块

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

下一个块(MTrk)的长度为11个字节:
00 ff 51 03 06 8a 1b 00 ff 2f 00
。在本例中,它只包含一个用于节奏的MIDI元事件,然后是曲目结束消息

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

我不确定您的计数是从哪里开始的,您确定您没有将4字节头(即MTrk)与块中的总字节数进行计数吗?区块长度不包括名称或长度所需的8个字节

作为将来的参考,查看此类文件时,
hextump
实用程序非常有用,尤其是使用
-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.

跳到轨道“FF2F00”或下一个“MTrk”的末尾似乎是合理的。您似乎有一个不符合MIDI教程的文件。你检查过其他来源的MIDI文件吗?我试过3个来源,发生了3次。我发现另一个教程提到了块大小有50%的时间报告不准确,但它没有详细说明在这种情况下该怎么做。这是一个MIDI规范pdf(),它证实了你的教程。我能想到的唯一一件事是,你没有把块大小理解为big-endian。但这并不能解释40和70之间的区别。。。我从未遇到过这种现象。还有其他C++代码工作正常吗?你可以用(样本还是LIB)测试?我从来没有见过这样的问题。请举个例子。我可能读错了文件,如果你看看你有什么和我张贴有一些差异,但你有什么似乎是正确的。我将修改我阅读的方式。是的,现在我看,你报告看到的20个字节,如果你把它转储,肯定是11个字节。我感觉您从磁盘读取的文件不正确,但您的解析算法实际上是正确的。
00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F00
4D54726B
$> 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.