BBDドライバ w/ LFO
BBDドライバ w/ LFO
BBDドライバ with LFO が、机上検討ではなんとなくいけそうな気がしてきました。
きっかけはtwitterだった。
Ganさんが、
synth-diy ML にウェーブテーブルオシレータつくるぜスレッドができててすげー面白そうなんだが…no title
とツイート*1していたので見てみたところから始まる。
最近目が疲れるので英語は苦しいのだが、ざっと1分でスキミングした理解によれば、ROMに波形データ書いておいて、MIDIノートのピッチに合わせて回して読みたい、マイコンを使いたいということのようだった。クロッキングはどうするんだ?というあたりから話がそれたのか、アセンブリ言語だ、FPGAだという話にも飛んでいた。残念ながらフェーズアキュームレータでDDSという話には行かなかったようであったので、私としては追跡をやめた。
いやー、ときどき読むデータを飛ばさないと高音で苦しいでしょう。真面目に1周期分のROMテーブルを全部読み出していたら高音ではずいぶんと高速クロックになってしまう。どうしてもやりたいならマイコンからはピッチ周波数を出して1周期分のアドレス数だけPLL LSIで逓倍したクロックでカウンタ回してアドレッシングするのが無難じゃね?とか思うわけであった。
しかしこの問題は、実は、私にも無関係とは云えない。
はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど でシンセのBBDモジュールについて言及したが、そのなかでマイコンでBBDドライバをできないかという点にも触れており、コメント欄でも燃料を投下していただいていた。記事を書いた時点では 10kHz から 1MHz までをひとつのスキームでやるのは難しいという印象だった。すなわち 分周したクロックアウト のやり方と タイマで割り込んでポートをON/OFF というやり方を発振周波数によって切り替えることになるかなぁと考えていた。
が、ちょっと考えればわかることだったが、Timer1 を PCK*2で動かして CTCモードにしておけば OCR1Cの値をトップ値としてカウンタをリセットできる。PWM A/B をトグルで使えば64MHzのクロックをカウントしてパルスを出せるはず。タイマに供給する PCKの分周比 と タイマクリアのトップ値(OCR1C) と コンペア値(OCR1AまたはOCR1B)をテーブル管理して、LFOの周期でゆすりながらPWMしてやれば 10kHz~1MHz が生成できるかも。PWMの波形生成はトグルモードにしてやれば値管理も楽。しかも OC1A/OC1A_n の二相出力だし、dead timeも付けられる。これらは全部マイコン内部のハードウェアモジュールがやるのでソフト側ではLFO関連処理に集中できる、と。
とりあえずPCKの分周比とトグルモードのPWMにしてBBDドライブ用のパルスを生成するとこんな感じの周波数になりそうですよ、と。
さっそくテスト用にコードを書き始めました。
目下の問題は、LFOの周波数だけじゃなくて Depth と Manual もマイコン側で演算しないといけないね、というところ。幸いにも ATtiny48/85 は A/Dコンバータが豊富なのでピン数は足りる。ていうかぎりぎりぴったり。A/D 3本(Frequency, Depth, Manual)、CP1/CP2 (OC1A, OC1A_n)、電源、GND、RESET。8本ぴったり。
Depth と Manual の変化幅も問題で、結局 美味しい値はどうなのか、そのときクロックパルスはいくつだったらいいのか、といったあたりを探らなくてはいけません。
とりあえず手元にケースが壊れてなかばジャンクのYAMAHA PSE01シリーズ、FL-01 があるのでオシロで当たってみましょうかねぇ…