【问题标题】:Polyphony with Pygame channels带有 Pygame 通道的复音
【发布时间】: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"),声音就不会相互播放;声音一次只会播放一个。 (额外问题:为什么会这样?

长话短说:有人知道实现复音的更好方法吗?

【问题讨论】:

    标签: python raspberry-pi pygame


    【解决方案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),非常感谢您的回答。我可能会实施您的大部分/所有建议,我将报告代码修订
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2021-06-08
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多