ハイハット部を作る

前回の記事で書いたように、クローンの中はタイマが必要な構成部品だらけ、それに対して ATMega64 のタイマは4つしかないので、タイマの使い方を工夫しないといけません。そこで二つ重要なタイマを定めました。一つは Timer0 を使ったマスタクロックで、このタイマをさらにソフトウェアを使って分周して他の用途にも使います。もう一つは Timer2 を使った PCM 出力カウンタです。この二つのタイマの実装まで進み、いよいよハイハットを鳴らす準備が整いました。

ファームウェアを組むにあたって、一つ方針を定めました。それは、Timer2 以外で割り込みを使わないことです。これは、PCM のクロックを乱さないようにすることがねらいではです。Timer2 では割り込みを使って正確なクロックを得る一方、他のクロックは PCM ほどタイミングに神経質になる必要がないので、割り込みを使わずに処理してゆくことにします。

まずは Timer0 の設定から。このタイマは、ベロシティー用の PWM にも使います。PWM の平滑用のフィルタの特性も見ながら、PWM の周期は 10kHz ぐらいが良さそうとあたりをつけました。プロセッサのクロックが 16MHz で、PWM の分解能は 256 です。プロセッサのクロックをそのままタイマに入れると速すぎるのでプリスケーラで 1/8 に落とすと、

16 x 1000 x 1000 / 8 / 256 = 7812.5

で、約 8 kHz、ちょっと低めですがこれで良しとします。割り込みは使いませんが、メインルーチンで Timer0 のカウンタ値を繰り返し監視して、値がオーバーフローしたら 1 クロックとします。このクロックを使って 16bit 整数をインクリメントしていってその値を分周器として使います。そうすると 7812.5 / 65536 = 0.119 Hz まで低い周波数までクロックを得ることができます。

この分周器を使って、各音源のトリガを発生する部分を組みなおしました。以下の図のように狙い通りほぼ 2ms 幅のトリガが得られました。正確には 2.048 ms = 2048 μsです。コンピュータっぽくていいです。

次は Timer2、こちらも 256 ステップのタイマです。PCM の実装上 60 kHz のクロックが欲しいのですが、プリスケーラを使わずにこのタイマを動かすと周波数は

16 x 1000 x 1000 / 256 = 62.5 x 1000 Hz

ということで、大まかにこれで良さそうです。クローンの追加仕様としてハイハットのピッチ可変があってどうするか悩ましいですが今はとりあえずほっておきます。こちらのクロックは割り込みを使って正確にタイミングを取ることにします。割り込みルーチンからテスト用のピンを割り込みごとに反転させてみて、きちんと 30 kHz が出ていることを確認しました。

さてあとの難関はは PCM 再生の部分です。非常に幸運なことに、TR-909 のオリジナルの ROM データが wav 形式で公開されているのを見つけました。これを使うことにしました。下の図がその波形です。

見てわかるように二波形が入っています。前半がオープンハイハットで、後半がクローズドハイハットです。なぜ一つのファイルなのかというと、オリジナルの TR-909 では、この波形が一個の ROM チップに入っていて、同様のアドレス構成だからです。実はこのままの構成でプログラムを組んだ方が何かと楽なことがわかってきたので、これをそのままデータに焼きこみます。しかし、データのサンプル数は 32768、32KBです。当然 RAM には乗りませんからスタティックメモリとして宣言できません。どうしよう?

色々調べたところ、AVR ではデータを直接プログラム用のフラッシュメモリに書き込んで、そこから読みだすこともできるようです。これは良い、これを使いましょう。フラッシュメモリデータについては、以下の記事が参考になりました。

https://www.avrfreaks.net/forum/tut-c-gcc-and-progmem-attribute

それと、プログラミング例として、AVR を使ったウェーブテーブルシンセサイザのソースコードを参考にさせていただきました。このプロジェクトもとっても面白そうです

https://github.com/Jacajack/usynth

さて、データをプログラムに取り込むにあたって、uint8_t のサイズ 32768 の配列は、コンパイラが「大きすぎる」とエラーを出してきます。どうするのこれ?と一瞬パニックになりましたが、32767 点に減らすとコンパイラに通ったので一点減らして先に進むことにします。なんとなく残念ですが大勢に影響はありません。

必要なあれこれを組んで、無事ハイハット部の動作を確認しました。今 PC につなぐオーディオデバイスが不調で録音できませんがなんとかしないといけません

ファームウェアのソースコードが大きくなってきたので git で管理、github に公開しました。

https://github.com/naokiiwakami/tr909-clone-firmware

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください