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

标签 python object pygame midi

我找到了 this module可以创建 MIDI 文件。

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

pygame.error: Couldn't read from RWops

.

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

有谁知道可以播放 MIDI 对象的模块,也许也可以创建它们?

最佳答案

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

我完成了您执行的所有步骤,但遇到了同样的错误。然后我找到了 sourceforge 的 RWops 库(日期为 2006 年),并准备好责备它。

然后在成功处理模块 tempfile 中的对象后,我尝试了模块 IO 中的 ByteIO。他们都工作了,但我在加载之前用他们做了一个 seek(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!"

关于python - 生成 MIDI 文件并播放它而不将其保存到磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27279864/

相关文章:

c++ - 通过 Function Frustrations c++ 传递对象数组

java - 在集合中搜索同一对象的不同实例

python - 我应该如何序列化包含 pygame 表面的游戏对象?

python - Pygame 内存错误

python - txt 文件中的参数

python - Django - 外键根据其内容引用两个表之一

javascript - JavaScript 中的 Splat 运算符,相当于 Python 中的 *args 和 **kwargs?

python - 如何动态消除蓝牙加速度计的噪声?

java - 可以使用 `String.length()` 来查看两个 String 对象中哪一个更大?

python - Alien 类没有 rect 属性