前提・実現したいこと
raspberry pi zeroとpythonを使っていろんな音程ののこぎり波を再生する
発生している問題・エラーメッセージ
のこぎり波の配列を用意して、pyaudioを使ってループ再生させると音が途切れたり、ぶつぶつとノイズが生じる。
該当のソースコード
Python
1import numpy as np 2import wave 3import time 4import array 5import struct 6import RPi.GPIO as GPIO 7import pyaudio 8 9max=32767 #16bitの最大値 10 11def gensaw(q):#のこぎり波の一山分を生成 12 p=2**(float(1)/12) 13 ppow=p**q 14 pitch =655.36*ppow #q=0でAの音、qが1増えるごとに半音上がる 15 val=-max 16 saw=np.array([-max]) 17 while val+pitch <= max: 18 val =val + pitch 19 intval=int(val) 20 saw=np.hstack((saw,[intval])) 21 return saw 22 23GPIO.setmode(GPIO.BOARD) 24GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP) 25GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP) 26GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP) 27GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP) #GPIOをプルアップ 28 29 30p=pyaudio.PyAudio() 31stream = p.open(format=pyaudio.paInt16,channels=1, rate=44100, output=1) 32 33ra=gensaw(0) 34do=gensaw(3) 35re=gensaw(5) 36mi=gensaw(7) 37ra2=gensaw(12) 38 39try: 40 while True: 41 if GPIO.input(11)==False: 42 stream.write(ra) 43 elif GPIO.input(13)==False: 44 stream.write(do) 45 elif GPIO.input(15)==False: 46 stream.write(re) 47 elif GPIO.input(16)==False: 48 stream.write(mi) 49 else: 50 stream.write(ra2) 51except KeyboardInterrupt: 52 print("detect key interrupt\n") 53 54stream.stop_stream() 55stream.close() 56p.terminate() 57GPIO.cleanup() 58
試したこと
配列を長めにとったり、一旦WAVに書き出しておいて、読み込んだりしても改善せず。
補足情報(FW/ツールのバージョンなど)
音の再生はGPIOピンに47μFのコンデンサを挟んでスピーカーを接続。
raspbian jessie liteを使用。
python3でnumpyを使おうとするとなぜかエラーが出てしまうのでpython2.7を使用中。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/15 03:58
2018/07/15 04:05