Python音频采样器

时间:2013-12-22 06:22:07

标签: python audio sampling

在谷歌搜索了很长一段时间之后,我看起来有一个相当独特的问题。我正在使用sparkfun monome键盘,arduino和raspberry pi构建音频采样器。这个概念是使用arduino来监听一个按键,将一个标识密钥的字符发送到覆盆子pi,并有一个python脚本监听串口准备在按键上播放样本。我已经达到了可以在按键上播放音频样本的程度,但样本只能在与样本对齐的按键上播放:例如,我可以每1秒钟按一次按键,但仍然只有一次播放样本一秒。我实际上想要一个允许我像按下寄存器那样快速播放样本的设置(我已经验证过这与通过监视TX led和串口的样本的播放不对应)。我的脚本非常简单,并且只有两个声音被配置为用于测试目的:

import serial
import pygame

pygame.mixer.init(22050, -16, 1, 1024)

sndA = pygame.mixer.Sound('testSound1.wav')
sndB = pygame.mixer.Sound('testSound2.wav')

soundChannelA = pygame.mixer.Channel(1)
soundChannelB = pygame.mixer.Channel(2)

ser = serial.Serial('/dev/ttyAMC0', 9600)

while True:
    try:
        if '0' in ser.readline():
            soundChannelA.play(sndA)
        if '1' in ser.readline():
            soundChannelB.play(sndB)

    except KeyboardInterrupt:
        exit()

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了您的问题,您希望每次用户按下0键时,testsound1.wav都会重新启动。根据{{​​3}}的文档:

  

如果频道正在播放任何其他声音,那么它将是   停止。

这让我想知道pygame代码是否会检查你是否要求它在频道上播放相同的声音并忽略该请求。

也许解决方案就像在调用play()方法之前调用Channel对象的stop()方法一样简单:

if '0' in ser.readline():
    soundChannelA.stop()
    soundChannelA.play(sndA)
if '1' in ser.readline():
    soundChannelB.stop()
    soundChannelB.play(sndB)