从MIDI文件中获取备注数据

Bil*_*ill 7 language-agnostic midi parsing

有没有办法从MIDI文件中获取音符数据?也就是说,我想将MIDI文件分解为其组成部分,因此它们采用唯一字(或任何其他数据类型)的形式.我最终想要做的是获取MIDI文件并在笔记中找到模式.获取每个音符,找到它的频率(正在播放)并记录其后音符播放的可能性.

在C/C++中这样做会很好,但任何语言都可以.

pig*_*ggy 7

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并不像它看起来那么难.如果你有一些问题,请写信给我..

  • NIH综合症可能吗?我的意思是std :: vector类不难写在表面上它只是一个可变长度数组... std :: log2()也不难写......等等.为什么不自己写一切?像手工文件解析这样的东西是最令人讨厌的东西,甚至在处理"标准"格式时更是如此,这些格式肯定应该在某个地方有一个可靠的实现. (2认同)
  • 对不起,我可以给他发送2198312093框架和第三方解决方案,他可以得到更大的问题,然后只能自己编写.至少如果我使用第三方库我会遇到更大的问题,如果我自己做错了.无论如何,有人需要编写代码.如果我是来自台湾的那个或者一个约瑟夫诺瓦克,那就不重要了.你总是会遇到一些错误.如果你想真正了解一些库正在做什么,你需要查看所有的代码.所以在很多情况下,自己编写它会更容易. (2认同)

Nik*_*man 4

手动解析 MIDI 文件并不有趣,请相信我的话。;) 该格式虽然有详细记录,但很难处理,因为您始终处于原始字节级别。由于您有兴趣从 MIDI 文件本身提取一些有意义的信息,因此我建议使用Juce等框架,它是用 C++ 编写的,支持读取 MIDI 文件。

Juce 相当大,但 API 很好并且有详细的文档。例如,用于解析 MIDI 文件的类非常简单且易于使用。