ノイズジェネレータ
それほど手間取らなかったですけれども、忘れないうちにメモ
手間取らなかったのは、Electric Druid の非常に詳しい解説記事のおかげです。感謝
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++ で書くのはあまりやったことがありませんがどんな感じなりそうか見てみました。
さて、909クローンのハイハットを鳴らすにはファームウェアを書かないといけません。さっそくプログラミングに入りたいところですが、仕事で書くソフトウェアでも設計しないでいきなり書くと必ずひどい目にあいます。先に進みたくて焦りますが設計に時間を少し割いたほうが良さそうです。
下図は予定しているファームウェアの大まかな構成です。このほかに設定値の記憶など全体を統括する部分も必要になりそうですがとりあえず設計の大筋に影響は出なさそうなので後で考えることにします。図を眺めているうち、プログラムを書く前にタイマの割り当てを考える必要があることが見えてきました。
リムショット回路の製作は完了、予定に従って次はハイハットの製作です。初挑戦の PCM 音源、ここが製作の一つのヤマだと考えています。また作るのを楽しみにしていた音源でもあり、ずんずん製作を進めたいところですが、残念ながら休暇も最終日、本日中には終わりそうにもないのでここまでの作業と調べたことを記録に残します。
909クローン、ファームウェアが壊れているのかどうかはまだはっきりしていませんが、現状では動かし方がわからないのは確かです。このままアセンブラの解析をしようとするととてつもない時間がかかりそうなので自分でファームウェアを組んでしまったほうが速く先に進めそうです。ファームウェアに書かれているソフトウェアもクローンの一部なわけで、実機なしに進めるには苦労がありそうです。どうなることやら。製作に使える時間は大変に限られているので、効率よく進めないといけません。手を動かす前にちょっと見通しを立ててみます。
前回は、フラッシュメモリへプログラミングができたところまででした。その後 AVRISP mkII での書き込みも普通にできるようになりました。何だったんでしょう?使えるとなればこちらが何かと楽なので AVRISP でプログラミングしてゆくことにします。
さて、プログラミングは無事にできるようになったものの、もとのファームウェアを書き戻してもやっぱり動きません。ここで疑った問題は以下の三点:
1 と 2 の問題は簡単なテストプログラムを書いて走らせて、ちゃんと動けば潰せます。のでそこから手を付けることにしました。
前回は、スイッチボードの LED を駆動するトランジスタの買い忘れであたふたしましたが、無事に代替部品で配線を終え、スイッチ・LED ともに正常動作を確認、スイッチのうち二個、どうしても基板に載るものが見つからず(日本国内では入手できそうです)、次回日本に戻るまで代替のスイッチを使う必要があったり、指定のスペーサが長すぎて基板同士の接続がうまくゆかずスペーサの長さを変更しなくてはならなかったりと、小さな問題はありますがとりあえずここまでは概ねOKです。次は鬼門のマイクロプロセッサの動作確認です。ここが動かないと一切の音源が動きません。そして一番不具合のでやすい場所です。ちなみに使われているプロセッサは ATMega64 です。
作業はなかなか進みませんが細々とやってます。今昼にやっている仕事はどっちかというと厳しいほうで、とはいってもソフトウェアを書く仕事なので体力的にきついことはありませんが、仕事時間はかなり長く、夜10時に終わったらどっちかというと早め、ということで平日は作業時間があまりとれません。
今日は早めに上がってちょっとだけ作業時間作れました。前回電源とマイクロプロセッサの通電確認までしました。モジュールごとに動作確認しながら作りたいので、それに沿った手順で作業を進めるつもりです。