■自作デジタルエフェクター

■RasPd1 プログラミング編

プログラミングはかなり昔にお遊び程度にしていたレベルで、全く自信がありません。参考になるかわかりませんが、とりあえずRasPd1に入っているファイルをアップロードしておきます。(直リンクできないようなのでこちらの別ページにダウンロードリンクを載せています。)
Pythonというプログラミング言語を使っています。記事にしてみると思ったよりたいしたことはしていませんでした。エフェクトは3種類入っていますが、取り急ぎ適当に作ったものになります。



<スイッチ・LED>
Raspberry PiではGPIOピンという端子によりデジタル信号の入出力を行うことができます。スイッチやLEDの制御は比較的簡単です。こちらで丁寧に解説されています。→RaspberryPi電子工作入門

<液晶ディスプレイ>
秋月電子の超小型LCDキャラクタディスプレイを使用しています。HD44780互換ということで、下記ページのプログラムをほぼそのままモジュールとしてインポートしています。
16×2 LCD Module Control Using Python
ただし、3番ピンはGNDではなく10kΩトリマーで5Vを抵抗分圧して接続しています。トリマーを回すことでコントラスト調整ができます。

<ロータリーエンコーダ>
こちらのページのプログラムを改変して利用しました。→RaspberryPi + Python でロータリエンコーダを制御してみた
主な変更は、ロータリーエンコーダを回し始めたときにGPIO監視を開始するようにした点、速く動かしたとき値が3倍増減するようにした点です。いまいちコントロールしにくいときがあるので、まだまだ改善が必要だと思います。

<Pure Data(Pd)連携>
pdsendというコマンドを使って、ロータリーエンコーダやスイッチからPythonを介してPdへデータ送信しています。例えば「$ echo '50;' | pdsend 3010」というコマンドで、開いているPdのパッチの[netreceive 3010]オブジェクトにセミコロンが除かれた50というデータが送られます。数字データの場合は、Pdが文字ではなく数値と認識してくれるようなので、そのまま計算等に使うことができます。pdreceiveというコマンドで逆にデータ受信もできると思いますが、現状では必要なかったため試していません。

<データ保存>
起動時・終了時やエフェクト切り替え時に、各エフェクトの状態をテキストファイルに保存しています。エフェクトのパラメータはfx_pというリストデータになっています。いちいち整数と文字を切り替えなければいけないのが少し面倒でした。



ハードウェア編へ  ソフトウェア編その1へ  ソフトウェア編その2

■RasPd1 ソフトウェア編その2

Pure Data(Pd)の設定等をしていきます(太字表記はコマンド)。



<Pd設定>
Pdと外部オブジェクト(Externals)をインストールします。
$ sudo apt-get install puredata
$ sudo apt-get install pd-libdir pd-cyclone pd-unauthorized pd-ggee pd-zexy
作るエフェクトによっては、もっとたくさんの外部オブジェクトが必要となるかもしれません。

設定ファイルを作成します。
$ nano .pdsettings (新規作成)
以下の内容です。パス(path)は念のため全ての外部オブジェクトを入れています。
audioapi: 1
noaudioin: False
audioindev1: 0 2
noaudioout: False
audiooutdev1: 0 2
audiobuf: 6
rate: 44100
callback: 0
blocksize: 64
nomidiin: True
nomidiout: True
path1: /usr/lib/pd/extra
path2: /usr/lib/pd/extra/cyclone
path3: /usr/lib/pd/extra/ggee
path4: /usr/lib/pd/extra/libdir
path5: /usr/lib/pd/extra/pddp
path6: /usr/lib/pd/extra/unauthorized
path7: /usr/lib/pd/extra/zexy
npath: 7
standardpath: 1
verbose: 0
nloadlib: 0
defeatrt: 0
flags: -nogui -rt -alsa

