■タグ「PureData」

■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へ  プログラミング編

■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(よくある質問)もお読みください。

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

アクセスカウンター