■$2の格安マイコンボードBlue Pill STM32を使って、E.ギター用のデジタルディレイを作りました。
マイコンボードのスペック
ピンヘッダの取り付け方向に注意します。ピンヘッダはMCU側に取り付けます。注)こちら側にピンヘッダを付けてしまうと、もうブレッドボードには刺さらなくなります(ソケットを介せば刺さります)。
基板からはみ出ているピンはケースに接触するので短くカットします。
片面基板で作れます。Blue Pillボードとは20Pピンソケット x2で接続します。下図の様に使わないピンを抜いてからハンダ付けします。
ピンソケットは秋月、マルツなどで購入できます。
基板は2枚重ねになります。Blue Pillボードの下にも電子パーツが配置されるので、コンデンサは出来るだけ高さの低いタイプを選んで下さい。フィルムコンデンサは低背のボックス型、電解コンデンサは高さ5mmのニチコンのMWシリーズと小型の高分子ポリマーコンデンサを使いました。電源周りに使われているデカップリングコンデンサは高分子ポリマーを使って下さい。
内蔵ADCの性能
サブサンプリングとディレイタイム
ADCのサンプリングレートは40kHzですがエフェクトプログムはダウンサンプリングして20kHzで処理しています。こうゆう手法を海外のフォーラムではサブサンプリングと呼んでいたので、ここでもそう呼ぶことにします。ノーマルエフェクトとリバースディレイは1/2サブサンプリングで20kHz、アナログディレイは1/4サブサンプリングで10kHzで処理しています。サブサンプリングすると周波数特性が落ちますがディレイタイムが伸びるのでアナログディレイモードではディレイタイムが800msになります。
オーバーサンプリング
ソースコード
今回のソースコードです。これはプログラミングしない人は要らないものです。開発環境はSTM32CubeIDEです。
https://drive.google.com/open?id=1lJ0OPfYAnAXqBuVzT6HzhuQy4UOJ0Wv1
モノラル-シングルエフェクトです。ノーマルディレイ、アナログディレイ、リバースディレイのどれか1つをトグルスイッチで切り替えられます。
・最長ディレイタイム
・ノーマルモード : 425ms (周波数特性:7kHz)
・アナログモード : 800ms (周波数特性:1.5kHz)
・リバースモード : 420ms (周波数特性:7kHz)
・消費電力 DC9V 55mA
音は普通のディレイです。ノーマルモードの周波数特性が7kHz(-6db)なのでBBDやPT2399よりはクリアな音です。S/NはPT2399ディレイと同じくらいです。
このデジタルエフェクターに使用した小型のマイコンボードです。海外のホビーマイコンユーザーの間でBlue Pill(青い錠剤)と呼ばれているものです。大きさ23mm x 55mmの基板でエフェクターケース(1590B/TD6-11-3)に余裕で入ります。Aliexpressなら$2(+送料)で手に入ります。日本国内ではAmazonやaitendoで取り扱いがあります。米国ではebayで見つかります。"STM32F103C8T6"で検索します。
マイコンボードのスペック
■STMicroelectronics製STM32F103C8T6(Cortex-M3 32ビットARMマイコン)
■動作クロック 72MHz
■プログラムFlash 64k
■SRAM 20k
■ADC 12ビット 2系統
■DACなし
このMCUにはDACが内蔵されていません。そこでDual PWM DACという方法でアナログ信号を出力しています。疑似DACといったところでしょうか。2本の抵抗と1個のコンデンサでデジタル信号をアナログ信号へ変換する面白い回路です。
あと、このマイコンボードの他にプログラムを書き込む為のプログラムライターが必要になりますが、詳しくは別の記事で書いているので参照してください。プログラムライターもAliexpressでなら$2程度で入手できます。
回路図
回路図
回路はPT2399ディレイのようにアナログ回路で原音とデジタルエフェクトをミックスする構成になっています。そもそもBlue Pillマイコンは汎用のプロセッサで、信号処理に特化したDSPではありません。搭載されているADCは解像度が12ビットしなかく、流石に原音までサンプリングして出力するのは無理があります。そこでエフェクト音だけデジタル処理にして、アナログ回路で原音とミックスすることで性能不足を補っています。
リバースディレイはPT2399と差別化するという狙いで付けましたが、最長ディレイタイムが400ms程度では短すぎるかもしれません。タップテンポやメモリー機能なども付けられますが、それは今後の課題になります。
パーツレイアウト
※トグルスイッチはON-ON-ON(3ポジション)タイプを使います。ショートハンドルタイプはギャレットオーディオにあります。ハンドルが長いタイプは秋月に置いてあります。
パーツレイアウト
※トグルスイッチはON-ON-ON(3ポジション)タイプを使います。ショートハンドルタイプはギャレットオーディオにあります。ハンドルが長いタイプは秋月に置いてあります。
プリント基板(pdf)
ピンヘッダの取り付け方向に注意します。ピンヘッダはMCU側に取り付けます。注)こちら側にピンヘッダを付けてしまうと、もうブレッドボードには刺さらなくなります(ソケットを介せば刺さります)。
基板からはみ出ているピンはケースに接触するので短くカットします。
片面基板で作れます。Blue Pillボードとは20Pピンソケット x2で接続します。下図の様に使わないピンを抜いてからハンダ付けします。
ピンソケットは秋月、マルツなどで購入できます。
基板は2枚重ねになります。Blue Pillボードの下にも電子パーツが配置されるので、コンデンサは出来るだけ高さの低いタイプを選んで下さい。フィルムコンデンサは低背のボックス型、電解コンデンサは高さ5mmのニチコンのMWシリーズと小型の高分子ポリマーコンデンサを使いました。電源周りに使われているデカップリングコンデンサは高分子ポリマーを使って下さい。
サンプリングレート周波数の確認
マイコンボードのPC13ピンはサンプリングレートと同じ周波数(約40KHz)でオンオフしています。PC13ピンはボード上のユーザーLEDに繋がっているのでユーザーLEDが点灯している状態が正常に動作している状態になります。40kHzですから点滅を目で確認することはできません。もしオシロスコープまたは周波数カウンターがあればPC13ピンの周波数を確認してみてください。内蔵ADCの性能
汎用ADCの限界というかS/Nは余り良くありません。S/Nを稼ぐためにクリップしない程度で出来るだけ高いレベルの信号を入れてください。小さな入力信号で使うとS/Nが極端に悪くなります。いわゆる「LSBの低い所で使うのは良くない」というヤツです。例えば古いデジタルエフェクターって必ず入力にゲインコントロールが付いていましたよね?(知らない?orz)。今のオーディオコーデックはメチャクチャS/Nが良いので、もう入力ゲインコントロールとかは必要なくなってしまいましたけど、S/Nの良くないマシンは入力レベルに気を使わないといけません。クリーンサウンドで使う際は、E.ギターを直接入力するのは良くありません。ブースターなどで信号レベルを上げてから入力するのがベターです。コンプレッサー/リミッターを掛ければ更に良いです。
ディレイタイムとサンプリングレート
メモリとディレイタイムの関係はサンプリングレートが20kHzで、1サンプルのデータサイズが2バイト(16ビット)とすると
17000バイト ÷ 2バイト ÷ 20000Hz = 0.425(秒)
ディレイタイムが425msと短かいのは内蔵SRAMが20kバイトしかない為です。約17kバイトをディレイメモリとして使っています。モードによってディレイタイムが微妙に異なるのはプログラムによってメモリの使用量が異なる所為で、できるだけディレイタイムを稼ぐために細かく調節した結果です。
サンプリングレートが20kHzなので周波数特性は10kHzですが、LPFのカットオフを少し低目の7kHz(-6db)にしてるので少し籠った感があります。最初は10kHzでアクティブフィルタを入れていたのですが、何度も作り直しているウチに面倒臭くなってきて簡単なRCフィルタへ変更しました。パッシブのLPFだけでもそんなに悪くなかったので、これでヨシとしました。
サブサンプリングとディレイタイム
ADCのサンプリングレートは40kHzですがエフェクトプログムはダウンサンプリングして20kHzで処理しています。こうゆう手法を海外のフォーラムではサブサンプリングと呼んでいたので、ここでもそう呼ぶことにします。ノーマルエフェクトとリバースディレイは1/2サブサンプリングで20kHz、アナログディレイは1/4サブサンプリングで10kHzで処理しています。サブサンプリングすると周波数特性が落ちますがディレイタイムが伸びるのでアナログディレイモードではディレイタイムが800msになります。
オーバーサンプリング
ADCのサンプリングレートは40kHzですが、ADCのS/Nを稼ぐためにオーバークロックして50倍オーバーサンプリングを行っています。実際のADCサンプリングレートは2MHzです。CubeMXの設定でADC駆動用タイマーが2MHzになっているのが分かると思います。
残念なことにSTM32F103のADCはサンプリングレートの上限が1MHzまでしかありません。そこで無理矢理ADCクロックを上げてADCサンプリングレートを引き上げています。これは完全なオーバースペックなので、CubeMXでコードを生成する度に警告が出ます。元が12ビットのADCですから、そこまでやらないとノイズが凄いです。それでもPT2399と同程度のS/Nしかありませんが。
残念なことにSTM32F103のADCはサンプリングレートの上限が1MHzまでしかありません。そこで無理矢理ADCクロックを上げてADCサンプリングレートを引き上げています。これは完全なオーバースペックなので、CubeMXでコードを生成する度に警告が出ます。元が12ビットのADCですから、そこまでやらないとノイズが凄いです。それでもPT2399と同程度のS/Nしかありませんが。
疑似DAC
疑似DACはキャリアがシステムクロック72MHz÷256=281.25kHzなので思ったほど悪い音ではありません。出力をオシロスコープで見ると僅かに281kHzのノイズが出ていますが、人間の耳には聞こえないので大丈夫でしょう。
今回のソースコードです。これはプログラミングしない人は要らないものです。開発環境はSTM32CubeIDEです。
次はBlue Pillでディレイ・エフェクトの外部コントローラーを作る予定です。
コメント
コメントを投稿