flagsにコマンドラインオプションを入れることができます。-realtime(-rt)を入れるとPdをリアルタイム優先度で実行できますが、通常のpiユーザーでは権限が弱いためこのオプションが使えずエラーが出ます。こちらのページを参考に設定変更しています。
$ sudo nano /etc/security/limits.conf
以下の2行を追加で記載します。
* - rtprio 99
* - memlock unlimited
※「audio」ユーザーグループだけに設定してもよいのですが、面倒なので全てのユーザーで優先度を上げて実行可能にしています。

設定ファイルのaudiobufとblocksizeを少なくするほど低レイテンシーとなります。しかし少なくしすぎると処理が追いつかず波形が途切れ途切れの状態になり、ノイズが発生します。ですので波形が途切れない限界の値を探っていくことになります。レイテンシーについては別の記事にも記載しています。

-nosleepオプションを入れると「audiobuf 5 blocksize 64」が限界値で、レイテンシーは11msとなりました。しかしエフェクトを切り替えた際にハングアップしてしまうことがあるため、このオプションは入れないことにしました。その場合「audiobuf 6 blocksize 64」が限界値で、レイテンシーは14msでした。聴感上は遅延を感じませんが、複数のエフェクトを処理する場合はもっと遅くなると思われるので、現在はI2S接続のオーディオインターフェイスの使用を検討中です。

※ちなみにclass4のmicroSDカードを使ったときclass10のものよりレイテンシーが約0.7ms増加していたので、ハイスピードのmicroSDカードはわずかに効果がありそうです。



<自動起動設定>
電源を入れたときにメインプログラム(私の場合はmain.pyというPythonスクリプトファイル)が自動起動されるように設定します。
$ crontab -e
最後に追加 @reboot python /home/pi/main.py
※私はメインプログラム等の使うファイルはすべて/home/pi/フォルダに入れています。

自動起動しているプログラムを終了したいときは下記コマンドを使います。
$ killall python ; killall pd



<リアルタイムカーネル>
下記ページに載っている方法が最も簡単にリアルタイムカーネルを導入できると思われます。
Raspberry Pi 3とリアルタイムカーネル(3)[自前ビルド無し導入編(おまけ)]
しかしながらはっきりとはわかりませんが、Pdで「tried but couldn't sync A/D/A」というエラーが発生する原因になる可能性があります。また、私の環境ではレイテンシーがほとんど変わらなかったので、特に導入する必要はないと思います。

<JACK Audio Connection Kit>
いろいろなサイトでふれられているJACKですが、私はどう設定してもうまくいきません。何とか起動できてもレイテンシー24msぐらいだったため、導入をあきらめました。



ハードウェア編へ  ソフトウェア編その1へ  プログラミング編

■WM8731 設定メモ

03_180_1wm8731p.jpg
WM8731が搭載されているI2SオーディオインターフェイスMikroElektronika MIKROE-506を試してみたので、設定をメモしておきます。写真の通り、現在はLINE INも使えるようになっています。

↓参考ページ
I2SオーディオI/F WM8731をraspberry piで鳴らす
PIAiF Raspberry Pi i2s ”IN-OUT” AudioInterFace
接続は、上記PIAiFの回路図の通りで問題ありませんでした。

<Raspberry Pi 3の設定>
$ sudo nano /boot/config.txt
#dtparam=audio=on (コメントアウトしてオンボードのオーディオをオフに)
dtoverlay=rpi-proto (追加記載)

alsa-base.confファイルをすでに作っていた場合は、内容を書き換えます。
$ sudo nano /etc/modprobe.d/alsa-base.conf
options snd slots=snd_soc_rpi_proto
options snd_soc_rpi_proto index=0

再起動し、オーディオ認識を確認します。
$ aplay -l

入出力の音量は同じではありませんが、とりあえずテストしたときの設定は下記のようになります。マイク入力部コンデンサC23の値が1nFしかありませんので、LINE INを利用しました。
$ alsamixer
全て表示 F5
Master 100 [dB gain: 6.00, 6.00]
Master Playback ZC [Off, Off]
Sidetone 0 [dB gain: -15.00]
Line CAPTURE
Mic [Off]
Mic Boost 0 [dB gain: 0.00]
Mic Boost 0 [dB gain: 0.00]
Playback Deemphasis [Off] (オンにすると高域が削られる)
Capture 40 [dB gain: -6.00, -6.00]
ADC High Pass Filter オン (オフにすると高域の雑音が増える)
Input Mux [Line In]
Output Mixer HiFi オン
Output Mixer Line Bypass [Off]
Output Mixer Mic Sidetone [Off]
Store DC Offset [Off]

