【发布时间】:2019-01-22 15:24:36
【问题描述】:
我一直在尝试使用 C 编写 MIDI 解析器。
我进行了研究,并从多个来源中学到了很多关于 MIDI 文件结构的知识。
这里有一些最有用的(对于那些有兴趣的人):
- https://web.archive.org/web/20141227205754/http://www.sonicspot.com:80/guide/midifiles.html
- https://www.csie.ntu.edu.tw/~r92092/ref/midi/
使用上述来源的信息,我编写了一个非常未经优化的 MIDI 解析器。当前版本的目的是简单地打印它遇到的事件并将它们保存在一个文件中。
我已经设法解析了 midi 文件 [虽然我遇到了一个不应该存在的元事件(元事件 0x09)] .
但是,在实现保存功能时,我发现如果我尝试保存某些 midi 文件会导致问题(只需解析它们就可以正常工作)(程序冻结一段时间并在完成执行之前返回非零值)。
我认为问题可能与我分配内存或访问它的方式有关。
这是代码(正如我所说,它还不漂亮)):
_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
MtrkDatas[p] = (_MtrkCD *)(malloc(sizeof(_MtrkCD)));
if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
printf("Error reading MTrk Chunk. Bad MTrk.\n");
return 0;
}
}
^分配内存的部分(因需要而发布)^
main.c
这是我使用的两个示例文件(一个工作正常,另一个导致问题):
home.mid(This file doesn't cause problems)
014-Theme03.mid(This is the one causing problems)
以下是我运行程序时的输出:
home Parsed.txt(Expected Output)
014-Theme03 Parsed.txt(What even is this?)
再次,我想指出一些我注意到的事情:
- 程序解析两个 MIDI 文件没有任何问题
- 程序不仅无法将事件输出写入 .txt 文件,而且无法写入正确的字节数
感谢大家的宝贵时间。 (如果有人更好地格式化文本,我将不胜感激。如您所见,我不是很擅长。)
更新:
这是工作代码。我在为轨道分配内存时犯了一个非常简单的错误。感谢Paul R指出错误。
_MtrkCD **MtrkDatas = (malloc(sizeof(_MtrkCD *) * (MthdData->tracks_count)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
MtrkDatas[p] = (malloc(sizeof(_MtrkCD)));
if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
printf("Error reading MTrk Chunk. Bad MTrk.\n");
return 0;
}
}
【问题讨论】:
-
元事件 0x09 是 RP-019 中的 specified。
-
您的代码似乎无法处理运行状态。有关示例,请参见 aplaymidi source。
标签: c parsing dynamic-memory-allocation midi