Raspberry Pi(B+)でアコギ用のエフェクターを作ってみました。
いずれ、SileShareできちんとスライドを作ります。とりあえず、メモ書きですみませんが…
機能としては下記の機能を備えています。
- エフェクター
- 5Bandパライコ
- コーラス
- リバーブ
- AD/DA変換
- 32bit/48KHz
- 内部32bit浮動小数点(float型)
- Cirrus Logic WM5102(Raspberry Pi用 Cirrus Logic オーディオカード)
- エフェクトコントロール
- TouchOSC(Open Sound Controlプロトコル)使用
参考:h e x l e r . n e t - Android(Nexus13)/iOS(iPod)で動作確認
- TouchOSC(Open Sound Controlプロトコル)使用
目的
もともと、デジタルエフェクターには興味はありました。「Raspberry Pi」で作ることにした経緯は以下の通りです。
- Linuxが載っているボードで電子工作の実績が多いことである
- エフェクトコントロールは物理的ノブでは無く、スマホ等の操作にしたかった
(自分のエフェクターの使い方は、家で細かく音を作り外では絶対に触らない。
物理ノブがあると、移動時にノブが回ってしまい、いちいちセッティングし直すのもいやだった) - 持ち歩くことを考え、消費電力の観点からPi2,Pi3ではなくB+を選択
メモリ使用量を見てA+の選択も視野に入れる予定 - Raspberry Pi Zeroがリソース的や取り回ししやすさから一番であるが、入手面を考えて今回は対象から外した
ソフトウェア構成
この投稿か別投稿で図示はするつもりですが、とりあえず箇条書きで。
- ディストリビューション
Raspberian(JESSIE)を使用。NOOBSではなくdebootstrapでイメージを作成
参考:Raspbianをdebootstrapから作る - カーネル
kernekl 4.4.28(PREEMPT_RTパッチは未使用。CONFIG_PREEMPT_VOLUNTARYでconfig作成) - サウンドサーバ
JACK Audio Connection Kit
ALSAドライバ使用 - エフェクトプラグイン
LV2インターフェースでC++で作成 - OSCプロトコル制御、LV2プラグイン管理、Jackクライアント機能はC++で作成
- Jack、プロトコル制御、プラグインは"-march=armv6 -mfloat-abi=hard -mfpu=vfp"オプションでコンパイル
PureDataでの事例はありましたが、
- GUIレスで設定を含めて実現した
- PureDataでOSCプロトコルでエフェクトコントロールができるか疑問だった
要は、新しくPureDataを覚えたくなかったため、全てC++で作成しました。
性能
- JackはFrame/Period=256,Periods/Buffer=3,リアルタイムモードで実行
- レイテンシーは5ms位で演奏での遅延は感じられない
- 使用メモリは160~180MB位でA+でも行けそうな感じ
- CPU利用率は70%弱。98KHzにはしたかったが、難しそう。もう一つくらいエフェクトは乗せられるか?
これから着手する機能
- 電源断耐性向上
/var以下をOverlayFSに持っていく予定 - WIFI
手持ちのWIFIトングルが標準でドライバがないため、標準でドライバがあるWIFIトングル入手中 - 設定バックアップ
バックアップが必要なファイルはbootパーティション(FAT)へ。ファイルコピーでバックアップできるようにする。 - ハウジング
- 使用方法を含めたドキュメンt(これが一番苦手…)