带有 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 通道的复音的主要内容,如果未能解决你的问题,请参考以下文章

pygame 绘制带有剪切区域的 lifebar

pygame.Color

Pygame和Numpy动画

平铺python游戏(pygame)

PyCharm 自动完成功能不适用于 pygame

Pygame幻灯片延迟异常长