2017年1月14日土曜日

ベースマシン まとめ(弱め)

予定していたハードウェアがほぼほぼ完成したので、まとめておきます。

全体図

左側がシーケンス打ち込み、パラメータ設定用のユーザーインターフェイス。右側がベースマシンのシンセ本体です。こうやって見るとシンセ本体よりユーザーインターフェイスの占めている面積が大きくなってしまった。

最初の構成案

半年前に漠然と考えた構成案です。デジタル制御できるところはデジタル制御で、しかし音声信号はアナログ回路で、という方針は貫き通しました。

ディティールは試行錯誤の結果異なりますが、全体のつながりは構成案のままになりました。I/Oピンが足りなくて一度はUI系とシンセ系でコアとなるNucleo F401REを2枚使うように分けてみましたが、Nucleo同士のSPI通信がうまく行かず、結局1枚にまとめてI/Oエキスパンダーを使ってI/Oピンを増やしました。


Sequencer UI パネル


シーケンス打ち込み用のユーザーインターフェイスの本体です。PropellerHeadのReasonというソフト・シンセのシーケンサーをリスペクトしています。

128x64ドットの大型LCD(CH12864F-SPI)を使ってシーケンスパターンを表示するようにしました。LCDの左右のロータリーエンコーダでシーケンスのピッチとステップを指定。左側のオレンジと青のタクトスイッチで表示するオクターブを指定。

下側のタクトスイッチはNoteのOn/Off、Tie、Accentを指定します。右のタクトスイッチでシーケンスの再生/停止。

上の基板のロータリーエンコーダはBPMを指定。去年作ったリズムマシンはBPMをPOTで設定していましたが、値がふらついて設定が難しいのでデジタル的に値を決められるロータリーエンコーダにしました。

白色のタクトスイッチはDCOの波形選択。黒色のタクトスイッチはLCDの表示モード切り替えようです。

今のところ、LCDの表示モードはシーケンス打ち込み画面、パラメータの数値表示、POTの読み取り値の数値表示、の3モードにしています。(参考:「ベースマシン UIとSequencerを分離 ハードウェア接続の整理」)

「ベースマシンのシーケンサ基板を作ってみた。(http://dad8893.blogspot.jp/2016/09/blog-post.html)」
「ベースマシンのシーケンサ基板 その2(http://dad8893.blogspot.jp/2016/09/2.html)」

アナログPOTパネル


POT(可変抵抗)を並べたパネルです。パネルは1mm厚のアルミ板をトンカチで叩いて加工しました。

POTに割り当てた機能は、上の2つの「A4/RESO」と「A3/CUTOFF」はDCFのCutoffとResonance、下の5つ(PC_2のPULSE_W以外)はDCA用のエンベロープ設定用です。「PC_2/PULSE_W」はDCOのパルス幅変調用。A0~A5、PC_2、PC_3は、NucleoのPin名。

経験的にPOTの分圧値をADCで拾うと7bit精度がせいぜいなので、読み取り値は7bit(128段階)に設定して使っています。

「ベースマシン用のコントロール・パネルを作ってみた。(http://dad8893.blogspot.jp/2016/07/blog-post_29.html)」

Exioパネル


Nucleo 1枚ではI/OPinが足りなかったので、I/OエキスパンダーのMCP23S17を使ってI/Oピンを増やしました。下側のSW×8はシーケンスパターンの切り替え用、上側のスイッチ類はパターンのロード&セーブ、コピー&ペースト用です。ロータリーエンコーダはロード&セーブのスロットを選択するためのものです。

ロータリーエンコーダーとOK/Cancelのスイッチは1次的には使っていないので(LoadかSaveボタンを押さないと有効にならない)、まだ機能が増やせないかと妄想中。

永続的にパターンを記録するために、最初はSDカードを考えていましたが、SDカードをmbedで使うとややこしそうなのでI2C接続のEEPROMのAT24C1024を使いました。

「ベースマシン I/Oエクスパンダ―基板 でけた(http://dad8893.blogspot.jp/2017/01/io.html)」

Nucleo F401RE



シーケンサー本体です。mbedでプログラミングしています。
https://developer.mbed.org/users/ryood/code/BaseMachine/

PSoC4 DCO



矩形波とノコギリ波を生成するモジュール。テーブル参照ではなくて、サンプリング・タイム毎に値を生成するようにしています。

「PSoC 4 Prototyping Kit DCOでけた。(http://dad8893.blogspot.jp/2016/09/psoc-4-prototyping-kit-dco.html)」

https://github.com/ryood/PSoC4_DCO

VCVS DCF



VCVS LPFのカットオフ周波数とレゾナンス(Q値)をDigital PotのAD8403を使って制御しています。


「VCVS DCF シールドでけた(http://dad8893.blogspot.jp/2016/04/vcvs-dcf_19.html)」
https://github.com/ryood/VCVS_DCF_Shield

OTA DCA


DACのMCP4922とOTAのNJM13600を使っています。

OTAとは電流で増幅率を可変できる素子で、アナログ・シンセを作るにはとて有用な素子です。
NJM13700は秋月電子でも取扱いされるようになったので、ある程度いじくりがいがありそう。←といっても、アナログ素子なので理屈で考えてもうまくいかないところはあります。


「NJM13700 DCAの基板でけた。(http://dad8893.blogspot.jp/2016/07/njm13700-dca_28.html)」

https://github.com/ryood/NJM13700_DCA

PWR Board


電源ボードです。入力は±9V。5V出力は3端子レギュレータの7805、3.3VはLDOを使っています。


「5V/3.3V/2.5V電源 はんだ付け完了(http://dad8893.blogspot.jp/2016/12/5v33v25v_27.html)」

https://github.com/ryood/BaseMachine/tree/master/5V_3.3V_%2B-2.5V_PowerSupply


SPI Bus Buffer


シンセに回すSPI信号を補強するためのバッファ・ボードです。Nucleoから直接出力した場合と比べて、ロジックICのバッファを通すと波形が整形されるので使っています。

「SPIバス・バッファ(TC74HC541)基板の製作(http://dad8893.blogspot.jp/2016/11/spitc74hc541.html)」

https://github.com/ryood/BaseMachine/tree/master/SPI%20Bus%20Buffer


全体の配線表



ToDo:
Sequencer

1    EEPROMがSaveされていない場合、Loadするとハングする
2    Run/StopでSTEP0から再生(前回停止位置から再生と切り替えられる?)
3    シーケンス打ち込み画面でBPM表示
4    Tieした時にエンベロープもTie。Durationを引き延ばす?
5    32Step打ち込めるようにする
6    BaseMachineUIController.h Timer系のスタートのタイミングを整理
7    Exio BufferのTimer間隔を調整
8    Filterにエンベロープをかけられるようにする
9    外部信号でSync
   
DCO   
1    DCOの周波数をDDSのサンプリング値で補正できる?
2    PSoC4 DCO 三角波とノコギリ波をデューティ比で可変できるようにする。 VC++で実験済み
   
DCF   
1    SVFをデジ・ポットで実験
2    4pole VCF Feedbackを検討