与Pygame频道的复音

时间:2018-01-01 17:36:50

标签: python raspberry-pi pygame

我正在尝试使用物理按钮在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 个答案:

答案 0 :(得分:0)

当我尝试你的功能时,我会在你的睡眠声明中遇到异常:

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对象不保留有关其构造的任何信息,打印长度可能对您的调试很有用。