2

私がやりたいことは次のとおりです。MIDIファイルを作成しますが、メモリ内にのみ作成し、pygame.mixer.music.load(). これが私が試したことです(ここからMidiFileを使用しています):

import pygame.mixer
import MidiFile3
import io

pygame.mixer.init()

midi = MidiFile3.MIDIFile(1) # midi file with one track
midi.addTrackName(0,0,"Track 1") #Track Name on track 0, position 0
midi.addTempo(0,0,120) #Tempo to 120 bpm on track 0, position 0

for i in range(8):
    midi.addNote(0,0,60,i,1,100) #add 8 c1-notes to the track

bytestream = io.BytesIO()
midi.writeFile(bytestream)
pygame.mixer.music.load(bytestream.getvalue())

ここでエラーメッセージが表示されます

pygame.error: File path 'MThd' contains null characters

私がする時

bytestream = open('file.mid','wb')
midi.writeFile(bytestream)
bytestream.close()
pygame.mixer.music.load('file.mid')

期待どおりに動作します。

もちろん、ファイル名を含む文字列とファイルに含まれるものを含むバイト文字列には違いがあることは知っています。しかし、バイトストリームを使用するこの投稿を Daniwebで見つけました。この例は私にとってはうまくいきます。

私の例を機能させる方法がわかりません。

4

3 に答える 3

1

次のように問題を修正しました。

bytestream = io.BytesIO()
midi.writeFile(bytestream)
temp = io.BytesIO(bytestream.getvalue())
pygame.mixer.music.load(temp)

お分かりのように、このwriteFile()操作により、何らかの方法で BytesIO オブジェクトがpygame.mixer.music.load()メソッドに対して無効になります。正しく作成されたバイトストリームで BytesIO のコンストラクタを再度使用することにより、 に渡すことができる有効なバイトストリームを魔法のように取得しますpygame.mixer.music.load()

于 2015-06-07T19:26:25.367 に答える