アルゴリズムはあってるはずなのに何故?!
LeapMotion で指をトラッキングして、鍵盤を押すとき、どの指を使うか?は、midi チャンネルで指定するようにしてます。
なので、テストする時にはメインで弾いてる鍵盤の他に、ミニキーボードを準備しといて、C を弾いたら親指、D を弾いたら人差指、E を弾いたら中指が鍵盤を押す、みたいにしてます。
ところが、鍵盤を押してる間に指の切り替えをミニキーボードから指定すると、鍵盤から手を離した時に、切り替えた指が割り込んで来て、本来鍵盤から離れるはずの指が固定してしまうという謎現象が…
例えば、親指で鍵盤を押してる時に、指の指定を中指とかにすると、鍵盤から手を離すと、いきなり中指が親指の位置に来て、本来親指がやるはずの動作をやってしまうという…
たぶん、NoteOff の midi チャンネル指定が上手く行ってないのが原因で、シーケンサーを使って運指をコントロールしてる時には出ない問題のはずなんだけど、気持ち悪いんで修正する事にしました。
ところが、プログラムをどう眺めても考え方はあってるはずで、なぜ途中で別な指が割り込んで来ちゃうのか半日悩みました。
で、夜半過ぎにやっと理解できたのが、安いキーボードでは NoteOff イベントは出力されないで、NoteOn の Velocity 0 としてデータが出力されるって事を思い出し、その部分に NoteOn で Velocity 0 ならっていう条件文を加えたら、一気に解決!
そう言えば、同じ問題で前も悩んでたのでした。
という事で、次は、指が下に降り過ぎて、鍵盤の中にめり込んじゃうのを回避する部分を作ります。これはコライダーを常に見てて、鍵盤と指先が触れたら、それ以上指が下に下がらないようにすれば良いはず…
明日は、この問題に挑戦予定です。