Bil*_*ill 7 language-agnostic midi parsing
有没有办法从MIDI文件中获取音符数据?也就是说,我想将MIDI文件分解为其组成部分,因此它们采用唯一字(或任何其他数据类型)的形式.我最终想要做的是获取MIDI文件并在笔记中找到模式.获取每个音符,找到它的频率(正在播放)并记录其后音符播放的可能性.
在C/C++中这样做会很好,但任何语言都可以.
Nik Reisman - 对不起,但我不同意你的看法......在C#中解析midi,C++就是400行代码......这没什么难的,也没什么难的.
我会建议你从这个链接开始:https://web.archive.org/web/20141227205754/http : //www.sonicspot.com :
80/guide/midifiles.html你需要知道关于midi和midi的一切怎么读..
在简短的描述中解析器将如何工作:
1)在字节模式下打开midi
2)读取标题块,其中有关于大小,轨道数和重要文件格式的信息!
- 有3种类型的格式:0,1,2(类型2真的是"有价值的",只有少数这种类型的midi文件,因此如果有类型2,你不需要读取midi)
- 如果没有写入:"MThd" (0x4D546864),以错误结束(这是一个糟糕的midi文件)
3)读取轨道块
- 如果没有写入:"MTrk" (0x4D54726B)结束有错误(这是一个糟糕的midi文件)
4)读取midi事件.. - 有非常许多事件,您可以使用if-else命令读取它们,或者您只能读取您想要知道的事件,例如NOTE ON,NOTE OFF - 有时在某些midi文件中没有注意OFF ..此事件已更改使用NOTE ON和速度0
在网站上,一切都很好地解释.如果你在字节模式下打开midi文件,你将只有几个方法,然后一切只是关于if-else命令,那么你将捕获现在存储的内容.
了解VARIABLE LENGTH非常重要,但在网站上也有解释.这并不难.您可以使用一些图像和示例来google许多可以解释VARIABLE LENGTH的网站.所以我认为在这里解释它并不困难.
如果您想要更多建议,请写信给我,我会尝试一下.但解析midi并不像它看起来那么难.如果你有一些问题,请写信给我..
手动解析 MIDI 文件并不有趣,请相信我的话。;) 该格式虽然有详细记录,但很难处理,因为您始终处于原始字节级别。由于您有兴趣从 MIDI 文件本身提取一些有意义的信息,因此我建议使用Juce等框架,它是用 C++ 编写的,支持读取 MIDI 文件。
Juce 相当大,但 API 很好并且有详细的文档。例如,用于解析 MIDI 文件的类非常简单且易于使用。