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