11

我正在尝试使用 pygame.midi 模块播放声音。这是我使用的代码:

#!/usr/bin/env python

import pygame.midi
import time

pygame.midi.init()

print pygame.midi.get_default_output_id()
print pygame.midi.get_device_info(0)

player = pygame.midi.Output(0)

player.set_instrument(0)

print 'Playing...'

player.note_on(64)
time.sleep(1)
player.note_off(64)

print 'Played'

pygame.midi.quit()

我在搜索示例时发现了类似的代码,这是输出:

0

('ALSA', 'Midi 通过端口 0', 0, 1, 0)

玩...

玩过

PortMidi 调用失败...

PortMidi:`错误的指针'

输入回车...

没有声音播放,我也没有找到任何关于 pygame.midi 退出后意外发生的 PortMidi 错误的信息。

你有什么主意吗?如果有帮助的话,我正在运行一个基于 debian 的 linux 发行版。

4

4 回答 4

12

有两个小问题。声音不会播放,因为您没有设置音符的力度。尝试将其设置为 127(最大)以听到声音。另一个问题是您在退出之前没有在最后删除 midi 输出对象。这会导致最后出现“PortMidi: `Bad pointer'”错误。所以这里是应该正常工作的更正代码:

import pygame.midi
import time

pygame.midi.init()
player = pygame.midi.Output(0)
player.set_instrument(0)
player.note_on(64, 127)
time.sleep(1)
player.note_off(64, 127)
del player
pygame.midi.quit()
于 2014-07-31T18:44:10.803 回答
6

感谢您的代码,帮助我从 midi 和 python 开始。

在我看来,您忘记了 note_on、note_off 事件中的速度(某种音量)信息。默认值为 0,因此音符会“播放”,但听不到。

关于您收到的退出错误消息...我无能为力,我不了解 Linux 和 ALSA。作为参考,这在使用默认 midi 映射器的 Win Vista 框中对我来说效果很好。这只是使用基本音符和大和弦结构演奏一个音符、琶音或和弦。

import pygame
import time
import pygame.midi

pygame.midi.init()
player= pygame.midi.Output(0)
player.set_instrument(48,1)

major=[0,4,7,12]

def go(note):
    player.note_on(note, 127,1)
    time.sleep(1)
    player.note_off(note,127,1)

def arp(base,ints):
    for n in ints:
        go(base+n)

def chord(base, ints):
    player.note_on(base,127,1)
    player.note_on(base+ints[1],127,1)
    player.note_on(base+ints[2],127,1)
    player.note_on(base+ints[3],127,1)
    time.sleep(1)
    player.note_off(base,127,1)
    player.note_off(base+ints[1],127,1)
    player.note_off(base+ints[2],127,1)
    player.note_off(base+ints[3],127,1)
def end():
       pygame.quit()

要使用它,只需导入模块,例如,键入 go(60)、chord (60, major) 或 arp(60, major) 之类的命令

于 2013-04-09T21:44:16.647 回答
4

错误消息显示您的输出设备是“通过端口的 MIDI”——它不能自己发出声音。您必须将它(例如使用 qjackctl 或任何其他让您连接 ALSA MIDI 端口的工具)连接到像 qsynth 这样的软件合成器。

于 2015-08-06T12:26:09.397 回答
-3

尝试导入整个 pygame 模块:

import pygame

不是

import pygame.midi
于 2013-04-07T16:55:14.147 回答