我正在尝试编写一个C程序,它以十六进制格式读取MIDI并根据this教程推断必要的数据 . 在轨道块信息中,第一个信息是您正在查看轨道"MTrk" . 第二个4字节指的是块大小 .
据我所知,块大小是指下一个轨道块开始之前的字节数,或者是文件的结尾 . 但是,在我一直在使用的midi文件中,我的块大小通常太小 . 也就是说,让我们说块大小是40个字节:下一个“MTrk”直到当前的70个字节之后才会发生(我确实考虑到“MTrk”和块大小本身不是块大小的一部分) . 那么,这些额外的30个字节是什么?我应该截断块大小后发生的字节吗?或者我应该忽略块大小并继续阅读,直到遇到下一首曲目(或表示曲目结束的FF2F00)?
读完MIDI文件后,我将以下内容录制为输出:
4D546864000000060001000300604D54726B0000000B00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F004D54726B
下面我分开了有意义的部分:
4D546864
00000006
0001
0003
0060
( Headers 结尾)
4D54726B
0000000B
(CHUNK SIZE = 11个字节)
00FFFFFFFF510306FFFFFF8A1B00FFFFFFFF2F00
(但在这里我们看到20个字节)
4D54726B
Here是我使用的MIDI文件 .
1 回答
我从提供的链接下载了文件,这看起来很正常 . 让我们分解它定义的块 .
第一个块的大小为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数据 . 最后是最后一首曲目......我'm not sure where exactly your count got off, are you sure that you'不计算4字节头(即MTrk)与块中的总字节数?块长度不包括名称或长度所需的8个字节 .
为了将来参考,
hexdump
实用程序对于查看此类文件非常有用,尤其是使用-C
. 对于此文件,它将显示如下数据: