gpt4 book ai didi

c - 在 C 中生成 MIDI 文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:33 26 4
gpt4 key购买 nike

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

因此 MIDI header 的形式为:

chunk type-length-format-ntrks-division

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

所以我为标题创建了一个结构,如下所示:

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 查看二进制/十六进制并将其与使用 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 位)长等等。如果这是一个字节顺序的事情,我该如何纠正这个问题。我在这里阅读了一些字节顺序主题,但并没有真正理解它们。

有关 MIDI 的更多信息,这里有一个 pdf 链接: https://www.cs.cmu.edu/~music/cmsip/readings/Standard-MIDI-file-format-updated.pdf

最佳答案

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

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

关于c - 在 C 中生成 MIDI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com