带有 Pygame 通道的复音
Posted
技术标签:
【中文标题】带有 Pygame 通道的复音【英文标题】:Polyphony with Pygame channels 【发布时间】:2018-01-01 17:36:49 【问题描述】:我正在尝试使用物理按钮在 Raspberry Pi 3 上触发 Python 中的音频样本。这个想法是,当我按下按钮时,会播放声音。我一直在使用 Pygame 库的通道来实现(或至少模仿)复音。
我一直在尝试实现的代码如下:(source)
def PlaySound(sound):
nextAvailableChannel = mixer.find_channel(True)
if nextAvailableChannel != None and nextAvailableChannel.get_busy() == False:
nextAvailableChannel.play(sound)
我的完整脚本如下:
#Import functions
import pygame.mixer as mixer
import RPi.GPIO as GPIO
from time import sleep
#Initialize mixer
mixer.init(48000, -16, 16, 1024)
#Pin setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#Create sound objects
bass = mixer.Sound('/home/pi/Desktop/Sounds/bass.wav')
snare = mixer.Sound('/home/pi/Desktop/Sounds/snare.wav')
hat = mixer.Sound('/home/pi/Desktop/Sounds/hihat.wav')
#Defining the channel-picking function
def PlaySound(sound):
nextAvailableChannel = mixer.find_channel(True)
if nextAvailableChannel != None and nextAvailableChannel.get_busy() == False:
nextAvailableChannel.play(sound)
print(sound, "button pressed")
sleep(sound / 10)
#Sounds are GO!
while True:
if GPIO.input(12) == False:
PlaySound(snare)
if GPIO.input(16) == False:
PlaySound(bass)
if GPIO.input(1) == False:
PlaySound(hat)
奇怪的是,没有print(sound, "button pressed")
,声音就不会相互播放;声音一次只会播放一个。 (额外问题:为什么会这样?)
长话短说:有人知道实现复音的更好方法吗?
【问题讨论】:
【参考方案1】:当我尝试你的函数时,我在你的 sleep 语句中遇到了一个异常:
TypeError: unsupported operand type(s) for /: 'Sound' and 'int'
您想用sleep(sound / 10)
完成什么?如果您删除它,您的功能应该可以工作。也许你打算睡十分之一的声音长度,那就是:
sleep(sound.get_length() / 10)
如果您尝试实现某种去抖动功能,请参阅here 获取软件示例,或查看here 获取硬件示例。
好的,看看上面链接的 github 项目,他们使用 sleep(.3)
作为简单的去抖动,所以这应该足以满足您的目的。
而且你的打印语句并没有真正显示出任何有趣的东西:
<Sound object at 0x00515BC0> button pressed
mixer.Sound
对象不保留有关其构造的任何信息,打印长度可能对您的调试有用。
【讨论】:
啊,sleep(sound / 10)
是拼写错误或复制错误,我的实际脚本为sleep(sound.get_length / 10)
,非常感谢您的回答。我可能会实施您的大部分/所有建议,我将报告代码修订以上是关于带有 Pygame 通道的复音的主要内容,如果未能解决你的问题,请参考以下文章