このページの最終更新日: 2008/10/09
2008年10月9日

とりあえず仕様が固まりました。

実は旅先にてアルゴリズムだけ別言語にて確認したものですので、ATMEGA実装時にコケるとすれば割込み実装時かも知れません。まぁその時はその時で。

概要は以下の通り。

・RX割込み発生時にコールバックを呼び出し、受信バイトをバッファに溜め込みます。
  ですので、データを受信しない間の負荷はゼロのはずです。
  (6611氏のPWMシンセとの親和性を多少考慮して)

・受信バイト列が意味を成した時点で、ユーザ定義のコールバック関数が呼び出されます。
  現在のところ対応予定のメッセージは以下の通り。それ以外は平和に無視されます。

    • Note-on
    • Note-off
    • CC
    • PGM change
    • Sysex

・ユーザ定義コールバック関数内にて、メッセージ毎に必要なデータ長を読み出すのはユーザに依存します。
例えばNote-onメッセージのコールバック関数内で、不要になるはずの3バイト目から先にはゴミが書き込まれている可能性があります。また、Sysex受信時はF0によるメッセージ終了を確認するのもユーザの仕事になります。(Sysexを使う場合は俺俺仕様で固定長メッセージに限定する方が楽かも)

・Sysexの最大受信長は255バイトです。超過した場合は、Sysex受信を継続しつつも、開始メッセージF7以降のデータがすべてクリアされます。

・Running status処理対応。
(0x90, 0x20, 0x40, 0x20, 0x00) ... 実際の入力(Note on, note off)
(0x90, 0x20, 0x40, 0x90, 0x20, 0x00) ... ユーザ側には省略されない形で表示

・軽く見積もったところ16MHzのプロセッサであれば大方問題ないと思われるが、メインの処理が相次ぐコールバックに邪魔されてちーとも進まない時の対処は今後の課題

・割込みを使用するので…多分Arduino標準のタイマーは使用できなくなるか、精度が落ちることになると思われます。ウェイトはnop等で対応願います。

2008年10月1日

ページ開設しました。DreamWeaverテンプレートの試験がてら、最初の書き込みです。