Top - 資料 - 自作ライブラリ - 創作物 - 日記 - さくいん - 著者
とりあえず仕様が固まりました。
実は旅先にてアルゴリズムだけ別言語にて確認したものですので、ATMEGA実装時にコケるとすれば割込み実装時かも知れません。まぁその時はその時で。
概要は以下の通り。
・RX割込み発生時にコールバックを呼び出し、受信バイトをバッファに溜め込みます。
ですので、データを受信しない間の負荷はゼロのはずです。
(6611氏のPWMシンセとの親和性を多少考慮して)
・受信バイト列が意味を成した時点で、ユーザ定義のコールバック関数が呼び出されます。
現在のところ対応予定のメッセージは以下の通り。それ以外は平和に無視されます。
・ユーザ定義コールバック関数内にて、メッセージ毎に必要なデータ長を読み出すのはユーザに依存します。
例えば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等で対応願います。
ページ開設しました。DreamWeaverテンプレートの試験がてら、最初の書き込みです。