使用十六进制从头开始编写 Midi 文件

Writing Midi File From Scratch Using Hexadecimal

我正在尝试从头开始编写 midi 文件。它将演奏 3 个四分音符的 C 大调琶音。我一直在使用 sublime text 来使用十六进制编码进行保存。然后我将结果导入逻辑(在将扩展名更改为 .mid 之后)。到目前为止,这还没有成功,逻辑什么都不做。

我的大部分信息来自 here 并写下了以下内容:

4d 54 68 64 00 00 00 06 00 00 00 01 00 18 4d 54 72 6b 00 00 00 1e 80 18 81 3c 7f 80 00 91 3c 00 80 18 81 40 7f 80 00 91 40 00 80 18 81 43 7f 80 00 91 43 00

这是每个字节的细分,它是注释形式,但总结了我对文件格式的理解:

谁能指出为什么这没有将正确的结果加载到 Logic 中。是我误解了文件格式本身还是编码问题更深层次。
更新:这是最终的、更正后的十六进制...

4d 54 68 64 00 00 00 06 00 00 00 01 00 18 4d 54 72 6b 00 00 00 22 80 18 91 3c 7f 80 00 81 3c 00 80 18 91 40 7f 80 00 81 40 00 80 18 91 43 7f 80 00 81 43 00 00 ff 2f 00

该曲目缺少曲目结束元事件(类型 2F,长度 0)。所以添加字节 00 FF 2F 00,并相应地调整轨道大小。

该曲目包含六个 MIDI 信息。所有六个都是注释消息,因此没有任何实际注释。

8x 是一个注释消息。
9x 是音符开消息,但力度为 0 实际上指定了音符关。 (这是一项优化,在使用 运行 状态时很有用。)