2010-03-03 158 views
4

我想知道关于可能被用来在MIDI文件执行一些简单任务的开源库:开源MIDI库

  1. 读取文件中的一个音符 - 或弦 - 一次;
  2. 提取给定的乐器以在新文件中单独重新编码;
  3. 允许产生一个“可定制”的分数 - 我的意思是我应该能够改变从midi使用库生成乐谱的方式......我认为这将需要与Lilypond或Musixtex。

我真的没有首选语言,只要让应用程序跨平台不是太痛苦。其他建议是值得欢迎的 - 现在更好地学习它,而不是当我已经写了很多代码时。到目前为止,我一直在试图挖掘MuseScore的(C++)源代码,但似乎GUI代码渗透了大多数文件,虽然发现相关文件很容易,但我很难提取我需要的东西(我是目前只是针对一个命令行应用程序,后面我会介绍接口)。

任何想法?

谢谢!

+0

我在6年前简要地调查了这一点。 MIDI文件规范并不那么难(如果我记得有3种风格),但我从来不能理解他们使用的压缩方案,其中涉及读取高阶位并理解将要在那块。我想这就是我为什么是前端编码器的原因。 :) – Robusto 2010-03-03 01:13:36

+0

看到这个问题:http://stackoverflow.com/questions/3231/c-c-library-for-reading-midi-signals-from-a-usb-midi-device – 2010-04-15 16:09:09

回答

2

那么,我刚开始,但this(在Python中)似乎很有前途。

2

如果你还在研究项目和语言不成问题,你可以尝试Python的跨平台music21,它可以将MIDI文件解析成Note,Chord,Instrument等对象,让你可以操纵分数,然后R/T回MIDI或输出到Lilypond等(完全公开,我是该工具包的作者;但我不知道许多其他语言的MIDI会将Lilypond同时让您有机会将MIDI元素作为对象在此期间进行操作)。

示例代码搞砸了所有的乐器声音的MIDI文件,然后发挥它,并从中做出lilypond.pdf:

import music21 
mf = music21.converter.parse('pathToMidiFile.mid') 
for x in mf.recurse(): 
    if 'Instrument' in x.classes: 
     x.midiProgram = (x.midiProgram * 2) % 128 
mf.show('midi') 
mf.show('lily.pdf') 

希望有所帮助。

+0

感谢您的领导。我完成了我想要构建的软件,但很高兴知道您的工具箱存在,有一天我可能需要它来安装另一个应用程序。 – 2012-10-05 06:18:23