用pygame.midi播放音符

时间:2013-04-07 14:34:19

标签: python pygame midi

我正在尝试使用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 Through Port-0',0,1,0)

     

...播放

     

玩过

     

PortMidi呼叫失败...

     

PortMidi:“糟糕的指针”

     

输入ENTER ...

没有播放声音,我没有找到有关PortMidi错误的任何信息 在pygame.midi退出之后出乎意料地发生了。

你知道吗?我正在运行基于debian的linux发行版 可以帮忙。

4 个答案:

答案 0 :(得分:7)

有两个小问题。由于您没有设置音符的velocity,因此不会播放声音。尝试将其设置为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()

答案 1 :(得分: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)

答案 2 :(得分:1)

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

答案 3 :(得分:-2)

尝试导入整个pygame模块:

import pygame

import pygame.midi