You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用pygame.midi播放MIDI音符触发Segmentation Fault问题求助

解决pygame.midi播放音符时的Segmentation Fault错误

你遇到的这个段错误,大概率是因为指定了无效的MIDI输出设备ID导致的——直接用0不一定对应系统里可用的输出设备,底层代码访问无效内存就会触发崩溃。下面是几个针对性的解决步骤:

1. 先找到正确的MIDI输出设备ID

首先运行这段代码,列出系统里所有MIDI设备,筛选出支持输出的设备:

import pygame.midi

pygame.midi.init()
for device_id in range(pygame.midi.get_count()):
    info = pygame.midi.get_device_info(device_id)
    # 设备信息元组的第3个元素为1,表示是输出设备
    is_output = info[2] == 1
    device_name = info[1].decode('utf-8')
    print(f"设备ID: {device_id} | 名称: {device_name} | 是否输出设备: {is_output}")
pygame.midi.quit()

从输出里挑出是否输出设备True的ID,替换你代码里pygame.midi.Output(0)中的0即可。

2. 确保系统有可用的MIDI输出设备

如果上面的代码没找到任何输出设备,你需要先配置系统的MIDI输出:

  • Windows:检查是否启用了「Microsoft GS Wavetable Synth」,在声音设置的MIDI选项里可以找到;若没有,安装虚拟MIDI设备(比如LoopBe1)。
  • Linux:安装timidity提供MIDI合成支持,终端运行sudo apt install timidity
  • macOS:系统自带CoreMIDI,一般默认有输出设备,若缺失可安装虚拟MIDI工具。

3. 优化代码的资源释放逻辑

资源未正确释放也可能引发崩溃,建议用try-finally确保player被销毁后再退出pygame.midi:

import pygame
import pygame.midi
import time

pygame.midi.init()
player = None
try:
    # 替换成你找到的正确设备ID
    player = pygame.midi.Output(1)
    player.set_instrument(42)
    player.note_on(60, 127)
    time.sleep(3)
    player.note_off(60, 127)
finally:
    if player is not None:
        del player  # 必须先销毁player再执行quit
    pygame.midi.quit()

4. 更新或重新安装pygame

如果以上方法都无效,可能是pygame版本与系统不兼容,尝试升级或重装:

pip install --upgrade pygame

注意如果用了虚拟环境,要先激活环境再执行这条命令。

内容的提问来源于stack exchange,提问作者Peter-Andre

火山引擎 最新活动