Не могу сыграть ноту с мингусом - PullRequest
0 голосов
/ 07 декабря 2018

Я пришел использовать mingus , чтобы попытаться воспроизвести некоторые заметки на python.Исходя из того, что ответил здесь , я пробовал:

from mingus.midi import fluidsynth

fluidsynth.init('/home/btc/Escritorio/SinestesiaRCB/gfx/ViolinsLong.sf2',"alsa")

fluidsynth.play_Note(64,0,100)
#Also tried with Note("C-5") and so forth

Используя, среди прочего, один из этих файлов sf2 .Но затем я получил ошибку:

fluidsynth: предупреждение: не удалось установить поток с высоким приоритетом

fluidsynth: предупреждение: пресет не найден на канале 9 [bank = 128 prog = 0]

Немного изучив, этот ответ сказал :

Для общей совместимости с MIDI инструментами звукового шрифта по умолчанию назначаются банк 0, программа 0(«Acoustic Grand Piano») для каналов 0–8 и 10–15 и банка 128, программа 0 («Набор ударных по умолчанию») для канала 9. Очевидно, ваш звуковой шрифт не имеет последнего.Это не имеет значения, если ваш MIDI-файл не поддерживает общие MIDI-совместимые инструменты и не пытается воспроизводить звуки ударных на канале 9.

Но, кроме этого, это может немного прояснить ситуацию, ядо сих пор не знаю, как ее решить.

Плюс, если я использую тот же файл , что в ответе самой первой ссылки, то я получаю ошибку (и донне знаю, как ее решить):

fluidsynth: предупреждение: не удалось установить поток с высоким приоритетом

fluidsynth: предупреждение: не удалось закрепить данные образца в ОЗУ;обмен возможен.

Обновление

Запуск программы с разрешениями sudo удаляет эти ошибки , но этого не делаетзвук .Таким образом, я получаю сообщение об ошибке:

QStandardPaths: XDG_RUNTIME_DIR не установлен, по умолчанию используется значение «/ tmp / runtime-root»

Я подумал, что это может быть проблемойс выбранным режимом драйвера в fluidsynth драйвере, но я пробовал их всех (alsa, oss и т. д.) с тем же результатом.Ради полноты, я запускаю его в виртуальной машине, и другие звуки внутри него правильно воспроизводятся в динамиках моего хоста.

Однако, основываясь на этот ответ , я думаю это должно быть решено путем передачи ему правильной переменной звукового окружения .Что я не знаю.Я пробовал с:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY python3 /home/btc/Escritorio/SinestesiaRCB/SinestesiaRCB.py

Там, где нужен полный путь к файлу, так как для этого требуются разрешения sudo и изменяется его рабочий каталог, и в конце концов появилась та же ошибка: XDG_RUNTIME_DIR.

Обновление 2

Если я запускаю его с опцией sudo -E, ошибка заменяется новой:

QStandardPaths: неправильное владениев каталоге времени выполнения / run / user / 1000, 1000 вместо 0

Я читаю в некоторых сетях , что пользователь 1000 должен быть пользователем по умолчаниювместо root.

Поэтому я сделал:

sudo chown root:root /run/user/1000

Просто попробуйте, а затем приложение запускает без сбоев, но оно все равно не звучит .

Обновление 3

На основе этого примера и этого Q & A , я пробовал использовать обавремя сна с несколько раз, и с использованием raw_input также после (также до) сделать play_note, но он все еще не звучит.

1 Ответ

0 голосов
/ 10 декабря 2018

Я отвечу на свой вопрос, но очень большая часть процесса отладки / решения заключается в самом вопросе, который выполняется с помощью обновлений.

Последняя часть заключалась в том, чтобы заставить его звучать, даже если дажеожидание с sleep заставляло его работать.Даже не делая этого до и после функции play_note.Позвольте мне сказать, что эта функция всегда возвращала True, поэтому ожидалось, что нота будет звучать с самого начала.Дело в том, что файл SF2 (почти 150 МБ) был загружен успешно, или, по крайней мере, он выглядел так, поскольку он также возвратил True и был довольно быстро.

Решение

Давайте продолжим после достижения точки, где при выполнении моего скрипта не было напечатано ни одной ошибки (как раз перед обновлением 3 в вопросе).

Я хотел проверить, сколько процентов использования ЦП быловыполняя свой сценарий, я использовал top на своем терминале Linux и обнаружил, что pulseaudio работает несколько дней назад:

enter image description here

Killingэтот процесс позволил ему наконец-то звучать.Однако я должен сказать, что после функции play_Note() была добавлена ​​time.sleep() с примерно 0.25 секундами, чтобы позволить ей полностью воспроизвести ноту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...