Mac Python 中的 MIDI 程序没有声音
No sound from MIDI program in Python on Mac
我一直在 Python 开发一个使用 MIDI 的程序。该程序的一部分允许用户使用 MIDI 输入设备播放一个音符并听到回放给他们的相同音符。
我之前一直在 Windows PC 上开发它并让它工作,但最近转移到 macOS 并发现我的程序现在不再播放任何声音。
以下代码旨在(用于测试目的)播放一个音符一秒钟。它不会 return 任何错误,但不会在我的 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 上做一些事情,但我不确定是什么。
如有任何帮助,我们将不胜感激!
MIDI 事件必须发送到 MIDI 合成器以转换为您可以收听的声音。 Windows 总是有可用的 MIDI 合成器(臭名昭著的 "Microsoft GS Wavetable Synth")。它是一个系统驱动程序,所以它的行为就像一个硬件合成器,虽然它不是,它是一个程序(顺便说一句,由 Roland 提供)。
在其他操作系统中情况有所不同。在 macOS 中,Apple 包含了另一个 MIDI 软件合成器,但它不是程序,它是程序必须加载和激活的库(也由 Roland 提供)。幸运的是,有几个免费程序可用,例如 SimpleSynth. You can also play with my VMPK (connecting MIDI IN to CoreMIDI and MIDI OUT to the Apple DLS synth). If you want an alternative for Windows, my recommendation is virtualMIDIsynth.
在 macOS 中启动合成器后,您需要 select 您需要的设备 ID。例如,对您的程序进行这些修改:
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 运行 我可以使用 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
我一直在 Python 开发一个使用 MIDI 的程序。该程序的一部分允许用户使用 MIDI 输入设备播放一个音符并听到回放给他们的相同音符。 我之前一直在 Windows PC 上开发它并让它工作,但最近转移到 macOS 并发现我的程序现在不再播放任何声音。
以下代码旨在(用于测试目的)播放一个音符一秒钟。它不会 return 任何错误,但不会在我的 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 上做一些事情,但我不确定是什么。
如有任何帮助,我们将不胜感激!
MIDI 事件必须发送到 MIDI 合成器以转换为您可以收听的声音。 Windows 总是有可用的 MIDI 合成器(臭名昭著的 "Microsoft GS Wavetable Synth")。它是一个系统驱动程序,所以它的行为就像一个硬件合成器,虽然它不是,它是一个程序(顺便说一句,由 Roland 提供)。
在其他操作系统中情况有所不同。在 macOS 中,Apple 包含了另一个 MIDI 软件合成器,但它不是程序,它是程序必须加载和激活的库(也由 Roland 提供)。幸运的是,有几个免费程序可用,例如 SimpleSynth. You can also play with my VMPK (connecting MIDI IN to CoreMIDI and MIDI OUT to the Apple DLS synth). If you want an alternative for Windows, my recommendation is virtualMIDIsynth.
在 macOS 中启动合成器后,您需要 select 您需要的设备 ID。例如,对您的程序进行这些修改:
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 运行 我可以使用 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