Какой самый простой способ перейти от MIDI к реальному звуку, выходящему из моих динамиков (синтез звука) в Python?
Я начинаю работу над приложением, которое должно создавать звук из множества предварительно загруженных файлов ".mid".
Я использую Python и Kivy для создания приложения, так как я создал приложение уже с этими инструментами, и они - единственный код, который я знаю. Другое приложение, которое я сделал, не использует звук вообще.
Естественно, я хочу убедиться, что код, который я пишу, будет работать кроссплатформенно.
Прямо сейчас я просто пытаюсь доказать, что могу создать любой настоящий звук из миди-ноты.
Я взял этот код, предложенный из другого ответа на аналогичный вопрос, используя 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", который вы передаете в качестве второго аргумента.play_Note(). Попробуй это:
fluidsynth.play_Note(64,1,100)
или (из какой-то документации)
from mingus.containers.note import Note
n = Note("C", 4)
n.channel = 1
n.velocity = 50
fluidSynth.play_Note(n)
ОБНОВИТЬ:
В исходном коде этого метода есть ссылки только на каналы 1-16, для канала по умолчанию установлено значение 1:
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