【问题标题】:Simple, Cross Platform MIDI Library for Python [closed]用于 Python 的简单、跨平台 MIDI 库 [关闭]
【发布时间】:2010-10-08 19:59:05
【问题描述】:

我想构建一个创建 MIDI 声音的小应用程序。我从来没有在编程中处理过声音,所以我想从一些基本的并且有很好的文档的东西开始。我想坚持使用 Python,因为我对它最熟悉,并且最初不想让自己不知所措。

我的时间在 Windows 和 Ubuntu 之间分配了大约 50/50,所以在这两个平台上“正常工作”的东西会非常有帮助。

有什么建议吗?

【问题讨论】:

  • 为什么不将您的问题标记为已回答!?
  • 你的问题不是很清楚。您不能“创建 MIDI 声音”。 MIDI 不存储或传输声音,仅用于 MIDI 兼容设备/软件的控制数据。我想您想 a) 使用计算机的 MIDI 接口与其他 MIDI 设备/软件实时对话,或者 b) 读写标准 MIDI 文件 (SMF)。这是两个不同的要求(尽管许多应用程序都会同时满足这两个要求),并且有不同的库可以针对这两个任务提出建议

标签: python audio midi


【解决方案1】:

我尝试了 wiki http://wiki.python.org/moin/PythonInMusic 上列出的八个软件包。 我发现music21 (http://web.mit.edu/music21/) 是那个

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

但至于您对简单的要求,我认为这不是最简单的。但我无法让任何其他程序以稳健的方式读取 midi 文件(我有各种奇怪而美妙的 midi 文件格式)

【讨论】:

    【解决方案2】:

    如果你只需要生成Midi或者处理midi文件,试试mingus, 这是一个很棒的包,它还允许更高的抽象,例如和弦、和弦进行、音阶等。

    【讨论】:

      【解决方案3】:

      MIDIUtil 库(在 Google 代码中托管 here)可以满足您的需求:从纯 Python 库编写 MIDI 文件。关于它的好处(并且完全公开:我是作者)是您不必跟踪较低级别的 MID 事件,例如 note-on 和 note-off:它会为您处理它们。

      作为一个写笔记的例子,你可以这样做:

      MyMIDI = MIDIFile(1)
      track = 0
      channel = 0
      pitch = 60
      time = 0
      duration = 1
      volume = 100
      MyMIDI.addNote(track,channel,pitch,time,duration,volume)
      

      希望对你有帮助

      【讨论】:

      • 真的迟到了,但它可以处理和弦吗?如果可以的话,我可能会在我的软件中实现它...
      • 您可以轻松定义和弦,对吧? for pitch in pitches: midi.addNote(.., pitch, ...)
      • 你能用这个读取midi文件吗?
      【解决方案4】:

      我一直在寻找一个纯 Python 库来生成一个 MIDI 文件,mxm's Python MIDI library 就是这样。

      来自this dzone snippet,上面的库有一个单文件版本,smidi.pygist'd here为后代)

      用法很简单:

      >>> 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 上对其进行了测试

      【讨论】:

        【解决方案5】:

        Midi 支持(输入和输出)已添加到 pyGame 1.9 中,虽然它主要处于开发阶段并且还没有很好的文档记录,但它可以工作。

        Midi 支持也在 pyGame 的继任者 pgreloaded(或 pygame2)中开发。

        还请注意,尽管 pyGame 在标题中包含“游戏”,但它的用途远远超出了游戏设计。

        【讨论】:

        • PyGame 中的 MIDI 支持基于与 pyPortMidi 相同的代码库(请参阅@unwind 的答案),PyGame repository 中的 pyPortMidi 代码是当前最新且可用的版本。免责声明:我是 PyGame 的 pyPortMidi 版本补丁的作者,它大量清理了代码并修复了严重错误。该补丁尚未应用于portmidi repository,pyPortMidi 代码现在所在的位置。网络上还有其他几个 pyPortMidi 存储库已过时。
        【解决方案6】:

        cSounds

        【讨论】:

        【解决方案7】:

        pyPortMidi 是 PortMidi 的 Python 包装器,被描述为“用于实时 MIDI 控制的跨平台 C 库”。我自己没用过,但看起来很有前途。明确提到能够实时发送 MIDI 数据。

        【讨论】:

        • 对于通过 Google 找到此页面的人:请注意 pyPortMidi 最后一次更新是在 2005 年 3 月 15 日。我怀疑它已经被放弃了。
        • pyGame中包含了一个稍微更新一点的pyPortMidi版本,我已经成功使用了。
        • 如果不以原始十六进制形式编写,甚至无法发送弯音? player.write_short(0xE0, 0x00, 0x60) :/
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 2015-07-04
        相关资源
        最近更新 更多