2014-12-03 82 views
2

我发现this module可以创建MIDI文件。生成MIDI文件并播放而不保存到磁盘

我可以使用pygame的mixer.music轻松播放输出文件,但如果我尝试,而无需保存到一个文件(播放对象)打它不工作,我得到

pygame.error: Couldn't read from RWops

我试过用StringIO没有成功。我得到上面的同样的错误。

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

回答

4

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

我经历了你所做的所有步骤,并得到了同样的错误。然后,我在sourceforge(2006年)追踪了012ops164​​RWops库,并准备对此负责。

然后,在模块tempfile中的对象成功后,我尝试从模块IO的ByteIO。他们都工作,但我在装载之前与他们一起寻找(0)。

所以我回到了StringIO,并且在加载之前做了一次seek(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!" 
+0

惊人的家伙,我已经想这是一个失败的事业。如果有人说你需要“回放”文件来播放它,我会认为那个人很疯狂。但尽管如此,它像一个魅力。 – 2014-12-17 08:05:29