2010-09-07 410 views
6

是否有方法从MIDI文件获取音符数据?也就是说,我想将MIDI文件分解为其组成部分,以便它们以唯一字(或任何其他数据类型)的形式出现。 我最终想做的事情是获取一个MIDI文件并在笔记中找到模式。获取每个音符,找到它的频率(正在播放),并记下其他音符在其后播放的可能性。从MIDI文件获取音符数据

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

回答

1

用手解析MIDI文件是没有趣味的,就此对我说。 ;)格式虽然有据可查,但难以处理,因为您始终处于原始字节级别。由于您有兴趣从MIDI文件本身提取一些有意义的信息,因此我建议您使用一个框架,如Juce,它是用C++编写的,并且支持读取MIDI文件。

Juce非常大,但API很好,并且有很好的文档记录。例如,class for parsing MIDI files非常简单易用。

5

Nik Reisman - 对不起,但我不同意你......在C#中解析midi,C++是大约400行代码的东西......它没有什么困难,也没有困难。

我会建议在开始使用此链接:http://www.sonicspot.com/guide/midifiles.html 有你需要了解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文件中不是NOTE NOTE..This事件是chang ed NOTE ON和速度0

在网站上的一切都很好地解释。如果你以字节模式打开midi文件,你将只有几个方法,一切都只是关于if-else命令,并且你将捕获现在存储的内容。
理解VARIABLE LENGTH很重要,但在网站上也有解释。这并不难。您也可以在谷歌的许多网站中使用一些图片和示例来解释VARIABLE LENGTH。所以我不认为在这里很难解释它。

如果你想多一点建议,写信给我,我会试试看。但是解析midi并不像看起来那么困难。如果你有一些问题,请写信给我。

+1

NIH syndrom可能吗?我的意思是一个std :: vector类不难写在它的表面上,它只是一个可变长度数组...... std :: log2()并不难写......等等。为什么不自己写一切?像手动解析文件这样的东西是他们所有人中最红的东西,在处理“标准”格式时绝对应该有一个可行的实施方式。 – thesaint 2014-04-29 20:35:33

+2

对不起,我可以给他发送2198312093框架和第三方解决方案,然后他可能会遇到更大的问题,然后只能由他自己写。至少如果我使用第三方库我会遇到更大的问题,那么如果我自己写了。无论如何,有人需要编写代码。如果我是来自台湾的一位或一位约瑟夫诺瓦克,那么这不重要。所有的时间你都可以得到一些错误。如果你真的想明白一些图书馆在做什么,你需要看看代码。所以在很多情况下,你自己编写它比较容易。 – piggy 2014-04-30 00:17:31