「さん、ハイッ」ペダル
https://pds.exblog.jp/pds/1/200507/11/77/a0011077_7395778.jpghttp://pds.exblog.jp/pds/1/200506/27/77/a0011077_7533128.jpg
Ployetc の 34one というツールを見て、これは、ようはタップテンポを生成するペダルなのだけれど、見つけた当時、ワンチップマイコンでMIDIをハンドリングするプロジェクトを手掛けようとしていたこともあって、その仕様を参考にして自作に至ったものです。日本語で言えば、「さん、ハイッ」と言って歌を始めるがごとく、三拍目と四拍目でペダルを踏むと次の小節の一拍目からMIDIのリアルタイムメッセージが出てくるというものを目指しました。
仕様
テンポは 30bpm~300bpm ぐらいに対応
3拍目と4拍目にあたるタイミングでペダルを踏むと、その間を時間計測し、
4.5拍目からMIDI タイミング・クロック F8が出力され
次の拍の直前にスタート FA が出力される
既にタイミング・クロックが出力されている状態にあっても、3, 4拍と踏めば新しいテンポに変わる
3拍目を踏んだ後、一定時間経っても4拍目が踏まれないときは初期状態に戻る
LEDは、初期状態は無灯火、時間計測中はオレンジ色、クロック出力中はテンポにあわせて緑点滅
http://pds.exblog.jp/pds/1/200506/15/77/a0011077_22351840.gif
動作説明用
状態遷移図を描いてみた。チャタリング取りの状態も含めているので状態が多めとなっている。
https://pds.exblog.jp/pds/1/200506/21/77/a0011077_1431840.gif
用語の説明
IDLE
初期状態
TRANS3
状態THREEへの遷移途中状態
THREE
3拍目が確定している状態
TRANS4
状態FOUR1への遷移途中状態
FOUR1
4拍目の前半部分の状態
FOUR2
4拍目の後半部分の状態。F8を出力している。
STABLE
F8を1拍あたり24回出力している定常状態。
動作の説明
電源投入で初期状態に
ペダルが踏まれる(3拍目想定) timer0 と timer1 を0からスタート(0からスタートすると、timer0はカウントアップして255を超えて再び0になったときに、timer1 は 65535 を超えて再び0になったときに割り込みがかかる。)
timer0 で割り込まれたときに
まだ踏まれている→3拍目を受信して状態THREEへ
踏まれていない→ノイズとみなし初期状態へ
timer1がフルカウントして割り込まれる=4拍目が来ないでタイムアウト→初期状態へ
ペダルが踏まれる(時間内に4拍目がきたのかも)。timer0 を0からスタート。timer1 の値を beat_timeに記憶
timer0 で割り込まれたときに
まだ踏まれている→確かに4拍目として、timer1を (65536-beat_time/2) にセットしてスタート(beat_time/2 だけカウントするとtimer1割り込みがかかる。)して、状態FOUR1へ
timer0 で割り込まれたときに踏まれていない→ノイズとみなし初期状態へ
beat_time/2 で割り込みがかかった時点で 6 の遷移が起こる。それまでに beat_time/24 の演算がメインルーチンで完了しているはずなので、この値で割り込まれるようにtimer1をセット(65536 - beat_time/24)し、割り込みの回数を12個数えている。
最後でFAを出力し → 状態 STABLEへ遷移
STABLE状態にあっても、ペダルが踏まれると TRANS3 へ遷移して、全体の状態遷移を繰り返す。