首页 文章

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

提问于
浏览
1

我正在尝试编写一个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 回答

  • 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数据 . 最后是最后一首曲目......

    我'm not sure where exactly your count got off, are you sure that you'不计算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.
    

相关问题