Нет звука от MIDI-программы на Python на Mac - PullRequest
2 голосов
/ 01 октября 2019

Я разрабатывал программу на Python, которая использует MIDI. Часть этой программы позволяет пользователю воспроизводить ноту с помощью устройства ввода MIDI и слушать ту же самую ноту, воспроизводимую им. Раньше я разрабатывал это на ПК с Windows, и он начал работать, но недавно перешел на macOS и обнаружил, что моя программа больше не воспроизводит звук.

Следующий код предназначен (для целей тестирования) для воспроизведенияобратите внимание на одну секунду. Он не возвращает никаких ошибок, но не выводит звук на моем Mac.

import pygame.midi
import time

pygame.midi.init()
player = pygame.midi.Output(1)
player.set_instrument(0)
player.note_on(60, 127)
print("PLAYING")
time.sleep(1)
player.note_off(60, 127)
print("STOPPED")

del player
pygame.midi.quit()

Я попытался установить звуковые шрифты, изменить устройство вывода, изменить инструмент, но без радости. Как я уже говорил, эта программа отлично работала на моей машине с Windows. Я почти уверен, что мне нужно что-то делать на macos, но я не уверен, что.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 02 октября 2019

MIDI-события должны быть отправлены на MIDI-синтезатор для преобразования в звук, который вы можете слушать. В Windows всегда есть доступный MIDI-синтезатор (печально известный «Microsoft GS Wavetable Synth»). Это системный драйвер, поэтому он ведет себя как аппаратный синтезатор, хотя это не так, это программа (кстати, предоставленная Роландом).

Ситуация в других операционных системах иная. В macOS Apple включает другой программный синтезатор MIDI, но это не программа, это библиотека (также предоставленная Roland), которую программы должны загружать и активировать. К счастью, есть несколько бесплатных программ, таких как SimpleSynth . Вы также можете играть с моим VMPK (подключив MIDI IN к CoreMIDI и MIDI OUT к синтезатору Apple DLS). Если вам нужна альтернатива для Windows, я рекомендую virtualMIDIsynth .

После того, как вы запустите синтезатор в macOS, вам нужно выбрать нужный идентификатор устройства. Например, с этими изменениями в вашей программе:

pygame.midi.init()

#list all midi devices
for x in range( 0, pygame.midi.get_count() ):
    print(x,"=",pygame.midi.get_device_info(x))

player = pygame.midi.Output(2)
...

Я могу воспроизводить звук в моем Linux, и это вывод консоли:

0 = (b'ALSA', b'Midi Through Port-0', 0, 1, 0)
1 = (b'ALSA', b'Midi Through Port-0', 1, 0, 0)
2 = (b'ALSA', b'UM-2 MIDI 1', 0, 1, 0)          <-- here is my synth
3 = (b'ALSA', b'UM-2 MIDI 1', 1, 0, 0)
4 = (b'ALSA', b'UM-2 MIDI 2', 0, 1, 0)
5 = (b'ALSA', b'UM-2 MIDI 2', 1, 0, 0)
PLAYING
STOPPED

В Windows, когда VirtualMIDISynth работает Iможно использовать id = 2 и id = 1

C:\tmp>python3 testpygame.py
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
0 = (b'MMSystem', b'Microsoft MIDI Mapper', 0, 1, 0)
1 = (b'MMSystem', b'VirtualMIDISynth #1', 0, 1, 0)
2 = (b'MMSystem', b'Microsoft GS Wavetable Synth', 0, 1, 0)
PLAYING
STOPPED

И, наконец, в моей книге Mac, с VMPK (id = 1) и SimpleSynth (id = 2):

$ python3 testpygame.py
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
0 = (b'CoreMIDI', b'VMPK Output', 1, 0, 0)
1 = (b'CoreMIDI', b'VMPK Input', 0, 1, 0)
2 = (b'CoreMIDI', b'SimpleSynth virtual input', 0, 1, 0)
PLAYING
STOPPED
...