用C生成MIDI文件

时间:2017-12-22 00:18:03

标签: c midi

我试图用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

1 个答案:

答案 0 :(得分:3)

MIDI文件要求以big-endian字节顺序写入值,即“网络顺序”;您可能会发现htnol(3)htons(3)有用:

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