我正在尝试使用物理按钮在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")
,声音就不会相互影响;声音一次只播放一个。 (奖金问题:为什么会这样?)
长话短说:有没有人知道更好的复音方式?
答案 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
对象不保留有关其构造的任何信息,打印长度可能对您的调试很有用。