2013-12-22 126 views
2

我有一個相當特殊的問題,似乎在通過谷歌拖網很長時間後。我正在使用sparkfun單體鍵盤,arduino和覆盆子pi構建音頻採樣器。這個概念是使用arduino來監聽一個按鍵,發送一個字符來標識串口上的按鍵到樹莓派,並且有一個python腳本正在聽串行端口準備按鍵播放樣本。我已經到了可以在按鍵上播放音頻樣本的地步,但樣本只能在與樣本對齊的按鍵上播放:例如,我可以每1秒鐘有一次按鍵,但仍然只有樣本只播放一次一秒。我實際上需要一個設置,使我可以像印刷機註冊一樣快速地播放樣本(我已通過監控TX led以及串行端口來驗證這些內容與播放樣本不對應)。我的腳本如下的又非常簡單,只配置爲測試目的發揮兩個聲音:Python音頻採樣器

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() 

回答

0

如果我正確地讀你的問題,你想要的,例如,testsound1.wav到每次重新啓動用戶按下0鍵。根據pygame.mixer.Channel的文檔:

如果頻道正在播放任何其他聲音,則將停止播放 。

這使我懷疑,如果你問它Pygame的代碼檢查,發揮相同聲通道上,而忽略了請求。

也許解決方案是爲調用play()方法之前調用通道對象的stop()方法非常簡單:

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

這是我完全沒有想到的......我給它是一個嘗試,並讓你張貼,但這可能是我正在尋找的答案 –

+0

你發現這是否是解決方案,如果是的話,你能標記答案嗎? – 2014-05-09 13:16:21