Python的简单跨平台MIDI库

28

我想建立一个能够产生MIDI声音的小应用程序。我以前从未在编程中处理过声音,因此希望从一些基础且有良好文档支持的东西开始。我想坚持使用Python,因为我最擅长它,并且不想给自己带来太多压力。

我的时间大约平分在Windows和Ubuntu上,因此寻找一个“只需正常工作”的跨平台库会非常有帮助。

有什么建议吗?


相关链接:https://dev59.com/_nRB5IYBdhLWcg3wz6MJ - S.Lott
为什么你不把你的问题标记为已回答呢? - Shimmy Weitzhandler
4
你的问题不是很清楚。你无法“创建MIDI声音”。MIDI并不存储或传输声音,而只是用于MIDI兼容设备/软件的控制数据。我猜想你要么想通过计算机的MIDI接口实时与其他MIDI设备/软件进行通信,要么想读取和写入标准MIDI文件(SMF)。这是两个不同的需求(尽管许多应用程序都会有这两个功能),并且有不同的库可以建议用于这两个任务。 - Chris Arndt
7个回答

33

MIDIUtil库(托管在Google Code上这里)可以实现您的需求:从纯Python库编写MIDI文件。其中一个优点(全面披露:我是作者)是您不必跟踪低级别的MID事件,例如音符的开始和结束:它会为您处理。

例如,要编写一个音符,您可以执行以下操作:

MyMIDI = MIDIFile(1)
track = 0
channel = 0
pitch = 60
time = 0
duration = 1
volume = 100
MyMIDI.addNote(track,channel,pitch,time,duration,volume)
希望这能帮到你。

2
真的很晚才发布这个,但它能处理和弦吗?如果可以的话,我可能会在我的软件中实现它... - Blender
2
你可以轻松地定义和弦,对吧? for pitch in pitches: midi.addNote(.., pitch, ...) - sam boosalis
1
你能用这个读取MIDI文件吗? - Jim

10

我在寻找一个纯Python库来生成MIDI文件,mxm的Python MIDI库正是这样一个库。

这个dzone代码片段中,有一个单文件版本的上述库,即smidi.py这里为后世留存

使用非常简单:

>>> import smidi
>>> m = smidi.MidiOutFile('out.mid')
>>> m.header()
>>> m.start_of_track()
>>> m.update_time(0)
>>> m.note_on(note=0x40)  # single note
>>> m.update_time(192)
>>> m.note_off(note=0x40) # stop it after 192
>>> m.update_time(0)
>>> m.end_of_track()
>>> m.eof()

据推测可以在Windows上运行(因为原始示例使用C:\out.mid作为输出文件名),我已在OS X上测试过。


8

pyPortMidi是PortMidi的Python封装,PortMidi被描述为“用于实时MIDI控制的跨平台C库”。虽然我自己没有使用过它,但它看起来非常有前途。明确提到可以实时发送MIDI数据。


4
注意:通过谷歌搜索进入此页面的人,请注意,pyPortMidi最后更新于2005年3月15日。我怀疑它已被放弃。 - larsks
2
在pyGame中包含了稍微更新一些的pyPortMidi版本,我已经成功地使用过了。 - rjmunro
甚至不能发送弯音而不用以原始十六进制形式编写它们吗?player.write_short(0xE0, 0x00, 0x60) :/ - endolith

7
如果您只需要生成Midi或处理Midi文件,请尝试使用mingus。这是一个很棒的软件包,它还允许更高级的抽象,例如和弦、和弦进行、音阶等等。请点击mingus获取更多信息。

5

我在维基上列出的八个包中尝试了一下,链接地址为http://wiki.python.org/moin/PythonInMusic

我发现其中一个名为music21 (http://web.mit.edu/music21/) 的包:

  • 最全面
  • 最好的教程
  • 在windows上安装最容易

但是关于你要求的简单性,我认为它不是最简单的。但是我无法让其他程序以强大的方式读取midi文件(我有各种奇怪而美妙的midi文件格式)。


4

在pyGame 1.9中新增了Midi支持(输入和输出),尽管它主要处于开发阶段,且文档不是很完善,但它可以工作。

pgreloaded(或pygame2)也正在开发Midi支持。

还请注意,尽管pyGame标题中有“game”一词,但其用途远远超出了游戏设计。


5
PyGame中的MIDI支持基于与pyPortMidi相同的代码库(请参见@unwind的答案),而PyGame存储库中的pyPortMidi代码目前是最新且可用的版本。免责声明:我是PyGame的pyPortMidi版本补丁的作者,该补丁大大清理了代码并修复了严重错误。该补丁尚未应用于portmidi存储库,现在pyPortMidi代码正在该存储库中。网络上还有其他几个已过时的pyPortMidi代码库。 - Chris Arndt

-3

3
你能否展开回答?cSounds页面没有提到MIDI或Python。 - rjmunro
@rjmunro,FYI:http://www.csounds.com/manual/html/py.html - Brian Cain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接