我试图用C语言生成MIDI文件,但我对文件的标题块有点麻烦。
所以MIDI标题的形式为:
chunk type-length-format-ntrks-division
块类型是四个ASCII字符' MThd&#39 ;; length是数字6的32位表示(高字节优先)。其余的是16位。
所以我为Header创建了一个Struct,它是:
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查看二进制/十六进制并将它与用let' s说创建的正确midi文件进行比较,我会看到它们不同而且我的不正确。
以十六进制校正midi标题:
4d54 6864 0000 0006 0000 0001 0060
我的十六进制midi标题不正确:
4d54 6864 0000 0000 0600 0000 0000 0000 0000 0100 6000 0000
是什么原因引起的?它是一个字节序问题还是我使用了错误的数据类型。我在64位os X 10.10.5上。因为如果我理解正确,标题中的16位部分应该是整数,长度(32位)长,依此类推。如果它是一个字节序的东西我怎么能纠正这个。我在这里阅读了一些字节序主题,但并没有真正理解它们。
这里有一个指向pdf的链接,了解有关MIDI的更多信息: https://www.cs.cmu.edu/~music/cmsip/readings/Standard-MIDI-file-format-updated.pdf
答案 0 :(得分:3)
MIDI文件要求以big-endian字节顺序写入值,即“网络顺序”;您可能会发现htnol
(3)和htons
(3)有用:
#include <arpa/inet.h>
...
mthd->length = htonl(6);
mthd->ntraks = htons(1);
...