バスドラム・部品の差し替え・スネアドラム

TR-909 クローン、製作が進みだんだんコツをつかんできてあまりつっかえるところがなくなってきました。できれば一月中にハードウェアの組み立てを終わってしまいたいのでブログに記録を残すのを端折って製作作業を急いでいました。スネアドラムまで組み終わったので忘れないうちにやったことをざっと記録しておきます。

トランジスタの選別

ファームウェア側の二つの気がかりだった PCM とノイズジェネレータのめどが立ったので、アナログ回路の組み立てをどんどん進めようと思います。組み進める前に、アナログ回路側の気がかり、トランジスタの選別に手を付けました。組…

AVR のファームウェアを C++ で書くのはどう?

TR-909 クローンのファームウェア、あまり深く考えずに C で書き始めましたけど、どうもちょいちょい「これは、C++ のほうがよくない?」という場面にあたります。

例えばこんなところ

void TriggerRimShot(int8_t velocity) {
  SET_BIT(PORT_TRIG_RIM_SHOT, BIT_TRIG_RIM_SHOT);
  SET_BIT(PORT_LED_RIM_SHOT, BIT_LED_RIM_SHOT);
  g_rim_shot.status = 255;
}

この関数にはこんなマクロが参照されています

#define SET_BIT(port, bit) (port) |= _BV(bit)
#define PORT_TRIG_RIM_SHOT PORTD
#define BIT_TRIG_RIM_SHOT  PD0

なんというか。マクロだらけです。けっこう危ないコードだしメンテも大変そうです。他にもこんなところ

void CheckSwitches(uint8_t prev_switches, uint8_t new_switches) {
  if ((prev_switches ^ new_switches) == 0) {
    return;
  }
  if (IS_RIM_SHOT_ON(new_switches)) {
    TriggerRimShort(127);
  }
  if (IS_OPEN_HI_HAT_ON(new_switches)) {
    TriggerOpenHiHat(127);
  }
  if (IS_CLOSED_HI_HAT_ON(new_switches)) {
    TriggerClosedHiHat(127);
  }
}

スイッチが押されるのを検知する関数ですが、マクロを使うわ微妙に違う似たようなパタンの繰り返しになるわ。実行速度を考えるとループを回したり関数ポインタを使った汎用ルーチンを使ったりは避けたいですけど、すぐにメンテが大変なことになりそうです。これ、テンプレートが使えないかな?

てな風に、C++ で書いた方がいいんじゃね?感がどんどん増してきました。8bit プロセッサのコードを C++ で書くのはあまりやったことがありませんがどんな感じなりそうか見てみました。

ハイハット部を作る

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

ファームウェアの大まかな構成を決める

さて、909クローンのハイハットを鳴らすにはファームウェアを書かないといけません。さっそくプログラミングに入りたいところですが、仕事で書くソフトウェアでも設計しないでいきなり書くと必ずひどい目にあいます。先に進みたくて焦りますが設計に時間を少し割いたほうが良さそうです。

下図は予定しているファームウェアの大まかな構成です。このほかに設定値の記憶など全体を統括する部分も必要になりそうですがとりあえず設計の大筋に影響は出なさそうなので後で考えることにします。図を眺めているうち、プログラムを書く前にタイマの割り当てを考える必要があることが見えてきました。

ハイハット部の作業開始

リムショット回路の製作は完了、予定に従って次はハイハットの製作です。初挑戦の PCM 音源、ここが製作の一つのヤマだと考えています。また作るのを楽しみにしていた音源でもあり、ずんずん製作を進めたいところですが、残念ながら休暇も最終日、本日中には終わりそうにもないのでここまでの作業と調べたことを記録に残します。