<Pure Dataの設定>
$ nano .pdsettings
audioindevname1とaudiooutdevname1の行は削除、下記該当箇所を変更しました。
audioindev1: 0 2
audiooutdev1: 0 2
audiobuf: 2
rate: 48000
blocksize: 32
ここまで値を小さくしても音切れはないようで、レイテンシーは5msととても優秀でした。もうUSBオーディオインターフェイスには戻れそうにありません。

■タグ : RaspberryPi

■RasPd1 ソフトウェア編その1

Pure DataやUSBオーディオを優先的に動かすため、下準備をしていきます(太字表記はコマンド)。
Raspberry Pi 3の基本設定はこちら
参考サイト(英語)→Raspberry Pi and realtime, low-latency audio



<CPU周波数スケーリング>
CPUのクロック周波数は基本600MHz動作の設定となっていますが、常に1200MHzで動作するよう設定変更します。
$ sudo apt-get install cpufrequtils(cpufrequtilsインストール)
$ sudo nano /etc/init.d/cpufrequtils
43行目あたり GOVERNOR="performance"
※オーバークロックは試していません。



<不要なプログラムを停止>
自動起動するサービスプログラムのうち、不要なものを停止します。
$ sudo apt-get install chkconfig(chkconfigインストール)
とりあえず以下を停止しましたが、現状不具合はありません。
$ sudo chkconfig motd off (ログイン時メッセージ)
$ sudo chkconfig ntp off (時刻合わせ)
$ sudo chkconfig plymouth off (起動画面)
$ sudo chkconfig dphys-swapfile off (swap)
$ sudo chkconfig triggerhappy off (キーボードショートカット)
$ sudo chkconfig avahi-daemon off (ローカルネットワーク関係?)
$ sudo chkconfig dbus off (プロセス間通信)
$ sudo chkconfig bluetooth off (Bluetooth)
再起動後、停止しているか確認します。
$ chkconfig -l
上記だけではBluetoothが停止しないらしく、削除してしまいます。
$ sudo apt-get purge pi-bluetooth
$ sudo apt-get autoremove
さらに念のため追加で停止設定をしておきます。
$ sudo nano /boot/config.txt
最後に追加 dtoverlay=pi3-disable-bt-overlay



<USBオーディオ設定>
USBオーディオをデフォルトのサウンドデバイスとするように設定します。
$ sudo nano /etc/modprobe.d/alsa-base.conf (新しく作成、以下を記載)
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

USB2.0では問題が起こる場合があるらしいので、USB1.1に変更します。また、イーサネットコントローラーのターボモードを停止することにより、USBが効率的に通信できるそうです。
$ sudo nano /boot/cmdline.txt
改行せずに追加 dwc_otg.speed=1 smsc95xx.turbo_mode=N
※参考サイトには載っていますが、イーサネットコントローラーを停止させる下記コマンドは失敗するようです。
$ echo -n “1-1.1:1.0” | sudo tee /sys/bus/usb/drivers/smsc95xx/unbind

再起動し、オーディオ認識を確認します。
$ aplay -l



<音量設定>
$ alsamixer (音量設定プログラムを起動)
F5で全表示、スペースキーかmキーで機能オン(OO)・オフ(MM)です。以下のコマンドで設定保存できます。
$ sudo alsactl store

Plugable USBオーディオ変換アダプタの場合は以下の設定で入出力がほぼ同じ音量となります。
[Speaker オン 100] [Mic オフ 0] [Mic CAPTURE 35] [Auto Gain Control オフ]
コマンドで上記と同じ設定にする場合は以下のようになります。
$ amixer controls (設定ID番号確認)
$ amixer cset numid=3 off ; amixer cset numid=4 0 ; amixer cset numid=7 on ; amixer cset numid=8 18 ; amixer cset numid=9 off ; amixer cset numid=5 on ; amixer cset numid=6 37



