(57)【特許請求の範囲】
【請求項１】
演奏の進行に応じて演奏者が鍵盤を操作していく際の手指の動作画像を鍵盤画像とともに表示する装置であって、
前記鍵盤上で発生させるべきイベントの内容を表すイベントデータ、該イベントデータの発生タイミングを示す時間データ、及び該イベントの発生に使用すべき指を指定する指データから構成される楽音・運指データが複数個集合してなる演奏データを取得する演奏データ取得手段と、
前記演奏データ取得手段が取得した演奏データに基づいて、前記鍵盤の鍵を押鍵するとき、或いは離鍵した後の手指の位置を、前記楽音・運指データ単位で決定する状態決定手段と、
前記状態決定手段が決定した手指の位置に順次移行させることにより、前記鍵盤を操作していく手指の動作を動画表示する動画表示手段と
を具備し、
前記状態決定手段は、押鍵するときの手の位置を決定したら、該手の位置と押鍵に使用すべき指と押鍵すべき鍵とに基づいて、指を接触させる鍵上の位置を、予め定められた複数の基準位置の中から一つ選択する
ことを特徴とする演奏動作表示装置。
【請求項２】
演奏の進行に応じて演奏者が鍵盤を操作していく際の手指の動作画像を鍵盤画像とともに表示する装置に実行させるプログラムであって、
前記鍵盤上で発生させるべきイベントの内容を表すイベントデータ、該イベントデータの発生タイミングを示す時間データ、及び該イベントの発生に使用すべき指を指定する指データから構成される楽音・運指データが複数個集合してなる演奏データを取得する機能と、
前記取得する機能により取得した演奏データに基づいて、前記鍵盤の鍵を押鍵するとき、或いは離鍵した後の手指の位置を、前記楽音・運指データ単位で決定する機能と、
前記決定する機能により決定した手指の位置に順次移行させることにより、前記鍵盤を操作していく手指の動作を動画表示する機能と
を実現させるためのプログラムであって、
前記決定する機能は、押鍵するときの手の位置を決定したら、該手の位置と押鍵に使用すべき指と押鍵すべき鍵とに基づいて、指を接触させる鍵上の位置を、予め定められた複数の基準位置の中から一つ選択する
ことを特徴とするプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、鍵盤などの演奏操作の対象となる演奏操作子群に対し、演奏の進行に応じて操作していく際の動作を表示するための技術に関する。
【０００２】
【従来の技術および発明が解決しようとする課題】
現在では、多くの鍵盤楽器に、演奏の進行に応じて押鍵（操作）すべき鍵を順次、ユーザ（演奏者）に通知していくナビゲーション機能が搭載されている。しかし、ナビゲーション機能を利用するユーザの多くは技術的に未熟であり、そのナビゲーション機能によって次に押鍵すべき鍵を知ることができても、その鍵をどの指で押鍵すべきかが判らないのが実状である。このことから、鍵の押鍵に使うべき指を表示する装置（演奏動作表示装置）を搭載した鍵盤楽器も製品化されている。その演奏動作表示装置を利用することにより、指の運び方を意識した演奏を行えるため、ユーザにとってはより効率的な練習（学習）を行うことができる。
【０００３】
演奏動作表示装置の多くは、次の押鍵（操作）に使うべき指を単に表示するだけである。しかし、押鍵（操作）すべき鍵への指の運び方は、その鍵に単に指を運ぶだけではない。別の指の下をくぐらせて指を運んだり、別の指の上をまたいで指を運んだりすることもある。これは、単に指だけを表示した場合、その指をどのように運んで押鍵（操作）するべきなのかをユーザが直ちに理解できるとは限らないことを意味する。このことから、例えば特開平１０−３９７３９号公報に開示されているように、使う指だけでなく、その指の運び方をより理解しやすい形で表示する演奏動作表示装置が創案されている。
【０００４】
その特開平１０−３９７３９号公報に開示された従来の演奏動作表示装置では、押鍵時の手指（手首から先の部分）を表示することにより、押鍵に使うべき指をどのような形で使うべきかをユーザに知らせるようになっている。しかし、次に押鍵すべき鍵が現在、押鍵している鍵と離れているような場合、普通、手や指を大きく動かさなければならない。これは、押鍵時の手指を表示しても、その表示された手指の形にどのようにして移行させるのかをユーザが直ちに理解できるとは限らないことを意味する。このため、従来の演奏動作表示装置には、全体的な手指の動作が判りにくいという問題点があった。
【０００５】
なお、上記従来の演奏動作表示装置では、コンピュータ・グラフィクス（以降、ＣＧと略記する）技術を用いて、押鍵に使う指を動かしている。その指の動きにより、押鍵に使うべき指をユーザは知ることができる。しかし、その指の動きは、押鍵時の手指の形を作った後の動きである。このため、その指の動きによって、押鍵時の手指の形にどのようにして移行させるかをユーザに知らせることはできない。
【０００６】
本発明の課題は、演奏中における手指の動作をユーザが容易に理解できる形で表示するための技術を提供することにある。
【０００７】
本発明の演奏動作表示装置は、演奏の進行に応じて演奏者が鍵盤を操作していく際の手指の動作画像を鍵盤画像とともに表示する装置であることを前提とし、鍵盤上で発生させるべきイベントの内容を表すイベントデータ、該イベントデータの発生タイミングを示す時間データ、及び該イベントの発生に使用すべき指を指定する指データから構成される楽音・運指データが複数個集合してなる演奏データを取得する演奏データ取得手段と、演奏データ取得手段が取得した演奏データに基づいて、前記鍵盤の鍵を押鍵するとき、或いは離鍵した後の手指の位置を、前記楽音・運指データ単位で決定する状態決定手段と、その状態決定手段が決定した手指の位置に順次移行させることにより、鍵盤を操作していく手指の動作を動画表示する動画表示手段とを具備し、状態決定手段は、押鍵するときの手の位置を決定したら、該手の位置と押鍵に使用すべき指と押鍵すべき鍵とに基づいて、指を接触させる鍵上の位置を、予め定められた複数の基準位置の中から一つ選択することを特徴とする。
【００１１】
本発明のプログラムは、上記演奏動作表示装置を実現させるための機能を実現させるものである。そのプログラムは、以下のような機能を実現させる。
鍵盤上で発生させるべきイベントの内容を表すイベントデータ、該イベントデータの発生タイミングを示す時間データ、及び該イベントの発生に使用すべき指を指定する指データから構成される楽音・運指データが複数個集合してなる演奏データを取得する機能と、取得する機能により取得した演奏データに基づいて、鍵盤の鍵を押鍵するとき、或いは離鍵した後の手指の位置を、楽音・運指データ単位で決定する機能と、決定する機能により決定した手指の位置に順次移行させることにより、鍵盤を操作していく手指の動作を動画表示する機能とを実現させるためのプログラムであって、決定する機能は、押鍵するときの手の位置を決定したら、該手の位置と押鍵に使用すべき指と押鍵すべき鍵とに基づいて、指を接触させる鍵上の位置を、予め定められた複数の基準位置の中から一つ選択することを特徴とする。
【００１４】
本発明では、鍵盤上の鍵に指を接触させるうえで基準となる基準位置を予め複数定めておき、押鍵のために指を鍵に接触させる位置を、手の位置と使用すべき指と押鍵すべき鍵とに基づいて、予め定められた基準位置のなかから一つ選択して決定する。そのようにして、指の接触位置を決定する範囲を制限することにより、各指が取れる状態は制限され（選択肢が少なくなり）、接触位置を決定するうえで必要な計算量は少なくなる。この結果、接触位置をより容易、且つ短時間に決定することが可能となる。
【００１５】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
図１は、本実施の形態による演奏動作表示装置の回路構成図である。この演奏動作表示装置は、後述する楽音・運指データを外部から取得し、取得した楽音・運指データに基づいて演奏中の手指の動作を動画で表示する装置として実現されている。
【００１６】
上記演奏動作表示装置は、図１に示すように、装置全体の制御を行うＣＰＵ１０１と、そのＣＰＵ１０１が実行するプログラムや各種制御データ（画像表示用の各種データを含む）などを格納したＲＯＭ１０２と、そのＣＰＵ１０１がワーク用に用いるＲＡＭ１０３と、上記楽音・運指データを含む各種データを取得するためのデータ入力部１０４と、ＣＰＵ１０１から送られたデータを画面上に表示する表示部１０５と、ユーザが操作の対象とする操作部１０６と、ＣＰＵ１０１の指示に従って楽音の波形データを生成する音源１０７と、その音源１０７が出力した波形データをサウンドに変換して放音するサウンドシステム１０８と、ＣＰＵ１０１を各部１０２〜１０７と接続するバス１０９と、を備えて構成されている。
【００１７】
上記データ入力部１０４は、例えばフレキシブルディスクドライブ（ＦＤＤ）である。表示部１０５は、例えばＣＲＴ、或いは液晶表示装置などの表示装置である。操作部１０６は、例えば各種スイッチやキー等の複数の操作子、及びそれら操作子への操作を検出する検出回路から構成された入力装置である。サウンドシステム１０８は、例えばＤ／Ａコンバータ、アンプ、及びスピーカからなるシステムである。なお、データ入力部１０４は、外部機器が出力した信号を少なくとも受信できるインターフェース、或いは所定のネットワークとの通信を行う通信制御装置であっても良い。
【００１８】
上記楽音・運指データは、図２に示すように、楽音データに運指データを付加する形で構成されている。楽音データは、通常は演奏の再生に使用される演奏データ（シーケンスデータ）であり、楽音の音階（音高）データ、その楽音の発音が開始（ノートオンイベント）か消音（ノートオフイベント）かを含むイベントの種別を表す種別データ、及び楽音の音高データと種別データによって特定されるイベントが発生したタイミングを示す時間データを１単位のデータ（以降、便宜的に単位楽音データと呼ぶ）として、その単位楽音データをイベントの発生順に並べた形で構成されている。運指データは、単位楽音データ毎に付加された、その単位楽音データが表すイベントを発生させるために用いるべき指を示す指番号データからなるデータである。指番号として、親指には０、人差し指には１、中指には２、薬指には３、小指には４がそれぞれ割り当てられている。
【００１９】
上記運指データには、通常、指番号データの他に、少なくとも、動かす指が右手か左手かを示す手データが存在し、単位楽音データ毎に、それらのデータが付加される。しかし、ここでは、混乱を避けて理解を容易とするために、右手のみに着目して手データ等は考慮しないことにする。上記時間データは、イベント間の時間間隔（デルタタイム）でそのイベントの発生タイミングを表すデータであり、種別データ、及び音高データは、例えばＭＩＤＩデータを構成するデータである。
【００２０】
なお、上記楽音データ（演奏データ）では、楽音の発音開始（オン）、その楽音の消音（オフ）をそれぞれ別のイベントとして扱い、楽音の発音期間はそれらのイベントによって指定されるようになっているが、楽音データはそれらのイベントを一つにまとめたものであっても良い。即ち単位楽音データは、例えば音高データ、その音高データで指定される楽音の発音開始タイミングを指定する時間データ、及びその楽音を発音させている時間長（ゲートタイム）を指定する時間長データから構成されるものであっても良い。このことから明らかなように、楽音データの形式は特に限定されるものではない。
【００２１】
以上の構成において、その動作を説明する。
ＣＰＵ１０１は、電源がオンされると、ＲＯＭ１０２に格納されているプログラムを読み出して実行することにより、装置全体の制御を開始し、表示部１０５には初期画面を表示させる。以降は、ユーザの操作部１０６への操作に応じて制御を行う。
【００２２】
ＣＰＵ１０１は、その初期画面を表示させるための画像データを、例えばＲＡＭ１０３を作業用に使用して、ＲＯＭ１０２から読み出した複数の画像データを用いて生成する。そのようにして生成された初期画面の画像データを送られた表示部１０５は、それを特には図示しないメモリ（例えばデュアルポートＲＡＭ）に格納する。それ以降における表示内容の全体的、或いは部分的な変更は、例えばＣＰＵ１０１が、そのメモリに格納された画像データ中でデータを書き換えるべき部分の画像データをＲＯＭ１０２から読み出すか、或いはそれを用いて生成し、そのようにして得た画像データを、そのメモリ中の画像データを書き換えるべき部分に上書きすることで行われる。そのようにして、ＣＰＵ１０１は、表示部１０５に、表示すべき画面やメッセージ、後述する演奏動作を表現する手指などを必要に応じて表示させる。
【００２３】
ユーザが操作部１０６を操作してフレキシブルディスク（ＦＤ）に格納されたファイルのデータの読み出しを指示した場合、その旨を示すデータが操作部１０６からバス１０９を介してＣＰＵ１０１に送られる。そのデータを受け取ったＣＰＵ１０１は、データ入力部（ＦＤＤ）１０４に対しそれの読み出しを指示するコマンドを送り、その後にデータ入力部１０４から送られるそのファイルのデータをＲＡＭ１０３に格納する。そのようにして、楽音・運指データを含め、ユーザが指定したデータをファイル単位でＦＤから取得する。
【００２４】
ＣＰＵ１０１にデータを読み出させるファイルの指定は、特に詳細な説明は省略するが、操作部１０６を操作してファイル名を入力するか、或いはＦＤに格納されたファイルの一覧を表示部１０５に表示させて、そのなかからファイルを選択することで行うようになっている。その一覧に表示させるファイル名は、ＣＰＵ１０１が、データ入力部１０４にＦＤに格納されたファイル名を読み出させて受け取ったものである。
【００２５】
特開平１０−３９７３９号公報に開示された従来の演奏動作表示装置のように、基本的には押鍵時における手指の形だけを表示させるのでは、その形に移行するまでの手指の動かし方をユーザは理解しにくい。このことから、本実施の形態では、イベント単位で、それまでの手指の状態から、そのイベントを生じさせる手指の状態に移行するまでの動作を動画で表示するようにしている。即ち手をどこからどこまで移動させるか、どの指の状態をどのように変化せるか、といったことを動画で表示するようにしている。そのようにして、演奏中における一連の手指の動作を細かく表示した場合、どのように手指を動作させれば良いのかを考えさせることなくユーザに理解させることができる。
【００２６】
演奏中における手指の動作を動画で表示させるためには、そのためのデータ（以降、動作制御データと呼ぶ）を生成しなければならない。そのデータは、楽音・運指データから生成するが、対象となる楽音・運指データによってはその生成に重い負荷がかかる。これは、動作制御データを生成しつつ、楽音・運指データ（楽音データ）を再生させようとすると、楽音の発音や画像の表示に不具合を生じさせる可能性があることを意味する。即ち、楽音を発音させるべきタイミングで発音させられなかったり、手指の動作をスムーズに表示させられないといったことが生じる可能性がある。このことから、本実施の形態では、動作制御データの生成は楽音・運指データの再生とは別に行うようにしている。
【００２７】
動作制御データの生成は、例えばＲＡＭ１０３にファイル形式で格納された楽音・運指データを対象に行うようにしている。ユーザが操作部１０６を操作して、ＲＡＭ１０３に格納された楽音・運指データのなかから一つを指定（選択）し、動作制御データの生成を指示した場合、ＣＰＵ１０１は、以下のようにしてユーザが指定した楽音・運指データの動作制御データを生成する。なお、楽音・運指データの指定方法は、基本的にＦＤから読み出すファイルを指定する場合と同じである。
【００２８】
図３は、表示用の手指の構造を説明する図である。
身体の各部は、関節を曲げて動かすことができる。これは、手指においても同じである。このことから、本実施の形態では、図３に示すように、手首から先を、手と５本の指に分けている。各指は、３関節の曲げ動作が行えることから、３つの部分に更に分けている。以降、表示する手指については、実際の手指のそれと区別するために「パート」を最後に付けて表記することにする。指の関節については、手に近いほうから第１関節、第２関節、第３関節と呼ぶことにする。
【００２９】
図３中の３０１〜３０６は、各部分を動かすうえでの基点である。具体的には、基点３０１は手パートの基点であり、手首（の関節）に対応する。基点３０２は親指パートの基点であり、その第１関節に対応する。基点３０３〜３０６は、それぞれ、人差し指パート、中指パート、薬指パート、及び小指パートの基点であり、対応している指の第１関節に対応する。
【００３０】
手パートの状態は、基点３０１のｘ、ｙ、ｚ軸上における各位置ｈｘ、ｈｙ、ｈｚの他に、ｚ軸の周りの回転角ｈｒｚで管理している。それらを示す値は、それぞれ、用意した変数に代入させることで保持させている。それにより、３次元で手指の動きを表現するようになっている。ｚ軸の周りの回転角ｈｒｚは、手パートの基点３０１から中指パートの基点３０４までの長さＬａをｙ軸上に投影させた際に、基点３０４が投影されたｙ軸上の位置から基点３０１が投影されたｙ軸上の位置を引いて得られる長さがその長さＬａと一致する状態が基準（０度）である（図６（ｂ）参照）。例えば図３に向かって左回りが正、右回りが負である。そのようにして、図３中の鍵盤３００との相対的な位置関係を任意に変更できるようにしている。なお、ｘ軸、或いは／及び、ｙ軸の周りの回転角を更に考慮しても良い。上記ｈｘ、ｈｙ、ｈｚ、及びｈｒｚを保持させる変数については、以降そのシンボルを最後に付加して表記する（変数ｈｘ、等）ことにする。
【００３１】
各指には、上記したように３つの関節がある。このことから、第１関節だけでなく、第２及び第３関節も基点とし、第１関節と第２関節間、第２関節と第３関節間、及び第３関節から先を、それぞれ一つのパートとしている。ここでは、それらのパートをそれぞれ、指第１パート、指第２パート、及び指第３パートと呼ぶことにする。それらの長さＬ１、Ｌ２、及びＬ３は、指毎にその長さが異なることから、各指パート毎に定めている。
【００３２】
指の第１関節は２方向（曲げたり伸ばしたりする方向と、開いたり閉じたりする方向）に動き、他の第２、及び第３関節は一方向にのみ動く。このことから、指第１パートの状態は、第１関節に対応する基点上におけるｚ軸の周りの回転角ｆｒｚと、手の甲から手のひらに向けてそれを折り曲げた角度ｆｒｘ１とで管理している。指第２パート、及び指第３パートは、それぞれ、第２関節、及び第３関節に対応する基点上において、それを手の甲から手のひらに向けて折り曲げた角度ｆｒｘ２、及びｆｒｘ３で管理している。そのようにして、指の間を広げたり狭めたり、指を伸ばしたり曲げたりといった動作を模倣できるようにしている。なお、指第１〜第３パートの状態を管理するための角度ｆｒｘ１〜ｆｒｘ３は、例えば基点を介してつながっている２つのパートが直線となる状態を基準（０度）として表したものである（図６（ａ）参照）。このため、例えば手の甲と指の第２関節までが直線状となった状態では、角度ｆｒｘ１は０となる。以降は、角度ｆｒｘ１〜３の何れかを変化させる動きを指（指パート）の縦の動き、回転角ｆｒｚを変化させる動きを指（指パート）の横の動きとも呼ぶことにする。
【００３３】
上記ｆｒｚ、及びｆｒｘ１〜３の値は、それぞれ、用意した変数に代入させることで保持させている。それらの値は各指パート毎に保持しなければならないことから、その変数は配列変数とし、指番号で指定される要素に、対応する値を代入させている。以降、ｆｒｚ、及びｆｒｘ１〜３を保持させる配列変数も、そのシンボルを最後に付加して表記する（配列変数ｆｒｚ、等）ことにする。
【００３４】
各指パートの基点３０２〜３０６は、手パートの基点（手首）３０１の位置の変化に伴って移動する。上記したように、各指パートは人間の指を模倣した動きを表現させることができる。このため、鍵盤３００上の任意の鍵を押鍵するために手を移動させる動作や、鍵を押鍵、或いは離鍵する指の動作、それらを組み合わせた動作を動画で表現することができる。その表現は、鍵盤３００を操作していく手指の各パートの動作を表示することで行うことから、鍵盤３００上の白鍵や黒鍵のサイズやその並び、各鍵間の位置関係、などのデータは予め変数などの形で用意している。
【００３５】
図４は、手の移動範囲を説明する図である。手パートは基点３０１によってその表示状態を管理している。図４は、その基点３０１の位置として取りうる範囲を示したものである。
鍵盤と手首との間のｙ軸上における距離は、押鍵するのが白鍵か黒鍵かで異なる。当然のことながら、黒鍵を押鍵する場合は白鍵を押鍵する場合と比較して距離は小さくなる。鍵を押鍵する指によっても異なる。例えば親指は他の指と比較して手首に近いために、親指で鍵を押鍵する際にはその鍵を他の指で押鍵する際と比較して距離を小さくしなければならない。また、同じ白鍵、或いは黒鍵を押鍵するとしても、複数の鍵を同時に押鍵するのか１鍵だけを押鍵するのかによってその距離は変化する。複数（特に３つ以上）の鍵を同時に押鍵しているときには、各指の間を広げた形となっているので、１鍵だけを押鍵しているときと比較して鍵盤に近くなる。
【００３６】
鍵盤に対する演奏操作では、状況によって、親指を他の指と交差させてその下を移動させる指くぐりや、親指以外の指を親指と交差させてその上を移動させる指またぎを行うことがある。そのように指を交差させる場合、鍵を押鍵させている指は通常の押鍵時よりも立てた状態（図６（ａ）に示すように、指全体がｚ軸により平行に近くなる状態）となり、指のｙ軸上の長さがより短くなることから、鍵盤との距離も短くなる。このようなことから、本実施の形態では、鍵盤３００から離した場合の基点３０１のｙ軸上の位置としてＹＰＯＳ１、その鍵盤３００に近づけた場合の位置としてＹＰＯＳ２を定めている。
【００３７】
一方、鍵盤と手首（手のひら）の間のｚ軸上における距離も、複数の鍵を同時に押鍵するのか１鍵だけを押鍵するのかによって変化する。複数の鍵を同時に押鍵しているときには、手全体を鍵盤に向けて移動させている形となっているので、その距離は小さくなる。指くぐりや指またぎを行うには、或る程度、手を鍵盤から離さなければならない。このようなことから、本実施の形態では、鍵盤３００から離した場合の基点３０１のｚ軸上の位置としてＺＰＯＳ１、その鍵盤３００に近づけた場合の位置としてＺＰＯＳ２を定めている。そのような位置を定めて、白鍵、或いは黒鍵を押鍵するのか、複数の鍵を押鍵するのか１鍵を押鍵するのか、といったことで変化する動作や、指を交差させる動作などを表現するようにしている。
【００３８】
図５は、状況に応じて変化させる鍵を押鍵する位置を説明する図である。
指は縦と横の両方の動きが行えることから、手の位置を動かさなくとも、押鍵のために指（指先）を鍵に接触させる位置（押鍵位置）は指だけの動きで変更させることができる。それにより、鍵上で指を接触させることが可能な範囲は広いことも多い。しかし、その範囲を全て考慮して押鍵位置を決定しようとすると、押鍵位置の決定には手や各指の状態も考慮しなければならないこともあって、それを決定するために要する処理時間は長くなる。このことから、本実施の形態では、押鍵位置を決定するうえで基準となる押鍵位置（基準押鍵位置）を予め複数、定め、押鍵位置は、複数の基準押鍵位置のなかから一つを選択して、選択した基準押鍵位置、或いはその近傍に決定するようにしている。図５は、白鍵、黒鍵に分けて、その基準押鍵位置を示したものである。
【００３９】
押鍵位置を基準押鍵位置、及びその近傍の範囲に限定することで、押鍵位置を決定するうえで考慮するその範囲が実質的に狭くなる。このため、押鍵位置をより容易、且つ短時間に決定できることになる。なお、基準押鍵位置の近傍も範囲として考慮しているのは、例えば複数の鍵を同時に押鍵する状態となった場合に、指に不可能な動きをさせないようにするためである。親指に続いて中指で鍵を押鍵する場合を例にとれば、その中指を基準押鍵位置に接触させるために中指に人にとって不可能と考えられるような横の動きをさせるといったことを回避させるためである。
【００４０】
白鍵では、図５（ａ）に示すように、図中Ａ〜Ｃを付した計３つ点を基準押鍵位置として定めている。黒鍵では、図５（ｂ）に示すように、図中Ｄ、Ｅを付した計２つの点を基準押鍵位置として定めている。それぞれ基準押鍵位置を示す点Ａ〜Ｅは、以下のような状況のときに選択している。ここでは主なものを挙げて説明する。
点Ａ：手が位置ＹＰＯＳ２にある場合に、人差し指、中指、或いは薬指で押鍵するとき
点Ｂ：手が位置ＹＰＯＳ２にある場合に、親指、或いは小指で押鍵するとき。その手が位置ＹＰＯＳ１にある場合には、人差し指、中指、或いは薬指で押鍵するとき
点Ｃ：手が位置ＹＰＯＳ１にある場合に、親指、或いは小指で押鍵するとき
点Ｅ：手が位置ＹＰＯＳ１にある場合に、人差し指、中指、或いは薬指で押鍵するとき。その手が位置ＹＰＯＳ２にある場合には、親指、或いは小指で押鍵するとき
点Ｄ：手が位置ＹＰＯＳ２にある場合に、人差し指、中指、或いは薬指で押鍵するとき
図６は、手のｘ軸上の位置ｈｘの求め方を説明するための図である。同図（ａ）は、指パートで鍵（白鍵）を押鍵している様子を横から見た側面図、同図（ｂ）は、その様子を上から見た上面図である。
【００４１】
図５（ａ）及び（ｂ）から明らかなように、鍵の押鍵位置によってその鍵を押し下げなければならないｚ軸上の距離は長くなる。指のｘｙ平面上における長さは押鍵時の形によって変化する。このことから、手のｘ軸上における位置ｈｘは、以下のようにして求めている。図６を参照して具体的に説明する。
【００４２】
図６（ａ）において、ｋｔｏｐＺは、押鍵したときに指パートと接触している鍵の押鍵位置のｚ軸上における高さ（基準となる位置からの距離）を示すシンボルである。その高さｋｔｏｐＺは、基準押鍵位置毎に異なることから、基準押鍵位置毎に、それと対応付けられた配列変数の要素に用意している。ｈｚは手パートのｚ軸上における高さ（基準となる位置からの距離）を示すシンボルであり、その高さｈｚは、位置ＺＰＯＳ１、或いはＺＰＯＳ２に対応する。ｆｚは、手パートの高さｈｚと押鍵させる指パートの基点のｚ軸上における高さ（基準となる位置からの距離）との差を示すシンボルである。差ｆｚはマイナスの値である。ｆｌｅｎＺは、押鍵させる指パートのｚ軸上における長さを示すシンボルである。その長さｆｌｅｎＺを得るために、第１関節の角度ｆｒｘ１、更には第２、第３関節の角度ｆｒｘ２、ｆｒｘ３を調整することになる。ｔｏｐＺは指パートの指先に当たる第３パートにおいて、その中央から鍵に接触させる部分までの第３関節を折り曲げる方向上における厚さを示すシンボルである。
【００４３】
指パートを押鍵させるために必要なｚ軸上における長さをｆｔｏｋＺで表すと、そのｆｔｏｋＺは、手パートの高さｈｚから、差ｆｚ、及び高さｋｔｏｐＺを引いた分の高さ（＝ｈｚ−ｆｚ−ｋｔｏｐＺ）となる。一方、長さｆｌｅｎＺは、第２、第３パートのｚ軸上における長さはそれよりも手パートに近い関節の角度を考慮、即ち第２パートでは第２関節の他に第１関節の角度ｆｒｘ１を考慮しなければならないことから、以下の式により求められる。
【００４４】
ｆｌｅｎＺ＝Ｌ１×ｓｉｎ（ｆｒｘ１）＋Ｌ２×ｓｉｎ（ｆｒｘ１＋
ｆｒｘ２）＋Ｌ３×ｓｉｎ（ｆｒｘ１＋ｆｒｘ２＋ｆｒｘ３）
＋ｔｏｐＺ×ｃｏｓ（ｆｒｘ１＋ｆｒｘ２＋ｆｒｘ３）
上記式より求められる長さｆｌｅｎＺは長さｆｔｏｋＺと一致させる必要がある。各角度ｆｒｘ１〜３は、それらが一致するように決定しなければならない。そのために、本実施の形態では、第１関節の角度ｆｒｘ１に応じて決定すべき第２、及び第３関節の角度ｆｒｘ２、３を定めたテーブル（以降、便宜的に角度テーブルと呼ぶ）を用意している。それにより、角度ｆｒｘ２、３は、角度ｆｒｘ１に対応するものに決定している。その決定は、式に角度ｆｒｘ１〜３を代入して求められる長さｆｌｅｎＺが長さｆｔｏｋＺと一致するまで、式に代入する角度ｆｒｘ１、更には角度ｆｒｘ２、３を変更しながら、長さｆｌｅｎＺの算出、それと長さｆｔｏｋＺとの比較を繰り返すことで行っている。
【００４５】
なお、上記角度テーブルで定められた１組の角度ｆｒｘ２、３は、例えば或る範囲の角度ｆｒｘ１を対応させている。それにより、長さｆｌｅｎＺを長さｆｔｏｋＺと一致させるための微調整は、基本的には角度ｆｒｘ１だけを変更することによって行うようになっている。
【００４６】
上述したようにして角度ｆｒｘ１〜３を決定することに伴い、指パートのｘｙ平面上における長さが決定する。図６（ｂ）中では、その長さはｌｅｎＸＹで示してある。その長さｌｅｎＸＹは、以下の式より求められる。その図６（ｂ）において、回転角ｈｒｚが０度、即ち手パートが基準の位置となっているときに、押鍵させる指パートの付け根に対応する基点と手パートの基点３０１間のｘ軸上の距離はｆｌｅｎＸで示してある。その距離ｆｌｅｎＸは、各指パート毎に予め用意したデータである。押鍵のために指パートを接触させる鍵の押鍵位置のｘ軸上の位置はｎｏｔｅＸで示してある。ｆｒｚ［ｆｉｇ］は、押鍵させる指パートの第１関節である基点でのｚ軸周りの回転角である。なお、上記回転角ｈｒｚ、ｆｒｚは、基準となる位置から図６（ｂ）に向かって右回転させた場合に負となる。
【００４７】
ｌｅｎＸＹ＝Ｌ１×ｃｏｓ（ｆｒｘ１）＋Ｌ２×ｃｏｓ（ｆｒｘ１＋
ｆｒｘ２）＋Ｌ３×ｃｏｓ（ｆｒｘ１＋ｆｒｘ２＋ｆｒｘ３）
押鍵させる指パートの第１関節に当たる基点のｘ軸上の位置ｆｂａｓｅＸは、押鍵位置のｘ軸上の位置ｎｏｔｅＸを基準にする形で、上述したようにして算出される長さｌｅｎＸＹを用いて次の式より求めている。
【００４８】
ｆｂａｓｅＸ＝ｌｅｎＸＹ×ｓｉｎ（ｈｒｚ＋ｆｒｚ）＋ｎｏｔｅＸ
図６（ｂ）に示す状態では、回転角ｈｒｚ、ｆｒｚはそれぞれ負の値となる。このため、上記式より算出される位置ｆｂａｓｅＸの値は、位置ｎｏｔｅＸのそれよりも小さくなる。
【００４９】
手パートの基点３０１のｘ軸上の位置ｈｘは、以下の式より求めている。
ｈｘ＝Ｌａ×ｓｉｎ（ｈｒｚ）＋ｆｂａｓｅＸ
＋ｆｌｅｎＸ×ｃｏｓ（ｈｒｚ）
このように、本実施の形態では、鍵の押鍵位置を決め、その決めた押鍵位置から押鍵させる指パート、更には手パートの状態を決定するようにしている。その決定は、詳細は後述するが、指くぐりや指またぎの形で指パートを交差させる必要性の有無を判定して行っている。それらの状態は、複数の鍵を同時に押鍵させている状況となることもあって、他の指パートの状態を考慮して決定する必要がある。このことから、押鍵させる指パートに注目してその指パートや手パートの押鍵時の状態を決定した後に、他の指パートの状態を考慮して、全体的な微調整を行い、指パートの不自然な横の動きや指パート間の不自然な位置関係はそれを修正している。それにより、指くぐりや指またぎを含め、より自然で違和感を与えない演奏動作を表示させるようにしている。
【００５０】
図３、或いは図６に示すように複数のパートに分割した手指の動画表示は、各パートの状態を演奏の進行に応じて順次、変更させていくことで行っている。その動画表示を実現させるための動画制御データは、本実施の形態では２段階で生成している。ここでは、便宜的に、始めの段階で生成したデータを動画制御データＡ、次の段階で生成したデータを動画制御データＢと呼ぶことにする。
【００５１】
上記動画制御データＡは、ＣＰＵ１０１が、図２に示すような楽音・運指データの他に、各指パートの長さ（指第１〜第３パートの長さ）やその手パートにおける配置、鍵盤３００上の鍵の配置や各種鍵の形状といった予め用意したデータ（パラメータ）を参照しつつ生成する。ＣＰＵ１０１は、楽音・運指データ中の単位楽音データ、及びそれに付加された指番号データ、更にはそれらによって指定される演奏の流れなどを解析して、イベント単位でそれまでの手指の状態から次のイベントを生じさせるために移行させる手指の状態を求め、その後者の手指の状態を指定するデータ、即ちどのパートの状態をどのように変化させるべきかを指定するデータをＲＡＭ１０３に保存する。手や指を動かす速さは、イベント間の時間間隔の長さに依存する。その時間間隔が短いほど、手や指を速く動かさなければならない。このことから、イベント間の時間間隔を基に、パートの状態の変化を開始するタイミングやその変化を継続している時間を決定し、それらを示すデータも合わせてＲＡＭ１０３に保存する。そのようにして生成・保存したデータが動画制御データＡである。なお、上記解析は、例えば楽音データに付加された運指データの生成に用いたアルゴリズムにより行われる。それにより、求めた手指の状態が不自然な形とならないようになっている。
【００５２】
上記動画制御データＡの生成によって、離鍵イベントでは離鍵させる指パートの離鍵後の状態が決定し、押鍵イベントでは指パートの押鍵時の状態の他に、必要に応じて、その状態への移行に合わせて他のパートの状態を決定する。他のパートの状態の決定とは、例えば押鍵すべき鍵の位置やその種類（白鍵か黒鍵か）に応じた手パートの移動や他の指パートの動き、押鍵中の鍵があれば、その鍵を押鍵させている指パートはその鍵から離すことができないことから、その手パートの移動に伴って指パート間を広げたり狭くする、或いは次に押鍵させる指パートを指くぐり、或いは指またぎさせて動かす、といったことである。ＣＰＵ１０１は、その決定した状態に移行するまでを幾つかの段階に分け、各段階毎にその状態を示すデータを生成し、ＲＡＭ１０３に動作制御データＡとは別に保存する。そのようにして生成・保存したデータが動作制御データＢである。なお、本実施の形態では、後述するように、イベント単位での動作制御データＡの生成に連動して、動作制御データＢの生成も行うようにしている。
【００５３】
図７は、上述したようにして生成・保存される動作制御データの構成を説明する図である。同図（ａ）は動作制御データＡ、同図（ｂ）は動作制御データＢを示す。
動作制御データＡは、図７（ａ）に示すように、値を変更すべき変数、或いは配列変数の要素を指定するデータ（以降、変数指定データと呼ぶ）、変数、或いは配列変数の要素の変更後の値である値データ、変数、或いは配列変数の要素に対応するパートを動作させている時間を示す動作時間データ、及びそのパートの動作終了、或いは動作開始のタイミングを指定する時間データを、演奏上の１イベントに対応するデータ（それらをまとめて単位動作データＡと呼ぶことにする）として構成されている。値データ、及び動作時間データは変数指定データ毎に存在する。それにより、変数指定データが指定する変数、或いは配列変数の要素の値で指定されるパートの状態は、独立に変化させられるようにしている。単位動作データＡ中の時間データは、楽音・運指データ中の対応する単位楽音データ中の時間データと一致する。なお、一組の変数指定データ、値データ、及び動作時間データはパートの或る状態量をどのように変化させるかを表していることから、以降、それらをまとめてパート動作データと呼ぶことにする。
【００５４】
図７（ａ）に示す動作制御データＡは、図２に示す楽音・運指データを基に生成されたものであり、以下のようなイベント、即ちパートの状態変化を生じさせることを表している。図２も参照しつつ、時系列に沿って説明する。
図２に示すように、楽音・運指データ中の最初の単位楽音データが指定するイベントは、音名が「Ｃ３」の楽音の発音開始である。その「Ｃ３」は、鍵番号（ノートナンバー）の６４が対応する。このため、そのイベントは、鍵盤号６４の鍵の押鍵を表している。
【００５５】
そのイベントの発生は、時間データの値である１００で指定されるタイミングであり、その前にはイベントは存在していない。各パートには初期状態（対応する変数、或いは配列変数の要素の初期値）を定めている。このため、そのイベントが発生する様子を表示するには、指番号データで指定された人差し指パートで鍵盤号６４の鍵を押鍵させるまでに、その押鍵を行える位置にまで手パートを移動させておかなければならない。ここでは、変数ｈｘの値を値データの１００として得られる位置に手パートを移動させなければならない。動作制御データＡ中の最初の単位動作データＡは、そのために生成されたものである。その単位動作データＡでは、時間データの値が０で動作時間データも０である。このため、それは、図８（ａ）に示すように、手パートは初めから変数ｈｘの値を１００としたｘ軸上の位置に表示させることを表している。
【００５６】
なお、手パートは、最初の押鍵を行える位置に初めから表示させなくても良い。例えば、予め定めた位置に表示させた後、その押鍵を行うべきタイミングとなるまでに、その位置から押鍵を行える位置に移動させても良い。時間データ、及び動作時間データの値は、予め定めた単位時間で表したものであることから、その値で指定される時間の単位は単位時間と呼ぶことにする。
【００５７】
次の単位動作データＡでは、時間データは１００、変数指定データは配列要素ｆｒｘ１［１］と配列要素ｎｏｔｅ［１］を指定し、値データは配列要素ｆｒｘ１［１］の値として１０を、配列変数ｎｏｔｅ［１］の値として６４をそれぞれ指定し、動作時間データは配列要素ｆｒｘ１［１］では−５、配列要素ｎｏｔｅ［１］では０となっている。これは、直前（最初）の単位動作データＡが表すイベントから１００単位時間が経過した後、人差し指パートを第１関節で曲げて鍵盤号６４の鍵を押鍵するイベントを発生させることを表している。動作時間データの負の値は、その第１関節で曲げ始めるのを時間データで指定されるタイミングより５単位時間だけ早く開始させることを表している。それにより、直前のイベントから９５単位時間が経過した後に、人差し指パートは鍵盤号６４の鍵に対する押鍵動作を開始し、１００単位時間が経過したときに押鍵が完了することになっている。配列変数ｎｏｔｅ［１］の動作時間データの０は時間データが示すタイミングで楽音を発音開始させることを表している。
【００５８】
その次の単位動作データＡでは、時間データは５０、変数指定データは配列要素ｆｒｘ１［１］と配列要素ｎｏｔｅ［１］を指定し、値データは配列要素ｆｒｘ１［１］の値として０を、配列変数ｎｏｔｅ［１］の値として０をそれぞれ指定し、動作時間データは配列要素ｆｒｘ１［１］では２、配列要素ｎｏｔｅ［１］では０となっている。これは、直前の単位動作データＡが表すイベントから５０単位時間が経過した後、それまで第１関節で曲げていた人差し指パートを伸ばして鍵盤号６４の鍵を離鍵するイベントを発生させることを表している。動作時間データの値は正である。それにより、直前のイベントから５０単位時間が経過した後に、人差し指パートは伸び始めて鍵盤号６４の鍵を離鍵し、それから２単位時間が経過して元の位置に戻ることになっている。配列変数ｎｏｔｅ［１］の値データの０は離鍵を表し、その動作時間データの０は時間データが示すタイミングで楽音を消音させることを表している。
【００５９】
このように、動作制御データＡ中の単位動作データＡは、イベント発生時に、どのパートをどの状態に移行させるかを指定するだけでなく、その移行にかける時間を動作時間データによって指定するようになっている。
一方の動作制御データＢは、図７（ｂ）に示すように、値を変更すべき変数、或いは配列変数の要素を指定する変数指定データ、変数、或いは配列変数の要素の変更後の値である値データ、及び、変数指定データとそれの値データによって指定される状態に変化させるタイミングを指定する時間データを、１段階の動作を表現するデータ（それらをまとめて段階動作データと呼ぶ）として構成されている。当然のことながら、段階動作データ中の時間データの値は、対応する単位動作データＡ中の時間データの値以下である。
【００６０】
単位動作データＡを構成するパート動作データの数、即ち変数指定データが指定する変数、或いは配列変数の要素の数は、それまでの状態やイベントの内容などによって異なる。指パートを折り曲げるだけで済むのであれば一つの配列変数の要素の値を変更するだけで済む。しかし、他の指パートとの間隔を広げて或る指パートを折り曲げるのであれば、その指パートでは二つの要素の値を変更する必要がある。例えばその指パートが中指パートであり、人差し指パートとの間隔を広げるのであれば、中指パートの外側に位置する薬指パートや小指パートも、その中指パートの横の動きに合わせて、それぞれ、一つの要素の値を変更しなければならない。このようなことから、図７（ｂ）には、各パート毎に、値の変更の対象となりうる変数、及び配列変数の要素を示してある。親指パートのｆｒｚ、ｆｒｘ１〜３は、全て配列変数の要素であり、明確に図示していないが、それらは人差し指パート、中指パート、薬指パート、及び小指パートにも存在する。各配列変数の要素は、指パートの指番号を引数として指定される。
【００６１】
図７（ｂ）に示す動作制御データＢは図７（ａ）に示す動作制御データＡを基に生成したものである。動作制御データＡ中で最初に位置する単位動作データＡ中の動作時間データの値は０であり、２番目の単位動作データＡ中の時間データの値は１００、その単位動作データＡ中で最初に位置するパート動作データ中の動作時間データの値は−５である。一方、動作制御データＢにおける２番目、及び３番目の段階動作データ中の時間データの値はそれぞれ９５、２となっている。このことから明らかなように、それらの段階動作データは２番目の単位動作データＡを基に生成されたものであり、人差し指パートによる押鍵動作を表現するために、特には図示していないが、変数指定データによって配列要素ｆｒｘ１［１］が指定され、それに代入すべき値が値データとして設定されている。
【００６２】
図８は、手指の動作表示例を説明する図である。図７に示す動作制御データに従って手指の各パートの状態を変化させていく様子を示したものである。図８（ａ）において、楽音・運指データでは、楽音・運指データによって指定される楽音の発音開始タイミング（押鍵タイミング）、及びその消音タイミング（離鍵タイミング）を時間軸上に矢印で示してある。楽音の音名（「Ｃ」や「Ｆ」など）は矢印の近傍に示してある。指動作では、押鍵動作開始タイミング、及び離鍵動作開始タイミングを時間軸上に矢印で示してある。その矢印の近傍に表記した「１」や「２」などの数字は、押鍵、或いは離鍵する指パートの指番号である。手ｘ位置では、手パートのｘ軸上の位置の時間変化を示してある。手ｙ位置、及び手ｚ位置では、それぞれ、手パートのｙ軸上、及びｚ軸上の位置の時間変化を示してある。手ｚ位置の時間軸に表記した０は、楽音・運指データの再生開始時点を示している。なお、手ｘ位置、手ｙ位置、及び手ｚ位置は、それぞれ、初期位置からの移動を相対的に示したものである。
【００６３】
図８（ａ）に示すように、押鍵動作は、実際に楽音を発音させるタイミングよりも前に開始し、離鍵動作は、楽音の消音タイミングと合わせて開始するようになっている。手パートのｘ軸上における位置は、音名が「Ｃ」の鍵の離鍵動作開始後に、次に人差し指パートによって音名が「Ｆ」の鍵を押鍵できる位置に向かって移動を開始し、その押鍵開始タイミングの前に移動を完了させている。手パートのｙ軸上における位置は、親指パート、人差し指パート、中指パート、及び薬指パートによって、それぞれ、発音される楽音の音名が「Ｄ＃」、「Ｆ」、「Ｇ」、及び「Ｂ」の鍵を同時に押鍵していることを表現するために、「Ｇ」の鍵の離鍵後に鍵盤３００に向かって移動を開始し、即ち図４に示す位置ＹＰＯＳ１から位置ＹＰＯＳ２に向かって移動を開始し、それらの鍵の離鍵が開始するまでは位置ＹＰＯＳ２にとどまり、その離鍵の開始後に位置ＹＰＯＳ２から位置ＹＰＯＳ１に向かって移動を開始する。手パートのｚ軸上における位置は、それらの鍵の押鍵動作開始から最後の鍵の押鍵が終了するまでの間に鍵盤３００に向かって下降する。即ちその間に図４に示す位置ＺＰＯＳ１から位置ＺＰＯＳ２に移動する。位置ＺＰＯＳ２から位置ＺＰＯＳ１への移動は、それらの鍵の離鍵動作開始から最後の鍵の離鍵が終了するまでの間に行われている。
【００６４】
図８（ｂ）は、図８（ａ）中の時点▲１▼〜▲５▼における手パートの基点（手首）３０１の位置を示す図である。それらの時点▲１▼〜▲５▼におけるｘｙ平面上の位置は、それぞれ、▲１▼〜▲５▼で示してある。
図８（ｂ）に示すように、手パートは、始めに▲１▼で示す位置から▲２▼で示す位置にまで移動する。次には複数鍵を同時に押鍵するために、▲３▼で示す位置に移動する。その▲３▼で示す位置と▲４▼で示す位置が同じことから明らかなように、複数鍵を押鍵している間はその位置にとどまる。▲１▼で示す位置は▲５▼で示す位置と同じである。このことから、複数鍵を離鍵後は、▲４▼で示す位置から▲１▼で示す位置に移動する。
【００６５】
上述したように、手パートを移動させたり、各指パートの状態を変化させることで手指の動作を動画で表現している。
図９は、実際の表示例を示す図である。
図９に示すように、実際には、右手だけでなく、左手も表示している。押鍵中か否かをユーザが判りやすいように、押鍵中の鍵は他と表示色を変えて表現している。その表示色の変更は、押鍵時（発音開始時）から離鍵時（消音時）の間だけ行っても良いが、押鍵すべき鍵を事前に通知する、或いは離鍵すべき鍵を事前に通知する、といったことのために、表示色を複数の色に変更するようにしても良い。なお、特に詳細な説明は省略するが、本実施の形態では、手指の各パートのサイズの変更、即ち拡大、或いは縮小や、各パートの表示の透過表示、或いはワイヤーフレーム表示への変更、表示角度の変更、なども行えるようになっている。ユーザが実際に操作する鍵盤を備えている場合には、ユーザの演奏速度に応じて、楽音・運指データの再生速度（演奏動作の表示速度を含む）を変更するようにしても良い。
【００６６】
図９に示すような手指パートの動作表示は、ユーザが操作部１０６を操作して、ＲＡＭ１０３に格納された楽音・運指データの再生を指示した場合に行われる。その指示をユーザが行うと、ＣＰＵ１０１は、楽音・運指データ（ここでは運指データを除いた部分である楽音データのみが対象）とそれを基に生成した動作制御データＢを並行に処理する。それにより、楽音の発音と同期した手指の各パートの動作を表示部１０５に表示させる。本実施の形態では、それ以外に、楽音データから演奏内容を示す楽譜を表示するようになっている。
【００６７】
図１０は、本実施の形態による演奏動作表示装置の機能ブロック図である。
図１０に示すように、上記演奏動作表示装置は、機能的に見て、基本的に、楽音・運指データから動作制御データを生成するデータ生成部８０１、及び楽音・運指データや動作制御データを再生するリアルタイム処理部８０２から構成されている。データ生成部８０１において、楽音・運指データから動作制御データを生成するのは動作制御データ生成部８０３によって行われる。そのデータ生成部８０１には、図１において、例えばＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３、データ入力部１０４、表示部１０５、及び操作部１０６が対応する。
【００６８】
一方のリアルタイム処理部８０２は、データ生成部８０１が生成した動作制御データや楽音データを処理するデータ送出部（シーケンス処理部）８０４、そのデータ送出部８０４から送られた動作制御データに従って手指の動作を表示する動作表示部８０５、それから送られた楽音データに従って楽音を放音する音源部８０６、及びそれから送られた楽音データに応じて楽譜を表示する楽譜表示部８０７を備えたものである。図１において、例えばＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３、表示部１０５、操作部１０６、音源１０７、及びサウンドシステム１０８が対応する。
【００６９】
次に、上述した動作制御データの生成やその再生などを実現するＣＰＵ１０１の動作について、図１１〜図２５に示す各種動作フローチャートを参照して詳細に説明する。
図１１は、動作制御データ生成処理の動作フローチャートである。この生成処理は、ユーザが操作部１０６を操作して、ＲＡＭ１０３に格納された楽音・運指データのなかから一つを指定（選択）し、動作制御データの生成を指示した場合に、ＣＰＵ１０１が、ＲＯＭ１０２に格納されているプログラムを実行することで実現される処理である。図１０に示すデータ生成部８０１はその生成処理を実行することによって実現される。始めに図１１を参照して、その生成処理について詳細に説明する。
【００７０】
この生成処理では、ユーザが指定した楽音・運指データから単位楽音データ、及びそれに付加された指番号データを順次、読み出しながら、その単位楽音データが表すイベントを指番号データが指定する指によって発生させる様子を表示するための動作制御データを生成するようになっている。ここでは、単位楽音データが表すイベントの種類として、ノートオンイベント、及びノートオフイベントに重点をおいて処理の流れを示してある。
【００７１】
先ず、ステップ９０１では、初期設定を行う。その初期設定により、各種変数には初期値が代入され、ＲＡＭ１０３には動作制御データを格納する領域が確保される。楽音・運指データから読み出す単位楽音データを管理するための変数ｐｅには、その先頭に位置する単位楽音データが格納されたアドレス値が代入される。
【００７２】
ステップ９０１に続くステップ９０２では、楽音・運指データが終了したか否か判定する。例えば、楽音・運指データの最後には、そのデータの終了を表すユニークなデータ（以降、エンドデータと呼ぶ）が付加されている。このため、変数ｐｅの値が指定するデータがそのエンドデータであった場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ９０３に移行する。
【００７３】
ステップ９０３では、変数ｔｋｏｌｄに変数ｔｋｔｉｍｅの値を代入した後、その変数ｔｋｔｉｍｅに、それまでの値に変数ｐｅが指定する単位楽音データの時間データの値ｔｋｔを加算した値を代入する。続くステップ９０４では、その変数ｐｅの値が指定する単位楽音データが表すイベントがノートオンイベントか否か判定する。その単位楽音データがノートオンイベントを表すものであった場合、判定はＹＥＳとなってステップ９０５に移行し、そうでない場合には、判定はＮＯとなってステップ９１５に移行する。なお、各単位楽音データの時間データの値を累算していくことから明らかなように、変数ｔｋｔｉｍｅの値は楽音データの再生を開始してから経過した時間（絶対時間）で示す値である。
【００７４】
ステップ９０５〜９０９では、ノートオンイベントを表す単位楽音データに対応するための処理が行われる。
先ず、ステップ９０５では、変数ｐｅの値で指定される単位楽音データを基に、各種の設定を行う。それにより、変数ｆｉｇに指番号データの値を代入し、変数ｎｏｔｅには音高データ（鍵盤号）を代入するとともに、それらの値から単位動作データＡを生成して保存する。そのような代入が終了した後はステップ９０６に移行する。なお、ここで生成される単位動作データＡは、時間データ、変数ｆｉｇの値で指定される配列要素ｎｏｔｅ［ｆｉｇ］を指定する変数指定データ、及びその配列要素ｎｏｔｅ［ｆｉｇ］の値データ（変数ｆｉｇの値で指定される指パートに押鍵させる鍵のノートナンバー）である（図７（ａ）参照）。
【００７５】
ステップ９０６では、その変数ｐｅの値で指定される単位楽音データが表すノートオンイベントの発生時に、他のノートオンイベントが発生中か否か、即ち他の鍵が押鍵されているか否か判定する。他の鍵が押鍵されていない場合、判定はＹＥＳとなってステップ９０７に移行し、そうでない場合には、判定はＮＯとなって後述するステップ９０９に移行する。なお、上記押鍵の判定は、楽音・運指データが表す仮想的な演奏を想定しての判定である。以降も便宜的に、特に断らない限り、その想定で説明を行うことにする。
【００７６】
ステップ９０７では、手パートのｙ軸上の位置を決定する手のｙ位置処理を実行する。続くステップ９０８では、手パートのｚ軸上の位置を決定する手のｚ位置処理を実行する。その後に移行するステップ９０９では、他のイベントとの関係を考慮しつつ、単位楽音データが表すノートオンイベントに応じて手指の各パートを動作させる内容を決定するノートオンメイン処理を実行する。そのノートオンメイン処理を実行した後はステップ９１０に移行する。
【００７７】
ステップ９１０では、変数ｂｃｈｏｒｄに「ＴＲＵＥ」を表す値が代入されているか否か判定する。直前のノートオンメイン処理の実行時に、単位楽音データが表すノートイベントが和音を発音させるためのものであると判定すると、その変数ｂｃｈｏｒｄには「ＴＲＵＥ」を表す値が代入される。このため、ノートオンメイン処理の実行時に単位楽音データが和音を発音させるためのものと判定されていた場合、判定はＹＥＳとなってステップ９１３に移行する。そうでない場合には、判定はＮＯとなり、ステップ９１１に移行する。
【００７８】
ステップ９１１では、手パートのｘ軸上の位置を決定する手のｘ位置処理を実行する。続くステップ９１２では、手パートのｙ軸上の位置を再度、決定する手のｙ位置再処理を実行する。その処理を実行した後は、ステップ９１３でその他の処理を実行し、続くステップ９１４で変数ｐｅに、次に対象となる単位楽音データのアドレスを代入した後、上記ステップ９０２に戻る。
【００７９】
上記ステップ９０７〜９０９、９１１、９１２、及び後述するステップ９１７では、それぞれ、特定の動作が伴うパラメータ（変数、或いは配列変数の要素）に着目したパート動作データの生成が行われ、それが単位動作データＡに追加される。それにより、ステップ９１３に移行時には、手指の各パートをどのような状態に移行させるかが確定するようになっている。このため、ステップ９１３では、単位動作データＡから段階動作データを生成し、それをＲＡＭ１０３に格納することを行っている。その生成は、本実施の形態では、動作時間データで指定される時間間隔を複数に区切り、それまでの状態と移行後の状態の間を直線で補間することで行っている。また、そのステップ９１３では、ノートオンイベント、及びノートオフイベント以外のイベントを表す単位楽音データの処理も行っている。
【００８０】
一方、上記ステップ９０４の判定がＮＯとなって移行するステップ９１５では、変数ｐｅの値で指定される単位楽音データがノートオフイベントを表しているか否か判定する。その単位楽音データがノートオフイベントを表している場合、判定はＹＥＳとなってステップ９１６に移行する。そうでない場合には、上記ステップ９１３に移行する。
【００８１】
ステップ９１６では、変数ｐｅの値で指定される単位楽音データを基に、各種の設定を行う。それにより、変数ｆｉｇに指番号データの値を代入し、変数ｎｏｔｅには音高データ（鍵盤号）を代入するとともに、それらの値から単位動作データＡを生成して保存する。そのような代入が終了した後はステップ９０６に移行する。なお、ここで生成される単位動作データＡは、時間データ、変数ｆｉｇの値で指定される配列要素ｎｏｔｅ［ｆｉｇ］を指定する変数指定データ、及びその配列要素ｎｏｔｅ［ｆｉｇ］の値データ（ここでは離鍵なので０である）である。
【００８２】
それに続くステップ９１７では、ノートオフイベント時に手指の各パートを動作させるための動作制御データ（単位動作データＡに追加するパート動作データ）を生成するノートオフメイン処理を実行する。その後は上記ステップ９１０に移行する。
【００８３】
上述したようにして、動作制御データ生成処理では、動作制御データの生成の対象とする単位楽音データ、及びそれに付加した指番号データを順次、変更しながら動作制御データを生成する。それにより、動作制御データは演奏上のイベント単位で生成するようになっている。
【００８４】
次に、上記動作制御データ生成処理内で実行される各種サブルーチン処理について、図１２〜図２４に示すその動作フローチャートを参照しながら詳細に説明する。
図１２は、上記ステップ９０７として実行される手のｙ位置処理の動作フローチャートである。サブルーチン処理では、始めに図１２を参照して、手のｙ位置処理について詳細に説明する。
【００８５】
基点３０１のｙ軸上の位置を示す値は、変数ｈｙｎｅｗに保持されている。この手のｙ位置処理では、基点３０１を次に配置すべき位置を求め、その位置を示す値を変数ｈｙｎｅｗに代入することが行われる。
先ず、ステップ１００１では、初期設定を行い、変数ｈｙｎｅｗの値を変数ｈｙｎｏｗに代入する。続くステップ１００２では、現在、対象としている単位楽音データ、及び指番号データ以降のデータを読み出し、次に全ての鍵が離鍵するまでに親指か小指が黒鍵を押鍵するようになっているか否か判定する。次に全ての鍵が離鍵するまでに、０、或いは４を指番号データとする単位楽音データが存在していた場合、判定はＹＥＳとなってステップ１００５に移行する。そうでない場合には、判定はＮＯとなってステップ１００３に移行する。
【００８６】
ステップ１００３では、変数ｈｙｎｏｗに位置ＹＰＯＳ１（図４参照）を示す値が代入されているか否か判定する。その値が変数ｈｙｎｏｗに代入されていた場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ステップ１００４で変数ｈｙｎｅｗに位置ＹＰＯＳ２を示す値を代入し、直前の単位楽音データの処理タイミングから今回の単位楽音データの処理タイミングまでに位置ＹＰＯＳ１への移動を完了させるパート動作データを生成し、それを単位動作データＡに追加した後、一連の処理を終了する。
【００８７】
一方、ステップ１００２の判定がＹＥＳとなって移行するステップ１００５でも、変数ｈｙｎｏｗに位置ＹＰＯＳ１（図４参照）を示す値が代入されているか否か判定する。その値が変数ｈｙｎｏｗに代入されていなかった場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなり、ステップ１００６で変数ｈｙｎｅｗに位置ＹＰＯＳ１を示す値を代入し、直前の単位楽音データの処理タイミングから今回の単位楽音データの処理タイミングまでに位置ＹＰＯＳ２への移動を完了させるパート動作データを生成した後、一連の処理を終了する。
【００８８】
このように、手のｙ位置処理では、ユーザが親指、或いは小指を使って黒鍵を押鍵しなければならない場合、手パートを位置ＹＰＯＳ２に移動させて、鍵盤３００に予め近づけるようにしている。今回を含め、親指、及び小指を使うことなく、全ての鍵を離鍵している状態となる場合、手パートは位置ＹＰＯＳ１に位置させている。
【００８９】
親指、或いは小指を使って黒鍵を押鍵する以外にも、指を大きく開いた形で複数の鍵を押鍵したりすると、手と鍵盤との間のｙ軸上の距離は小さくなる。そのようなことに対応するための手パートの基点３０１のｙ軸上における位置調整は、ステップ９１２として実行される手のｙ位置再処理で行っている。
【００９０】
図１３は、図１１に示す動作制御データ生成処理内でステップ９０８として実行される手のｚ位置処理の動作フローチャートである。次に、図１３を参照して、その処理について詳細に説明する。
現時点において基点３０１が存在すべきｚ軸上の位置を示す値は変数ｈｚｎｏｗに保持されている。直前の単位楽音データを処理した際の変数ｔｋｔｉｍｅの値は変数ｔｋｏｌｄに保持されている。手パートの基点３０１は、図４に示すように、ｚ軸上では位置ＺＰＯＳ１、或いはＺＰＯＳ２の何れかの位置をとる。手のｚ位置処理の実行時は、押鍵されている鍵が存在していない状況である。
【００９１】
先ず、ステップ１１０１では、変数ｈｚｎｏｗに位置ＺＰＯＳ１を示す値が代入されているか否か判定する。その値が変数ｈｚｎｏｗに代入されていた場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、即ち手パートの基点３０１が位置ＺＰＯＳ２に位置している場合には、判定はＮＯとなり、ステップ１１０２に移行して、変数ｔｋｏｌｄの値が示すタイミングから変数ｔｋｔｉｍｅの値が示すタイミングまでに、基点３０１を位置ＺＰＯＳ２から位置ＺＰＯＳ１に移動させるパート動作データを作成し、それを単位動作データＡに追加する形でＲＡＭ１０３に格納する。それが終了した後に一連の処理を終了する。
【００９２】
図１４は、図１１に示す動作制御データ生成処理内でステップ９０９として実行されるノートオンメイン処理の動作フローチャートである。次に、図１４を参照して、その処理について詳細に説明する。
現在、処理対象としている単位楽音データを実際に処理、即ち再生する際に、和音（コード）が発音中か否かを示す値（「ＴＲＵＥ」或いは「ＦＡＬＳＥ」）は変数ｂｃｈｏｒｄに保持されている。和音が発音中であれば、その和音を構成する楽音のなかで最後に発音が開始する楽音の単位楽音データのアドレスは変数ｐｃｈｏｒｄｅｎｄに保持されている。ノートオンメイン処理では、そのような変数を含む各種変数の値が参照される。
【００９３】
先ず、ステップ１２０１では、変数ｂｃｈｏｒｄの値が「ＴＲＵＥ」か否か判定する。処理対象としている単位楽音データを再生する状況で和音を発音させているとみなしていた場合、その変数ｂｃｈｏｒｄには「ＴＲＵＥ」が代入されていることから、判定はＹＥＳとなってステップ１２０７に移行し、そうでない場合には、判定はＮＯとなってステップ１２０２に移行する。
【００９４】
ステップ１２０２では、変数ｂａｌｌｏｆｆの値が「ＴＲＵＥ」か否か判定する。処理対象としている単位楽音データを再生する状況で押鍵されている鍵が存在している場合、判定はＮＯとなってステップ１２０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１２０３に移行する。
【００９５】
ステップ１２０３では、処理対象としている単位楽音データ、及びそれに続く単位楽音データによって和音が発音されるか否か判定する和音判定処理を実行する。その和音判定処理において、それらの単位楽音データによって和音が発音されると判定すると、変数ｂｃｈｏｒｄには「ＴＲＵＥ」が代入されることになる。その実行後は、ステップ１２０４に移行する。
【００９６】
ステップ１２０４では、変数ｂｃｈｏｒｄの値が「ＴＲＵＥ」か否か判定する。上記和音判定処理を実行した結果、新たに和音が発音されるとみなした場合、判定はＹＥＳとなり、ステップ１２０５でその和音を発音させる動作の内容を決定する和音動作処理を実行した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ステップ１２０６で押鍵動作の内容を決定するノートオン動作処理を実行した後、一連の処理を終了する。
【００９７】
一方、上記ステップ１２０１の判定がＹＥＳとなって移行するステップ１２０７では、変数ｐｃｈｏｒｄｅｎｄの値が変数ｐｅの値と等しいか否か判定する。変数ｐｅの値が指定する単位楽音データ、即ち現在、処理対象としている単位楽音データが、和音を構成しているとみなす楽音のなかで最後に発音される楽音の発音開始を指示するものであった場合、判定はＹＥＳとなり、ステップ１２０８で変数ｂｃｈｏｒｄに「ＦＡＬＳＥ」、変数ｐｃｈｏｒｄｅｎｄにＮＵＬＬ（空値）をそれぞれ代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなって、ここで一連の処理を終了する。
【００９８】
このように、ノートオンメイン処理では、単位楽音データが発音開始を指示する楽音が和音を構成しているか否かにより処理を分岐させている。それにより、和音を発音させるのか単に楽音を発音させるのかに応じて、手指の各パートを動作させるようにしている。
【００９９】
ここで、上記ノートオンメイン処理内で実行される各種サブルーチン処理について、図１５〜図１８を参照して詳細に説明する。
図１５は、上記ステップ１２０３として実行される和音判定処理の動作フローチャートである。ノートオンメイン処理内で実行されるサブルーチン処理では、図１５を参照して、始めに和音判定処理について詳細に説明する。
【０１００】
先ず、ステップ１３０１では、初期設定を行う。その初期設定を行うことにより、変数ｔｋｎｅｘｔには、変数ｐｅの値で指定される単位楽音データ以降で最初に楽音の発音開始を指示する単位楽音データの処理タイミングを絶対時間で示す値が代入され、変数ｔｋｎｅｘｔｏｆｆには、変数ｐｅの値で指定される単位楽音データ以降で最初に楽音の消音を指示する単位楽音データの処理タイミングを絶対時間で示す値が代入される。
【０１０１】
ステップ１３０１に続くステップ１３０２では、変数ｔｋｎｅｘｔの値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値より小さいか否か判定する。その変数ｔｋｃｈｏｒｄには、和音を構成しているか否か判定するうえで基準となる、楽音間の発音開始間隔を示す値が代入されている。このことから、その間隔以内に次の楽音の発音が開始する場合、判定はＹＥＳとなってステップ１３０３に移行し、そうでない場合には、判定はＮＯとなって、ここで一連の処理を終了する。
【０１０２】
ステップ１３０３では、変数ｔｋｎｅｘｔｏｆｆの値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値より大きいか否か判定する。変数ｔｋｃｈｏｒｄの値が示す時間が経過する前に、消音される楽音が存在していない場合、判定はＹＥＳとなり、ステップ１３０４で変数ｂｃｈｏｒｄに「ＴＲＵＥ」を代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【０１０３】
このように、本実施の形態では、変数ｔｋｃｈｏｒｄの値が示す時間内に複数の押鍵（ノートオンイベント）があり、且つその時間内に離鍵（ノートオフイベント）が存在していなければ、その時間内に発音開始される楽音は和音を構成しているとみなすようにしている。
【０１０４】
図１６は、図１４に示すノートオンメイン処理内でステップ１２０５として実行される和音動作処理の動作フローチャートである。次に図１６を参照して、和音動作処理について詳細に説明する。
先ず、ステップ１４０１では、初期化処理を実行する。その初期化処理を実行することにより、変数ｔｋｔｉｍｅ０には、変数ｔｋｔｉｍｅの値が代入され、変数ｐｅ０には変数ｐｅの値が代入され、変数ｐｃｈｏｒｄｅｎｄにはＮＵＬＬが代入される。ステップ１４０１に続くステップ１４０２以降は、変数ｐｅ０の値を順次、インクリメントしながら、和音とみなす楽音の範囲の特定や、その和音を鳴らす動作内容を決定するための処理が行われる。
【０１０５】
ステップ１４０２では、楽音・運指データが終了したか否か判定する。変数ｐｅ０の値が指定するデータが楽音・運指データの最後に位置するエンドデータであった場合、判定はＹＥＳとなってステップ１４１０に移行し、そうでない場合には、判定はＮＯとなってステップ１４０３に移行する。
【０１０６】
ステップ１４０３では、変数ｐｅ０の値が変数ｐｅの値と等しいか否か判定する。それらの値が等しい場合、判定はＹＥＳとなってステップ１４０５に移行する。そうでない場合には、判定はＮＯとなり、ステップ１４０４で変数ｔｋｔｉｍｅ０に、それまでの値に変数ｐｅ０の値が指定する単位楽音データの時間データの値を加算した値を代入した後、そのステップ１４０５に移行する。そのようにして、変数ｔｋｔｉｍｅ０には、変数ｐｅの値が指定する単位楽音データ以降の単位楽音データを処理すべきタイミングを絶対時間で示す値が代入される。
【０１０７】
ステップ１４０５では、変数ｔｋｔｉｍｅ０の値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値よりも小さいか否か判定する。変数ｐｅ０、及びｐｅの値がそれぞれ指定する単位楽音データの処理タイミングが、変数ｔｋｃｈｏｒｄの値で指定される時間内でなかった場合、判定はＮＯとなって上記ステップ１４１０に移行する。そうでない場合には、判定はＹＥＳとなってステップ１４０６に移行する。
【０１０８】
ステップ１４０６では、変数ｐｅ０の値が指定する単位楽音データは押鍵（ノートオンイベント）を表すものであるか否か判定する。その単位楽音データがノートオンイベントを表していた場合、判定はＹＥＳとなり、ステップ１４０７で変数ｐｃｈｏｒｄｅｎｄに変数ｐｅ０の値を代入し、続くステップ１４０８でノートオン動作処理を実行した後、ステップ１４０９に移行する。そうでない場合には、判定はＮＯとなってそのステップ１４０９に移行する。
【０１０９】
ステップ１４０９では、変数ｐｅ０に次の単位楽音データのアドレスを代入する。それを行った後、上記ステップ１４０２に戻る。
このように、ステップ１４０２〜１４０９で形成される処理ループをステップ１４０２の判定がＹＥＳ、或いはステップ１４０５の判定がＮＯとなるまで繰り返し実行することにより、変数ｐｃｈｏｒｄｅｎｄには、和音を構成するとみなす楽音のなかで最後に発音が開始する楽音の単位楽音データのアドレス値が代入されることになる。
【０１１０】
一方、ステップ１４０２の判定がＹＥＳ、或いはステップ１４０５の判定がＮＯとなって移行するステップ１４１０では、手パートがｚ軸上を移動していく動作（ここでは図４に示す位置ＺＰＯＳ１から位置ＺＰＯＳ２に移動していく動作である）を表現するパート動作データを作成する。その動作データを作成することにより、手パートの基点３０１が、変数ｔｋｓｔａｒｔ０の値が示すタイミングで移動を開始し、変数ｔｋｔｉｍｅの値が示すタイミングで位置ＺＰＯＳ２への移動が終了するようにさせる。そのようなパート動作データを単位動作データＡに追加した後、一連の処理を終了する。
【０１１１】
上記変数ｔｋｓｔａｒｔ０の値が示すタイミングは、和音を構成する楽音のなかで最初に発音される楽音を発音させる指パートの動作を開始するタイミングか、或いは各指パートの離鍵から押鍵に移行するまでの時間が比較的に長ければ、変数ｔｋｔｉｍｅの値から、押鍵動作を開始してから押鍵するまでの基準時間を示す値を引いた値が示すタイミングである。それにより、和音を鳴らす状況に応じて、それを鳴らすための手指の各パートの動作を異ならせるようにしている。図８に示す例では、変数ｔｋｓｔａｒｔ０に前者の値が代入、即ちパート動作データ中の動作時間データにその値に対応する時間を表す値が設定された結果、親指パートの押鍵動作の開始に合わせて手パートのｚ軸上の移動が開始し、そのｚ軸上の移動が「Ｄ＃」の楽音の発音開始時に終了していることを表している。なお、その基準時間を示す値は変数ｔｋｃｏｓｔに代入されている。離鍵動作を開始してからその動作が完了するまでの基準時間を示す値は変数ｔｋｏｆｆｃｏｓｔに代入されている。
【０１１２】
次に、上記ステップ１４０８、或いは図１４に示すノートオンメイン処理内でステップ１２０６として実行されるノートオン動作処理について、図１７、及び図１８に示すその動作フローチャートを参照して詳細に説明する。なお、この処理内では、単位楽音データに付加された指番号データは変数ｆｉｇに、その単位楽音データ中の音高データは変数ｎｏｔｅに代入されている。
【０１１３】
先ず、ステップ１５０１では、初期設定を行う。その初期設定では、変数ｆｉｇの値を指番号データとして付加された、ノートオフイベントを表す直前の単位楽音データの処理タイミングを絶対時間で示す値を求め、その求めた値を変数ｔｋｆｏｆｆに代入することが行われる。
【０１１４】
ステップ１５０１に続くステップ１５０２では、変数ｔｋｔｉｍｅの値から変数ｔｋｆｏｆｆの値を引いた値が、変数ｔｋｃｏｓｔの値に変数ｔｋｏｆｆｃｏｓｔの値を加算した値より小さいか否か判定する。即ち変数ｆｉｇで指定される指パートの離鍵動作を開始させてからその指パートを押鍵させるまでの時間が、離鍵動作の基準時間と押鍵動作の基準時間を足した時間よりも短いか否か判定する。前者の時間が後者の時間よりも長い場合、判定はＮＯとなり、ステップ１５０３で変数ｔｋｓｔａｒｔに、変数ｔｋｔｉｍｅの値から変数ｔｋｏｆｆｃｏｓｔの値を引いた値を代入した後、ステップ１５０４に移行する。そうでない場合には、即ち離鍵動作、或いは押鍵動作を基準時間で行わせる余裕がない場合には、判定はＹＥＳとなってステップ１５０５に移行する。
【０１１５】
ステップ１５０４では、変数ｔｋｅｎｄに、押鍵動作が終了するタイミングを示す値として変数ｔｋｔｉｍｅの値を代入する。続く図１８のステップ１５０８では、ノートオン中の楽音は１つ以下か否か判定する。鍵を押鍵させている指パートが２つ以上であった場合、判定はＮＯとなってステップ１５０９に移行する。そうでない場合には、判定はＹＥＳとなってステップ１５１０に移行する。
【０１１６】
ステップ１５０９では、変数ｆｉｇの値で指定される指パートが、変数ｔｋｓｔａｒｔの値が示すタイミングで変数ｎｏｔｅの値が示す鍵に対する押鍵動作を開始し、変数ｔｋｅｎｄの値が示すタイミングでその動作を完了、即ち押鍵する動作を終了させるためのパート動作データを作成し単位動作データＡに追加する。そのパート動作データ中の動作時間データの値が示す時間は、変数ｔｋｏｆｆｃｏｓｔの値が示す時間である。その作成・追加を行った後に、一連の処理を終了する。
【０１１７】
一方、ステップ１５１０〜１５１９では、直前に処理した単位楽音データ、及びそれに付加された指番号データを参照して、指くぐり、或いは指またぎといった指パートを交差させる形での動作を行わせる必要性の有無を判定し、その判定結果に応じてパート動作データを作成し単位動作データＡに追加するための処理が行われる。
【０１１８】
先ず、ステップ１５１０では、直前に処理した単位楽音データに付加された指番号データを変数ｆｉｇａに、その単位楽音データ中の音高データを変数ｎｏｔｅａにそれぞれ代入する。その代入後に移行するステップ１５１１では、変数ｎｏｔｅ、ｎｏｔｅａに音高データが代入された楽音は共に和音の構成音ではないか否か判定する。それらの楽音のうちの一方でも和音の構成音であった場合、即ち和音を鳴らすためにその構成音を発音させている、或いは和音を鳴らした後、再度、和音を鳴らすような場合、判定はＮＯとなってステップ１５０９に移行して、それを実行する。そうでない場合には、判定はＹＥＳとなってステップ１５１２に移行する。
【０１１９】
ステップ１５１２では、変数ｎｏｔｅａに音高データが代入された楽音をノートオフさせるタイミングが変数ｎｏｔｅに音高データが代入された楽音をノートオンさせるタイミングより後になっているか、即ちそれら２つの楽音を発音させる期間が重なっているか、或いは前者をノートオフさせてから後者をノートオンさせる時間間隔が所定時間内か否か判定する。それら２つの条件のうちの何れもが満たされていない場合、判定はＮＯとなって上記ステップ１５０９に移行する。そうでない場合には、即ちそれら２つの条件のうちの一方が満たされている場合には、判定はＹＥＳとなってステップ１５１３に移行する。
【０１２０】
ステップ１５１３では、変数ｆｉｇ、ｆｉｇａにそれぞれ代入された指番号データで指定される指パートが親指と、人差し指、中指、及び薬指のうちの何れかの関係となっているか否か判定する。その関係が満たされていない場合、判定はＮＯとなって上記ステップ１５０９に移行する。そうでない場合には、判定はＹＥＳとなってステップ１５１４に移行する。
【０１２１】
ステップ１５１４では、変数ｆｉｇの指番号データで指定されるのが親指で変数ｎｏｔｅの音高データは変数ｎｏｔｅａの音高データより高い音高を示しているか否か判定する。変数ｆｉｇの指番号データで指定されるのが親指であり、その親指に、現在、ノートオンさせている、或いは直前にノートオフさせた鍵の音高よりも高い音高の鍵をノートオンさせる場合、判定はＹＥＳとなってステップ１５１５に移行する。そうでない場合には、判定はＮＯとなってステップ１５１７に移行する。
【０１２２】
ステップ１５１５では、人差し指パートなどの指パートの下をくぐらせて親指パートに次に押鍵すべき鍵を押鍵させる指くぐりを行うべき条件が満たされているとして、変数ｋｕｇｕｒｕに「ＴＲＵＥ」を表す値を代入する。続くステップ１５１６では、変数ｆｉｇの値で指定される親指パートをくぐらせて変数ｎｏｔｅの値が示す鍵を押鍵させる動作を変数ｔｋｓｔａｒｔの値が示すタイミングで開始させ、変数ｔｋｅｎｄの値が示すタイミングでその動作を完了、即ち押鍵する動作を終了させるためのパート動作データを作成し単位動作データＡに追加する。そのパート動作データ中の動作時間データの値が示す時間は、変数ｔｋｏｆｆｃｏｓｔの値が示す時間である。その作成・追加を行った後に、一連の処理を終了する。
【０１２３】
上記ステップ１５１４の判定がＮＯとなって移行するステップ１５１７では、変数ｆｉｇａの指番号データで指定されるのが親指で変数ｎｏｔｅａの音高データは変数ｎｏｔｅの音高データより高い音高を示しているか否か判定する。変数ｆｉｇａの指番号データで指定されるのが親指であり、その親指に現在、押鍵させている、或いは直前に離鍵させた鍵の音高よりも低い音高の鍵をノートオンさせる場合、判定はＹＥＳとなってステップ１５１８に移行する。そうでない場合には、判定はＮＯとなって上記ステップ１５０９に移行する。
【０１２４】
ステップ１５１８では、親指パートの上を人差し指パートなどの指パートにまたがせて、次に押鍵すべき鍵を押鍵させる指またぎを行うべき条件が満たされているとして、変数ｍａｔａｇｕに「ＴＲＵＥ」を表す値を代入する。続くステップ１５１９では、変数ｆｉｇの値で指定される指パートを、親指パートの上をまたがせて変数ｎｏｔｅの値が示す鍵を押鍵させる動作を変数ｔｋｓｔａｒｔの値が示すタイミングで開始させ、変数ｔｋｅｎｄの値が示すタイミングでその動作を完了、即ち押鍵する動作を終了させるためのパート動作データを作成し単位動作データＡに追加する。そのパート動作データ中の動作時間データの値が示す時間は、変数ｔｋｏｆｆｃｏｓｔの値が示す時間である。その作成・追加を行った後に、一連の処理を終了する。
【０１２５】
このようにして、本実施の形態では、指くぐり、或いは指またぎを行わせて次の鍵を押鍵させるべき状況か否か判定し、その判定結果に応じてパート動作データを作成している。それにより、そのような指パートを交差させる動作を含め、演奏動作を表示させている。
【０１２６】
手パートを移動させなければ変数ｆｉｇの値で指定される指パートで鍵を押鍵させることができないこともある。各指パートの回転角ｆｒｚは、その手パートの位置が確定していなければ確定させることはできない。このようなことから、ここでは単に押鍵する動作を行わせるためのパート動作データだけを作成している。指パートを横に動作させるためのパート動作データは、図１１に示す動作制御データ生成処理内のステップ９１１の手のｘ位置処理を実行した際に、必要に応じて作成する。ここで作成したパート動作データも必要に応じて修正する。そのために、上記変数ｋｕｇｕｒｕ、ｍａｔａｇｕは、手のＸ位置処理の実行時に参照される。
【０１２７】
図１７のステップ１５０２の判定がＹＥＳとなって移行するステップ１５０５では、変数ｔｋｔｉｍｅの値から変数ｔｋｆｏｆｆの値を引いた値に０．２を掛けた値が、変数ｔｋｏｆｆｃｏｓｔの値よりも大きいか否か判定する。離鍵開始から次の押鍵までの時間に０．２を掛けて得られる時間が、離鍵動作の基準時間よりも長い場合、判定はＹＥＳとなり、ステップ１５０６で変数ｔｋｓｔａｒｔに、変数ｔｋｆｏｆｆの値に変数ｔｋｏｆｆｃｏｓｔの値を加算した値を代入した後、上記ステップ１５０４に移行する。そうでない場合には、判定はＮＯとなり、ステップ１５０７で変数ｔｋｓｔａｒｔに、変数ｔｋｏｆｆｃｏｓｔの値に０．８を掛けた値に変数ｔｋｆｏｆｆの値を加算した値を代入した後、ステップ１５０４に移行する。
【０１２８】
上記ステップ１５０６、或いは１５０７を実行した後にステップ１５０４に移行したのであれば、ステップ１５０９、１５１６、或いは１５１９を実行した際に設定される動作時間データの値は、ステップ１５０６からステップ１５０４に移行したのであれば、変数ｔｋｔｉｍｅの値から変数ｔｋｆｏｆｆの値を減算し、その減算結果から更に変数ｔｋｏｆｆｃｏｓｔの値を減算した値である。ステップ１５０７からステップ１５０４に移行したのであれば、変数ｔｋｔｉｍｅの値から変数ｔｋｆｏｆｆの値を減算し、その減算結果から更に、変数ｔｋｏｆｆｃｏｓｕｔの値に０．８を掛けた値を減算した値である。
【０１２９】
直前に処理した単位楽音データが表すイベントがノートオフイベントであり、ステップ１５１６、或いは１５１９を実行したのであれば、その単位楽音データを処理した際に、くぐらせる、或いはまたがせる指パートの動作を開始させるパート動作データを生成するようになっている。このため、ステップ１５１６、及び１５１９では、その生成したパート動作データで表される動作を継続させる形でパート動作データを作成している。
【０１３０】
このように、同じ指パートによる離鍵、押鍵を短い時間内に行わせる場合、離鍵動作に要する時間、及び押鍵動作に要する時間の少なくとも一方を調整して、それらの動作を表現するようにしている。
図１４に示すノートオンメイン処理では、上述した各種サブルーチン処理が実行される。それにより、指パートを押鍵させる動作を表現するためのパート動作データをサブルーチン処理単位で生成し単位動作データＡに追加している。それらのパート動作データでは、変数ｈｚ、配列変数ｆｒｘ１〜３のうちの何れかが値の変更対象である。
【０１３１】
図１９は、図１１に示す動作制御データ生成処理内でステップ９１７として実行されるノートオフメイン処理の動作フローチャートである。次に、図１９を参照して、ノートオフメイン処理について詳細に説明する。
現在、処理対象としている単位楽音データを実際に処理、即ち再生する際に、消音すべき和音（コード）があるか否かを示す値（「ＴＲＵＥ」或いは「ＦＡＬＳＥ」）は変数ｂｃｈｏｒｄｏｆｆに保持されている。その和音があれば、その和音を構成する楽音のなかで最後に消音する楽音の単位楽音データのアドレスは変数ｐｃｈｏｒｄｅｎｄｏｆｆに保持されている。ノートオフメイン処理では、そのような変数を含む各種変数の値が参照される。
【０１３２】
先ず、ステップ１６０１では、変数ｂｃｈｏｒｄｏｆｆの値が「ＴＲＵＥ」か否か判定する。処理対象としている単位楽音データを再生する状況で消音すべき和音があるとみなしていた場合、その変数ｂｃｈｏｒｄｏｆｆには「ＴＲＵＥ」が代入されていることから、判定はＹＥＳとなってステップ１６０６に移行し、そうでない場合には、判定はＮＯとなってステップ１６０２に移行する。
【０１３３】
ステップ１６０２では、処理対象としている単位楽音データ、及びそれに続く単位楽音データによって和音が消音、即ちその和音の構成音が全て消音されるか否か判定する和音オフ判定処理を実行する。その和音オフ判定処理において、それらの単位楽音データによって和音が消音されると判定すると、変数ｂｃｈｏｒｄｏｆｆには「ＴＲＵＥ」が代入されることになる。その実行後は、ステップ１６０３に移行する。
【０１３４】
ステップ１６０３では、変数ｂｃｈｏｒｄｏｆｆの値が「ＴＲＵＥ」か否か判定する。上記和音オフ判定処理を実行した結果、和音を消音させると決定した場合、判定はＹＥＳとなり、ステップ１６０４でその和音を消音させる動作の内容を決定する和音オフ動作処理を実行した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ステップ１６０５で離鍵動作の内容を決定するノートオフ動作処理を実行した後、一連の処理を終了する。
【０１３５】
一方、上記ステップ１６０１の判定がＹＥＳとなって移行するステップ１６０６では、変数ｐｃｈｏｒｄｅｎｄｏｆｆの値が変数ｐｅの値と等しいか否か判定する。変数ｐｅの値が指定する単位楽音データ、即ち現在、処理対象としている単位楽音データが、和音を構成する楽音のなかで最後に消音される楽音の消音を指示するものであった場合、判定はＹＥＳとなり、ステップ１６０７で変数ｂｃｈｏｒｄｏｆｆに「ＦＡＬＳＥ」、変数ｐｃｈｏｒｄｅｎｄｏｆｆにＮＵＬＬをそれぞれ代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなって、ここで一連の処理を終了する。
【０１３６】
このように、ノートオフメイン処理では、単位楽音データが消音を指示する楽音が和音を構成しているか否かにより処理を分岐させている。それにより、和音を構成する楽音を消音させるのか単に楽音を消音させるのかに応じて、手指の各パートを動作させる内容を決定している。
【０１３７】
ここで、上記ノートオフメイン処理内で実行される各種サブルーチン処理について、図２０〜図２３を参照して詳細に説明する。
図２０は、上記ステップ１６０２として実行される和音オフ判定処理の動作フローチャートである。ノートオフメイン処理内で実行されるサブルーチン処理では、図２０を参照して、始めに和音オフ判定処理について詳細に説明する。
【０１３８】
先ず、ステップ１７０１では、初期設定を行う。その初期設定を行うことにより、変数ｔｋｎｅｘｔには、変数ｐｅで指定される単位楽音データ以降で最初に楽音の発音開始を指示する単位楽音データの処理タイミングを絶対時間で示す値が代入され、変数ｔｋｎｅｘｔｏｆｆには、変数ｐｅで指定される単位楽音データ以降で最初に楽音の消音を指示する単位楽音データの処理タイミングを絶対時間で示す値が代入される。
【０１３９】
ステップ１７０１に続くステップ１７０２では、変数ｔｋｎｅｘｔｏｆｆの値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値より小さいか否か判定する。変数ｔｋｃｈｏｒｄの値が示す時間が経過する前に、消音される楽音が存在していない場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップ１７０３に移行する。
【０１４０】
ステップ１７０３では、変数ｔｋｎｅｘｔの値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値より大きいか否か判定する。変数ｔｋｃｈｏｒｄの値が示す時間が経過する前に、次の楽音の発音が開始する場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなり、ステップ１７０４で変数ｂｃｈｏｒｄｏｆｆに「ＴＲＵＥ」を代入した後、一連の処理を終了する。
【０１４１】
このように、本実施の形態では、変数ｔｋｃｈｏｒｄの値が示す時間内に複数の楽音の消音（ノートオンイベント）があり、且つその時間内に発音開始する楽音（ノートオフイベント）が存在していなければ、和音の構成音とみなした楽音は消音すべき状況になったとしている。
【０１４２】
図２１は、図１９に示すノートオフメイン処理内でステップ１６０４として実行される和音オフ動作処理の動作フローチャートである。次に図２１を参照して、和音オフ動作処理について詳細に説明する。
先ず、ステップ１８０１では、初期化処理を実行する。その初期化処理を実行することにより、変数ｔｋｔｉｍｅ０には、変数ｔｋｔｉｍｅの値が代入され、変数ｐｅ０には変数ｐｅの値が代入され、変数ｐｃｈｏｒｄｅｎｄｏｆｆにはＮＵＬＬが代入される。ステップ１８０１に続くステップ１８０２以降では、変数ｐｅ０の値を順次、インクリメントしながら、和音とみなす楽音の範囲の特定や、その和音を消音させる動作内容を決定するための処理が行われる。
【０１４３】
ステップ１８０２では、楽音・運指データが終了したか否か判定する。変数ｐｅ０の値が指定するデータが楽音・運指データの最後に位置するエンドデータであった場合、判定はＹＥＳとなってステップ１８１０に移行し、そうでない場合には、判定はＮＯとなってステップ１８０３に移行する。
【０１４４】
ステップ１８０３では、変数ｐｅ０の値が変数ｐｅの値と等しいか否か判定する。それらの値が等しい場合、判定はＹＥＳとなってステップ１８０５に移行する。そうでない場合には、判定はＮＯとなり、ステップ１８０４で変数ｔｋｔｉｍｅ０に、それまでの値に変数ｐｅ０の値が指定する単位楽音データの時間データの値を加算した値を代入した後、そのステップ１８０５に移行する。そのようにして、変数ｔｋｔｉｍｅ０には、変数ｐｅの値が指定する単位楽音データ以降の単位楽音データを処理すべきタイミングを絶対時間で示す値が代入される。
【０１４５】
ステップ１８０５では、変数ｔｋｔｉｍｅ０の値が、変数ｔｋｔｉｍｅの値に変数ｔｋｃｈｏｒｄの値を加算した値よりも小さいか否か判定する。変数ｐｅ０、及びｐｅの値がそれぞれ指定する単位楽音データの各処理タイミングが、変数ｔｋｃｈｏｒｄの値で指定される時間内でなかった場合、判定はＮＯとなって上記ステップ１８１０に移行する。そうでない場合には、判定はＹＥＳとなってステップ１８０６に移行する。
【０１４６】
ステップ１８０６では、変数ｐｅ０の値が指定する単位楽音データは楽音の消音（ノートオフイベント）を表すものであるか否か判定する。その単位楽音データがノートオフイベントを表していた場合、判定はＹＥＳとなり、ステップ１８０７で変数ｐｃｈｏｒｄｅｎｄｏｆｆに変数ｐｅ０の値を代入し、次にステップ１８０８でノートオフ動作処理を実行した後、ステップ１８０９に移行する。そうでない場合には判定はＮＯとなり、そのステップ１８０９に移行する。
【０１４７】
ステップ１８０９では、変数ｐｅ０に次の単位楽音データのアドレスを代入する。それを行った後、上記ステップ１８０２に戻る。
このように、ステップ１８０２〜１８０９で形成される処理ループをステップ１８０２の判定がＹＥＳ、或いはステップ１８０５の判定がＮＯとなるまで繰り返し実行することにより、変数ｐｃｈｏｒｄｅｎｄｏｆｆには、和音を構成するとみなす楽音のなかで最後に消音する楽音の単位楽音データのアドレス値が代入されることになる。
【０１４８】
一方、ステップ１８０２の判定がＹＥＳ、或いはステップ１８０５の判定がＮＯとなって移行するステップ１８１０では、手パートがｚ軸上を移動していく動作（ここでは図４に示す位置ＺＰＯＳ２から位置ＺＰＯＳ１に移動していく動作である）内容を指定するパート動作データを作成する。その動作データの作成は、変数ｔｋｔｉｍｅの値が示すタイミングで移動を開始し、所定の速度で位置ＺＰＯＳ１に達するように行う。そのようにしてパート動作データを生成し単位動作データＡに追加した後、一連の処理を終了する。
【０１４９】
和音の消音動作内容として、手パートをｚ軸上における移動内容を指定するパート動作データは上述したようにして生成される。それにより、図８に示す例では、親指パートが「Ｄ＃」の音高が割り当てられた鍵の離鍵開始に合わせて、手パートのｚ軸上の移動が開始している。
【０１５０】
次に、上記ステップ１８０８、或いは図１９に示すノートオフメイン処理内でステップ１６０５として実行されるノートオフ動作処理について、図２２、及び図２３に示すその動作フローチャートを参照して詳細に説明する。なお、この処理内では、単位楽音データに付加された指番号データは変数ｆｉｇに、その単位楽音データ中の音高データは変数ｎｏｔｅに代入されている。
【０１５１】
先ず、ステップ１９０１では、初期設定を行う。その初期設定では、変数ｐｅの値で指定される単位楽音データ以降で、変数ｆｉｇの値が指番号データとして付加されているノートオンイベントを表す単位楽音データ中の音高データを抽出し、その抽出した音高データを変数ｎｅｘｔｎｏｔｅに代入することなどが行われる。
【０１５２】
ステップ１９０１に続くステップ１９０２では、変数ｆｉｇの値が指定する指パートが押鍵に使用中か否か判定する。変数ｎｏｔｅの値で指定される楽音を実際には発音させないような場合、即ちその楽音の発音開始を指示する単位楽音データが存在していない、或いはその単位楽音データが存在していても、それに変数ｆｉｇの値が指番号データとして付加されていないような場合、判定はＮＯとなり、ここで一連の処理を終了する。そうでない場合には、判定はＹＥＳとなってステップ１９０３に移行する。
【０１５３】
ステップ１９０３では、変数ｎｏｔｅの値が変数ｎｅｘｔｎｏｔｅの値と等しいか否か判定する。それらの値が等しくない場合、即ちユーザがそれまで押鍵していた鍵とは異なる鍵を同じ指で押鍵しなければならない場合、判定はＮＯとなって図２３のステップ１９０５に移行する。そうでない場合には、判定はＹＥＳとなってステップ１９０４に移行し、変数ｆｉｇの値で指定される指パートが、変数ｔｋｔｉｍｅの値で指定されるタイミングで単に離鍵動作を開始させるパート動作データを生成した後、一連の処理を終了する。その動作データでは、離鍵動作を開始させる指パートと隣の指パートとの間を広げさせていても、その間を狭くさせることは行わせない。
【０１５４】
例えば押鍵中の人差し指を離鍵した直後に、親指でその鍵よりも高音の鍵を押鍵する場合、その人差し指を離鍵させる前に親指の指くぐり動作を開始させる必要がある。このことから、図２３のステップ１９０５〜１９１７では、次の押鍵に向けて指くぐり、或いは指またぎさせる動作を開始させる必要性の有無を判定し、その判定結果に応じてパート動作データを作成し単位動作データＡに追加するための処理が行われる。
【０１５５】
先ず、ステップ１９０５では、変数ｆｉｇの値で指定される指パートのみを押鍵させているか否か判定する。それ以外の指パートも押鍵させていた場合、即ち複数の指パートを押鍵させていた場合、判定はＮＯとなってステップ１９０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１９０７に移行する。
【０１５６】
ステップ１９０６では、変数ｆｉｇの値で指定される指パートが、変数ｔｋｔｉｍｅの値で指定されるタイミングで離鍵動作を開始させるパート動作データを生成した後、一連の処理を終了する。その動作データは、離鍵動作を開始させる指パートと隣の指パートとの間を広げさせていれば、その間を狭くさせて弛緩状態に戻す動作も行わせるものである。
【０１５７】
このように、本実施の形態では、指パートの離鍵後の状態は、それを次の押鍵に使用するか否かを考慮して決定している。それにより、次の押鍵に使わない指パートをいつまでも広げた状態にしておくようなことは回避させている。このため、指パートを離鍵開始時から次の押鍵終了時まで単に動かすようなことは無くなる。その結果、より自然な形で演奏動作を表現できるだけでなく、押鍵イベント、或いは離鍵イベントを発生させる指パートの動作や、その動作に伴う他の指パートの動作をより目立たせることができる。
【０１５８】
一方、ステップ１９０７では、次に処理する単位楽音データが表すイベントはノートオンイベントか否か判定する。そのデータが表すイベントがノートオンイベントでなかった場合、判定はＮＯとなって上記ステップ１９０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１９０８に移行する。
【０１５９】
ステップ１９０８では、次に処理する単位楽音データに付加された指番号データを変数ｆｉｇａに、その単位楽音データ中の音高データを変数ｎｏｔｅａにそれぞれ代入する。その代入後に移行するステップ１９０９では、変数ｎｏｔｅ、ｎｏｔｅａに音高データが代入された楽音は共に和音の構成音ではないか否か判定する。それらの楽音のうちの一方でも和音の構成音であった場合、判定はＮＯとなって上記ステップ１９０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１９１０に移行する。
【０１６０】
ステップ１９１０では、変数ｎｏｔｅａに音高データが代入された楽音をノートオンさせるタイミングと変数ｎｏｔｅに音高データが代入された楽音をノートオフさせるタイミングの時間間隔が所定時間内か否か判定する。変数ｆｉｇの値で指定される指パートを離鍵させた後、変数ｆｉｇａの値で指定される指パートを直ちに押鍵させるような場合、判定はＹＥＳとなってステップ１９１１に移行する。そうでない場合には、判定はＮＯとなって上記ステップ１９０６に移行する。
【０１６１】
ステップ１９１１では、変数ｆｉｇ、ｆｉｇａにそれぞれ代入された値（指番号データ）で指定される指パートが親指と、人差し指、中指、及び薬指のうちの何れかの関係となっているか否か判定する。その関係が満たされていない場合、判定はＮＯとなって上記ステップ１９０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１９１２に移行する。
【０１６２】
ステップ１９１２では、変数ｆｉｇａの指番号データで指定されるのが親指で変数ｎｏｔｅａの音高データは変数ｎｏｔｅの音高データより高い音高を示しているか否か判定する。変数ｆｉｇａの指番号データで指定されるのが親指であり、その親指に、今回、離鍵させる鍵の音高よりも高い音高の鍵を押鍵させる場合、判定はＹＥＳとなってステップ１９１３に移行する。そうでない場合には、判定はＮＯとなってステップ１９１５に移行する。
【０１６３】
ステップ１９１３では、人差し指パートなどの指パートの下をくぐらせて親指パートに次に押鍵すべき鍵を押鍵させる指くぐりを行うべき条件が満たされているとして、変数ｋｕｇｕｒｕに「ＴＲＵＥ」を表す値を代入する。続くステップ１９１４では、変数ｆｉｇａの値で指定される親指パートをくぐらせる動作を開始させ、変数ｔｋｓｔａｒｔの値が示すタイミングで変数ｆｉｇの指番号データで指定される指パートの離鍵動作を開始させるためのパート動作データを作成し単位動作データＡに追加する。その作成・追加を行った後に、一連の処理を終了する。
【０１６４】
上記親指パートの動作を開始させるタイミング、即ちパート動作データ中の動作時間データは、その親指パートの直前の動作を終了させたタイミングを考慮して決定する。直前の動作を終了させてから変数ｆｉｇの指番号データで指定される指パートを離鍵させるタイミングまでの時間間隔が予め定めた時間内であれば、その動作に続ける形で動作させる。即ち直前の動作を終了させたタイミングを、新たな動作を開始させるタイミングとする。それらの時間間隔が予め定めた時間内でなければ、変数ｆｉｇの指番号データで指定される指パートを離鍵させるタイミングから、例えばその指パートを離鍵させる鍵と親指パートを押鍵させる鍵の音高差に応じた時間だけ前のタイミングとする。その時間は、例えば音高差と時間の関係を予め定義したテーブルを参照して決定する。親指パートに横の動きを行わせるための対象変数である変数ｆｒｚには、例えば親指パートを押鍵させるまでの間、その横の動きを一定速度で行わせるとの前提で、変数ｆｉｇの指番号データで指定される指パートを離鍵させる時点での値を設定する。そのようなパート動作データをステップ１９１４では生成する。
【０１６５】
上記ステップ１９１２の判定がＮＯとなって移行するステップ１９１５では、変数ｆｉｇの指番号データで指定されるのが親指で変数ｎｏｔｅの音高データは変数ｎｏｔｅａの音高データより高い音高を示しているか否か判定する。変数ｆｉｇの指番号データで指定されるのが親指であり、その親指に現在、押鍵させている鍵の音高よりも低い音高の鍵をノートオンさせる場合、判定はＹＥＳとなってステップ１９１６に移行する。そうでない場合には、判定はＮＯとなって上記ステップ１９０６に移行する。
【０１６６】
ステップ１９１６では、親指パートの上を人差し指パートなどの指パートにまたがせて、次に押鍵すべき鍵を押鍵させる指またぎを行うべき条件が満たされているとして、変数ｍａｔａｇｕに「ＴＲＵＥ」を表す値を代入する。続くステップ１９１７では、変数ｆｉｇの値で指定される親指パートの上をまたがせる動作を開始させ、変数ｔｋｓｔａｒｔの値が示すタイミングで変数ｆｉｇの指番号データで指定される指パートの離鍵動作を開始させるためのパート動作データを作成し単位動作データＡに追加する。その作成は、上記ステップ１９１４と同様にして行う。そのようなパート動作データを作成・追加した後に、一連の処理を終了する。
【０１６７】
このようにして、本実施の形態では、今回、離鍵させる鍵の次に行う押鍵に向けて、指くぐり、或いは指またぎを行わせるべき状況か否か判定し、その判定結果に応じてパート動作データを作成している。それにより、そのような指パートを交差させる動作を含め、演奏動作を表示させている。
【０１６８】
図１９に示すノートオフメイン処理では、上述した各種サブルーチン処理が実行される。それにより、指パートを離鍵させる動作を表現するためのパート動作データをサブルーチン処理単位で生成し単位動作データＡに追加している。それらの動作データでは、変数ｈｚ、配列変数ｆｒｘ１〜３、及びｆｒｚのうちの何れかが値の変更対象である。
【０１６９】
図２４は、図１１に示す動作制御データ生成処理内でステップ９１１として実行される手のｘ位置処理の動作フローチャートである。次に、図２４を参照して、手のｘ位置処理について詳細に説明する。上述したように、この手のｘ位置処理には、図１７及び図１８に示すノートオン動作処理、或いは図２２及び図２３に示すノートオフ動作処理の実行時に値が代入される変数ｋｕｇｕｒｕ、ｍａｔａｇｕが引数として渡される。
【０１７０】
先ず、ステップ２００１では、変数ｋｕｇｕｒｕ、及びｍａｔａｇｕのうちの一方に「ＴＲＵＥ」を表す値が代入されているか否か判定する。図１７及び図１８に示すノートオン動作処理、或いは図２２及び図２３に示すノートオフ動作処理を実行した結果、変数ｋｕｇｕｒｕ、及びｍａｔａｇｕのうちの一方に「ＴＲＵＥ」を表す値が代入されていた場合、判定はＹＥＳとなってステップ２００２に移行する。そうでない場合には、判定はＮＯとなってステップ２００３に移行する。
【０１７１】
ステップ２００２では、指パートが押鍵している、或いは押鍵する鍵、その配置、その鍵上の押鍵位置、各指パートの長さ、各指パートの横に動かせる範囲、などを基に、親指パート以外の各指パートの回転角ｆｒｚが全て小さな範囲内に収まるようにしつつ、手パートの基点３０１（手首）を軸としたｚ軸の周りの回転角ｈｒｚを求める。それにより、実際の指が横に動く範囲を越えて各指パートが横に動くのを回避させている。
【０１７２】
このように、本実施の形態では、親指パートをそれ以外の４つの指パートと区別して扱い、回転角ｈｒｚを求めている。これは、指くぐりや指またぎでは、親指パートの回転角ｆｒｚは他の指パートのそれと比較して大きくさせなければならない、親指パート以外の４つの指パートは、隣り合う指パートの間を大きく広げることは普通はない。といった傾向が見られるためである。
【０１７３】
一方、ステップ２００３では、横方向に動かした際の各指パートの回転角ｆｒｚのなかの最大角（の絶対値）が最小となる手パートの基点３０１（手首）を軸としたｚ軸の周りの回転角ｈｒｚを求める。それにより、１つの指パートに無理な動きを行わせるのを回避させて、手指の各パートが全体的に見てより楽な状態となるようにさせている。
【０１７４】
上記ステップ２００２、或いは２００３を実行することにより、手パート、及び各指パートのｘｙ平面上での配置が確定する。このことから、それらのうちの一方を実行した後に移行するステップ２００４では、各指パートが押鍵している、或いは押鍵する鍵、その鍵の配置、その鍵上の押鍵位置（図５参照）、各指パートの長さ、その回転角ｆｒｚ、手パートの回転角ｈｒｚ、及び手パートの長さＬａ（図３参照）などを基に、手パートの基点３０１のｘ軸上の位置ｈｘを求める（図６参照）。その後はステップ２００５に移行する。
【０１７５】
ステップ２００５では、変数ｔｋｏｌｄの値で指定されるタイミングから変数ｔｋｔｉｍｅの値で指定されるタイミングまでに、手パートの基点３０１をステップ２００４で求めた位置ｈｘまで移動させたり、ステップ２００２、或いは２００３で求めた回転角ｈｒｚにさせるパート動作データをそれぞれ必要に応じて生成し単位動作データＡに追加する。位置ｈｘ、及び回転角ｈｒｚを共に変化させる必要がなければ、それらのパート動作データは作成しない。
【０１７６】
図５に示すように基準押鍵位置を複数、予め設定し、そのなかの一つを押鍵位置として選択すると、複数の指パートを押鍵させるような場合に、１つ以上の指パートに無理、或いは負担の大きい動作を行わせなければならなくなる可能性が高くなる。しかし、無理、或いは負担の大きい動作は、押鍵位置を僅かにずらすだけで無理でなくなる、或いは負担が大きく軽減することが多い。このことから、ステップ２００２、２００３では、鍵の押鍵位置の修正も必要に応じて行うようにしている。その修正を行うと、通常、指パートの曲げ方やその回転角ｆｒｚなども修正しなければならなくなる。このため、ステップ２００５では、必要に応じて、既に作成したパート動作データの修正なども合わせて行っている。
【０１７７】
ステップ２００５に続くステップ２００６では、変数ｋｕｇｕｒｕ、及びｍａｔａｇｕの両方に「ＦＡＬＳＥ」を表す値を代入する。一連の処理はその後に終了する。
上記手のｘ位置処理を実行すると、変数ｐｅの値で指定される単位楽音データが表すイベントの発生時、或いはそのイベント後の手指の各パートの状態を指定する各種変数、及び各種配列変数のなかで、変数ｈｙの除く全てのものの値が確定することになる。その変数ｈｙの値は、この手のｘ値処理の次にステップ９１２として実行される手のｙ位置再処理によって確定される。
【０１７８】
図２５は、シーケンス処理の動作フローチャートである。このシーケンス処理は、例えばユーザが操作部１０６を操作して、予め指定（選択）した楽音・運指データの再生を指示した場合に、ＣＰＵ１０１が、ＲＯＭ１０２に格納されているプログラムを実行することで実現される処理である。図１０に示すリアルタイム処理部８０２はそのシーケンス処理を実行することによって実現される。
【０１７９】
図７（ｂ）に示す動作制御データＢは、楽音・運指データとは別の領域に格納されている。動作制御データＢを構成する段階動作データは、当然のことながら、楽音・運指データを構成する単位楽音データの数よりも多く、その処理タイミングは、通常、単位楽音データの処理タイミングと一致しない。このようなことから、動作制御データＢ、及び楽音・運指データは、それぞれ、並行に処理している。
【０１８０】
先ず、ステップ２１０１では、変数ｔｋｔｉｍｅＥ、ｔｋｔｉｍｅＭ、及びｃｌｏｃｋにそれぞれ０を代入したり、変数ｐｅ、及びｐｍにそれぞれ初期値を代入するといった各種変数への値の代入や、特には図示しないハードタイマが所定時間間隔で出力する割り込み信号を有効にして、タイマインタラプト処理の実行禁止を解除するといった初期設定を行う。その実行禁止を解除することによって、変数ｃｌｏｃｋの値は、タイマインタラプト処理が実行される度にインクリメントされる。
【０１８１】
ステップ２１０１に続くステップ２１０２では、変数ｃｌｏｃｋの値やテンポデータの値を用いた演算を行って、変数ｃｌｏｃｋの値を楽音・運指データ中の時間データの単位で示す値を算出し、その算出結果を変数ｔｋｔｉｍｅに代入する。その後はステップ２１０３に移行する。
【０１８２】
ステップ２１０３〜２１０９では、楽音・運指データの再生に係わる処理が実行される。
先ず、ステップ２１０３では、楽音・運指データが終了したか否か判定する。変数ｐｅの値が指定するデータが楽音・運指データの最後に位置するエンドデータであった場合、判定はＹＥＳとなってステップ２１１０に移行し、そうでない場合には、判定はＮＯとなってステップ２１０４に移行する。
【０１８３】
ステップ２１０４では、変数ｐｅの値で指定される単位楽音データ中の時間データの値を変数ｔｋｔｉｍｅＥの値に加算した値が、変数ｔｋｔｉｍｅの値以上か否か判定する。変数ｔｋｔｉｍｅＥには、それまでに処理した単位楽音データ中の時間データの値を累算した値、即ち直前に処理した単位楽音データの処理タイミングを絶対時間で示す値が代入されている。このため、変数ｐｅの値で指定される単位楽音データを処理すべきタイミングとなった場合、判定はＹＥＳとなってステップ２１０５に移行する。そうでない場合には、判定はＮＯとなってステップ２１１０に移行する。
【０１８４】
ステップ２１０５では、変数ｔｋｔｉｍｅＥに、それまでの値に変数ｐｅの値が指定する単位楽音データ中の時間データの値を加算した値を代入する。それにより、次の単位時間データを処理すべきタイミングを示す値を変数ｔｋｔｉｍｅＥに代入した後は、処理タイミングとなった単位楽音データをそれが表すイベントの種類に応じて処理を行い、その処理による演奏の進行に応じて、表示ページの切り換え、新たに発音させた楽音に対応する音符の表示色の変更などを行い、更に変数ｐｅに、それまでのアドレス値から１イベント分だけ進めたアドレス値を代入した（以上、ステップ２１０６〜２１０９）後、ステップ２１１０に移行する。なお、単位楽音データの処理は、ＣＰＵ１０１が、そのデータから音源１０７に送出すべきコマンドを生成して送出することで行われる。
【０１８５】
ステップ２１１０〜２１１５では、動作制御データＢに従って手指の各パートを動作させるための処理が行われる。
先ず、ステップ２１１０では、動作制御データＢが終了したか否か判定する。変数ｐｍの値が指定する段階動作データが動作制御データＢ中に存在していない場合、判定はＹＥＳとなってステップ２１１５に移行し、そうでない場合には、判定はＮＯとなってステップ２１１１に移行する。
【０１８６】
ステップ２１１１では、変数ｐｍの値で指定される段階動作データ中の時間データの値を変数ｔｋｔｉｍｅＭの値に加算した値が、変数ｔｋｔｉｍｅの値以上か否か判定する。変数ｔｋｔｉｍｅＭには、上記変数ｔｋｔｉｍｅＥと同様に、それまでに処理した段階動作データ中の時間データの値を累算した値、即ち直前に処理した段階動作データの処理タイミングを絶対時間で示す値が代入されている。このため、変数ｐｍの値で指定される段階動作データを処理すべきタイミングとなった場合、判定はＹＥＳとなってステップ２１１２に移行する。そうでない場合には、判定はＮＯとなって上記ステップ２１０２に戻る。
【０１８７】
ステップ２１１２では、変数ｔｋｔｉｍｅＭに、それまでの値に変数ｐｍの値が指定する段階動作データ中の時間データの値を加算した値を代入する。それにより、次の段階動作データを処理すべきタイミングを示す値を変数ｔｋｔｉｍｅＭに代入すると、ステップ２１１３に移行して、処理タイミングとなった段階動作データに従って、手指の各パートのなかで状態を変化させるべきパートの状態を変化させて演奏動作を示す表示内容を更新する演奏動作表示更新処理を実行する。その実行後は、ステップ２１１４で変数ｐｍに、それまでのアドレス値から１イベント分だけ進めたアドレス値を代入した後、上記ステップ２１０２に戻る。なお、表示内容の更新は、例えばＣＰＵ１０１が、表示部１０５のメモリに格納された画像データ中でデータを書き換えるべき部分の画像データをＲＯＭ１０２から読み出すか、或いはそれを用いて生成し、そのようにして得た画像データを、そのメモリ中の画像データを書き換えるべき部分に上書きすることで行われる。
【０１８８】
一方、上記ステップ２１１０の判定がＹＥＳとなって移行するステップ２１１５では、楽音・運指データが終了したか否か判定する。変数ｐｅの値が指定するデータが楽音・運指データの最後に位置するエンドデータであった場合、判定はＹＥＳとなって一連の処理を終了し、そうでない場合には、判定はＮＯとなって上記ステップ２１０２に戻る。
【０１８９】
上述したシーケンス処理を実行することにより、図９に示すような画像が表示部１０５に表示され、それに表示された手指の各パートが図８に示すように動作することになる。
なお、本実施の形態では、図８に示すように、手パートは単位楽音データの処理タイミングで動作を開始させることを基本としているが、必ずしもそうしなくて良い。演奏中の動作としては、例えば横動作は押鍵動作の開始前に完了するといった特徴がある（関口、英保：仮想空間におけるピアノ演奏動作の生成と表示、情報処理学会研究報告  Ｖｏｌ９９、Ｎｏ．１６（１９９９））。このことから、例えば押鍵では、例えば手パートや指パートの移動が完了した後に指パートを関節で曲げての押鍵動作を開始するといったように、複数のフェーズに分けて手指の各パートを動作させるようにしても良い。
【０１９０】
手パートの基点３０１がとれるｚ軸上の位置は、位置ＺＰＯＳ１、或いはＺＰＯＳ２の２通りだけにしているが、その位置を３通り以上、或いは任意に設定できるようにしても良い。これは基点３０１がとれるｙ軸上の位置においても同様である。そのようにした場合、指が他の指をくぐる動作やまたぐ動作をより適切に表現できるようになる。
【０１９１】
また、本実施の形態では、演奏操作子群として鍵盤を想定し、その鍵盤に対する演奏動作を表示しているが、鍵盤以外の演奏操作子群に対する演奏動作を表示するようにしても良い。
本実施の形態は音源１０７や表示部１０５を搭載した装置に本発明を適用したものであるが、本発明を適用できる装置はそれらを搭載したものに限定されるわけではない。音源１０７は無くても良く、表示部１０５についても、外部の表示装置と接続できるのであれば、無くても良い。
【０１９２】
上記演奏動作表示装置の動作を実現させるようなプログラムは、ＣＤ−ＲＯＭ、フレキシブルディスク、或いは光磁気ディスク等の記録媒体に記録させて配布しても良い。或いは、公衆網等で用いられる伝送媒体を介して、そのプログラムの一部、若しくは全部を配信するようにしても良い。そのようにした場合には、ユーザはプログラムを取得して任意の演奏動作表示装置、或いはコンピュータ等のデータ処理装置にロードすることにより、その装置に本発明を適用させることができる。このことから、記録媒体は、プログラムを配信する装置がアクセスできるものであっても良い。
【０１９４】
【発明の効果】
以上、説明したように本発明は、鍵盤上の鍵に指を接触させるうえで基準となる基準位置を予め複数定めておき、押鍵のために指を鍵に接触させる位置を、手の位置と使用すべき指と押鍵すべき鍵とに基づいて、予め定められた基準位置のなかから一つ選択して決定する。そのようにして、指の接触位置を決定するうえで考慮すべき範囲を制限しているため、その接触位置をより容易、且つ短時間に決定することができる。
【図面の簡単な説明】
【図１】本実施の形態による演奏動作表示装置の回路構成図である。
【図２】楽音・運指データの構成を説明する図である。
【図３】表示用の手指の構造を説明する図である。
【図４】手の移動範囲を説明する図である。
【図５】状況に応じて変化させる鍵を押鍵する位置を説明する図である。
【図６】手のｘ軸上の位置の求め方を説明するための図である。
【図７】動作制御データの構成を説明する図である。
【図８】手指の動作表示例を説明する図である。
【図９】実際の表示例を示す図である。
【図１０】本実施の形態による演奏動作表示装置の機能ブロック図である。
【図１１】動作制御データ生成処理の動作フローチャートである。
【図１２】手のｙ位置処理処理の動作フローチャートである。
【図１３】手のｚ位置処理の動作フローチャートである。
【図１４】ノートオンメイン処理の動作フローチャートである。
【図１５】和音判定処理の動作フローチャートである。
【図１６】和音動作処理の動作フローチャートである。
【図１７】ノートオン動作処理の動作フローチャートである。
【図１８】ノートオン動作処理の動作フローチャートである（続き）。
【図１９】ノートオフメイン処理の動作フローチャートである。
【図２０】和音オフ判定処理の動作フローチャートである。
【図２１】和音オフ動作処理の動作フローチャートである。
【図２２】ノートオフ動作処理の動作フローチャートである。
【図２３】ノートオフ動作処理の動作フローチャートである（続き）。
【図２４】手のｘ位置処理の動作フローチャートである。
【図２５】シーケンス処理の動作フローチャートである。
【符号の説明】
１０１    ＣＰＵ
１０２    ＲＯＭ
１０３    ＲＡＭ
１０４    データ入力部
１０５    表示部
１０６    操作部
１０７    音源
１０８    サウンドシステム
３００    鍵盤
３０１〜３０６    基点
８０１    データ生成部
８０２    リアルタイム処理部
８０３    動作制御データ生成部
８０４    データ送出部
８０５    動作表示部
８０６    音源部
８０７    楽譜表示部
【図１】
0004337288.tif 000002
【図２】
0004337288.tif 000003
【図３】
0004337288.tif 000004
【図４】
0004337288.tif 000005
【図５】
0004337288.tif 000006
【図６】
0004337288.tif 000007
【図７】
0004337288.tif 000008
【図８】
0004337288.tif 000009
【図９】
0004337288.tif 000010
【図１０】
0004337288.tif 000011
【図１１】
0004337288.tif 000012
【図１２】
0004337288.tif 000013
【図１３】
0004337288.tif 000014
【図１４】
0004337288.tif 000015
【図１５】
0004337288.tif 000016
【図１６】
0004337288.tif 000017
【図１７】
0004337288.tif 000018
【図１８】
0004337288.tif 000019
【図１９】
0004337288.tif 000020
【図２０】
0004337288.tif 000021
【図２１】
0004337288.tif 000022
【図２２】
0004337288.tif 000023
【図２３】
0004337288.tif 000024
【図２４】
0004337288.tif 000025
【図２５】
0004337288.tif 000026