ピアノの運指(指使い)の合理化について

ピアノで指使いは楽譜に書いてあるものを基本使うように指導されることが多く、自分はそれがいいことはほとんどでしたが、稀に違う指使いを使った方が良いなと思うことがあります。実装はまだしていませんが指使いをできるだけロジカルに決める方法を考えてみたのでまとめておきます。
指使いで大事なのはまず楽であることだと思います。長い曲を弾いたりするときに変な指だとエネルギーのロスが激しいのでできるだけ効率の良い、使ってて楽な指使いにする必要があります。もう一つ考慮すべきなのは出したい音の質(音量とかタッチ)で、これを求めるために通常とは違う指使いをすることがあります。この点は一旦置いておきます。

問題を単純化し、”スラーがかかった30音からなる一声の旋律を健康な右手で弾く際の、指使いの最適化”について考えます。
もちろん実際の曲は30音どころではありませんが、その場合はピースに分割することができることがほとんどなのでそれはさほど大きな問題ではありません。
まず入力のパラメータとしては楽譜のデータと、手に関する情報が求められます。
具体的な情報としては、5本の指の長さ・指と指のmax・minの状態の角度・通常ピアノを弾く時の指の曲がり具合あたりが必要となるでしょう。

次に”最適”なものの定義ですが、これはまだ議論の余地があると思います。指使いにスコアをつけ、スコアが最小ならそれが最適ということを考えたいと思います。スラーがかかった旋律を考えているので基本跳躍するのは避けたいところです。そのため、指の跳躍が必要な指の移動については大きいスコアを配置しておきます(10^9+7とか)。
では、その他のスコアをどのように決めるかですが、跳躍を除いた場合の指のスコアを以下のように定義したいと思います。
・指使いのスコア=楽譜上の隣あう2音間に対する指使いに対するスコアの総和
・隣あう2音間に対する指使いに対するスコア=ある音を弾いた後次の音を弾くために、2音目をひくであろう指を動かした時指が通過した領域の体積

このように定義すると、例えばド-レを1-2で弾くときは、2の移動はほぼないのでスコアは0に限りなく近いものとなります。
一つ問題なのが指くぐりで、ド-ミ♭-ソ-ラを1-3-1-2で弾くと指くぐりが出ます。
ミ♭-ソ-ラが問題で、先程の話にのっとって考えるとソ-ラのスコアはほぼ0、ミ♭-ソのスコアは親指の移動体積が指またぎだと大きいことからそれなりに大きくなることがわかります。ただ、この例でわかるように、ミ♭-ソ-ラを弾くときに指くぐりした後ラを弾くために親指を軸として手を少しclockwiseに回転させることが必要になります。よって、先程の定義で指が通過した領域の体積としたのを、ある音AからBへ移動した際の”手”全体が通過した領域の体積と変更することでこの問題は解決できます。

ここまで定義したところをまとめると以下のようになります。
・音A→音Bへの指使いに対するスコアを定数時間で計算し、それを旋律中の音に適用することで旋律全体の指使いに対するスコアを計算し、スコアがminとなるのが望ましい

具体的にどのようにして探索するかですが、全探索させると1~5番の指に対して行うので5^nの手間がかかります。n=30だと9*10^20くらいかかります。これはスパコンでも使わない限り時間がかかりすぎます。
そのため実際に計算しようとする時はGA等の別の方法に頼る必要がありそうです。もし改善方法があれば教えてもらえると幸いです。

追記 ドを2、その左のシを3で弾くみたいなかなり不自然なケースを枝打ちすれば多少計算量が落ちるという指摘をいただきました。ありがとうございます

よろしければサポートをよろしくお願いいたします。頂いたサポートは新しい勉強用の本の購入に使わせていただきます。