我正在尝试使用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发行版 可以帮忙。答案 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