生成MIDI文件并播放它而不将其保存到磁盘

时间:2014-12-03 19:18:26

标签: python object pygame midi

我发现this module可以创建midi文件。

我可以轻松地使用pygame mixer.music播放输出文件,但是如果我尝试播放而不必保存到文件(播放对象)它不起作用,我得到了

  

pygame.error:无法读取RWops

我尝试使用StringIO但没有成功。我上面得到了同样的错误。

有没有人知道任何可以播放MIDI对象的模块,也可以创建它们?

1 个答案:

答案 0 :(得分:5)

你还记得倒回你的StringIO缓冲区吗?

我完成了你所做的所有步骤,并得到了同样的错误。然后我追查了 在sourceforge的RWops图书馆(日期为2006年),并准备责备它。

然后在成功使用模块tempfile中的对象后,我尝试了来自模块IO的ByteIO。他们都工作,但我在负载之前与他们进行了搜索(0)。

所以我回到了StringIO,并在加载之前进行了搜索(0),并取得了成功!!

以下是midutil中样本的编辑和精简修改:

from midiutil.MidiFile import MIDIFile
from StringIO import StringIO

# CREATE MEMORY FILE

memFile = StringIO()
MyMIDI = MIDIFile(1)
track = 0
time = 0
channel = 0
pitch = 60
duration = 1
volume = 100
MyMIDI.addTrackName(track,time,"Sample Track")
MyMIDI.addTempo(track,time,120)

# WRITE A SCALE

MyMIDI.addNote(track,channel,pitch,time,duration,volume)
for notestep in [2,2,1,2,2,2,1]:
    time += duration
    pitch += notestep
    MyMIDI.addNote(track,channel,pitch,time,duration,volume)
MyMIDI.writeFile(memFile)

# PLAYBACK

import pygame
import pygame.mixer
from time import sleep

pygame.init()
pygame.mixer.init()
memFile.seek(0)  # THIS IS CRITICAL, OTHERWISE YOU GET THAT ERROR!
pygame.mixer.music.load(memFile)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
    sleep(1)
print "Done!"