ピアノの鍵盤の動きの問題
2020年1月のテスト動画で、大まか体の動きと指の動きを取る事ができたので、次はピアノの問題。
恐らく、ほとんどの人が誤解してるのは、Midi データで楽器の演奏モーションを作ろうとした場合、midi データの Note On のデータは音の出るタイミングであって、楽器を弾きだすタイミングじゃないのです。
例えばピアノで言えば、Note On が来た時、音源は音を鳴らすわけだけど、演奏モーションで Note On が来た時っていうのは、鍵盤が一番下がったタイミングになるわけです。
つまり、鍵盤が下がり始めるタイミングというのは、Note On が来るよりも前からでないといけないわけ。
この音が出始める前にピアノの鍵盤が下がり始める動きがないと、ピアノの鍵盤が突然ガクン!と下がったようになってしまいます。
鍵盤が下がり始めるタイミングは Velocity 値が小さいほど早く、Velocity 値が大きいほど遅くなります。ここが結構こんがらがる所なんだけど、例えば1秒後に音が出るとして、小さい音はすぐに鍵盤が動き出して1秒後に鍵盤が一番下まで降りている必要があり、逆に大きい音は900ミリ秒くらい待ってから、鍵盤が下がり始め、100ミリ秒で一番下まで降りる、つまり早いスピードで鍵盤が動いて強く弦を叩いて大きな音がするってわけです。
現状の midi 1.x では、鍵盤が動き出すタイミングのデータはないので、ベロシティで大まかの鍵盤下降スピードを予測して、鍵盤を動かす必要があります。
midi 2.0 では、この辺、鍵盤の深さのデータも検出できるらしいので、midi 2.0 が出て来ると、もっと精密なピアノ鍵盤の動きが再現できる可能性があります。
ただし、midi 2.0 になっても、キーボードのソフトが鍵盤が押される深さのデータを出力するようにプログラムされてなければダメなんですけどね。
というわけで、ベロシティの強弱によって、鍵盤の下がる速度が変わるようなプログラムを Unity で書いて、動かしてるのが以下の動画です。