在 C 中生成 MIDI-files

Generating MIDI-files in C

我正在尝试用 C 生成 MIDI 文件,但我在处理文件的 header 块时遇到了一些问题。

所以 MIDI header 的形式是:

chunk type-length-format-ntrks-division

块类型为四个ASCII字符'MThd'; length 是数字 6 的 32 位表示(高字节在前)。其余为 16 位。

所以我为 Header 创建了一个结构如下:

struct headerStruct {
    char chunktype[4]; //MThd
    long length; //32bit length
    int format;//16bit format
    int ntraks;//16bit number of tracks
    int division;//16bit division
};

然后我在代码中创建结构:

struct headerStruct *mthd = malloc(sizeof(struct headerStruct));
strncpy(mthd->chunktype, "MThd",4);
mthd->length = 6;
mthd->format = 0;
mthd->ntraks = 1;
mthd->division = 96;

然后我用 fwrite 编写文件(还有此处未显示的其他内容),我将省略那部分代码。但是,如果我用 xxd 查看 binary/hex 并将其与使用 ableton 创建的正确 midi 文件进行比较,我发现它们是不同的,而我的是不正确的。

正确的十六进制 midi header:

4d54 6864 0000 0006 0000 0001 0060

我不正确的十六进制 midi header:

4d54 6864 0000 0000 0600 0000 0000 0000 0000 0100 6000 0000

这是什么原因造成的?这是字节序问题还是我使用了错误的数据类型。我在 64 位 os X 10.10.5。因为如果我理解正确,header 中的 16 位部分应该是整数,长度(32 位)长等等。如果这是一个字节顺序的事情,我该如何纠正这个问题。我在这里阅读了一些字节顺序主题,但并没有真正理解它们。

这里有一个 link 的 pdf 文件,可以了解更多关于 MIDI 的信息: https://www.cs.cmu.edu/~music/cmsip/readings/Standard-MIDI-file-format-updated.pdf

MIDI 文件要求以大端字节顺序写入值,又名 "network order";您可能会发现 htnol(3)htons(3) 很有用:

#include <arpa/inet.h>
...
mthd->length = htonl(6);
mthd->ntraks = htons(1);
...