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

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

■Raspberry Pi 用USBオーディオインターフェースの選定

Raspberry Piはマイク入力がないため、別途USBオーディオインターフェースが必要となります。とりあえず試した3種類を紹介しておきます。

Creative Sound Blaster Play!
たまたま手持ちにあったもので、現在は後継機種が出ています。
・分解されている方の記事→USB DAC を分解
C-Media CM119というICチップが使われています。Raspberry Piに挿すだけで認識し、録音・再生ができます。しかしPure Dataでは「tried but couldn't sync A/D/A」というエラーが数分に一度発生し、一瞬だけノイズが出ます。いろいろ設定を変えましたがこのエラーは消えないため、別のものを試すことにしました。

Plugable USB オーディオ変換アダプタ
03_176_1usbp.jpg
接着剤で固めてあるため、分解すると元に戻せません。USB端子側のプラスチック部分を壊す方が楽だと思います。
こちらはC-Media HS100BというICチップとなっています。これも認識は問題ありませんが、Pure Dataで上記と同じエラーが発生します。市販されている安価なUSBオーディオインターフェースはおそらくC-MediaのICを使っているでしょうから、別のものを買っても同じエラーになりそうです。エラー時のノイズは一瞬でほとんど気づかないため、やむを得ずこれを使っていくことにします。※現在はエラーは出ていません(追記参照)。

周波数特性を測定してみると、低域がかなり削られています。たぶん入力のコンデンサの容量が少ないのだろうと思い入力から辿っていくと、コンデンサC12が怪しいとわかりました。これに10μFの積層セラミックコンデンサを並列に追加すると特性が改善しました(1μFのフィルムコンデンサ等でも大丈夫だと思います)。
03_176_2usbpp.jpg
入力インピーダンスが低いため、ギターを繋ぐ場合は前段にバッファーが必要となります。バッファー等に関しては別に記事を書く予定です。

BEHRINGER GUITAR LINK UCG102
03_176_3usbu.jpg
だいぶ前に買ったのですが、現在は値上がりしているようです。Texas Instruments PCM2902というICチップが使われています。少し基板が大きいので採用保留としました。軽くテストしかしていませんが、これもたまにPure Dataのエラーが出ます。ただバッファーが不要なのは楽なので、今後こちらに変更するかもしれません。

---以下2017年4月17日追記---

「tried but couldn't sync A/D/A」というエラーは下記サイトを見て導入したリアルタイムカーネル(もしくは、cmdline.txtの設定項目)が原因かもしれません。導入せずにセットアップすると、今のところエラーは発生していません。特にレイテンシーも変わらないため、導入しない方がよさそうです。
・リアルタイムカーネル導入参考ページ→Raspberry Pi 3とリアルタイムカーネル(3)[自前ビルド無し導入編(おまけ)]
コメント欄に「I2Sのサウンドデバイスでレイテンシーが抑えられる」という記載もあるので、今後の検討課題です。

■USB接続ミニマイク
03_176_4usbm.jpg
分解しただけですが、一応おまけで紹介しておきます。ICを覆う黒い樹脂は取り除けませんでしたが、lsusbコマンドで確認するとC-Media CM108と認識していました。

■タグ : RaspberryPi

■レイテンシーの測定

通常デジタルエフェクターでは、音声処理にかかる時間の分遅延(レイテンシー)が発生します。0.01秒(10ms)以下だとリアルタイム処理と言っていいレベルのようです。なかなかレイテンシーが記載されている記事がありません。買ったはいいものの遅延がひどいというのは避けたいものです。
レイテンシー比較参考ページ

Pure Dataでレイテンシーを測定する場合はPd\doc\7.stuff\tools\latency.pdのパッチを使うことができます。しかしながらこのパッチで測定した場合、聴感より大きい値になっている気がしたため、別の方法で測定してみました。

図にするまでもありませんが、下図のように直接繋いだ音(Lch)と機器を通した音(Rch)を録音し比較するというものです。
03_175_1latep.gif

録音したファイルを拡大して見てみると、下図のようにRchの音が遅れます。(音量レベルは特に合わせていません。)
03_175_2lateg.gif
そしてlatency.pdでの測定結果と比べましたが、同じ遅延時間となりました。結局このパッチでレイテンシーを測定して問題ないと思われます。
こちらのサイトでも考察されています→139 not found

Pure Dataの設定を無理に低レイテンシーにすると、出力される音が途切れて雑音が発生します。現在私が製作中のRaspberryPi3エフェクターでは、Delay 5・Block size 64の設定までは雑音が出ず、実際のレイテンシーは12msでした。しかしながら、どの程度重い処理まで可能なのかは未知数です。※後日測定しなおすと、11msでした。

ちなみにZOOM MS-50Gのレイテンシーもついでに測定してみましたが、6個エフェクトをかけても1ms程度でした。本当にメーカーの技術力には圧倒されます……

管理人

ブログ内検索

メールフォーム

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

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

アクセスカウンター