在Python中从扬声器(声音合成)中获取从MIDI到真实音频的最简单方法是什么?

时间:2015-01-19 18:52:04

标签: python kivy midi fluidsynth

我正在开始处理需要从大量预加载的“.mid”文件创建声音的应用程序。

我正在使用Python和Kivy来创建一个应用程序,因为我已经使用这些工具创建了一个应用程序,它们是我所知道的唯一代码。我制作的另一个应用程序没有任何声音。

当然,我想确保我编写的代码可以跨平台工作。

现在,我只是想证明我可以用midi音符创造任何真实的声音。

我使用FluidSynth和Mingus从另一个类似问题的答案中提出了这个代码:

from mingus.midi import fluidsynth

fluidsynth.init('/usr/share/sounds/sf2/FluidR3_GM.sf2',"alsa")
fluidsynth.play_Note(64,0,100)

但是我什么也没听到,并且得到了这个错误:

fluidsynth: warning: Failed to pin the sample data to RAM; swapping is possible.

为什么我会收到此错误,我该如何修复它?这是最简单的方法还是正确的方式?

1 个答案:

答案 0 :(得分:2)

我可能错了,但我不认为有一个“0”频道,这是你作为你的第二个参数传递给.play_Note()。试试这个:

fluidsynth.play_Note(64,1,100)

或(来自某些documentation

from mingus.containers.note import Note
n = Note("C", 4)
n.channel = 1
n.velocity = 50
fluidSynth.play_Note(n)

更新:

默认通道设置为1时,该方法的源代码中仅引用通道1-16:

def play_Note(self, note, channel = 1, velocity = 100):
        """Plays a Note object on a channel[1-16] with a \
velocity[0-127]. You can either specify the velocity and channel \
here as arguments or you can set the Note.velocity and Note.channel \
attributes, which will take presedence over the function arguments."""
        if hasattr(note, 'velocity'):
            velocity = note.velocity
        if hasattr(note, 'channel'):
            channel = note.channel
        self.fs.noteon(int(channel), int(note) + 12, int(velocity))
        return True