2014-12-03 84 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