python - Mac 上 Python 中的 MIDI 程序没有声音

标签 python python-3.x macos pygame midi

我一直在用 Python 开发一个使用 MIDI 的程序。该程序的一部分允许用户使用 MIDI 输入设备播放一个音符并听到回放给他们的相同音符。 我之前一直在 Windows PC 上开发它并使其运行,但最近转移到 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 上做一些事情,但我不确定是什么。

如有任何帮助,我们将不胜感激!

最佳答案

MIDI 事件必须发送到 MIDI 合成器以转换为您可以收听的声音。 Windows 总是有一个可用的 MIDI 合成器(臭名昭著的“Microsoft GS Wavetable Synth”)。它是一个系统驱动程序,因此它的行为类似于硬件合成器,尽管它不是,它是一个程序(顺便说一句,由 Roland 提供)。

在其他操作系统中情况有所不同。在 macOS 中,Apple 包含另一个 MIDI 软合成器,但它不是程序,它是程序必须加载和激活的库(也由 Roland 提供)。幸运的是,有几个免费程序可用,例如 SimpleSynth .你也可以玩我的VMPK (将 MIDI IN 连接到 CoreMIDI 并将 MIDI OUT 连接到 Apple DLS 合成器)。如果你想要 Windows 的替代品,我的建议是 virtualMIDIsynth .

在 macOS 中启动合成器后,您需要选择所需的设备 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 book 中,使用 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 - Mac 上 Python 中的 MIDI 程序没有声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58191627/

相关文章:

python - Flask:如何在 session 中存储凭据并检索它们?

python - Selenium Chrome 获取文本在 headless 模式下不起作用

java - 如何从 IntelliJ-maven 项目为 OSX 制作 dmg 文件?

html - Mac 上的@font-face 位置问题

macos - OSX 终端在没有提示的情况下从命令行关闭当前选项卡?

python - Numpy 中是否有内置/简单的 LDU 分解方法?

python - numpy.savetxt 的分隔符

python-3.x - 连接 numpy 行元素

python - 在 Python 中断言没有顺序的列表相等列表

python - 如何在 python 3 中解析 excel 文档中的文本?