質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2084閲覧

raspberry pi zeroでのこぎり波を再生したい

Pyryota

総合スコア4

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/14 16:28

前提・実現したいこと

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を使用中。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

他のPCなどで作ったWAVファイルを再生してもダメ、ということでしょうか。
そうなら、まずはそれをまともにできるようにするのが先決でしょうね

他で作ったWAVはちゃんと再生できる、というなら、あなたの組んだ波形生成のコードにバグが有るということなので、それをどうにかしましょう

投稿2018/07/14 23:59

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Pyryota

2018/07/15 03:58

ご回答ありがとうございます。上記プログラムでは波形をごく短いスパンで生成してそれをリピート再生させています。リピートしたものをWAVに吐き出して、PCで再生するときれいな波形になっていますが、pyaudioでラズパイ上で再生するとノイズが入ってきます。 ラズパイ上でリアルタイム処理を加えていく予定なので、短い配列をリピート再生させたときに、異常がないようにしたいのです。
y_waiwai

2018/07/15 04:05

他のPCで再生してきれいな波形になるということは、そのコードは正常に動作している、ということなので、 まずは、OSやらpython環境をチューニングして、そのWAVを正常に再生できることを目指しましょう それができなければどう逆立ちしても無理、ということになろうかと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問