在 python 中播放 MIDI 文件?

Posted

技术标签:

【中文标题】在 python 中播放 MIDI 文件?【英文标题】:play MIDI files in python? 【发布时间】:2011-05-17 11:26:51 【问题描述】:

我正在寻找一种在 python 中播放 MIDI 文件的方法。 似乎 python 在其标准库中不支持 MIDI。 经过一番搜索,发现了一些python midi库,比如pythonmidi。 然而,他们中的大多数只能创建和读取 MIDI 文件而没有播放功能。 我想找一个包含播放方法的python midi库。 有什么建议吗?谢谢!

【问题讨论】:

怎么玩?通过 MIDI 端口?通过软件合成器? 我想写一个既能播放midi又能处理midi文件的python播放器。 【参考方案1】:

pygame模块可以用来播放midi文件。

http://www.pygame.org/docs/ref/music.html

请看这里的例子:

http://www.daniweb.com/software-development/python/code/216979

一大堆可用的选项:

http://wiki.python.org/moin/PythonInMusic

您也可以在此处修改以适合您的目的: http://xenon.stanford.edu/~geksiong/code/playmus/playmus.py

【讨论】:

【参考方案2】:

只是添加一个最小的例子(通过DaniWeb):

# conda install -c cogsci pygame
import pygame

def play_music(midi_filename):
  '''Stream music_file in a blocking manner'''
  clock = pygame.time.Clock()
  pygame.mixer.music.load(midi_filename)
  pygame.mixer.music.play()
  while pygame.mixer.music.get_busy():
    clock.tick(30) # check if playback has finished
    
midi_filename = 'FishPolka.mid'

# mixer config
freq = 44100  # audio CD quality
bitsize = -16   # unsigned 16 bit
channels = 2  # 1 is mono, 2 is stereo
buffer = 1024   # number of samples
pygame.mixer.init(freq, bitsize, channels, buffer)

# optional volume 0 to 1.0
pygame.mixer.music.set_volume(0.8)

# listen for interruptions
try:
  # use the midi file you just saved
  play_music(midi_filename)
except KeyboardInterrupt:
  # if user hits Ctrl/C then exit
  # (works only in console mode)
  pygame.mixer.music.fadeout(1000)
  pygame.mixer.music.stop()
  raise SystemExit

【讨论】:

超级有用。感谢您发布此信息!【参考方案3】:

pretty_midi 可以为您生成波形,然后您可以使用例如IPython.display.Audio

from IPython.display import Audio
from pretty_midi import PrettyMIDI

sf2_path = 'path/to/sf2'  # path to sound font file
midi_file = 'music.mid'

music = PrettyMIDI(midi_file=midi_file)
waveform = music.fluidsynth(sf2_path=sf2_path)
Audio(waveform, rate=44100)

【讨论】:

似乎比远程相关的 pygame 更好(更轻)的解决方案。音乐分析和 DSP 领域的 show case from two well know authors。【参考方案4】:

使用 pygame 播放您的 midi 文件。例如here 或here

【讨论】:

【参考方案5】:

我发现midi2audio 效果很好。

例子:

from midi2audio import FluidSynth

#Play MIDI

FluidSynth().play_midi('input.mid')

#Synthesize MIDI to audio

# Note: the default sound font is in 44100 Hz sample rate

fs = FluidSynth()
fs.midi_to_audio('input.mid', 'output.wav')

# FLAC, a lossless codec, is recommended

fs.midi_to_audio('input.mid', 'output.flac')

【讨论】:

以上是关于在 python 中播放 MIDI 文件?的主要内容,如果未能解决你的问题,请参考以下文章

python 用Python播放MIDI文件

在 python 中构建 MIDI 合并程序,带有恢复选项

在 Python 中为 Kivy 播放跨平台、移动、MIDI - 这可能吗?

如何使用 python 从头开始​​编写 Midi 文件

如何“减慢” MIDI 文件(最好在 Python 中)?

使用 chrome 播放 MIDI 文件