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

Posted

技术标签:

【中文标题】生成 MIDI 文件并播放它而不将其保存到磁盘【英文标题】:Generate MIDI file and play it without saving it to disk 【发布时间】:2014-12-03 19:18:25 【问题描述】:

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

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

pygame.error: 无法从 RWops 读取

.

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

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

【问题讨论】:

【参考方案1】:

你记得倒带你的 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!"

【讨论】:

了不起的家伙,我已经认为这是一个失败的事业。如果有人说你需要“倒带”文件来播放它,我会认为那个人疯了。但尽管如此,它就像一个魅力。

以上是关于生成 MIDI 文件并播放它而不将其保存到磁盘的主要内容,如果未能解决你的问题,请参考以下文章

生成pdf而不将其保存到磁盘然后将其显示给浏览器

如何在python中生成文件而不将其保存到磁盘?

在内存中创建 eml 文件而不将其保存在磁盘上

使用 keytab 而不将其写入磁盘的 Bash 脚本

将远程文件放入hadoop而不将其复制到本地磁盘

如何播放音频样本而不将其写入文件?