ハードウェア編へ  ソフトウェア編その2へ  プログラミング編

■RasPd1 ハードウェア編

03_174_1raspd1p.jpg
Raspberry Pi 3とPure Data(Pd)を使ったデジタルエフェクターを作りました。名前は適当ですが「RasPd」(ラズピーディー)です。このシリーズが続くかわかりませんが、とりあえず1号機は完成ということにしておきます。

Raspberry Pi 3を選んだのは、ウェブ上での情報が多く、GUI環境があるというのは大きなメリットだと思ったためです。結局はレイテンシー低減のためGUIなしでやることになりましたが、やってみるとなんとか慣れてくるものです。実用的な設定でのレイテンシーは14msとまずまずの値となりました。

USBオーディオインターフェイスについては、別記事に記載しています。
Raspberry Pi 用USBオーディオインターフェースの選定

Plugable USBオーディオ変換アダプタには前段にバッファーが必要となります。デジタル用USB電源5Vでそのままバッファーを動かすとノイズが大きいため、バッファー用にアナログ用電源を用意します。今回は絶縁型DC-DCコンバータで5Vを12Vに昇圧しました。絶縁型DC-DCコンバータはA.GND(アナロググラウンド)とD.GND(デジタルグラウンド)が内部で繋がっていない状態となっていて、ノイズ低減が見込めます。他には9V程度の電源からUSB用5Vに降圧させる案も考えられますが、Raspberry Pi 3に使えそうな5V・2Aの絶縁型DC-DCコンバータは手に入りにくいと思います。

▽回路図、接続図
03_174_2raspd1s.gif
電源は「USB5V電源→フィルタ→絶縁型DC-DCコンバータ→フィルター→アナログ用電源」という形になっています。スイッチング電源のフィルタにはインダクタを入れるのが普通ですが、可聴域ではあまり変わらないのと手持ちに適当なものがなかったため入れていません。消費電力が大きいオペアンプでは電圧が下がりすぎるので、フィルタの抵抗値は半分でもよいと思います。
※ずっと「キーン」というノイズに悩まされていたのですが、Raspberry Pi 3本体を新品に変えるとなくなりました。いろいろな実験をするうちにどこかが故障していたのだと思います。ですので通常はここまでノイズ対策をする必要はなさそうです。絶縁型でないDC-DCコンバータでもよいかもしれません。

USBオーディオの周辺回路が面倒な感じになっているのは、高域のプリエンファシス・デエンファシスを考えていた名残です。高域だけ増幅すると影響が出そうなエフェクト(コンプレッサー等)がある気がしたので、単に音量を増減するという形にしました。

「超小型LCDキャラクタディスプレイモジュール」「2色LED付スイッチ付ロータリーエンコーダ」(1色だけ利用)は秋月電子で販売しているものです。回路図は省略しましたが、データシートの通りチャタリング防止の抵抗やコンデンサを入れています。

▽コントロール割り当て
左スイッチ/ロータリーエンコーダ: エフェクト切替/パラメータ増減
中央スイッチ/ロータリーエンコーダ: エフェクト切替/パラメータ増減
右スイッチ/ロータリーエンコーダ: パラメータのページ切替、長押しでシャットダウン/パラメータ増減
左フットスイッチ: エフェクトオン・オフ、オン時左LED点灯
右フットスイッチ: 特殊機能(ブースト機能等)オン・オフ、オン時中央LED点灯
側面トグルスイッチ: 緊急時のバイパス用

現在はエフェクト単機能を切り替えて使用するプログラムとなっていますが、将来的には複数のエフェクトを繋いだパッチを切り替えて使用できるようにしたいと思います。そのためにはプログラミングはもちろん、スイッチやLCDも変更していく必要がありそうです。



ソフトウェア編その1へ  ソフトウェア編その2へ  プログラミング編

管理人

ブログ内検索

メールフォーム

当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

お名前
メールアドレス
件名
本文

アクセスカウンター