909 の製作はハードウェア部分はほぼ終わり、ファームウェア書きが中心になってきました。ソースコードは GitHub に上げていて文章で書くことがだんだんなくなってきて、ブログ記事の間が広がってまいりました。その中で、シーケンサの基本構造とそこへリズムパタンを打ち込む部分はソースコードを読むだけではわかりにくい、自分でも忘れてしまうかもしれないので大枠を記事にしておきます。
シーケンサの基本構造
ドラム一個に対してトリガとアクセントの2トラックを割り当てます。アクセントは ON 時にはベロシティー 127、OFF 時には 63 を割り当てます。音源はもっときめ細かにレベルを決められますがそれをするとファームウェアのメモリを使い切ってしまうのでここは割り切ります。細かなレベル制御が必要な場合は MIDI を介して PC によって制御します。全体で 6 ドラムあるので必要なトラックは 12 本、これらのトラックを保持するためメモリ上にビットマップを持つ必要があります。ビットマップは四分音符を24分割して、以下のようにトラックバイトに MSB から割り当ててゆきます。

このリズムパタンの割り当て方針を使って、シーケンサの仕組みは以下のようになっています。再生は、クロックを 1/24 のテンポで与え、各クロックごとにパタンとアクセントをチェックして、ON になっていれば各楽器にトリガを送ります。

リズムパタンの打ち込みは、本体のボタン数が少ないので、MIDI 信号を流し込んで行います。この場合、クロックは MIDI クロックを使います。MIDI はシリアル通信ですから、Note ON メッセージが到着する時刻はクロックの時刻と一致していないので、パタンの読み取りには少し工夫が必要です。今回は以下のような仕組みにしました

各ドラムごとにタイムスタンプを格納する変数を用意し、NOTE ON メッセージが来るたびにそのタイムスタンプを変数に格納しておきます。クロックが到着してから 1/2 クロック時間から 1 クロック経過するうちに、前のクロックの前後のタイムスタンプ区間をチェックして、変数に格納されているタイムスタンプが区間に収まる場合パタンを ON にします。
詳細はコードで