在 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);
...
我正在尝试用 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);
...