(57)【特許請求の範囲】
【請求項１】
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報から、右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定する位置推定手段と、
前記位置推定手段により推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別する判別手段と、
前記判別手段にて条件を満たすと判別された場合に、前記位置推定手段にて推定された前記右手及び左手の指位置のうち、少なくとも一方の手の指位置を補正する位置補正手段と、
前記位置補正手段により補正された前記指位置に基づいて、演奏操作ガイド情報を生成するガイド情報生成手段と、
を備えることを特徴とする演奏操作ガイド装置。
【請求項２】
前記判別手段は、前記位置推定手段により推定された右手の各指位置と左手の各指位置のうち、前記左手の親指位置が、前記右手の親指位置より右側にあるか否かを判別する、
ことを特徴とする請求項１に記載の演奏操作ガイド装置。
【請求項３】
前記位置補正手段は、
前記演奏情報に含まれる発音タイミング情報に基づき、演奏している指が前記右手及び左手のいずれに存在しているかを判別する演奏指判別手段をさらに有する、
ことを特徴とする請求項１または２のいずれかに記載の演奏操作ガイド装置。
【請求項４】
前記位置補正手段は、
前記演奏指判別手段により、前記右手に演奏している指が存在していると判別された場合は、前記左手の指位置を、当該左手方向に補正する一方、前記左手に演奏している指が存在していると判別された場合は、前記右手の指位置を、当該右手方向に補正する、
ことを特徴とする請求項３に記載の演奏操作ガイド装置。
【請求項５】
前記位置補正手段は、
前記演奏指判別手段により、前記右手及び左手の両方に演奏している指が存在していると判別された場合は、前記右手及び左手の少なくとも一方の指位置を、当該右手方向及び左手方向以外の方向に補正する、
ことを特徴とする請求項３または４のいずれかに記載の演奏操作ガイド装置。
【請求項６】
請求項１から５のいずれかに記載の演奏操作ガイド装置と、
演奏者に演奏操作を行わせる演奏操作子と、
前記演奏操作子における演奏操作に応じて楽音を生成して出力する楽音出力部とを備える電子楽器。
【請求項７】
演奏操作ガイド装置が、
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報から、右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定し、
前記推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別し、
前記条件を満たすと判別された場合に、前記推定された右手及び左手の指位置のうち、少なくとも一方の手の指位置を補正し、
前記補正された前記指位置に基づいて、演奏操作ガイド情報を生成する、演奏操作ガイド方法。
【請求項８】
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報から、右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定する位置推定ステップと、
前記推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別する判別ステップと、
前記条件を満たすと判別された場合に、前記推定された右手及び左手の指位置のうち、少なくとも一方の手の指位置を補正する位置補正ステップと、
前記補正された前記指位置に基づいて、演奏操作ガイド情報を生成するガイド情報生成ステップと、
をコンピュータに実行させる演奏操作ガイドプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、鍵盤楽器における運指ガイド等の演奏動作のガイドを行うための動作情報を生成する技術に関する。
【背景技術】
【０００２】
例えば鍵盤楽器における演奏動作を視覚的にガイドするために、従来、鍵盤楽器の画像上で演奏における指の運指をガイドする技術が知られている（例えば特許文献１）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第３５２１８３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ここで、例えば鍵盤楽器を演奏する場合には、さまざまな演奏動作上のテクニック(指越え・指くぐり、手を移動させる、手を広げる・狭めるなど)が存在する。従って、運指を習得するだけでなく、これらの演奏動作上のテクニックを習得することも望まれる。また、鍵盤楽器等の演奏に際しては、現在だけでなく、次以降の音形によって、どのように指や手の位置を準備させるかといった準備動作も重要なテクニックの一つであった。
【０００５】
しかし、従来の運指ガイド技術は、単にあるタイミングで押鍵すべき鍵盤の位置とその鍵盤を押鍵する指を指示するだけであり、演奏動作上のテクニックを習得することは困難であるという問題点を有していた。
【０００６】
本発明は、演奏情報に付加されている運指情報から演奏動作上のテクニックに関する動作情報を自動的に抽出可能とし、それにより両手パートが衝突しない運指とともに演奏動作上のテクニックも演奏ガイド可能とすることを目的とする。
【課題を解決するための手段】
【０００７】
態様の一例では、楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報から、右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定する位置推定手段と、前記位置推定手段により推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別する判別手段と、前記判別手段にて条件を満たすと判別された場合に、前記位置推定手段にて推定された前記右手及び左手の指位置のうち、少なくとも一方の手の指位置を補正する位置補正手段と、前記位置補正手段により補正された前記指位置に基づいて、演奏操作ガイド情報を生成するガイド情報生成手段と、を備える。
【発明の効果】
【０００８】
本発明によれば、演奏情報に付加されている運指情報から演奏動作上のテクニックに関する動作情報を自動的に抽出することが可能となり、それにより両手パートが衝突しない運指とともに演奏動作上のテクニックも演奏ガイドすることが可能となる。
【図面の簡単な説明】
【０００９】
【図１】本発明による動作情報生成装置の実施形態を示すブロック図である。
【図２】動作情報生成装置の実施形態を組み込んだ演奏ガイド装置のハードウェア構成の一例を示す図である。
【図３】演奏情報のデータ構成例を示す図である。
【図４】動作データのデータ構成例を示す図である。
【図５】本実施形態の全体動作処理の例を示すフローチャートである。
【図６】動作情報生成の処理の例を示すフローチャートである。
【図７】次鍵の検索の処理の例を示すフローチャートである。
【図８】Ｎｅｘｔバッファ更新の処理の例を示すフローチャートである。
【図９】パート毎の状態確認の処理の例を示すフローチャートである。
【図１０】離鍵確認の処理の例を示すフローチャートである。
【図１１】押鍵検索の処理の例を示すフローチャートである。
【図１２】準備確認の処理の例を示すフローチャート（その１）である。
【図１３】準備確認の処理の例を示すフローチャート（その２）である。
【図１４】準備確認の処理の例を示すフローチャート（その３）である。
【図１５】準備確認の処理の例を示すフローチャート（その４）である。
【図１６】鍵盤距離の取得の処理の例を示すフローチャートである。
【図１７】パート同士の状態比較処理の例を示すフローチャートである。
【図１８】動作データ出力の処理の例を示すフローチャート（その１）である。
【図１９】動作データ出力の処理の例を示すフローチャート（その２）である。
【図２０】奥行き位置計算の処理の例を示すフローチャートである。
【図２１】次回開始時刻の計算の処理の例を示すフローチャートである。
【図２２】演奏情報の記憶例を示す図である。
【図２３】準備動作を考慮しないときの動作データの出力例を示す図である。
【図２４】準備動作を考慮したときの動作データの出力例を示す図である。
【図２５】演奏ガイドの表示例を示す図である。
【図２６】左手の押鍵ガイドがその演奏進行に伴って右手の押鍵の準備ガイドに衝突しうる楽譜例を示す図である。
【図２７】衝突回避制御を行わないときの衝突が発生する場合の右手パートに関する動作データの出力例（その１）を示す図である。
【図２８】衝突回避制御を行うときの衝突が発生する場合の右手パートに関する動作データの出力例（その１）を示す図である。
【図２９】同じ押鍵タイミングでの右手および左手の接近により両者の演奏ガイドが衝突しうる楽譜例を示す図である。
【図３０】衝突回避制御を行わなわないときの衝突が発生する場合の右手パートおよび左手パートに関する動作データの出力例（その２）を示す図である。
【図３１】衝突回避制御を行うときの衝突が発生する場合の右手パートおよび左手パートに関する動作データの出力例（その２）を示す図である。
【発明を実施するための形態】
【００１０】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図１は、本発明による演奏操作ガイド装置１００の実施形態を示すブロック図である。この演奏操作ガイド装置１００は、演奏情報読み出し手段１０１、操作状態推定手段１０２、パート同士の状態比較手段１０３，演奏操作ガイド手段１０４を備える。また、内部または外部に、記憶部１０５が具備される。
【００１１】
演奏情報読み出し手段１０１は、曲を構成する各楽音の、発音を行う発音タイミングに関する情報と、音高に関する情報と、演奏者の演奏操作に関する情報と、を含む演奏情報１０８を記憶部１０５から読み出す。
【００１２】
操作状態推定手段１０２は、演奏情報読み出し手段１０１によって読み出された演奏情報１０８夫々に基づいて、その演奏情報１０８における演奏者の演奏操作状態を推定する。
【００１３】
パート同士の状態比較手段１０３は、操作状態推定手段１０２が推定した演奏操作情報をパート間で比較することにより、演奏操作に不都合が生じないように、パート毎の演奏操作状態を補正する。
【００１４】
演奏操作ガイド手段１０４は、操作状態推定手段１０２により推定されパート同士の状態比較手段１０３により補正された第１の演奏操作状態１０６と、第１の演奏操作状態１０６より後に推定された第２の演奏操作状態１０７とに基づいて、演奏者の演奏操作に関するガイドを行う。
【００１５】
上述の構成において、パート同士の状態比較部１０３は、操作状態推定手段１０２が推定した演奏操作状態が示す各指の演奏位置がパート間で衝突する状態にある場合に、演奏操作状態中の各指の演奏位置に関する情報を補正してよい。
【００１６】
より具体的には、操作状態推定手段１０２は、各指の奥行き方向の位置に関する情報をさらに含む演奏操作状態を推定する。そして、パート同士の状態比較手段１０３は、操作状態推定手段１０２が推定した演奏操作状態が示す親指に最も近い演奏位置の音高をパート毎に取得する。そして、パート同士の状態比較手段１０３は、その音高のうち左手のパートの音高が右手のパートの音高よりも高い場合に、左手のパートおよび右手のパートともに第１の演奏操作状態を含むならば、演奏操作状態中の各指の奥行き方向の位置に関する情報を補正する。また、パート同士の状態比較手段１０３は、左手のパートおよび前記右手のパートのうちの一方のパートのみが第１の演奏操作状態を含むならば、他方のパートの演奏操作状態中の前記各指の音高に関する情報を補正する。
【００１７】
ここまでの構成において、演奏操作ガイド装置１００は、鍵盤楽器の演奏操作に関するガイドを行うものとしてよい。このとき、操作状態推定手段１０２は、演奏者の第１及び第２の演奏操作状態１０６，１０７として、親指で鍵盤を押鍵中の状態及びこの状態から親指以外の指で親指の上を越えて移動させて次以降のタイミングにて押鍵する状態を推定してよい。この場合に、演奏操作ガイド手段１０４は、親指が演奏を行うべき指としてガイドするとともに、親指以外の指を演奏の準備を行うべき指としてガイドしてよい。また、操作状態推定手段１０２が、演奏者の第１及び第２の演奏操作状態１０６，１０７として、親指で鍵盤を押鍵中の状態及びこの状態から親指以外の指で押鍵中に親指で親指以外の指の下をくぐらせて移動させて次以降のタイミングにて押鍵する状態を推定してよい。この場合に、演奏操作ガイド手段１０４は、親指以外の指を演奏を行うべき指としてガイドするとともに、親指を演奏の準備を行うべき指としてガイドしてよい。さらに、操作状態推定手段１０２は、演奏者の第１及び第２の演奏操作状態１０６，１０７として、鍵盤の所定の鍵が押鍵されている状態及びその押鍵されている鍵から所定の基準値よりも離れた位置の鍵が次に押鍵される状態を推定してよい。この場合に、演奏操作ガイド手段１０４は、現在の押鍵状態から次の押鍵状態への移動の準備をガイドしてよい。
【００１８】
以上の実施形態の構成により、操作状態推定手段１０２が、演奏情報読み出し手段１０１によって読み出された演奏情報１０８夫々に基づいて、演奏情報１０８における演奏者の演奏操作状態を、第１および第２の演奏操作状態１０６，１０７として推定することができる。これらの第１および第２の演奏操作状態１０６，１０７を用いて、演奏操作ガイド手段１０４が演奏ガイドを行うことにより、各動作タイミングにおいて、演奏を行うべき指の運指ガイドだけでなく、それ以降の演奏の準備を行うべき指のガイドも行うことができる。演奏の準備の動作としては、他の指による親指越えや、親指による指くぐり、広範囲での指の移動などの動作を含むことができ、これにより演奏動作のテクニックに関するガイドを行うことが可能となる。
【００１９】
さらに、本実施形態では、左手と右手のパートで練習を行うための演奏ガイドを実行するときに、楽譜上、左手パートと右手パートの間で、演奏される指同士が衝突しそうになったり、あるいは次に演奏する準備を行うべき指を置く場所と演奏中の指が衝突しそうになった場合に、パート同士の状態比較手段１０３が、それらの状態を検知して補正することが可能となる。
【００２０】
具体的には、演奏中の指同士が衝突しそうになった場合は、各パートの演奏中の指および演奏の準備を行うべき指全体を奥行き方向の前後にずらして演奏ガイドをすることにより、衝突を回避できる。例えば鍵盤楽器の場合、一方のパートが奥の黒鍵側にある場合は、そのパートの指全体がさらに黒鍵側に移動するように、また他方のパートが手前の白鍵側にある場合、そのパートの指全体がさらに白鍵側に移動するように、演奏位置がずらされる。また、次に演奏の準備を行うべき指を置く場所と演奏中の指が衝突しそうになった場合には、左手と右手の各パートで指がオーバーラップしている分だけ、演奏の準備を行うべき指のほうを音高指定方向（例えば鍵盤楽器の鍵盤の横方向）にずらして演奏ガイドを行うことにより、衝突を回避できる。このようにして、本実施形態では、両手パートが衝突しない運指ガイドが可能となる。
【００２１】
図２は、図１の機能構成を有する演奏動作ガイド装置１００の実施形態のハードウェア構成の一例を示す図である。この装置１００は、ＣＰＵ（中央演算処理装置）２０１、ＲＯＭ（リードオンリーメモリ）２０２、ＲＡＭ（ランダムアクセスメモリ）２０３、入力部２０４、表示部２０５、およびＭＩＤＩインタフェース部（以下「ＭＩＤＩ  Ｉ／Ｆ」と表記する）２０６が、バス２０７によって相互に接続された構成を備える。ＭＩＤＩ  Ｉ／Ｆ２０６は、外部（内蔵でもよい）の電子楽器２０８に接続される。
【００２２】
ＣＰＵ２０１は、ＲＯＭ２０２に記憶された制御プログラムに従って、当該演奏操作ガイド装置１００の全体の制御を行う。
【００２３】
ＲＯＭ２０２は、後述する各フローチャートで示される制御動作を実行する制御プログラムを記憶する。また、ＲＯＭ２０２は、複数の楽曲の図１に示される演奏情報１０８などを記憶する。
【００２４】
ＲＡＭ２０３は、制御プログラムの実行に必要な、後述する図３、図４に示される、演奏情報、動作データなどの各種情報を、一時的に記憶する。
【００２５】
入力部２０４は、ユーザによるキーボード、マウス、各種スイッチ等による入力操作を検出し、その検出結果をＣＰＵ２０１に通知する。
【００２６】
表示部２０５は、ＣＰＵ２０１の制御によって送られてくるデータを液晶ディスプレイなどに出力する。例えば、表示部２０５は、後述する図２５のような表示形式で、演奏動作ガイドを表示する。
【００２７】
ＭＩＤＩ  Ｉ／Ｆ２０６は、ＣＰＵ２０１が、ＲＯＭ２０２またはＲＡＭ２０３上の演奏情報を、ＭＩＤＩ（Ｍｕｓｉｃａｌ  Ｉｎｓｔｒｕｍｅｎｔ  Ｄｉｇｉｔａｌ  Ｉｎｔｅｒｆａｃｅ）のデータフォーマットで、電子楽器２０８に順次転送することにより、演奏動作ガイドを行う楽曲を自動演奏させることができる。
【００２８】
本実施形態による演奏操作ガイド装置１００の動作は、後述する各フローチャート等で実現される図１の各部の機能処理を搭載した制御プログラムを、ＣＰＵ２０１がＲＯＭ２０２から読み出して順次実行することで実現される。そのプログラムは、特には図示しない可搬型記録媒体を介して提供されてもよく、或いは特には図示しないネットワーク接続装置によりネットワークから取得できるようにしてもよい。
【００２９】
以下、図１の機能構成と図２のハードウェア構成を有する本実施形態による演奏操作ガイド装置１００の動作について、以下に詳細に説明する。
【００３０】
図３は、演奏動作ガイドを行う曲の演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ−１］のデータ構成例を示す図であり、図１の演奏情報１０８に対応する。演奏情報は、図２において、ＣＰＵ２０１が電子楽器２０８に対して演奏ガイドをさせるにあたって必要な、インデックス番号（０、１、・・・、Ｎ−１）（Ｎは１曲分の演奏情報の数）、発音を開始する発音開始時刻Ｔｉｍｅと発音継続時間Ｇａｔｅ（図１の「発音タイミングに関する情報」に対応）、音高Ｐｉｔｃｈ（図１の「音高に関する情報」に対応）、右手（値「０」）または左手（値「１」）を示すトラック番号Ｈａｎｄ（図１の「パートに関する情報」に対応）、および指番号Ｆｉｎｇｅｒ（図１の「演奏する指に関する情報」に対応）の各情報を記憶する。演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ−１］は、図２において、ＣＰＵ２０１によってＲＯＭ２０２からＲＡＭ２０３に転送された後に、順次読み出されて処理されるが、発音開始時刻Ｔｉｍｅの順に並ぶように、インデックス番号（０、１、・・・、Ｎ−１）が付与されている。
【００３１】
図４は、図２のＣＰＵ２０１による後述する制御処理によってＲＡＭ２０３上に生成される動作データｆｒａｍｅ［０］、ｆｒａｍｅ［１］、・・・、ｆｒａｍｅ［ＦｒａｍｅＣｏｕｎｔ−１］のデータ構成例を示す図であり、図１の動作情報１０７、１０８に対応する。ｆｒａｍｅ［０］、ｆｒａｍｅ［１］、・・・、ｆｒａｍｅ［ＦｒａｍｅＣｏｕｎｔ−１］はそれぞれ、フレーム番号０、１、・・・、ＦｒａｍｅＣｏｕｎｔ−１に対応する動作データである。すなわち、動作データの出力単位はフレームである。ＦｒａｍｅＣｏｕｎｔは、ＲＡＭ２０３上に生成される動作データのフレームの総数を示す。動作データは、図２において、ＣＰＵ２０１が表示部２０５に演奏動作ガイドを表示させるにあたって必要な、右手（値「０」）または左手（値「１」）を示すトラック番号「Ｈａｎｄ」、５本の各指の演奏位置「ｐｏｓｉｔｉｏｎ［０］〜ｐｏｓｉｔｉｏｎ［４］」(指を置くべき鍵盤番号)（図１の「各指の演奏位置に関する情報」に対応）、そこへ動くにあたっての動作を開始・終了する時刻である動作開始時間「ｓｔａｒｔ」と動作終了時間「ｔｅｒｍ」（図１の「動作タイミングに関する情報」に対応）、各指の状態「ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］」（それぞれ、値「−１」が準備動作、値「１」が押鍵）（図１の「各指の演奏のガイド／演奏準備のガイドを指示する情報」に対応）、奥行き方向の位置「Ｚｐｏｓ」（図１の「奥行き方向の位置に関する情報」に対応）などの情報を記憶する。
【００３２】
以下、本実施形態の動作について、フローチャートを用いて説明する。以下の説明において、図１の各機能部分と図２の各ハードウェア部分を随時参照するものとする。また、図３で説明した演奏情報Ｎｏｔｅ［０］〜Ｎｏｔｅ［Ｎ−１］、および図４で説明した動作データｆｒａｍｅ［０］〜ｆｒａｍｅ［ＦｒａｍｅＣｏｕｎｔ−１］は、ＲＡＭ２０３に記憶されるものとする。さらに、以下の説明で用いる各変数も、ＲＡＭ２０３に記憶されるものとする。また、以下の説明では、ある変数の名称が、その変数が記憶している値を指す場合がある。
【００３３】
図５は、本実施形態全体動作処理を示すメインフローチャートである。この処理は、図２において、ＣＰＵ２０１が、ＲＯＭ２０２に記憶された制御プログラムを実行する動作として実現される。
【００３４】
本実施形態では、ユーザが入力部２０４から楽曲を選択することにより、ＣＰＵ２０１が、その楽曲１曲分の演奏情報Ｎｏｔｅ［ｉ］（０≦ｉ≦Ｎ−１）（図３参照）をＲＯＭ２０２からＲＡＭ２０３に読み出し、その読み出した各演奏情報Ｎｏｔｅ［ｉ］に対して順次、動作情報を一括して生成する。
【００３５】
処理が起動すると、ＣＰＵ２０１は、ＲＡＭ２０３上の演奏情報や各種変数を初期化し（ステップＳ５０１）、ＲＡＭ２０３から図３に例示される構成の演奏情報を読み込み（ステップＳ５０２）、ＲＡＭ２０３上に図４に例示されるデータフォーマットで動作データを生成し（ステップＳ５０３）、プログラムを終了する。
【００３６】
図６は、図５のステップＳ５０３の動作情報生成処理の例を示すフローチャートである。
【００３７】
まず、ＣＰＵ２０１は、各変数を初期化する（ステップＳ６０１）。ＣＰＵ２０１は、演奏情報検索ポインタ変数ｍｅＴａｉｌ［０］に、ＲＡＭ２０３に図３に例示されるフォーマットで記憶されている演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］のうちから、トラック番号（図３参照）を参照することにより、右手パートの最初の演奏情報へのポインタを設定する。同様に、ＣＰＵ２０１は、演奏情報検索ポインタ変数ｍｅＴａｉｌ［１］に、上記演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］のうちから、左手パートの最初の演奏情報へのポインタを設定する。動作開始時刻変数ｓｔａｒｔ［０］とｓｔａｒｔ［１］には、時刻０が設定される。ｓｔａｒｔ［０］は右手パート用、ｓｔａｒｔ［１］は左手パート用である。この変数は、ステップＳ６０７の動作データ出力の処理で使用される。現在のタイミングにおいて各指を押鍵中とすべき演奏情報へのポインタ変数Ｈａｎｄ［０］［０］〜Ｈａｎｄ［０］［４］（これら４つの変数は右手の親指から小指に対応）およびＨａｎｄ［１］［０］〜Ｈａｎｄ［１］［４］（これら４つの変数は左手の親指から小指に対応）には、未定義値ＮＵＬＬが設定される。以降、この変数を、「押鍵対象演奏情報ポインタ変数」と呼ぶ。また、図４の動作データの総数を示す変数ＦｒａｍｅＣｏｕｎｔの値が「０」に初期設定される。この変数は、ステップＳ６０７の動作データ出力の処理で操作される。
【００３８】
次に、ＣＰＵ２０１は、次鍵の検索の処理を実行する（ステップＳ６０２）。この処理は、各パートの各指の次に押鍵する演奏情報へのポインタ変数Ｎｅｘｔ［０］［０］〜Ｎｅｘｔ［０］［４］（これら４つの変数は右手パートの親指から小指に対応）およびＮｅｘｔ［１］［０］〜Ｎｅｘｔ［１］［４］（これら４つの変数は左手パートの親指から小指に対応）の各値を算出する処理である。以降、この変数を、「次タイミング演奏情報ポインタ変数」と呼ぶ。ステップＳ６０２は、最初の実行であって、ステップＳ６０１により、右手パートの演奏情報検索ポインタ変数ｍｅＴａｉｌ［０］と左手パートの演奏情報検索ポインタ変数ｍｅＴａｉｌ［１］には、それぞれ各パートの最初の演奏情報へのポインタが設定されているこのため、ステップＳ６０２での次鍵の検索の処理により、曲の先頭の発音タイミングに対して、各パート毎に、各指においてその次のタイミングで押鍵されるべき各演奏情報へのポインタ変数Ｎｅｘｔ［０］［０］〜Ｎｅｘｔ［０］［４］およびＮｅｘｔ［１］［０］〜Ｎｅｘｔ［１］［４］が予め取得されることになる。この次タイミング演奏情報ポインタ変数は、ステップＳ６０５のパート毎の状態確認処理の中の準備確認の処理（後述する図９のステップＳ９０８および図１２〜図１５参照）で参照される。なお、このステップＳ６０２の次鍵の検索の処理は、図９のステップＳ９０４またはＳ９０５の処理の後、ステップＳ９０６の処理に先立って行うようにしてもよい。
【００３９】
その後、ＣＰＵ２０１は、ステップＳ６０３で、右手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［０］および左手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［１］がそれぞれ参照する演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］のうちの発音開始時刻Ｔｉｍｅ（図３参照）が早い方、すなわち、右手パートと左手パートのうちの先に演奏すべき演奏情報を、検索ポインタ変数ｍｅＰｔｒに設定しながら、ステップＳ６０４で検索ポインタ変数ｍｅＰｔｒの内容が未定義値ＮＵＬＬとなってＲＡＭ２０３上の演奏情報の検索が全て終了したと判定するまで、以下のステップＳ６０５、Ｓ６０６、およびＳ６０７の一連の処理を繰り返し実行する。
【００４０】
なお、右手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［０］および左手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［１］の各内容は、ステップＳ６０５の中の押鍵検索の処理（後述する図９のステップＳ９０７および図１１のＳ１１１０参照）で、現在の押鍵タイミングに対応して各パート毎に同時に押鍵すべき演奏情報が検索される毎に、それらの同時に押鍵すべき演奏情報の次に押鍵すべき演奏情報へのポインタとして、順次更新される。
【００４１】
まず、ＣＰＵ２０１は、パート毎の状態確認の処理を実行する（ステップＳ６０５）。ここでは、ＣＰＵ２０１は、図１の操作状態推定手段１０２の機能に対応する処理を実行する。この結果、右手パート出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［０］［０］〜ｐｒｅｐ［０］［４］（これら４つの変数は右手パートの親指から小指に対応）に、右手パートのそれぞれの指で押鍵を行う演奏情報と押鍵の準備動作を行う演奏情報へのポインタが得られる。同様に、左手パート出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［１］［０］〜ｐｒｅｐ［１］［４］（これら４つの変数は左手パートの親指から小指に対応）に、左手パートのそれぞれの指で押鍵を行う演奏情報と押鍵の準備動作を行う演奏情報へのポインタが得られる。
【００４２】
次に、ＣＰＵ２０１は、パート同士の状態比較の処理を実行する（ステップＳ６０６）。ここでは、ＣＰＵ２０１は、図１のパート同士の状態比較手段１０３の機能に対応する処理を実行する。ここでは、ＣＰＵ２０１は、前述したように、左右パート間で、押鍵を行う指同士が衝突しそうになったり、あるいは次の押鍵のために押鍵の準備動作を行う指と押鍵を行う指が衝突しそうになったりする状態を検知する。そして、ＣＰＵ２０１は、右手パート鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［０］と左手パート鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［１］、および右手パート鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［０］と左手パート鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［１］を、それぞれ生成する。右手パート鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［０］は、現在のタイミングで右手パートについて押鍵を行う指または押鍵の準備動作を行う指の鍵盤上での演奏位置を、衝突の検知状態に応じて鍵盤の奥行き方向で補正するための値である。同様に、左手パート鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［１］は、現在のタイミングで左手パートについて押鍵を行う指または押鍵の準備動作を行う指の鍵盤上での演奏位置を、衝突の検知状態に応じて鍵盤の奥行き方向で補正するための値である。一方、右手パート鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［０］は、現在のタイミングで右手パートについて押鍵を行う指または押鍵の準備動作を行う指の鍵盤上での配置位置を、衝突の検知状態に応じて鍵盤の横方向で補正するための値である。同様、左手パート鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［１］は、現在のタイミングで左手パートについて押鍵を行う指または押鍵の準備動作を行う指の鍵盤上での配置位置を、衝突の検知状態に応じて鍵盤の横方向で補正するための値である。
【００４３】
最後に、ＣＰＵ２０１は、動作データ出力の処理を実行する（ステップＳ６０７）。動作データ出力の処理では、ＣＰＵ２０１は、図１の操作状態推定手段１０２の機能に対応する処理を実行する。この結果、ＣＰＵ２０１は、図４で説明したデータフォーマットで、演奏ガイドを実行するための動作データ（図１の「動作情報１０８」に対応）を出力する。
【００４４】
ＣＰＵ２０１は、以上のステップＳ６０５、Ｓ６０６、およびＳ６０７の一連の処理を、演奏情報の発音タイミング毎に実行することにより、各動作タイミングにおける演奏ガイドのための動作データを一括して出力することが可能となる。
【００４５】
図７は、図６のステップＳ６０２の次鍵の検索の処理の例を示すフローチャートである。
【００４６】
ＣＰＵ２０１はまず、パート検索用変数ｉＨに値０を設定する（ステップＳ７０１）。パート検索用変数ｉＨは、右手または左手のうちどちらを処理するかを示す情報であり、その値が０なら右手、１なら左手を示す。その後、ＣＰＵ２０１は、ステップＳ７０７でパート検索用変数ｉＨの値を＋１しながら、ステップＳ９０２で変数ｉＨの値が２に達したと判定するまで、変数ｉＨが示す右手および左手の各パート毎に、以下のステップＳ７０３からＳ７０６の一連の処理を実行する。これにより、ＣＰＵ２０１は、演奏ガイド開始時の押鍵タイミングに対する、右手パート次タイミング演奏情報ポインタ変数Ｎｅｘｔ［０］［０］〜Ｎｅｘｔ［０］［４］および左手パート次タイミング演奏情報ポインタ変数Ｎｅｘｔ［１］［０］〜Ｎｅｘｔ［１］［４］を設定する。
【００４７】
次に、ＣＰＵ２０１は、指番号指定変数ｉｆｉｇに値「０」を格納する（ステップＳ７０３）。
【００４８】
次に、ＣＰＵ２０１は、ステップＳ７０６で指番号指定変数ｉｆｉｇの値を＋１ずつしながら、ステップＳ７０４で変数ｉｆｉｇの値が片手の指の最大数「５」に達したと判定するまで、ステッ７０５で、変数ｉｆｉｇが示す指に対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］を更新する処理を実行する。ここで、ｉｆｉｇ＝０ならば親指、ｉｆｉｇ＝１ならば人差し指、ｉｆｉｇ＝２ならば中指、ｉｆｉｇ＝３ならば薬指、ｉｆｉｇ＝４ならば小指が、それぞれ指定されたことになる。
【００４９】
図８は、図７のステップＳ７０５のＮｅｘｔ［ｉＨ］［ｉｆｉｇ］の更新処理の例を示すフローチャートである。
【００５０】
まず、ＣＰＵ２０１は、現在のパートｉＨおよび現在の指番号ｉｆｉｇが示す指に対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］に未定義値ＮＵＬＬを格納する（ステップＳ８０１）。
【００５１】
次に、ＣＰＵ２０１は、演奏情報検索用変数ｉに、現在のパートｉＨに対応する演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］に＋１した値を格納する（ステップＳ８０２）。これは、現在のパートの演奏情報の次の演奏情報から検索が行われるという意味である。
【００５２】
次に、ＣＰＵ２０１は、ステップＳ８０６で演奏情報検索用変数ｉの値を＋１ずつしながら、ステップＳ８０３で変数ｉの値が演奏情報の最大数（図３の例では、演奏情報の最大数＝Ｎ）に達したと判定するまで、各演奏情報Ｎｏｔｅ［ｉ］（現在の演奏情報のインデックス番号＋１≦ｉ≦Ｎ−１）毎に、以下のステップＳ８０４とＳ８０５の判定処理を実行する。
【００５３】
すなわち、ＣＰＵ２０１はまず、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］中の右手または左手を示すトラック番号Ｈａｎｄ（図３参照）（図８中では「Ｎｏｔｅ［ｉ］．Ｈａｎｄ」と記載）が、パート検索用変数ｉＨの値が示す現在処理中のパート番号に等しいか否かを判定する（ステップＳ８０４）。なお、図８中の「＝＝」は、その両辺の値同士が「等しい」ことを検査する演算子である。
【００５４】
ステップＳ８０４の判定がＮＯならば、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］は、現在処理対象としている手（右手または左手）以外で演奏する音符であるので、ＣＰＵ２０１は、ステップＳ８０６の処理に移行して、次の演奏情報の検索に進む。
【００５５】
ステップＳ８０４の判定がＹＥＳならば、ＣＰＵ２０１はさらに、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］中の指番号Ｆｉｎｇｅｒ（図３参照）（図８中では「Ｎｏｔｅ［ｉ］．Ｆｉｎｇｅｒ」と記載）が、現在処理中の指番号ｉｆｉｇ（図７のステップＳ７０３、Ｓ７０４、Ｓ７０６参照）に等しいか否かを判定する（ステップＳ８０５）。
【００５６】
ステップＳ８０５の判定がＮＯならば、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］は、現在処理対象としている指以外で演奏する音符であるので、ＣＰＵ２０１は、ステップＳ８０６の処理に移行して、次の演奏情報の検索に進む。
【００５７】
ステップＳ８０５の判定がＹＥＳになると、ＣＰＵ２０１は、現在のパート番号ｉＨおよび現在の指番号ｉｆｉｇが示す指に対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］に、トラック番号（パート番号）と指番号が一致して検索された演奏情報Ｎｏｔｅ［ｉ］へのポインタ値（記憶アドレス等）を格納して、次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］の更新処理を終了する。
【００５８】
ステップＳ８０４またはＳ８０５の判定がＮＯの状態が続き、やがて全ての演奏情報についての検索が終了してステップＳ８０３の判定がＮＯになると、ＣＰＵ２０１は、図８のフローチャートで示される、ｉｆｉｇで表される指に関しての次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］の内容がステップＳ８０１でＮＵＬＬに設定されたまま、その更新処理を終了する。そしてこの図８処理は、図７で、ｉｆｉｇによる指の指示を順次変えながら繰り返して実行されて、現在処理中のパート（右手・左手）の全ての指について順次処理が行われる。
【００５９】
以上のようにして、図７と図８のフローチャートで示される処理の例によって、図６のステップＳ６０２の次鍵の検索の処理が実現される。
【００６０】
図９は、図６のステップＳ６０５のパート毎の状態確認の処理の例を示すフローチャートである。
【００６１】
ＣＰＵ２０１はまず、パート検索用変数ｉＨに値０を設定する（ステップＳ９０１）。前述したように、パート検索用変数ｉＨの値は、０なら右手、１なら左手を示す。その後、ＣＰＵ２０１は、ステップＳ９０９でパート検索用変数ｉＨの値を＋１しながら、ステップＳ９０２で変数ｉＨの値が２に達したと判定するまで、変数ｉＨが示す右手および左手の各パート毎に、以下のステップＳ９０３からＳ９０８の一連の処理を実行して、動作データ（図４参照）を一括して生成する。
【００６２】
まず、ＣＰＵ２０１は、検索ポインタ変数ｍｅＰｔｒの値が現在のパートｉＨに対応する演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の値と等しいか否かを判定する（ステップＳ９０３）。
【００６３】
本実施形態では、パート検索用変数ｉＨの値の制御（ステップＳ９０１、Ｓ９０２、Ｓ９０９）によって、右手パート（ｉＨ＝０）における押鍵の状態または押鍵の準備動作の状態を検出する処理と左手パート（ｉＨ＝１）における押鍵の状態または押鍵の準備動作の状態を検出する処理が常にペアで処理される。これは、後述するように、本実施形態では、図６のステップＳ６０６のパート同士の状態比較の処理において、右手パートの演奏状態と左手パートの演奏状態を比較して衝突が発生するかどうかを判定する必要があるためである。
【００６４】
そして、前述したように、図６のステップＳ６０３において、検索ポインタ変数ｍｅＰｔｒには、右手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［０］と左手パート演奏情報検索ポインタ変数ｍｅＴａｉｌ［１］のうち、各ポインタが示す演奏情報の発音開始時刻Ｔｉｍｅ（図３参照）が早い方の演奏情報へのポインタが格納される。なお、左右パート同時に発音される場合には、ｍｅＰｔｒ＝ｍｅＴａｉｌ［０］＝ｍｅＴａｉｌ［１］となっている。
【００６５】
ｍｅＰｔｒ＝＝ｍｅＴａｉｌ［ｉＨ］となってステップＳ９０３の判定がＹＥＳなら、ＣＰＵ２０１は、現在のパートｉＨに対応する押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］に値「１」を設定する。一方、ｍｅＰｔｒ≠ｍｅＴａｉｌ［ｉＨ］となってステップＳ９０３の判定がＮＯなら、ｐｕｓｈＫｅｙ［ｉＨ］に値「０」を設定する。押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］は、右手パートと左手パートのうち早く押鍵または押鍵の準備動作のガイド（以下「押鍵動作」と記載する）が開始されたほうのタイミングで、現在のパートｉＨがその早いほうの押鍵動作のタイミングであるか（値「１」）、否か（値「０」）を示すフラグである。図１７のフローチャートの説明で後述するように、ＣＰＵ２０１は、図６のステップＳ６０６のパート同士の状態比較の処理において、右手パートと左手パートの比較を行うときに、右手パートおよび左手パートのうちどちらが早く押鍵動作に入ったかを判別することにより、適切な衝突回避の制御を行う。この判別のために、ＣＰＵ２０１は、ステップＳ９０３で設定された押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値を参照する。
【００６６】
ステップＳ９０４またはＳ９０５の処理の後、ＣＰＵ２０１は、離鍵確認の処理を実行する（ステップＳ９０６）。なお、ここで、図６のステップＳ６０２の「次鍵の検索」の処理をステップＳ９０６の処理に先立って行うこととしてもよい。離鍵確認の処理では、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］が示す現在のパートｉＨの５本の各指の押鍵状態を示す演奏情報のうち、発音期間（発音開始時刻Ｔｉｍｅ＋発音継続時間Ｇａｔｅ）（図３参照）が、演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報の発音開始時刻Ｔｉｍｅよりも前に終了する指があれば、その指の押鍵状態が終了させられる。
【００６７】
次に、ＣＰＵ２０１は、押鍵検索の処理を実行する（ステップＳ９０７）。押鍵検索の処理では、演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報と同時に押鍵を行うべき現在のパートｉＨに属する演奏情報が検索される。そして、その検索された演奏情報がｍｅＴａｉｌ［ｉＨ］が示す演奏情報とともに、各演奏情報に登録されている指に対応する押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］にセットされる。また、次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［０］〜Ｎｅｘｔ［ｉＨ］［４］のうち、上記セットが行われた指に対応するポインタの内容が、そのセットが行われた指においてその次のタイミングで押鍵されるべき現在のパートｉＨに属する演奏情報へのポインタ値に更新される。なお、同じパートに属し同時に発音開始される演奏情報はＲＡＭ２０３上では連続して記憶されている。このため、上記押鍵検索の処理により同時に発音開始される演奏情報が検索された後は、演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の内容は、それらの同時に押鍵すべき演奏情報を飛び越して、その次に押鍵すべき演奏情報へのポインタとして設定される。
【００６８】
続いて、ＣＰＵ２０１は、準備確認の処理を実行する（ステップＳ９０８）。この結果、演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す演奏情報中の発音開始時刻Ｔｉｍｅ（図３参照）に対応する押鍵タイミングにおいて、パートｉＨの５本の各指で押鍵または押鍵の準備動作を行う演奏情報へのポインタが、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］（これら４つの変数はパートｉＨの親指から小指に対応）に得られる。この処理が、ステップＳ９０１、Ｓ９０２、およびＳ９０９で制御されるパート検索用変数ｉＨの値「０」および「１」毎に実行されることにより、右手パートに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［０］［０］〜ｐｒｅｐ［０］［４］と、左手パートに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［１］［０］〜ｐｒｅｐ［１］［４］が算出される。
【００６９】
上述の準備確認の処理では、演奏情報が順次読み込まれながら、曲の各再生時点において、再生時点における演奏情報に対応する演奏状態とその再生時点以降における演奏情報に対応する演奏状態とが比較される。この結果、例えば、親指で押鍵中に親指以外の指で親指の上を越えて移動させて次以降のタイミングにて押鍵する第１の状態（指越え）が検出される。または、親指以外の指で押鍵中に親指で親指以外の指の下をくぐらせて移動させて次以降のタイミングにて押鍵する第２の状態（指くぐり）が検出される。また、第１および第２のいずれの状態でもなく、任意の指で押鍵中の鍵から所定の基準値に比較して近い位置の異なる鍵を次以降のタイミングにてその任意の指以外の指で押鍵する第３の状態が検出される。あるいは、任意の指で押鍵中の鍵と同じ鍵を次のタイミングにてその任意の指以外の指で押鍵する第４の状態が検出される。さらには、現在押鍵されている鍵から所定の基準値よりも離れた位置の鍵が次に押鍵される状態が検出される。
【００７０】
以上のステップＳ９０６の離鍵確認の処理、ステップＳ９０７の押鍵検索の処理、ステップＳ９０８の準備確認の処理は、図１の操作状態推定手段１０２の機能を実現する。
【００７１】
図１０は、図９のステップＳ９０６の離鍵確認の処理の例を示すフローチャートである。
【００７２】
まず、ＣＰＵ２０１は、指番号指定変数ｉｆｉｇに値「０」を格納する（ステップＳ１００１）。
【００７３】
次に、ＣＰＵ２０１は、ステップＳ１００６で指番号指定変数ｉｆｉｇの値を＋１ずつしながら、ステップＳ１００２で変数ｉｆｉｇの値が片手の指の最大数「５」に達したと判定するまで、ステップ１００３からＳ１００５の一連の処理を実行する。なお、変数ｉｆｉｇの各値の意味は、図７の場合と同じである。
【００７４】
ＣＰＵ２０１は、現在のパートｉＨ（ステップＳ９０１、Ｓ９０２、Ｓ９０９参照）および現在の指番号ｉｆｉｇが示す押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］の値が未定義値Ｎｕｌｌでないか否かを判定する（ステップＳ１００３）。なお、図１０中の「！＝」は、その両辺の値同士が「等しくない」ことを検査する演算子である。前述のように、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］は、現在のパートｉＨのｉｆｉｇで表される指が押鍵中である場合の演奏情報へのポインタ変数であるので、このＨａｎｄ［ｉＨ］［ｉｆｉｇ］の値がＮｕｌｌでない場合は、その指が押鍵中であることを意味する。
【００７５】
ステップＳ１００３の判定がＮＯならば、Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］の値がＮｕｌｌでありその指は押鍵中では無いので、ＣＰＵ２０１は、ステップＳ１００６の処理に移行し、次の指の処理に移行する。
【００７６】
押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］の値が未定義値でなくステップＳ１００３の判定がＹＥＳならば、ＣＰＵ２０１は、ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］が指す演奏情報の発音開始時刻Ｔｉｍｅ（図３参照）にその演奏情報の発音継続時間Ｇａｔｅを加算することにより、その演奏情報の発音終了時刻を算出する。そして、ＣＰＵ２０１は、ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］が指す演奏情報の上記発音終了時刻が、演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報の発音開始時刻Ｔｉｍｅよりも前である（小さい）か否かを判定する（ステップＳ１００４）。
【００７７】
ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］が指す演奏情報の発音終了時刻がｍｅＴａｉｌ［ｉＨ］が示す演奏情報の発音開始時刻Ｔｉｍｅよりも前でステップＳ１００４の判定がＹＥＳならば、ＣＰＵ２０１は、ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］に未定義値ＮＵＬＬを格納して、現在の指番号ｉｆｉｇが示す指を離鍵状態にする（ステップＳ１００５）。
【００７８】
その後、ＣＰＵ２０１は、ステップＳ１００６の処理に移行し、次の指の処理に移行する。
【００７９】
５本全ての指についての確認が終了してステップＳ１００２の判定がＮＯになると、ＣＰＵ２０１は、図１０のフローチャートで示される図９のステップＳ９０６の離鍵確認の処理を終了する。
【００８０】
以上のようにして、図１０のフローチャートの処理の例で示される図９のステップＳ９０６の離鍵確認の処理によって、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］が示す現在のパートｉＨの各指で押鍵中とされている演奏情報のうち、現在処理中のｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報の発音開始時刻よりも発音終了時刻が前となる指について、離鍵状態とされる。
【００８１】
図１１は、図９のステップＳ９０７の押鍵検索の処理の例を示すフローチャートである。
【００８２】
ＣＰＵ２０１はまず、演奏情報検索用変数ｉに、現在の処理対象のｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報のインデックス番号ｉｎｄｅｘ（図３参照）の値をセットする。つまり、同時発音を行う演奏情報を検索するための開始位置が、現在処理対象の演奏情報自身とされる（ステップＳ１１０１）。
【００８３】
次に、ＣＰＵ２０１は、ステップＳ１１０８で演奏情報検索用変数ｉの値を＋１ずつしながら、ステップＳ１１０２で変数ｉの値が演奏情報の最大数（図３の例では、演奏情報の最大数＝Ｎ）に達したと判定するまで、ステップＳ１１０３からＳ１１０７までの一連の処理を実行する。
【００８４】
ＣＰＵ２０１はまず、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］中の右手または左手を示すトラック番号Ｈａｎｄ（図３参照）（図８中では「Ｎｏｔｅ［ｉ］．Ｈａｎｄ」と記載）が、パート検索用変数ｉＨの値が示す現在のパート（図９のステップＳ９０１、Ｓ９０２、Ｓ９１２参照）に等しいか否かを判定する（ステップＳ１１０３）。
【００８５】
ステップＳ１１０３の判定がＮＯならば、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］は、現在処理中のパート（右手・左手の別）ではないので、ＣＰＵ２０１は、ステップＳ１１０８の処理に移行して、次の演奏情報の検索に進む。
【００８６】
ステップＳ１１０３の判定がＹＥＳならば、ＣＰＵ２０１は、演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］中の発音開始時刻Ｔｉｍｅ（図３参照）（図１１中では「Ｎｏｔｅ［ｉ］．Ｔｉｍｅ」と記載）が、現在処理対象の演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す演奏情報の発音開始時刻Ｔｉｍｅ（図３参照）（図１１中では「ｍｅＴａｉｌ［ｉＨ］．Ｔｉｍｅ」と記載）と同時刻であるか否かを判定する（ステップＳ１１０４）。
【００８７】
同時刻の演奏情報が見つかりステップＳ１１０４の判定がＹＥＳならば、ＣＰＵ２０１は、指番号指定変数ｉｆｉｇに、現在検索されている演奏情報Ｎｏｔｅ［ｉ］中の指番号Ｆｉｎｇｅｒ（図１１中では「Ｎｏｔｅ［ｉ］．Ｆｉｎｔｅｒ」と記載）を格納する（ステップＳ１１０５）。なお、最初の処理では、「ｉ＝ｍｅＴａｉｌ［ｉＨ］のインデックス番号」であるから（ステップＳ１１０１参照）、ステップＳ１１０４の判定は、「Ｎｏｔｅ［ｉ］．Ｔｉｍｅ＝ｍｅＴａｉｌ［ｉＨ］．Ｔｉｍｅ＝＝ｍｅＴａｉｌ［ｉＨ］．Ｔｉｍｅ？」という自分自身を自分自身と比較する判定になる。このため、ステップＳ１１０４の判定は、必ずＹＥＳとなる。
【００８８】
次に、ＣＰＵ２０１は、検索された演奏情報Ｎｏｔｅ［ｉ］の指番号Ｆｉｎｇｅｒ（図３参照）を、現在の指番号ｉｆｉｇに格納する（ステップＳ１１０５）。
【００８９】
その後、ＣＰＵ２０１は、現在の指番号ｉｆｉｇが示す押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］に、検索された演奏情報Ｎｏｔｅ［ｉ］へのポインタを格納する（ステップＳ１１０６）。前述したように、最初の処理では、ステップＳ１１０５の判定は必ずＹＥＳとなるため、現在処理対象の演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す演奏情報へのポインタは、必ず押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］に登録されることになる。
【００９０】
最後に、ＣＰＵ２０１は、検索された演奏情報Ｎｏｔｅ［ｉ］に対応する指番号ｉｆｉｇ（ステップＳ１１０５参照）が示す指に対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］を更新する処理を実行する（ステップＳ１１０７）。この処理の例は、前述した図８のフローチャートで示される。ただし、図８のステップＳ８０２では、ＣＰＵ２０１は、演奏情報検索用変数ｉに、検索された現在の演奏情報のカウンタ値ｉに＋１した値を格納する。これは、検索された同時発音を行う現在の演奏情報Ｎｏｔｅ［ｉ］の次の演奏情報から、次に押鍵される演奏情報の検索が行われるという意味である。
【００９１】
ステップＳ１１０７の処理の後、ＣＰＵ２０１は、ステップＳ１１０８の処理に移行して、次の演奏情報の検索に進む。
【００９２】
ここで、図３で説明したように、演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］は、発音開始時刻Ｔｉｍｅの順に並ぶように、インデックス番号（０、１、・・・、Ｎ）が付与されている。従って、ステップＳ１１０４の判定で、現在の演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］中の発音開始時刻Ｔｉｍｅが、現在処理対象のｍｅＴａｉｌ［ｉＨ］が示す演奏情報の発音開始時刻Ｔｉｍｅと同時刻ではなく、判定結果がＮＯならば（ステップＳ１１０４の判定がＮＯ）、現在の演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］以降には同時刻の演奏情報は存在しない。そこでこの場合には、ＣＰＵ２０１は、押鍵検索の処理を終了する。この場合、同時発音を行うとして検索された演奏情報については、図９のステップＳ９０８では、現在の処理対象のｍｅＴａｉｌ［ｉＨ］が示す演奏情報とともに、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］にセットされて一括して処理される。このため、以降は図９のステップＳ９０２からＳ９０９までの処理ループを実行する必要はない。このため、ＣＰＵ２０１は、現在のパートｉＨの処理対象の演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］に、同時発音を行う演奏情報のグループを飛び越えて、最後に捨てＳ１１０４の判定がＮＯとなったときの演奏情報検索用変数ｉが示す演奏情報Ｎｏｔｅ［ｉ］へのポインタを設定する（ステップＳ１１１０）。
【００９３】
ただし、このステップＳ１１１０の処理が実行されるのは、現在のパートｉＨが他方のパートと同じかそれよりも早い押鍵動作のタイミングであって現在のパートｉＨに対応する押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］に値「１」が設定されている場合のみとする（ステップＳ１１０９の判定がＹＥＳ）。現在のパートｉＨが他方のパートよりも遅い押鍵動作のタイミングであって現在のパートｉＨに対応する押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］に値「０」が設定されている場合には、ステップＳ１１０９の判定はＮＯとなる。この場合には、現在のパートｉＨの処理対象の演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の内容は更新されずに、図１１のフローチャートで示される図９のステップＳ９０７の押鍵検索の処理を終了する。後述するように、図６のステップＳ６０７の動作データ出力の処理では、ｐｕｓｈＫｅｙ［ｉＨ］に値「０」が設定されていて右手パートと左手パートの衝突が発生していないときには動作データ出力の処理は実行されない（図１８のステップＳ１８０３の判定がＮＯとなる）。このため、ｐｕｓｈＫｅｙ［ｉＨ］に値「０」が設定されているときには、図１１のステップＳ１１０９の判定がＮＯとなって演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の内容は更新されず、そのパートｉＨに関しては、図５のステップＳ６０３でｐｕｓｈＫｅｙ［ｉＨ］に値「１」が設定されるまでｍｅＴａｉｌ［ｉＨ］の更新による演奏ガイドの表示進行が待たれることになる。
【００９４】
ステップＳ１１１０の処理の後、ＣＰＵ２０１は、図１１のフローチャートで示される図９のステップＳ９０７の押鍵検索の処理を終了する。
【００９５】
また、全ての演奏情報についての検索が終了してステップＳ１１０２の判定がＮＯになった場合も、ＣＰＵ２０１は、図１１のフローチャートで示される図９のステップＳ９０７の押鍵検索の処理を終了する。
【００９６】
図１２から図１５は、図９のステップＳ９０８の準備確認の処理の例を示すフローチャートである。
【００９７】
この図１２から図１５の準備確認の処理を通して、ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］には、図６のステップＳ６０７の動作データ出力の処理において図４の動作データを出力するために対象となる現在のパートｉＨの各指の演奏情報が格納される。この場合の演奏情報には、対応する動作データの出力タイミングにおいて、現在のパートｉＨの各指で押鍵を行う演奏情報と、次の動作タイミングでの押鍵の準備動作を行う演奏情報がある。まず、ＣＰＵ２０１は、図１２のステップＳ１２０１からＳ１２０８までの一連の処理によって、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］の内容を、いったん出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］にコピーする。このコピー処理では、まずは押鍵対象となっている演奏情報が格納されているポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］の内容がｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］にコピーされる。その後、図１３から図１５のフローチャートでは、現在のパートｉＨの各指の次タイミング演奏情報ポインタＮｅｘｔ［ｉＨ］［０］〜Ｎｅｘｔ［ｉＨ］［４］の中から準備動作の対象となる演奏情報が判別される。そして、その判別された演奏情報が、後述する図１５のステップＳ１２３９で、ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］に追加的に登録される。
【００９８】
ＣＰＵ２０１はまず、準備動作判定用変数Ｍｏｖｉｎｇ、Ｐａｓｓｉｎｇに、共に値「０」を格納する（ステップＳ１２０１）。
【００９９】
次に、ＣＰＵ２０１は、指番号指定変数ｉｆｉｇと押鍵指数カウンタ変数ｆｉｇｕｓｅに、共に値「０」を格納する（ステップＳ１２０２）。
【０１００】
その後、ＣＰＵ２０１は、ステップＳ１２０８で指番号指定変数ｉｆｉｇの値を＋１ずつしながら、ステップＳ１２０３で変数ｉｆｉｇの値が片手の指の最大数「５」に達したと判定するまで、ステップＳ１２０４からＳ１２０７までの一連の処理を実行する。
【０１０１】
まず、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］に、共に未定義値ＮＵＬＬを格納する。また、ＣＰＵ２０１は、現在の指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］に値「−１」を格納する（以上、ステップＳ１２０４）。ステップデータｓｔｅｐ［ｉｆｉｇ］は、現在の指番号ｉｆｉｇに対応する指が、どの押鍵段階にあるかを示す。ｓｔｅｐ［ｉｆｉｇ］＝０ならばその指を今回押鍵すべきであることを示し、ｓｔｅｐ［ｉｆｉｇ］＝１，２，・・・ならばその指を次回、その次、・・・で押鍵すべきであることを示す。ステップＳ１２０４で設定されるｓｔｅｐ［ｉｆｉｇ］＝−１は、その指についてはまだ押鍵段階が決定されていないことを示す。
【０１０２】
次に、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］の内容を出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］にコピーする（ステップＳ１２０５）。
【０１０３】
次に、ＣＰＵ２０１は、現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の内容が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ１２０６）。
【０１０４】
ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の内容が未定義値ＮＵＬＬでなくステップＳ１２０６の判定がＹＥＳならば、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］の内容がＮＵＬＬではなかったということなので、ＣＰＵ２０１は、現在の指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］に今回押鍵を示す値「０」を格納する。さらに、ＣＰＵ２０１は、押鍵指数カウンタ変数ｆｉｇｕｓｅの値を＋１インクリメントする（図１２中では「＋＋」という演算子で記載）（以上、ステップＳ１２０７）。
【０１０５】
ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の内容が未定義値ＮＵＬＬであってステップＳ１２０６の判定がＮＯである場合、またはステップＳ１２０７の処理の後、ＣＰＵ２０１は、ステップＳ１２０８の処理に移行し、次の指に対する処理を実行する。
【０１０６】
以上のステップＳ１２０３からＳ１２０８までの一連の処理の後、５本の指についてのコピー処理が終了しステップＳ１２０３の判定がＮＯとなった時点で、押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］のうち押鍵を示す演奏情報へのポインタが出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］にコピーされている。この場合、ステップデータｓｔｅｐ［０］〜ｓｔｅｐ［４］のうち押鍵状態にある指に対応するデータには値「０」が格納され、それ以外の指に対応するデータには未定義状態を示す値「−１」が格納される状態となる。
【０１０７】
図１２のステップＳ１２０３の判定がＮＯとなった後、ＣＰＵ２０１は、図１３のステップＳ１２０９からＳ１２１９の一連の処理を実行する。ここでは、現在のパートｉＨの各指の次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［０］〜Ｎｅｘｔ［ｉＨ］［４］のうちから、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］において演奏情報へのポインタが定義されていない指に対応するデータであって、かつ発音開始時刻が最も早い演奏情報へのポインタとそれに対応する指番号が、それぞれ変数ＮｏｔｅＰｒｅとｆｉｇに取得される。
【０１０８】
すなわち、ＣＰＵ２０１はまず、押鍵指数カウンタ変数ｆｉｇｕｓｅの値が５より小さいか否かを判定する（ステップＳ１２０９）。
【０１０９】
もし、押鍵指数カウンタ変数ｆｉｇｕｓｅの値が５になっていると、現在のパートｉＨの５本全ての指が押鍵中を示していることになり（図１２のステップＳ１２０６とＳ１２０７参照）、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］において演奏情報へのポインタが定義されていない指はない。この場合には、図１３のステップＳ１２０９の判定がＮＯとなって、ＣＰＵ２０１は、図９のステップＳ９０８の準備確認の処理を終了する。この場合は、準備動作判定用変数Ｍｏｖｉｎｇ、Ｐａｓｓｉｎｇの値は図１２のステップＳ１２０１で共に値「０」とされたままになる。そして、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］に設定されている５つの演奏情報は、全て押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［０］〜Ｈａｎｄ［ｉＨ］［４］に設定されていた、同時刻に発音開始する５つの演奏情報がそのまま格納される。この結果、後述する図６のステップＳ６０７の動作データ出力の処理（後述する図１９のステップＳ１８１５→Ｓ１８１６参照）において、各指の状態ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］（図４参照）として共に押鍵を示す値「１」が設定される。すなわち、後述する図１９のステップＳ１８１７→Ｓ１８１８の処理は一度も実行されず、各指の状態ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］（図４参照）のいずれにも、準備動作を示す値「−１」は設定されないことになる。
【０１１０】
押鍵指数カウンタ変数ｆｉｇｕｓｅの値が５より小さくステップＳ１２０９の判定がＹＥＳならば、ＣＰＵ２０１は、現在の押鍵比較段階変数ｓｔｅｐに初期値「１」を格納する（ステップＳ１２１０）。押鍵比較段階変数ｓｔｅｐの値は、現在の押鍵タイミングで押鍵中とされる演奏情報に対して何タイミング後に押鍵される演奏情報の比較が行われるかを示す。ｓｔｅｐ＝１であれば、現在押鍵中の演奏情報に対して次のタイミングにて押鍵される演奏情報の比較が行われることを示す。ｓｔｅｐ＝２であれば、現在押鍵中の演奏情報に対して次の次のタイミングにて押鍵される演奏情報の比較が行われることを示す。押鍵比較段階変数ｓｔｅｐの値は、ステップＳ１２０９で値「１」に初期設定された後、後述する図１５のステップＳ１２４０で＋１ずつインクリメントされ、ステップＳ１２１１からＳ１２１９の探索が繰り返し実行される。
【０１１１】
次に、ＣＰＵ２０１は、現在の押鍵比較段階ｓｔｅｐにおいて、まだ押鍵や準備動作が決定されていない指のうちで発音開始時刻が最も早い演奏情報へのポインタを格納する変数ＮｏｔｅＰｒｅに未定義値ＮＵＬＬを格納し、それに対応する指番号を格納する変数ｆｉｇにどの指でもないことを示す値「−１」を格納する（ステップＳ１２１１）。
【０１１２】
次に、ＣＰＵ２０１は、ステップＳ１２１２で指番号指定変数ｉｆｉｇに初期値「０」（親指）を設定した後、ステップＳ１２１９でｉｆｉｇの値を＋１ずつインクリメントしながら、ステップＳ１２１３で片手の指の最大数「５」に達したと判定するまで、以下のステップＳ１２１４からＳ１２１８の一連の処理を実行する。
【０１１３】
ＣＰＵ２０１はまず、現在の指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］の値が、指番号ｉｆｉｇの指についてはまだ押鍵段階が決定されていないことを示す値「−１」（図１２のステップＳ１２０４参照）であるか否かを判定する（ステップＳ１２１４）。
【０１１４】
現在の指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］の値が「−１」以外でありステップＳ１２１４の判定がＮＯならば、その指番号ｉｆｉｇの指は押鍵または押鍵の準備動作をすることが決定済みであるため、ＣＰＵ２０１は、ステップＳ１２１９の処理に移行し、次の指番号の処理に進む。
【０１１５】
現在の指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］の値が「−１」でありステップＳ１２１４の判定がＹＥＳならば、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ１２１５）。
【０１１６】
Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬであってステップＳ１２１５の判定がＮＯならば、その指番号ｉｆｉｇに対応する指について次以降のタイミングで押鍵されることはない。このため、ＣＰＵ２０１は、ステップＳ１２１９の処理に移行し、次の指番号の処理に進む。
【０１１７】
Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬではなくステップＳ１２１５の判定がＹＥＳならば、ＣＰＵ２０１は、まだ押鍵や準備動作が決定されていない指のうちで発音開始時刻が最も早い演奏情報へのポインタを格納する変数ＮｏｔｅＰｒｅの内容が未定義値ＮＵＬＬではなく、かつ変数ＮｏｔｅＰｒｅが示す演奏情報の発音開始時刻Ｔｉｍｅ（図１３中では「ＮｏｔｅＰｒｅ．Ｔｉｍｅ」と記載）が現在の指番号ｉｆｉｇに対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］が示す演奏情報の発音開始時刻Ｔｉｍｅ（図１３中では「Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］．Ｔｉｍｅ」と記載）よりも早い（小さい）か否かを判定する（ステップＳ１２１６）。
【０１１８】
ステップＳ１２１６の判定がＹＥＳならば、現在の変数ＮｏｔｅＰｒｅが示す演奏情報の発音開始時刻のほうが、現在の指番号ｉｆｉｇに対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］が示す演奏情報の発音開始時刻よりも早い。この場合には、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅの内容をそのまま維持し、ステップＳ１２１９の処理に移行し、次の指番号の処理に進む。
【０１１９】
ステップＳ１２１６の判定がＮＯならば、現在の変数ＮｏｔｅＰｒｅがまだ定義されていなかった（ＮＵＬＬ）か、または、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］が示す演奏情報の発音開始時刻が、現在の変数ＮｏｔｅＰｒｅが示す演奏情報の発音開始時刻より早いことになる。そこでこの場合には、ＣＰＵ２０１は、Ｎｅｘｔ［ｉＨ］［ｉｆｉｇ］に格納されているポインタ値を変数ＮｏｔｅＰｒｅにコピーする（ステップＳ１２１７）。
【０１２０】
さらに、ＣＰＵ２０１は、現在の指番号指定変数ｉｆｉｇの値を変数ＮｏｔｅＰｒｅに対応する指番号を保持する変数ｆｉｇにコピーする（ステップＳ１２１８）。
【０１２１】
その後、ＣＰＵ２０１は、ステップＳ１２１９の処理に移行し、次の指番号ｉｆｉｇに対する処理に進む。
【０１２２】
以上のステップＳ１２１４からＳ１２１８までの一連の処理が、各指番号ｉｆｉｇについて繰り返し実行され、やがて指番号ｉｆｉｇの値が５になってステップＳ１２１３の判定がＮＯとなった時点で、変数ＮｏｔｅＰｒｅに、まだ押鍵や準備動作が決定されていない指のうちで、その指による次の押鍵が他の指と比べて、現在の押鍵比較段階ｓｔｅｐにおいて発音開始時刻が最も早い演奏情報へのポインタが得られる。また、変数ｆｉｇに、ＮｏｔｅＰｒｅが示す演奏情報に対応する指番号が得られる。最初は、押鍵比較段階ｓｔｅｐ＝１である（ステップＳ１２１０参照）。従って、変数ＮｏｔｅＰｒｅとｆｉｇには、現在の押鍵に対して次に押鍵されるべき、発音開始時刻が最も早い演奏情報へのポインタと、それに対応する指番号が得られる。
【０１２３】
ステップＳ１２１３の判定がＮＯになると、ＣＰＵ２０１は、図１４のフローチャートのステップＳ１２２０からＳ１２３７までの一連の処理を実行する。ここでは、上述の変数ＮｏｔｅＰｒｅに得られた演奏情報に対応する演奏状態が、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］のうち押鍵を示す演奏情報の演奏状態と比較される。
【０１２４】
まず、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅの内容が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ１２２０）。図１３のステップＳ１２１３からＳ１２１９の実行状態によっては、変数ＮｏｔｅＰｒｅの内容が図１３のステップＳ１２１１で未定義値ＮＵＬＬに設定された後、全ての指番号ｉｆｉｇについて、図１３のステップＳ１２１６の判定がＹＥＳにならず、ステップＳ１２１３の判定がＮＯになる場合があり得る。この場合には、変数ＮｏｔｅＰｒｅには発音開始時刻が最も早い演奏情報へのポインタが得られない状態となり、ＮｏｔｅＰｒｅの値は未定義値ＮＵＬＬとなる。これによりステップＳ１２２０の判定がＮＯとなった場合には、ＣＰＵ２０１は、図９のステップＳ９０８の準備確認の処理を終了する。
【０１２５】
変数ＮｏｔｅＰｒｅの内容が未定義値ＮＵＬＬでなくステップＳ１２２０の判定がＹＥＳならば、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅの内容を出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］のいずれかへ登録するか否かを示すセット変数ｓｅｔに、登録を示す値「１」をひとまず格納する（ステップＳ１２２１）。このセット変数ｓｅｔの値は、後述する各種演奏状態の判断において非登録を示す値「０」にされ得る（図１４のステップＳ１２３０、Ｓ１２３３、Ｓ１２３６）。
【０１２６】
次に、ＣＰＵ２０１は、現在の押鍵に対して次に押鍵されるべき発音開始時刻が最も早い演奏情報の指番号ｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］に、現在の押鍵比較段階変数ｓｔｅｐの値（初回は値「１」）を格納する（ステップＳ１２２２）。これは、２回目以降に実行される図１３のステップＳ１２１４の判定において、すでに処理された指番号については再度その判定がＹＥＳとなって選択されてしまわないようにするための制御である。また、ステップデータｓｔｅｐ［０］〜ｓｔｅｐ［４］の各値を見れば、各指が現在の押鍵タイミング以降の何番目に押鍵されるべき演奏情報であるかを知ることができ、演奏ガイドの制御に活用することも可能になるというメリットも有する。
【０１２７】
次に、ＣＰＵ２０１は、ステップＳ１２２３で指番号指定変数ｉｆｉｇに初期値「０」（親指）をセットした後、ステップＳ１２３７でｉｆｉｇの値を＋１ずつインクリメントしながら、ステップＳ１２２４で指番号ｉｆｉｇの値が片手の指の最大数「５」に達したと判定するまで、以下のステップＳ１２２５からＳ１２３６までの一連の処理を実行する。この処理では、図１３のステップＳ１２１４からＳ１２１８の一連の処理で得られた、まだ押鍵や準備動作が決定されていない指による次の押鍵情報に対して、現在押鍵している指（音）との関係がチェックされる。
【０１２８】
ＣＰＵ２０１はまず、指番号ｉｆｉｇの値が現在の押鍵に対して次に押鍵されるべき発音開始時刻が最も早い演奏情報の指番号ｆｉｇに等しくなく、かつ現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬでなく、かつ指番号ｉｆｉｇに対応するステップデータｓｔｅｐ［ｉｆｉｇ］が押鍵を示す値「０」に等しいか否か（図１２のステップＳ１２０７参照）を判定する（ステップＳ１２２５）。一番目の条件は、同じ指同士の関係は調べる必要が無いので、ｉｆｉｇとｆｉｇが異なっていることをチェックしている。二番目の条件は、調査対象とする指番号ｉｆｉｇの演奏情報がまだ決定されておらず、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］がＮＵＬＬの場合は、そのような指ｉｆｉｇとの関係を調べる必要が無いからである。三番目の条件は、調査対象とする指番号ｉｆｉｇが押鍵されている指かどうかを調べているものである。この判定は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報が押鍵を示す演奏情報であるか否かの判定である。
【０１２９】
ステップＳ１２２５の判定がＮＯならば、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］は押鍵を示す演奏情報を示してはいないため、ステップＳ１２３７の処理に移行し、次の指番号の処理に進む。
【０１３０】
ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報が押鍵を示す演奏情報であってステップＳ１２２５の判定がＹＥＳならば、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す押鍵の演奏情報と、変数ＮｏｔｅＰｒｅが示す、まだ押鍵や準備動作が決定されていない指のうちで現在の押鍵に対して次に押鍵されるべき発音開始時刻が最も早い演奏情報と、の鍵盤距離を取得する（ステップＳ１２２６）。鍵盤距離は、指番号が大きいほうの演奏情報の音高Ｐｉｔｃｈ（図３参照）を鍵盤番号に換算した値から、指番号が小さいほうの演奏情報の音高Ｐｉｔｃｈを鍵盤番号に換算した値を減算した結果として算出される。この処理の詳細は、図１６のフローチャートを用いて後述する。
【０１３１】
次に、ＣＰＵ２０１は、ステップＳ１２２６で取得した鍵盤距離が０よりも小さいか否かを判定する（ステップＳ１２２７）。
【０１３２】
鍵盤距離が０よりも小さくステップＳ１２２７の判定がＹＥＳならば、現在関係を調査している２つの指の位置関係が、正常な手の向きにおける指の位置と逆転していることを表している。そこでこの場合、ＣＰＵ２０１は、現在の押鍵に対して次に押鍵されるべき発音開始時刻が最も早い演奏情報の指番号ｆｉｇと現在の押鍵の指番号ｉｆｉｇのいずれかが親指の指番号「０」であるか否かを判定する（ステップＳ１２２８）。すなわち、現在関係を調査している２つの指のいずれかが、親指であるかを調べる。
【０１３３】
ステップＳ１２２８の判定がＹＥＳの場合には、ＣＰＵ２０１は、親指で押鍵中に親指以外の指で親指の上を越えて移動させて次以降のタイミングにて押鍵する第１の状態である、または、親指以外の指で押鍵中に親指で親指以外の指の下をくぐらせて移動させて次以降のタイミングにて押鍵する第２の状態であると判定する。
【０１３４】
この場合には、ＣＰＵ２０１は、準備動作判定用変数の一つである指の交差を示す指交差変数Ｐａｓｓｉｎｇに値「１」を格納する（ステップＳ１２２９）。
【０１３５】
その後、ＣＰＵ２０１は、ステップＳ１２３７の処理に移行し、次の指番号を有する押鍵の演奏情報との比較処理に進む。
【０１３６】
ステップＳ１２２８の判定がＮＯの場合には、ＣＰＵ２０１は、親指以外の指同士の交差はあり得ないとして、変数ＮｏｔｅＰｒｅの内容を出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］のいずれかへ登録するか否かを示すセット変数ｓｅｔに、非登録を示す値「０」を格納する（ステップＳ１２３０）。すなわち、変数ＮｏｔｅＰｒｅが示す演奏情報は、現在押鍵している指との関係上、指を交差させないと準備ができない音であることが判ったので、この音については、準備動作をする演奏情報としては登録されない。
【０１３７】
その後、ＣＰＵ２０１は、ステップＳ１２３７の処理に移行し、次の指番号を有する押鍵の演奏情報との比較処理に進む。
【０１３８】
鍵盤距離が０よりも小さくなくステップＳ１２２７の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１２２６で取得した鍵盤距離が基準値よりも大きいか否かを判定する（ステップＳ１２３１）。基準値は例えば、指の間隔×半音での２〜４鍵分程度の値である。例えば、親指と小指の間隔としては、指の間隔（４−０）×２〜４半音で、８半音〜１６半音程度とすることができ、１２半音とすれば１オクターブを基準とすることとなる。
【０１３９】
鍵盤距離が基準値よりも大きくステップＳ１２３１の判定がＹＥＳならば、ＣＰＵ２０１は、鍵盤を弾く手の移動範囲が大きいと判断して、セット変数ｓｅｔに、非登録を示す値「０」を格納する（ステップＳ１２３２）。すなわち、変数ＮｏｔｅＰｒｅが示す演奏情報は、準備動作をする演奏情報としては登録されない。
【０１４０】
次に、ＣＰＵ２０１は、押鍵比較段階変数ｓｔｅｐの値が「１」であるか否かを判定する（ステップＳ１２３３）。
【０１４１】
ステップＳ１２３３の判定がＹＥＳ、すなわち鍵盤の移動が現在の押鍵の次の動作タイミングで実行されると判定された場合には、鍵盤距離が基準値よりも大きい音が、現在の押鍵のすぐ次の動作タイミングで実行されることから、指の跳躍が必要となる場合である。そこで、ＣＰＵ２０１は、準備動作判定用変数の一つである指の手の移動（跳躍）を示す移動変数Ｍｏｖｉｎｇに値「１」を格納する（ステップＳ１２３４）。
【０１４２】
このように、変数ＮｏｔｅＰｒｅが示す演奏情報は、準備動作をする演奏情報としては登録されないが、移動変数Ｍｏｖｉｎｇと一時バッファ用演奏情報ポインタ変数ｐＬｉｓｔ［ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ］へのセットが行われる。
【０１４３】
鍵盤距離が基準値よりも大きくはなくステップＳ１２３１の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ１２２６で取得した鍵盤距離が０で、かつ押鍵比較段階変数ｓｔｅｐの値が「１」ではないか否かを判定する（ステップＳ１２３５）。この判定がＹＥＳとなる場合は、任意の指で押鍵中の鍵と同じ鍵を、現在押鍵中の指とは異なる指で、次ではない、より先のタイミングで押鍵することを表している。
【０１４４】
ステップＳ１２３５の判定がＮＯの場合には、ＣＰＵ２０１は、セット変数ｓｅｔに登録を示す値「１」が格納された状態を維持する。すなわち、変数ＮｏｔｅＰｒｅが示す演奏情報は、準備動作をする演奏情報として登録可能な状態にされる。その後、ＣＰＵ２０１は、ステップＳ１２３７の処理に移行し、次の指番号を有する押鍵の演奏情報との比較処理に進む。
【０１４５】
任意の指で押鍵中の鍵と同じ鍵を、次の次以降のタイミングにてその任意の指以外の指で押鍵する状態であってステップＳ１２３５の判定がＹＥＳとなる場合は、ＣＰＵ２０１は、セット変数ｓｅｔに非登録を示す値「０」を格納する（ステップＳ１２３６）。すなわち、変数ＮｏｔｅＰｒｅが示す演奏情報は、準備動作をする演奏情報としては登録されない。
【０１４６】
その後、ＣＰＵ２０１は、ステップＳ１２３７の処理に移行し、次の指番号を有する押鍵の演奏情報との比較処理に進む。
【０１４７】
ＣＰＵ２０１は、以上のステップＳ１２２５からＳ１２３６までの一連の処理を、０から４までの指番号ｉｆｉｇについて実行する。これにより、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅに得られた演奏情報に対応する演奏状態を、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］のうち押鍵を示す演奏情報の演奏状態と比較する。そして、ＣＰＵ２０１は、ＮｏｔｅＰｒｅが示す演奏情報へのポインタを、準備動作をする演奏情報へのポインタとしてｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］に登録可能かどうかを判別し、セット変数ｓｅｔへの値のセットを行う。
【０１４８】
現在の変数ＮｏｔｅＰｒｅの演奏情報について、０から４までの全ての指番号ｉｆｉｇに対応する上述の制御動作が終了し、ステップＳ１２２４の判定がＮＯになると、ＣＰＵ２０１は、図１５のフローチャートの制御処理を実行する。
【０１４９】
図１５において、ＣＰＵ２０１は、セット変数ｓｅｔに値「１」がセットされているか否か、つまり登録可能であると判定されているか否かを判定する（ステップＳ１２３８）。
【０１５０】
ステップＳ１２３８の判定がＹＥＳならば、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅが示す演奏情報中の指番号Ｆｉｎｇｅｒ（図３参照）（図１５では「ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ」と記載）に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ］に、変数ＮｏｔｅＰｒｅの値を格納する（ステップＳ１２３９）。このようにして、変数ＮｏｔｅＰｒｅが示す演奏情報へのポインタが、準備動作を行う演奏情報へのポインタとして、ｐｒｅｐ［ｉＨ］［ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ］に登録される。
【０１５１】
セット変数ｓｅｔの値が「０」でステップＳ１２３８の判定がＮＯならば、ステップＳ１２３９の実行はスキップされ、変数ＮｏｔｅＰｒｅが示す演奏情報は、準備動作をする演奏情報としては出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ］へは登録されない。
【０１５２】
ステップＳ１２３９の処理の後またはステップＳ１２３８の判定がＮＯならば、ＣＰＵ２０１は、押鍵比較段階変数ｓｔｅｐの値を＋１インクリメントする（ステップＳ１２４０）。いままで、ｓｔｅｐ＝１、すなわち現在の押鍵の動作タイミングの次の動作タイミングに対応する準備動作に関する処理であったなら、これ以降、ｓｔｅｐ＝２となることにより、現在の押鍵の動作タイミングの次の次の動作タイミングに対応する準備動作に関する処理が実行されることになる。
【０１５３】
ＣＰＵ２０１は、図１５のステップＳ１２４０の処理の後、図１３のステップＳ１２１１の処理に戻る。そして、ＣＰＵ２０１は、図１３のステップＳ１２１１からＳ１２１９までの一連の処理によって、次タイミング演奏情報ポインタ変数Ｎｅｘｔ［ｉＨ］［０］〜Ｎｅｘｔ［ｉＨ］［４］のうちから、出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］において演奏情報へのポインタが定義されていない指に対応するデータであって、かつ上述のように最初に変数ＮｏｔｅＰｒｅに得られた演奏情報の次に発音開始時刻が早い演奏情報へのポインタとそれに対応する指番号を、それぞれ変数ＮｏｔｅＰｒｅとｆｉｇに取得する。そして、ＣＰＵ２０１は、これらの変数ＮｏｔｅＰｒｅおよびｆｉｇについて、図１４および図１５のフローチャートの処理を再度実行する。この結果、ＣＰＵ２０１は、変数ＮｏｔｅＰｒｅが示す現在の押鍵に対して次の次のタイミングで押鍵されるべき発音開始時刻が最も早い演奏情報へのポインタが、準備動作を行う演奏情報へのポインタとして、ｐｒｅｐ［ｉＨ］［ＮｏｔｅＰｒｅ．Ｆｉｎｇｅｒ］に登録される。
【０１５４】
ＣＰＵ２０１は、以上の制御処理を繰り返し実行する結果、図１３のフローチャートの実行において変数ＮｏｔｅＰｒｅに演奏情報へのポインタが得られなくなり、図１４のステップＳ１２２０の判定がＮＯになると、図９において演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］が示す現在のパートｉＨで最も早く押鍵が行われる演奏情報に対応するステップＳ９０８の準備確認の処理を終了する。
【０１５５】
図１６は、図１４のステップＳ１２２６の鍵盤距離の取得の処理の例を示すフローチャートである。
【０１５６】
ＣＰＵ２０１はまず、図１４の出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報と、変数ＮｏｔｅＰｒｅが示す演奏情報のうち、指番号Ｆｉｎｇｅｒ（図３参照）が大きいほうの演奏情報を変数ｎｏｔｅｆにセットし、指番号Ｆｉｎｇｅｒが小さいほうの演奏情報を変数ｎｏｔｅｔにセットする（ステップＳ１６０１）。
【０１５７】
次に、ＣＰＵ２０１は、演奏情報ｎｏｔｅｆの音高Ｐｉｔｃｈ（図３参照）（図１６中では「ｎｏｔｅｆ．Ｐｉｔｃｈ」と記載）をピッチ変数ｐｆに格納する。そして、ＣＰＵ２０１は、次式により鍵盤位置を算出し鍵盤位置変数ｋｅｙｆに格納する（ステップＳ１６０２）。
【０１５８】
ｋｅｙｆ←ＯｃｔＤｉｓｔ×（ｐｆ／１２）＋ＫｅｙＤｉｓｔ［ｐｆ％１２］
・・・（１）
【０１５９】
ここで、ＯｃｔＤｉｓｔは定数であり値「１４」を持つ。ＫｅｙＤｉｓｔ［］＝｛０，１，２，３，４，６，７，８，９，１０，１１，１２｝であり、ＫｅｙＤｉｓｔ［０］＝０、ＫｅｙＤｉｓｔ［１］＝１、ＫｅｙＤｉｓｔ［２］＝２、ＫｅｙＤｉｓｔ［３］＝３、ＫｅｙＤｉｓｔ［４］＝４、ＫｅｙＤｉｓｔ［５］＝６、ＫｅｙＤｉｓｔ［６］＝７、ＫｅｙＤｉｓｔ［７］＝８、ＫｅｙＤｉｓｔ［８］＝９、ＫｅｙＤｉｓｔ［９］＝１０、ＫｅｙＤｉｓｔ［１０］＝１１、ＫｅｙＤｉｓｔ［１１］＝１２という値を有する。上記（１）式において、ＫｅｙＤｉｓｔ［ｐｆ％１２］は、ピッチ変数ｐｆの値を１２で除算した剰余「ｐｆ％１２」（「％」は剰余演算を示す）をインデックスとするＫｅｙＤｉｓｔ［ｐｆ％１２］値である。なお、定数ＯｃｔＤｉｓｔは、１オクターブの鍵盤距離を表す定数である。１オクターブ間は１２半音であり、ＯｃｔＤｉｓｔも１２とすることも可能であるが、ここでは、便宜上、全ての白鍵−白鍵間の鍵盤距離を２とみなして、つまり、ミ−ファ間、シ−ド間も２半音であるとみなして、ＯｃｔＤｉｓｔとして１４という値を用いている。
【０１６０】
続いて、ＣＰＵ２０１は、ステップＳ１６０２と同様に、演奏情報ｎｏｔｅｔについても、その音高Ｐｉｔｃｈ（図１６中では「ｎｏｔｅｔ．Ｐｉｔｃｈ」と記載）をピッチ変数ｐｔに格納する。そして、ＣＰＵ２０１は、次式により鍵盤位置を算出し鍵盤位置変数ｋｅｙｔに格納する（ステップＳ１６０３）。
【０１６１】
ｋｅｙｔ←ＯｃｔＤｉｓｔ×（ｐｔ／１２）＋ＫｅｙＤｉｓｔ［ｐｔ％１２］
・・・（２）
【０１６２】
その後、ＣＰＵ２０１は、ステップＳ１６０２で算出した鍵盤位置変数ｋｅｙｆの値からステップＳ１６０３で算出した鍵盤位置変数ｋｅｙｔの値を減算し、その減算結果を鍵盤距離変数ｄｉｓｔに格納する（ステップＳ１６０４）。
【０１６３】
次に、ＣＰＵ２０１は、現在のパート検索用変数ｉＨ（図９のステップＳ９０２とＳ９１２参照）の値が２であるか否か、すなわち、現在のパートが左手であるか否かを判定する（ステップＳ１６０５）。
【０１６４】
ＣＰＵ２０１は、現在のパートが左手でステップＳ１６０５の判定がＹＥＳならば、鍵盤距離変数ｄｉｓｔの値を−１倍する、すなわち符号を逆にする（ステップＳ１６０６）。右手は低音側（左側）から順に親指、人差し指、・・・、小指の順になっているが、左手は高音側（右側）から順に親指、人差し指、・・・、小指の順になっていることを加味して、後述するように、演算上、効率良く処理するためである。
【０１６５】
ＣＰＵ２０１は、ステップＳ１６０６の処理の後、またはステップＳ１６０５の判定がＮＯの場合に、図１６のフローチャートで示される図１４のステップＳ１２２６の鍵盤距離の取得の処理を終了する。
【０１６６】
鍵盤距離の取得においては、指番号が大きい指の鍵盤位置から指番号が小さい指の鍵盤位置を減算して鍵盤距離ｄｉｓｔを算出している。従って、右手の場合、例えば人差し指の鍵盤位置が親指の鍵盤位置よりも大きな音高の位置にあれば、鍵盤距離ｄｉｓｔは正の値となる。また、右手において、親指で押鍵中に人差し指を親指の上を越えて親指の左側の鍵盤位置を押鍵しようとしているときには、指番号の大きい人差し指の鍵盤位置から親指の鍵盤位置を減算して得られる鍵盤距離ｄｉｓｔは０より小さい値となる。同様に、人差し指で押鍵中に親指を人差し指の下をくぐって人差し指の右側の鍵盤位置を押鍵しようとしているときには、指番号の大きい人差し指の鍵盤位置から親指の鍵盤位置を減算して得られる鍵盤距離ｄｉｓｔはやはり０より小さい値となる。
【０１６７】
左手については、得られた鍵盤距離ｄｉｓｔの値を−１倍することにより、右手と全く同じ関係にすることができる。すなわち、左手の場合、普通に左手を鍵盤上に置くと、人差し指の鍵盤位置は親指の鍵盤位置よりも小さい音高の位置になるため、その場合、指番号の大きな人差し指の鍵盤位置から親指の鍵盤位置を減算するとマイナスになってしまう。これを右手と同じ関係にするために、−１を乗算することによりプラス値にしている。この状態で、左手において、親指で押鍵中に人差し指を親指の上を越えて親指の右側の鍵盤位置を押鍵しようとしているときには、指番号の大きい人差し指の鍵盤位置から親指の鍵盤位置を減算して得られる鍵盤距離ｄｉｓｔは０より大きな値となり、これを−１倍することにより、最終的な鍵盤距離ｄｉｓｔはマイナス値となる。同様に、人差し指で押鍵中に親指を人差し指の下をくぐって人差し指の左側の鍵盤位置を押鍵しようとしているときには、指番号の大きい人差し指の鍵盤位置から親指の鍵盤位置を減算して得られる鍵盤距離ｄｉｓｔはやはり０より大きな値となり、これを−１倍することにより、最終的な鍵盤距離ｄｉｓｔはマイナス値となる。
【０１６８】
以上のようにして、親指がからんだ指越えまたは指くぐりが行われたときだけ、図１６のフローチャートにより算出される鍵盤距離変数ｄｉｓｔの値が０より小さい値となるようにすることができる。この状態が、図１４のステップＳ１２２７で判定される。
【０１６９】
図１７は、図６のステップＳ６０６のパート同士の状態比較の処理の例を示すフローチャートである。
【０１７０】
ＣＰＵ２０１はまず、パート間の状態補正フラグ変数ｃｏｎｆｌｉｃｔに、異常がないことを示す値「０」を初期設定する（ステップＳ１７０１）。
【０１７１】
次に、ＣＰＵ２０１は、右手パートに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［０］［０］〜ｐｒｅｐ［０］［４］の指し示す演奏情報のうち、親指を含む最も親指に近い演奏情報を変数ｍｅＲに格納する（ステップＳ１７０２）。具体的には、右手の各指のうち、押鍵または準備で使用している指のうち、もっとも親指に近いものを取得してｍｅＲに格納する。
【０１７２】
同様に、ＣＰＵ２０１は、左手パートに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［１］［０］〜ｐｒｅｐ［１］［４］の指し示す演奏情報のうち、親指を含む最も親指に近い演奏情報を変数ｍｅＬに格納する（ステップＳ１７０３）。具体的には、左手の各指のうち、押鍵または準備で使用している指のうち、もっとも親指に近いものを取得してｍｅＬに格納する。
【０１７３】
その後、ＣＰＵ２０１はまず、変数ｍｅＬが示す演奏情報の音高Ｐｉｔｃｈ（図３参照）（図１７中では「ｍｅＬ．Ｐｉｔｃｈ」と表記）が、変数ｍｅＲが示す演奏情報の音高Ｐｉｔｃｈ（図１７中では「ｍｅＲ．Ｐｉｔｃｈ」と表記）よりも、高い音高であるか否かを判定する（ステップＳ１７０４）。右手の親指と左手の親指は、それぞれ、他方の手に最も近い位置にある指であり、従って、これは、左手パートの指が右手パートの指の演奏領域に入り込んでいるか否かを判定していることになる。
【０１７４】
ステップＳ１７０４の判定がＹＥＳならば、ＣＰＵ２０１は次に、右手パートの押鍵動作フラグ変数ｐｕｓｈＫｅｙ［０］および左手パートの押鍵動作フラグ変数ｐｕｓｈＫｅｙ［１］ともに値「１」であるか否か、すなわち、両パートとも同時に押鍵を行う状態となっているか否かを判定する（ステップＳ１７０５）（図９のステップＳ９０３〜Ｓ９０５を参照）。
【０１７５】
ステップＳ１７０５の判定がＹＥＳならば、ＣＰＵ２０１は、パート間の状態補正フラグ変数ｃｏｎｆｌｉｃｔに異常（左右パートの衝突）が発生したことを示す値「１」をセットする。また、ＣＰＵ２０１は、右手パート用の鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［０］または左手パート用の鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［１］のうち、鍵盤奥行き方向で、奥方向（黒鍵側）にあるパートに対応する鍵盤奥行き方向状態補正値に、例えば正の値「１」または「２」等をセットし、手前方向（白鍵側）にあるパートに対応する鍵盤奥行き方向状態補正値に、例えば負の値「−１」または「−２」等をセットする（以上、ステップＳ１７０６）。
【０１７６】
ステップＳ１７０５の判定がＮＯならば、ＣＰＵ２０１は次に、右手パートの押鍵動作フラグ変数ｐｕｓｈＫｅｙ［０］の値が「１」であるか否かを判定する（ステップＳ１７０７）。ステップＳ１７０５で両パートとも同時に押鍵を行う状態となっているか否かを判定しているため、ステップＳ１７０７での判定は右手パートのみが押鍵を行う状態となっているか否かの判定となる。この場合は、左手パートは、押鍵の準備を行う状態となっている。
【０１７７】
ステップＳ１７０７の判定がＹＥＳならば、ＣＰＵ２０１は、パート間の状態補正フラグ変数ｃｏｎｆｌｉｃｔに異常（左右パートの衝突）が発生したことを示す値「１」をセットする。また、ＣＰＵ２０１は、左手パート用の鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［１］に、ステップＳ１７０４で判定された音高の差に応じた量だけ左側方向への移動を指示するための補正値をセットする（以上、ステップＳ１７０８）。すなわちこの処理では、右手パートが押鍵を行う状態となっているので、その右手パートに衝突しそうな左手パートの押鍵準備指を、鍵盤横方向の左側方向に逃がすことにより、衝突を防止する調整が行われる。
【０１７８】
ステップＳ１７０７の判定がＮＯならば、ＣＰＵ２０１は最後に、左手パートの押鍵動作フラグ変数ｐｕｓｈＫｅｙ［１］の値が「１」であるか否かを判定する（ステップＳ１７０９）。ステップＳ１７０９での判定は左手パートのみが押鍵を行う状態となっているか否かの判定となる。この場合は、右手パートは、押鍵の準備動作を行う状態となっている。
【０１７９】
ステップＳ１７０９の判定がＹＥＳならば、ＣＰＵ２０１は、パート間の状態補正フラグ変数ｃｏｎｆｌｉｃｔに異常（左右パートの衝突）が発生したことを示す値「１」をセットする。また、ＣＰＵ２０１は、右手パート用の鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［０］に、ステップＳ１７０４で判定された音高の差に応じた量だけ右側方向への移動を指示するための補正値をセットする（以上、ステップＳ１７１０）。すなわちこの処理では、左手パートが押鍵を行う状態となっているので、その左手パートに衝突しそうな押鍵の準備動作の状態となっている右手パートの各指を、鍵盤横方向の右側方向に逃がすことにより、衝突を防止する調整が行われる。
【０１８０】
図１８および図１９は、図６のステップＳ６０７の動作データ出力の処理の例を示すフローチャートである。
【０１８１】
ＣＰＵ２０１はまず、パート検索用変数ｉＨに値０を設定する（ステップＳ１８０１）。前述したように、パート検索用変数ｉＨの値は、０なら右手、１なら左手を示す。その後、ＣＰＵ２０１は、図１９のステップＳ１８２６でパート検索用変数ｉＨの値を＋１しながら、図１８のステップＳ１８０２で変数ｉＨの値が２に達したと判定するまで、変数ｉＨが示す右手および左手の各パート毎に、以下の図１８のステップＳ１８０３から図１９のＳ１８２５の一連の処理を実行して、動作データ（図４参照）を一括して生成する。
【０１８２】
始めに、ＣＰＵ２０１は、現在のパートｉＨに対応する押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値が「１」であるか、またはパート間の状態補正フラグ変数ｃｏｎｆｌｉｃｔに異常（左右パートの衝突）が発生したことを示す値「１」がセットされているか否かを判定する（ステップＳ１８０３）。
【０１８３】
ステップＳ１８０３の判定がＹＥＳならば、ＣＰＵ２０１は、図１８のステップＳ１８０４から図１９のステップＳ１８２６までの一連の処理を実行して、動作データ（図４参照）の出力処理を実行する。すなわち、現在のパートｉＨに対応する押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値が「１」である、つまり現在のパートｉＨが押鍵を行う状態になっているならば、無条件に動作データの出力処理が実行される。また、現在のパートｉＨが押鍵を行う状態になっておらず押鍵の準備動作を行う状態になっている場合であっても、ｃｏｎｆｌｉｃｔに異常が発生したことを示す値「１」がセットされている、つまり左右パートの衝突が発生しそうな状態になっているならば、動作データの出力処理が実行される。これは、他方のパートが押鍵を行う状態になっていてその状態が変化する毎に、現在のパートｉＨのほうも衝突しないように押鍵の準備動作を行う各指の位置を移動させ、その移動後の状態で押鍵の準備動作を行う現在のパートｉＨのほうもガイド表示する必要があるためである。ただし、図１１のステップＳ１１０９からステップＳ１１１０に移行する処理の説明で前述したように、現在のパートｉＨが押鍵を行う状態になっておらず押鍵の準備動作を行う状態になっていて押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値が「１」でなければ、現在のパートｉＨの演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の内容は更新されない。つまり、現在のパートｉＨが押鍵を行う状態になって押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値が「１」になるまでは、以下に説明する動作データの出力処理では、現在のパートｉＨの各指の演奏位置は、衝突回避のための補正をした上で同じ押鍵の準備動作の状態を表示し続けることになる。
【０１８４】
この動作データの出力処理では、現在のパートｉＨについて、図６のステップＳ６０６のパート同士の状態比較の処理でセットされた、鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［ｉＨ］（図１７のステップＳ１７０６の説明を参照）、または鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［ｉＨ］（図１７のステップＳ１７０８または１７１０の説明を参照）に基づいて修正が行われる。すなわち、出力される動作データの奥行き位置ｆｒａｍｅ［ｉ］．Ｚｐｏｓの修正（図１９のステップＳ１８２３）と、または出力される動作データの各指の演奏位置（鍵盤番号）ｆｒａｍｅ［ｉ］．ｐｏｓｉｔｉｏｎ［ｉｆｉｇ］の修正（図１９のステップＳ１８１４）が行われる。
【０１８５】
なお、ステップＳ１８０３の判定がＮＯ、すなわち、現在のパートｉＨの各指が押鍵の準備動作の状態となっていて押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］の値が「１」ではなく、かつ左右パートの衝突が発生しておらずｃｏｎｆｌｉｃｔ＝１でなければ、図１８のフローチャートの処理を終了して、パートｉＨについては、動作データの出力は行われない（図１８のステップＳ１８０３：ＮＯ）。この場合には、前述した図６のステップＳ６０５のパート毎の状態確認の処理における図９のステップＳ９０７の押鍵検索の処理において、押鍵を行う指ｉｆｉｇ（図１１のステップＳ１１０５）の検索および押鍵対象演奏情報ポインタ変数Ｈａｎｄ［ｉＨ］［ｉｆｉｇ］への設定が行われた後に、図１１のステップＳ１１０９の判定が行われる。ステップＳ１１０９では、現在のパートｉＨの押鍵動作フラグ変数ｐｕｓｈＫｅｙ［ｉＨ］が値「１」か否かが判定される。そして、ステップＳ１１０９の判定がＮＯならば、図１１のステップＳ１１１０が実行されない結果、現在のパートｉＨの処理対象の演奏情報検索ポインタ変数ｍｅＴａｉｌ［ｉＨ］の内容は更新されずに、やがて図６のステップＳ６０３に戻る。この結果、図６のステップＳ６０３での次の演奏情報の検索において、再び同じ演奏情報が検索されることになり、これがやがて他のパートの演奏情報よりも発音開始時刻が早くなって押鍵の状態を示すようになったときに、そのタイミングで図１８のステップＳ１８０３の判定がＹＥＳとなって動作データが出力される。
【０１８６】
図１８のステップＳ１８０３の判定がＹＥＳになると、始めに、ＣＰＵ２０１は、ステップＳ１８０４からＳ１８１０の一連の処理を実行する。ここでは、変数の初期設定と、今回出力する動作データｆｒａｍｅ［ｉ］のための今回の動作開始時間ｓｔａｒｔ、動作終了時間ｔｅｒｍ、トラック番号Ｈａｎｄの算出と設定等が行われる。
【０１８７】
まず、ＣＰＵ２０１は、動作データ（図４）の各フレームｆｒａｍｅ［ｉ］を指示するためのフレームカウント用変数ｉに、現時点におけるフレームの総数ＦｒａｍｅＣｏｕｎｔの値を格納する（ステップＳ１８０４）。このフレームの総数ＦｒａｍｅＣｏｕｎｔは、図６のステップＳ６０１で値「０」に初期化され、後述する図１９のステップＳ１８２４で＋１ずつインクリメントされる。これにより、動作データの数が順次増やされてゆく。
【０１８８】
次に、ＣＰＵ２０１は、ステップＳ１８０５からＳ１８１０で、今回の動作タイミングにおける動作データｆｒａｍｅ［ｉ］を生成するときの、トラック番号Ｈａｎｄ、動作開始時間ｓｔａｒｔと動作終了時間ｔｅｒｍ（図４参照）を決定する。今回の検索ポインタ変数ｍｅＰｔｒに対応する演奏情報、およびそれと同時に押鍵または準備動作される出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］〜ｐｒｅｐ［ｉＨ］［４］が示す各演奏情報に対して、演奏ガイドを行うためには、次のような制御が必要となる。すなわち、その演奏ガイドは、ｍｅＰｔｒが指す演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅより前からガイド表示を開始し、発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅでガイドを終了（実際に押鍵）する必要がある。
【０１８９】
そこで、ＣＰＵ２０１はまず、現在のパートｉＨに対応する動作開始時間ｓｔａｒｔ［ｉＨ］（同名の変数に格納されている）が、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅよりも大きいか否かを判定する（ステップＳ１８０５）。動作開始時間ｓｔａｒｔ［ｉＨ］は、一番最初は図６のステップＳ６０１で値「０」に初期設定されている。また、動作途中では、一つ前の検索ポインタ変数ｍｅＰｔｒの値における動作データ出力の処理の最後の図１９のステップＳ１８２５で、次の検索ポインタ変数ｍｅＰｔｒの値のための動作開始時間ｓｔａｒｔ［ｉＨ］が算出されている（後述する図２１参照）。
【０１９０】
上述のようにして算出されている今回の動作開始時間ｓｔａｒｔ［ｉＨ］が今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅよりも後（大きい値）になっているときは、演奏ガイドは今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅよりも前になければならないので、動作開始時間ｓｔａｒｔ［ｉＨ］の修正が必要となる。
【０１９１】
すなわち、ＣＰＵ２０１は、ステップＳ１８０５の判定がＹＥＳならばさらに、現在のパートｉＨに対応する前回の演奏情報の発音開始時刻ｌａｓｔｏｎ［ｉＨ］（同名の変数に格納されている）が、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅよりも小さいか否かを判定する（ステップＳ１８０６）。
【０１９２】
ステップＳ１８０６の判定がＹＥＳならば、ＣＰＵ２０１は、前回発音開始時刻ｌａｓｔｏｎ［ｉＨ］から、前回発音開始時刻ｌａｓｔｏｎ［ｉＨ］から今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅまでの経過時間に所定の比率ＲＡＴＩＯ（例えば８０％＝０．８）を乗算して得られる時間だけ経過した時点を、動作開始時間ｓｔａｒｔ［ｉＨ］として設定する（ステップＳ１８０８）。すなわち、次式の演算が実行される。
【０１９３】
ｓｔａｒｔ［ｉＨ］←ｌａｓｔｏｎ［ｉＨ］
＋（ｍｅＰｔｒ．Ｔｉｍｅ−ｌａｓｔｏｎ［ｉＨ］）
×ＲＡＴＩＯ      ・・・（３）
【０１９４】
これにより、前回の音の発音開始時刻から、今回の音の発音開始時刻までの時間の、例えば８０％（ＲＡＴＩＯで表される比率）だけ経過した時点を、動作開始時間ｓｔａｒｔ［ｉＨ］として設定することとなる。
【０１９５】
一方、前回発音開始時刻ｌａｓｔｏｎ［ｉＨ］がｍｅＰｔｒ．Ｔｉｍｅよりも小さくなくステップＳ１８０６の判定がＮＯの場合には、仕方がないので、前回発音開始時刻ｌａｓｔｏｎ［ｉＨ］を今回の動作開始時間ｓｔａｒｔ［ｉＨ］にセットする（ステップＳ１８０７）。
【０１９６】
算出されている動作開始時間ｓｔａｒｔ［ｉＨ］が今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅよりも大きくはなくステップＳ１８０５の判定がＮＯの場合には、ＣＰＵ２０１は、その算出されている動作開始時間ｓｔａｒｔ［ｉＨ］をそのまま使用する。
【０１９７】
以上のようにして今回の動作開始時間ｓｔａｒｔ［ｉＨ］が決定した後、ＣＰＵ２０１は、ｍｅＰｔｒの次の値による次回の処理のために、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅを前回発音開始時刻ｌａｓｔｏｎ［ｉＨ］としてセットする（ステップＳ１８０９）。
【０１９８】
その後、ＣＰＵ２０１は、フレームカウント用変数ｉの値に対応する動作データｆｒａｍｅ［ｉ］のトラック番号Ｈａｎｄ（図１８では「ｆｒａｍｅ［ｉ］．Ｈａｎｄ」と記載）に、現在のパート検索用変数ｉＨの値（図１８のステップＳ１８０２，図１９のＳ１８２６参照）を格納する。また、ＣＰＵ２０１は、動作データｆｒａｍｅ［ｉ］の動作開始時間ｓｔａｒｔ（図１８では「ｆｒａｍｅ［ｉ］．ｓｔａｒｔ」と記載）に、上述のように算出した今回の動作開始時間ｓｔａｒｔ［ｉＨ］を格納する。さらに、ＣＰＵ２０１は、動作データｆｒａｍｅ［ｉ］の動作終了時間ｔｅｒｍ（図１８では「ｆｒａｍｅ［ｉ］．ｔｅｒｍ」と記載）に、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅを格納する（以上、ステップＳ１８１０）。
【０１９９】
ステップＳ１８１０の後、ＣＰＵ２０１は、図１９のステップＳ１８１１からＳ１８２５までの一連の処理を実行する。ここでは、今回の動作データｆｒａｍｅ［ｉ］のための５本の各指の演奏位置「ｐｏｓｉｔｉｏｎ［０］〜ｐｏｓｉｔｉｏｎ［４］」(指を置くべき鍵盤番号)、各指の状態「ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］」（それぞれ、値「−１」が準備動作、値「１」が押鍵）、奥行き方向の位置「Ｚｐｏｓ」などの情報の生成と設定が行われる（図４参照）。
【０２００】
ＣＰＵ２０１は、ステップＳ１８１１で指番号指定変数ｉｆｉｇに初期値「０」（親指）を設定した後、ステップＳ１８２１でｉｆｉｇの値を＋１ずつインクリメントしながら、ステップＳ１８１２で片手の指の最大数「５」に達したと判定するまで、以下のステップＳ１８１３からＳ１８２０の一連の処理を実行する。
【０２０１】
まず、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ１８１３）。
【０２０２】
ステップＳ１８１３の判定がＹＥＳならば、現在処理中の指ｉｆｉｇについて、出力用の演奏情報ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が決定されているので、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の音高Ｐｉｔｃｈ（図３参照）（図１９中では「ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］．Ｐｉｔｃｈ」と記載）に、現在のパートｉＨの鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［ｉＨ］を加算して得られる値を、今回の動作データｆｒａｍｅ［ｉ］の指番号ｉｆｉｇに対応する演奏位置ｐｏｓｉｔｉｏｎ［ｉｆｉｇ］（図１９中では「ｆｒａｍｅ［ｉ］．ｐｏｓｉｔｉｏｎ［ｉｆｉｇ］」と記載）に格納する（ステップＳ１８１４）。すなわち、現在処理中の指ｉｆｉｇに関しての指位置（ｐｏｓｉｔｉｏｎ）のデータとして、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］で決定されている演奏情報の音高に対して、前述した右手パートと左手パートの衝突を考慮した鍵盤横方向の補正値（図１７のステップＳ１７０８およびＳ１７１０の説明を参照）を考慮して補正した値を格納する。
【０２０３】
次に、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報の発音開始時刻Ｔｉｍｅ（図１９中では「ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］．Ｔｉｍｅ」と記載）が、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅと等しいか否か、すなわちｐｒｅｐ［ｉＨ］［ｉｆｉｇ］とｍｅＰｔｒが指す演奏情報の各発音開始時刻Ｔｉｍｅが等しいか否かを判定する（ステップＳ１８１５）。これは、指番号ｉｆｉｇの押鍵がｍｅＰｔｒ．Ｔｉｍｅの押鍵と同時であるか否かを判定することとなる。
【０２０４】
ステップＳ１８１５の判定がＹＥＳならば、ＣＰＵ２０１は、今回の動作データｆｒａｍｅ［ｉ］の指番号ｉｆｉｇに対応する状態ｓｔａｔｕｓ［ｉｆｉｇ］（図１９中では「ｆｒａｍｅ［ｉ］．ｓｔａｔｕｓ［ｉｆｉｇ］」と記載）に、押鍵を示す値「１」を格納する（ステップＳ１８１６）。
【０２０５】
その後、ＣＰＵ２０１は、ステップＳ１８２１の処理に移行し、次の指番号の処理に進む。
【０２０６】
ステップＳ１８１５で、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の発音開始時刻Ｔｉｍｅが、今回の演奏情報ｍｅＰｔｒの発音開始時刻Ｔｉｍｅと等しくなく、ステップＳ１８１５の判定がＮＯならば、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］＞ｍｅＰｔｒ．Ｔｉｍｅであるか否かを判定する（ステップＳ１８１７）。
【０２０７】
ステップＳ１８１７の判定がＹＥＳならば、現在のパートｉＨの現在の指番号ｉｆｉｇに対応するｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報は、準備動作を行うべきものである。このため、ＣＰＵ２０１は、今回の動作データの指番号ｉｆｉｇに対応する状態ｆｒａｍｅ［ｉ］．ｓｔａｔｕｓ［ｉｆｉｇ］に、準備動作を示す値「−１」を格納する（ステップＳ１８１８）。
【０２０８】
その後、ＣＰＵ２０１は、ステップＳ１８２１の処理に移行し、次の指番号の処理に進む。
【０２０９】
ステップＳ１８１７の判定がＮＯならば、現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］には演奏情報へのポインタが格納されていないことを意味する。この場合には、ＣＰＵ２０１は、今回の動作データの指番号ｉｆｉｇに対応する状態ｆｒａｍｅ［ｉ］．ｓｔａｔｕｓ［ｉｆｉｇ］に、データ無しを示す値「０」を格納する（ステップＳ１８１９）。
【０２１０】
その後、ＣＰＵ２０１は、ステップＳ１８２１の処理に移行し、次の指番号の処理に進む。
【０２１１】
ステップＳ１８１３に戻って、現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬであって、ステップＳ１８１３の判定がＮＯならば、ＣＰＵ２０１は、今回の動作データの指番号ｉｆｉｇに対応する演奏位置ｆｒａｍｅ［ｉ］．ｐｏｓｉｔｉｏｎ［ｉｆｉｇ］に、データ無しを示す値「−１」を格納し、また、状態ｆｒａｍｅ［ｉ］．ｓｔａｔｕｓ［ｉｆｉｇ］に、データ無しを示す値「０」を格納する（ステップＳ１８２０）。
【０２１２】
その後、ＣＰＵ２０１は、ステップＳ１８２１の処理に移行し、次の指番号の処理に進む。
【０２１３】
以上のステップＳ１８１３からＳ１８２０までの一連の処理が、５本の全ての指番号ｉｆｉｇについて実行されると、ステップＳ１８１２の判定がＮＯとなる。
【０２１４】
この結果、ＣＰＵ２０１は、奥行き位置計算の処理を実行し、その結果得られる奥行き方向の位置を、変数ｚｐｏｓに得る（ステップＳ１８２２）。この奥行き位置計算の処理の詳細については、図２０を用いて後述する。
【０２１５】
ＣＰＵ２０１は、変数ｚｐｏｓに得た奥行き方向の位置に、現在のパートｉＨの鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［ｉＨ］を加算して得られる値を、現在の動作データにｆｒａｍｅ［ｉ］．Ｚｐｏｓ（図４参照）として格納する（ステップＳ１８２３）。ここでは、前述した右手パートと左手パートの衝突を考慮しないで算出された奥行き方向の位置ｚｐｏｓが、衝突を考慮した鍵盤奥行き方向の補正値（図１７のステップＳ１７０６の説明を参照）で補正され、その補正結果がｆｒａｍｅ［ｉ］．Ｚｐｏｓに格納される。
【０２１６】
ＣＰＵ２０１は、動作データｆｒａｍｅ［ｉ］のフレームの総数ＦｒａｍｅＣｏｕｎｔを＋１インクリメントする（ステップＳ１８２４）。
【０２１７】
最後に、ＣＰＵ２０１は、次回開始時刻の計算の処理を実行し、次の検索ポインタ変数ｍｅＰｔｒの値のための動作開始時間ｓｔａｒｔ［ｉＨ］を算出する（ステップＳ１８２５）。この次回開始時刻の算出処理の詳細については、図２１を用いて後述する。
【０２１８】
その後、ＣＰＵ２０１は、ステップＳ１８２６でパート検索用変数ｉＨの値を＋１ずつインクリメントしながら、図１８のステップＳ１８０２で変数ｉＨの値が２に達したと判定するまで、変数ｉＨが示す右手および左手の各パート毎に、以下の図１８のステップＳ１８０３から図１９のＳ１８２５の一連の処理を実行し、図１８のステップＳ１８０２で変数ｉＨの値が２に達したと判定されると（ステップＳ１８０２：ＮＯ）、図１８および図１９のフローチャートで示される図６のステップＳ６０７の動作データ出力の処理を終了する。
【０２１９】
図２０は、図１９のステップＳ１８２２の奥行き位置計算の処理の例を示すフローチャートである。この処理では、現在の各指の押鍵や準備動作の状態から、手を鍵盤の奥行き方向に対して、どの位置に置くのが相応しいかを判定する。ここでは、鍵盤奥行き方向の手の位置として、ｚｐｏｓ＝１〜４の４段階で手の位置を定義し、このいずれの奥行き位置が相応しいかを判断している。
【０２２０】
まず、ＣＰＵ２０１は、奥行き位置変数ｚｐｏｓに暫定的に値「１」を格納する（ステップＳ２００１）。この値は、鍵盤上の手前側に手を置き、全部の指が白鍵を押鍵する位置にあることを指示する。
【０２２１】
次に、ＣＰＵ２０１は、親指に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ２００２）。
【０２２２】
ステップＳ２００２の判定がＹＥＳならば、親指に対応する演奏情報が存在することになるので、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［０］が示す演奏情報の音高データｐｒｅｐ［ｉＨ］［０］．Ｐｉｔｃｈを、ピッチ変数ｐに格納する（ステップＳ２００３）。
【０２２３】
さらに、ＣＰＵ２０１は、ピッチ変数ｐの値に対応する黒鍵判定定数ＢｌａｃｋＫｅｙ［ｐ］の値が「１」であるか否か、すなわち親指に対応する演奏情報が示す音高Ｐｉｔｃｈが黒鍵であるか否かを判定する（ステップＳ２００４）。いま、黒鍵判定定数ＢｌａｃｋＫｅｙ［］＝｛０，１，０，１，０，０，１，０，１，０，１，０｝である。値「０」は白鍵を示し、値「１」は黒鍵を示す。この配列の並びは、実際の鍵盤楽器における白鍵と黒鍵の一般的な並びに対応している。この配列値を、ピッチ変数ｐをキー値として調べることにより、演奏情報が示す音高Ｐｉｔｃｈが黒鍵であるか否かを判定することができる。実際には、音高データｐｒｅｐ［ｉＨ］［０］．Ｐｉｔｃｈの値を、１２で除した余りの値を用いる等して、オクターブ内での音高を算出して判定を行う。
【０２２４】
ステップＳ２００４の判定がＹＥＳならば、親指に対応する演奏情報が黒鍵であることになるので、ＣＰＵ２０１は、奥行き位置変数ｚｐｏｓに値「４」を格納する（ステップＳ２００５）。この値は、片手の５本の指全てを鍵盤上の黒鍵が押せる程度奥側に寄せて置くことを指示する。すなわち、親指が黒鍵側（奥側）に置かれるということは、５本の全ての指が自然に黒鍵が押せる程度の奥側に置かれることを意味する。
【０２２５】
ステップＳ２００５の処理の後、ＣＰＵ２０１は、図２０のフローチャートで示される図１９のステップＳ１８２２の奥行き位置計算の処理を終了する。
【０２２６】
一方、ステップＳ２００２に戻って、親指に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［０］の値が未定義値ＮＵＬＬになっておりステップＳ２００２の判定がＮＯならば、ＣＰＵ２０１は、小指に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［４］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ２００６）。
【０２２７】
ステップＳ２００６の判定がＹＥＳならば、小指に対応する演奏情報が存在することになるので、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［４］が示す演奏情報の音高データｐｒｅｐ［ｉＨ］［４］．Ｐｉｔｃｈを、ピッチ変数ｐに格納する（ステップＳ２００７）。
【０２２８】
さらに、ＣＰＵ２０１は、ピッチ変数ｐの値に対応する黒鍵判定定数ＢｌａｃｋＫｅｙ［ｐ］の値が「１」であるか否か、すなわち小指に対応する演奏情報が示す音高Ｐｉｔｃｈが黒鍵であるか否かを判定する（ステップＳ２００８）。
【０２２９】
ステップＳ２００８の判定がＹＥＳならば、小指に対応する演奏情報が黒鍵であることになるので、ＣＰＵ２０１は、奥行き位置変数ｚｐｏｓに値「３」を格納する（ステップＳ２００９）。この値は、人差し指、中指、薬指、小指の４本の指を鍵盤上の黒鍵が押せる程度奥側に寄せて置くことを指示する。すなわち、小指が黒鍵側（奥側）に置かれるということは、上記４本の指が自然に黒鍵が押せる程度の奥側に置かれることを意味する。
【０２３０】
ステップＳ２００９の処理の後、ＣＰＵ２０１は、図２０のフローチャートで示される図１９のステップＳ１８２２の奥行き位置計算の処理を終了する。
【０２３１】
親指に加えて、小指に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［４］の値が未定義値ＮＵＬＬになっておりステップＳ２００６の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ２０１０で変数ｉに値「１」を設定した後、ステップＳ２０１６で変数ｉの値を＋１ずつインクリメントしながら、ステップＳ２０１１で変数ｉの値が４に達したと判定するまで、以下のステップＳ２０１２からＳ２０１５までの一連の処理を実行する。
【０２３２】
まずＣＰＵ２０１は、変数ｉの値が示す指（「１」なら人差し指、「２」なら中指、「３」なら薬指）に対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉ］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ２０１２）。
【０２３３】
ステップＳ２０１２の判定がＹＥＳならば、ＣＰＵ２０１は、ｐｒｅｐ［ｉＨ］［ｉ］が示す演奏情報の音高データｐｒｅｐ［ｉＨ］［ｉ］．Ｐｉｔｃｈを、ピッチ変数ｐに格納する（ステップＳ２０１３）。
【０２３４】
さらに、ＣＰＵ２０１は、ピッチ変数ｐの値に対応する黒鍵判定定数ＢｌａｃｋＫｅｙ［ｐ］の値が「１」であるか否か、すなわち変数ｉの値に対応する指の演奏情報が示す音高Ｐｉｔｃｈが黒鍵であるか否かを判定する（ステップＳ２０１４）。
【０２３５】
ステップＳ２０１４の判定がＹＥＳならば、ＣＰＵ２０１は、奥行き位置変数ｚｐｏｓに値「２」を格納する（ステップＳ２０１５）。この値は、人差し指、中指、薬指の３本の指を鍵盤上の黒鍵が押せる程度奥側に寄せて置くことを指示する。すなわち、上記３本の何れかの指が黒鍵側（奥側）に置かれるということは、上記３本の指が自然に黒鍵が押せる程度の奥側に置かれることを意味する。
【０２３６】
ステップＳ２０１５の処理の後、ＣＰＵ２０１は、図２０のフローチャートで示される図１９のステップＳ１８２２の奥行き位置計算の処理を終了する。
【０２３７】
変数ｉの値が４になりステップＳ２０１１の判定がＮＯになった場合も、ＣＰＵ２０１は、図２０のフローチャートで示される図１９のステップＳ１８２２の奥行き位置計算の処理を終了するが、この場合は、いずれの指も黒鍵ではない場合に相当するので、奥行き位置変数ｚｐｏｓの値は、ステップＳ２００１で初期設定された値「１」となっている。
【０２３８】
以上の奥行き位置計算の処理では、各指が押鍵をするのか準備動作をするのかにかかわらず、手を置く位置が計算される。
【０２３９】
図２１は、図１９のステップＳ１８２５の次回開始時刻の計算の処理の例を示すフローチャートである。
【０２４０】
ＣＰＵ２０１は、以下のステップＳ２１０１からＳ２１１２の一連の処理によって、演奏情報検索用変数ｉＨの次の値に対応する次回の図１８および図１９の動作データ出力の処理のために、次回の動作開始時間ｓｔａｒｔ［ｉＨ］を算出する。ここでは、現在発音されている演奏情報のうち、最も早く離鍵される音の演奏情報を基に、次回の動作開始時間ｓｔａｒｔ［ｉＨ］が設定される。
【０２４１】
まず、ＣＰＵ２０１は、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅを暫定的に次回の動作開始時間ｓｔａｒｔ［ｉＨ］に設定する（ステップＳ２１０１）。
【０２４２】
次に、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅに今回の演奏情報の発音継続時間ｍｅＰｔｒ．Ｇａｔｅ（図３参照）を加算した値が、その演奏情報のノートオフ時刻ＮｏｔｅＯｆｆ（同名の変数に格納される）として設定される（ステップＳ２１０２）。
【０２４３】
次に、ＣＰＵ２０１は、ステップＳ２１０３で指番号指定変数ｉｆｉｇに初期値「０」（親指）を設定した後、ステップＳ２１１０でｉｆｉｇの値を＋１ずつインクリメントしながら、ステップＳ２１０４で片手の指の最大数「５」に達したと判定するまで、以下のステップＳ２１０５からＳ２１０９までの一連の処理を実行する。
【０２４４】
まず、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の値が未定義値ＮＵＬＬでないか否かを判定する（ステップＳ２１０５）。
【０２４５】
ステップＳ２１０５の判定がＹＥＳならば、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数が示す演奏情報の、発音開始時刻ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］．Ｔｉｍｅが、今回の演奏情報の発音開始時刻ｍｅＰｔｒ．Ｔｉｍｅ以下か否か、すなわち指番号ｉｆｉｇの押鍵がｍｅＰｔｒ．Ｔｉｍｅの押鍵と同時若しくは、ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］に入っている音が、今回の演奏情報ｍｅＰｔｒよりも前に押鍵されて、まだ押鍵持続中である音のいずれかであるか否かを判定する（ステップＳ２１０６）。
【０２４６】
ステップＳ２１０６の判定がＹＥＳならば、ＣＰＵ２０１は、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数が示す演奏情報の発音開始時刻ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］．Ｔｉｍｅに、同じ演奏情報の発音継続時間ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］．Ｇａｔｅに比率ＲＡＴＩＯ（例えば８０％＝０．８）を乗算して得た値を加算し、その加算結果を、現在調査中の演奏情報ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の動作終了時間として、ｔｅｒｍに設定する（ステップＳ２１０７）。
【０２４７】
その後、ＣＰＵ２０１は、次回の動作開始時間ｓｔａｒｔ［ｉＨ］が、現在調査中の演奏情報ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の動作終了時間ｔｅｒｍよりも小さく、かつ、現在調査中の演奏情報ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］の動作終了時間ｔｅｒｍがノートオフ時刻ＮｏｔｅＯｆｆよりも小さいか否かを判定する（ステップＳ２１０８）。
【０２４８】
ステップＳ２１０８の判定がＹＥＳならば、ステップＳ２１０７で算出した動作終了時間ｔｅｒｍが、現在発音されている演奏情報の中で、ここまでに調べた音のうち暫定的に最も早く離鍵するものである。この場合、ＣＰＵ２０１は、その動作終了時間ｔｅｒｍを新たなノートオフ時刻ＮｏｔｅＯｆｆとして設定する（ステップＳ２１０９）。
【０２４９】
ステップＳ２１０８の判定がＮＯならば、ＣＰＵ２０１は、現在のノートオフ時刻ＮｏｔｅＯｆｆを維持する。
【０２５０】
ステップＳ２１０９の処理の後、またはステップＳ２１０８の処理の判定がＮＯである場合、または、現在のパートｉＨの現在の指番号ｉｆｉｇに対応する出力バッファ用演奏情報ポインタ変数ｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が示す演奏情報が、同時若しくはそれ以前に押鍵されるものではなくステップＳ２１０６の判定がＮＯの場合、あるいはｐｒｅｐ［ｉＨ］［ｉｆｉｇ］が未定義値ＮＵＬＬでステップＳ２１０５の判定がＮＯならば、ＣＰＵ２０１は、ステップＳ２１１０の処理に移行し、ｉｆｉｇの値を＋１インクリメントして、次の指番号の処理に進む。
【０２５１】
全ての指番号ｉｆｉｇに対する処理が終了しステップＳ２１０４の判定がＮＯになると、ＣＰＵ２０１は、次回の動作開始時間ｓｔａｒｔがノートオフ時刻ＮｏｔｅＯｆｆよりも前（小さい）か否かを判定する（ステップＳ２１１１）。
【０２５２】
ステップＳ２１１１の判定がＹＥＳならば、ＣＰＵ２０１は、ノートオフ時刻ＮｏｔｅＯｆｆを次回の動作開始時間ｓｔａｒｔ［ｉＨ］に設定し、ＮＯならば、現在の動作開始時間ｓｔａｒｔ［ｉＨ］の値を維持して、図２１のフローチャートで示される図１９のステップＳ１８２５の次回開始時刻の計算の処理を終了する。
【０２５３】
以上説明した図５から図２１のフローチャートにより、ＲＡＭ２０３上に生成される、図４で説明した動作データｆｒａｍｅ［０］〜ｆｒａｍｅ［ＦｒａｍｅＣｏｕｎｔ−１］は、動作タイミング毎に、どの指を押鍵するかという情報のみならず、どの指を次の押鍵のために準備するかという情報も、各指の状態ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］として保有することが特徴である。このような動作データを用いることにより、ＣＰＵ２０１は、表示部２０５のディスプレイ上で、次のような演奏動作ガイドを実現することができる。
【０２５４】
例えば、親指の状態を示すｓｔａｔｕｓ［０］に押鍵を示す値「１」がセットされ、親指以外の指の状態を示すｓｔａｔｕｓ［１］〜ｓｔａｔｕｓ［４］のうちのいずれかに準備動作を示す値「−１」がセットされている場合、ＣＰＵ２０１は、親指の位置ｐｏｓｉｔｉｏｎ［０］で表される鍵を親指で押鍵するとともに、親指以外の指の状態を示すｓｔａｔｕｓ［１］〜ｓｔａｔｕｓ［４］のうち準備動作を示す値「−１」がセットされている指について、その指に対応するｐｏｓｉｔｉｏｎ［１］〜ｐｏｓｉｔｉｏｎ［４］のいずれかで表される鍵の位置で、その指を準備（配置）させるように動作する。この場合において、親指の位置ｐｏｓｉｔｉｏｎ［０］と、準備すべき他の指の位置ｐｏｓｉｔｉｏｎ［１］〜ｐｏｓｉｔｉｏｎ［４］の鍵の位置との関係によっては、通常の指の左右の位置関係と逆転した位置関係になっている場合がある。このような場合、ＣＰＵ２０１は、「親指以外の指を親指の上を越えて次の押鍵位置まで移動させておきなさい」という準備動作をガイド表示させることが可能である。
【０２５５】
また例えば、親指以外の指の状態を示すｓｔａｔｕｓ［１］〜ｓｔａｔｕｓ［４］のうちのいずれかに押鍵を示す値「１」がセットされ、親指の状態を示すｓｔａｔｕｓ［０］に準備動作を示す値「−１」がセットされている場合も同様に、押鍵を示す指の鍵の位置と、親指が準備動作を行うべき鍵の位置との位置関係によっては、ＣＰＵ２０１は、「親指を親指以外の指の下をくぐらせて次の押鍵位置まで移動させておきなさい」という準備動作をガイド表示させることが可能である。
【０２５６】
これらの演奏ガイド表示は、演奏動作上のテクニックに関する動作情報であるということができる。このようにして、本実施形態の制御処理によって、演奏情報に付加されている運指情報（図３の「指番号」）から演奏動作上のテクニックに関する動作情報を自動的に抽出することが可能となり、それにより運指とともに演奏動作上のテクニックも演奏ガイドすることが可能となる。
【０２５７】
図２２は、演奏情報の記憶例を示す図、図２３は、図２２の演奏情報に対応して、準備動作を考慮しないときの動作データの出力例を示す図、図２４は、図２２の演奏情報に対応して、図５から図２１のフローチャートで示される制御処理により、準備動作を考慮したときの動作データの出力例を示す図、図２５は、演奏ガイドの表示例を示す図である。ただし、この例の場合は、片手のみのデータであるので、上記の実施例中で、右手と左手の衝突に関する調整（例えば図１７のパート同士の状態比較の処理）は必要としていない場合の例である。図２３および図２４において、濃いグレー色のデータ部分は押鍵動作が指定されている部分である。図２４において、薄いグレー色のデータ部分は押鍵の準備動作が指定されている部分である。
【０２５８】
図２２の演奏情報は、図３で説明したデータ構成例に従って、１行に１組の演奏情報、すなわち１行につき１音のデータが並んでいる。
【０２５９】
この演奏データに対して、準備動作を考慮しない場合には、図２３に例示されるように、各指の演奏位置ｐｏｓｉｔｉｏｎ［０］〜ｐｏｓｉｔｉｏｎ［４］毎に、音高が設定されると共に（濃い灰色部分）（値「−１」（色無しの部分）は音高設定無しを示す）、該当する状態ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］に、押鍵を行う場合は値「１」（濃い灰色部分）が、行わない場合は値「０」（色無しの部分）が設定されるだけである。従って、このような動作データに基づいて、演奏ガイドの表示が行われる場合には、図２３の例えば＊の行位置では、音高６７の鍵がｐｏｓｉｔｉｏｎ［０］の親指で押鍵された後に、＊の次の行位置で、音高「６７」の鍵の左隣りの音高「６６」の鍵がｐｏｓｉｔｉｏｎ［１］の人差し指で押鍵される。これは、親指の押鍵に対して人差し指によって指越えを行って次の押鍵を行う演奏テクニックを必要とする例である。しかし、図２２に例示される準備動作を考慮しない動作データでは、現在の押鍵に対して次にどのような押鍵がなされるかは知ることができないため、単純な演奏ガイド表示しか行うことができない。
【０２６０】
これに対して、図２２に例示される演奏データに対して、本実施形態の制御処理により準備動作を考慮した場合には、図２４に例示されるように、各指の演奏位置ｐｏｓｉｔｉｏｎ［０］〜ｐｏｓｉｔｉｏｎ［４］毎に、押鍵を行う指の音高（濃い灰色部分）と準備動作を行う指の音高（薄い灰色部分）が設定されると共に（値「−１」（色無しの部分）は音高設定無しを示す）、該当する状態ｓｔａｔｕｓ［０］〜ｓｔａｔｕｓ［４］に、押鍵を行う場合は値「１」（濃い灰色部分）が、準備動作を行う場合は値「−１」（薄い灰色部分）が、どちらも行わない場合は値「０」（色無しの部分）を設定することが可能となる。従って、このような動作データに基づいて、演奏ガイドの表示が行われる場合には、図２４の例えば＊の位置に示されるように、音高「６７」の鍵がｐｏｓｉｔｉｏｎ［０］の親指で押鍵されるときに（濃い灰色部分）、音高「６７」の鍵の左隣りの音高「６６」の鍵をｐｏｓｉｔｉｏｎ［１］の人差し指で押鍵する準備動作に入るべきことを、ｓｔａｔｕｓ［１］に設定される値「−１」と、ｐｏｓｉｔｉｏｎ［１］に設定される音高「６６」とで指定することができる（薄い灰色部分）。そして、親指が関係していることが認識されることによって、演奏ガイドの表示においては、現在の親指の押鍵に対して人差し指が指越えを行って次の押鍵を行う準備に入ることを表示させることが可能となる。これにより、ユーザは、押鍵時の演奏テクニックを習得することが可能となる。この場合、演奏情報としては、図２２に例示されるように、演奏テクニックのための特別な情報を持たせる必要はなく、指番号Ｆｉｎｇｅｒの情報から、準備動作の情報を自動的に生成することが可能となる。
【０２６１】
図２５は、演奏ガイドの表示例を示す図であり、右手の演奏ガイド表示を示している。鍵盤上の５個の丸い印は、右手の各指のポジションを示しており、左端の少し大きい丸印は親指を示し、右に向かって人差し指、中指、薬指、小指にそれぞれ対応する小さい丸印が示されている。左手の場合は、方向が逆になる。また、押鍵状態のときは、鍵盤が濃い色になる。
【０２６２】
図２５（ａ）の例では、親指が押鍵状態で、その他の指は準備状態であることが示されている。このとき、図１８のフローチャートで示した奥行き位置計算処理によって、図２５（ａ）の演奏ガイド例では、ｚｐｏｓに値「１」が格納されることにより、全ての指を白鍵上に置く指示が表示される。
【０２６３】
図２５（ｂ）の例も、親指が押鍵状態で、その他の指は準備状態であることが示されているが、図２０のフローチャートで示した奥行き位置計算処理によって、図２５（ｂ）の演奏ガイド例では、ｚｐｏｓに値「２」が格納されることにより、人差し指、中指、薬指の３本を黒鍵上に置き、親指と小指を白鍵上に置く指示が表示される。そして、人差し指は親指よりも半音低い黒鍵上に置いて準備する指示が表示されるため、演奏者は、自然に親指越えをして人差し指をＦ＃の黒鍵上に置いて準備する状態をとることができる。
【０２６４】
なお、指越えや指くぐりが発生したときに、それらを明示的に示すような表示がなされてもよい。例えば、画面上に矢印や特殊なマークを表示するようにしても良い。あるいは、対象となる指（例えば、親指や人差し指）を点滅させたり、別の色で表示する等しても良い。
【０２６５】
図２６は、左手の押鍵ガイドがその演奏進行に伴って右手の押鍵の準備ガイドに衝突しうる楽譜例を示す図である。図２６において、ト音記号が付与された上段のパートは右手パートを示し、ヘ音記号が付与された下段のパートは左手パートを示している。各音符の上に付与されている１から５の範囲の数字は、押鍵時の指番号を示しており、１は親指、２は人差し指、３は中指、４は薬指、５は小指で押鍵がされる音符であることを示している。図２７は、図２６の楽譜例に対応し、衝突回避制御を行わないときの衝突が発生する場合の右手パートに関する動作データの出力例（その１）を示す図である。図２８は、図２６の楽譜例に対応し、衝突回避制御を行うときの衝突が発生する場合の右手パートに関する動作データの出力例（その１）を示す図である。図２７および図２８において、図２３および図２４の場合と同様に、濃い灰色のデータ部分は押鍵動作が指定される部分、薄い灰色のデータ部分は押鍵の準備動作が指定される部分である。また、図２７および図２８において、左端の「Ｎｏ」列は各行の動作データのフレーム番号（図４のｆｒａｍｅ［０］、ｆｒａｍｅ［１］、・・・、ｆｒａｍｅ［ＦｒａｍｅＣｏｕｎｔ−１］に対応）を示している。以下の説明では、例えばフレーム番号として０が付与されている行の動作データを、「第０フレームの動作データ」と記載する。
【０２６６】
図２６において、第１小節から第４小節までは、右手パートのみで演奏が行われ、それに伴い、第０フレームから第２８フレームまでの動作データが、それぞれの押鍵タイミングに先行するタイミングで出力され、その動作データに基づいて演奏ガイドの表示が行われてゆく。このとき、左手パートは、第１小節から第５小節までは休符となっているため、その動作データは、特には図示しないが、押鍵の準備動作を示し、それに基づく演奏ガイド表示がなされる。
【０２６７】
図２６において、第５小節から第１０小節までは、右手パートは休符状態に入る。この区間に対応して、もし衝突回避制御を行わないとしたときの右手パートの動作データは、図２７の第２９フレームの動作データとして示されるように、第１１小節の先頭の２つの音符に対応するＰｏｓｉｔｉｏｎの値が「０」（親指）で音高が「６０」の「ド」音およびＰｏｓｉｔｉｏｎが「１」（人差し指）で音高が「６２」の「レ」音の押鍵の準備動作を指示する動作データが出力される。この第２９フレームの動作データは、ｓｔａｒｔ項目の時間値「７．５４」とｔｅｒｍ項目の時間値「１７．５０８」として示されるように、第５小節から第１０小節までずっと同じ演奏ガイド状態を維持する。。
【０２６８】
一方、左手パートについては、図２６において、第５小節から第９小節までは、押鍵動作が行われる。そして、第７小節の先頭音（音高が「６２」の「レ」音）の発音に先行してその押鍵が指示されるタイミングで、左手パートの親指に最も近い指である親指自身に対して設定される動作データが、図２６上の第７小節の４番目の音符（音高が「６７」の「ソ」音）の押鍵の準備動作を指示する。この結果、この左手パートの親指の演奏情報の音高が、右手パートの親指に最も近い指である親指自身に対して設定される演奏情報の音高「６０」（「ド」音）よりも高くなる。この結果、右手パートに関して、図２６の第７小節以降も、図２７に示されるように、もし衝突回避制御が行われずに第２９フレームの動作データにより演奏ガイド表示が継続された場合には、左手パートの押鍵または押鍵の準備動作の演奏ガイドにおける指の指定位置が、右手パートの演奏ガイドにおける指の指定位置に衝突してしまい、演奏ガイドがうまく表示できず、このため演奏者は演奏をうまく行えなくなる。
【０２６９】
そこで、本実施形態では、上述の状態では、図６のステップＳ６０６のパート同士の状態比較の処理における図１７のステップＳ１７０４の判定がＹＥＳとなる。さらに、第７小節の先頭音に対する演奏ガイドの開始時点で、右手パートで押鍵の準備動作の指示がされている演奏情報のうち発音開始時刻が最も早いものは第１１小節の先頭の音符のものであり、左手パートで押鍵または押鍵の準備動作の指示がされている指のうち発音開始時刻が最も早いものは第７小節の先頭の音符のものである。このため、図６のステップＳ６０５のパート毎の状態確認の処理における図９のフローチャートの処理において、ｉＨ＝０（右手パート）のときにはステップＳ９０３の判定はＮＯとなって（図６のステップＳ６０３参照）、ステップＳ９０５で押鍵動作フラグ変数ｐｕｓｈＫｅｙ［０］に値「０」がセットされ、ｉＨ＝１（左手パート）のときにはステップＳ９０３の判定はＹＥＳとなって、ステップＳ９０５でｐｕｓｈＫｅｙ［１］に値「１」がセットされる。この結果、図１７のステップＳ１７０５の判定がＮＯ、ステップＳ１７０７の判定がＮＯ、ステップＳ１７０９の判定がＹＥＳとなって、ステップＳ１７１０で、右手パート用の鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［０］に、ステップＳ１７０４で判定された音高の差に応じた量だけ右側方向への移動を指示するための補正値がセットされる。これにより、図６のステップＳ６０７の動作データ出力の処理における図１８と図１９のフローチャートにおいて、ｉＨ＝０（右手パート）のときに、ステップＳ１８１４で、押鍵または押鍵の準備動作を指示する動作データｆｒａｍｅ［ｉ］の各指ｉｆｉｇの演奏位置（鍵盤番号）ｐｏｓｉｔｉｏｎ［ｉｆｉｇ］が、右手パート用の鍵盤横方向状態補正値ｘＯｆｆｓｅｔ［０］の分だけ鍵盤右横方向に移動させられる。
【０２７０】
この結果、本実施形態では、衝突回避制御が行われる図２８の動作データ例に基づいて動作が実行される。図２７の衝突回避制御が行われないとした場合の動作データ例と図２８の衝突回避制御が行われる動作データ例では、衝突の発生が検知されない第０フレームから第２８フレームまでは、同じ動作データ群が出力される。そして、第２９フレームの出力が開始された後、図２６の第７小節の先頭音（音高が「６２」の「レ」音）の発音に先行してその押鍵が指示されるタイミングで、上述のように衝突が検知されて、右手パートの鍵盤横方向状態が補正された第３０フレームの動作データが出力される。すなわち、図２８に示されるように、第２９フレームの動作データでは、第１１小節の先頭の２つの音符（音高が「６０」の「ド」音および音高が「６２」の「レ」音）に対応するＰｏｓｉｔｉｏｎの値が「０」（親指）と「１」（人差し指）での押鍵の準備動作を指示する動作データが出力される。続いて、衝突が検知された第３０フレームの動作データでは、上記２つの音符を順次右に２半音ずつずらした音高が「６２」の「レ」音、音高が「６４」の「ミ」音、さらにもう１音加えて音高が「６６」の「ファ＃」音（右手パートの第１１小節の第３音目に対応）に対応するＰｏｓｉｔｉｏｎの値が「０」（親指）と「１」（人差し指）と「２」（中指）での押鍵の準備動作を指示する動作データが出力される。
【０２７１】
以下、図２６の第７小節において、左手パートが鍵盤右横方向に順次押鍵されてゆくに従って、上述の衝突に対する制御によって、左手パートの指が右手パートの指に重なる分だけ、右手パートの押鍵の準備動作を指示する各指の音高が鍵盤右横方向に移動させられる動作が順次実行されてゆく。この結果、左手パートの鍵盤右横方向への押鍵移動に従って、右手パートの押鍵の準備動作の演奏ガイドも鍵盤右横方向へ移動してゆく。その後、図２６の第７小節から第８小節にかけて、左手パートが鍵盤左横方向に順次押鍵されてゆくに従って、上述の衝突に対する制御によって、左手パートの指が右手パートの指に重なる分だけ、右手パートの押鍵の準備動作を指示する各指の音高が鍵盤右横方向に移動させられる動作が順次実行されてゆく。この結果、左手パートの鍵盤左横方向への押鍵移動に従って、右手パートの押鍵の準備動作の演奏ガイドも鍵盤左横方向へ移動してゆく。以上の衝突回避制御の動作が、図２６および図２８の破線枠で囲まれた範囲で実行されることになる。
【０２７２】
最後に、左手パートと右手パートの衝突が検知されなくなる図２８の第４７フレームの動作データの出力タイミングで、衝突の回避制御をしないとした場合の図２７の第３０フレームの動作データと同じ動作データが出力される状態に戻る。そして、このように構成された図２８の動作データに基づいて、図２５に示したような演奏ガイドの表示を行うことができる。具体的には、図２４の動作データから図２５の演奏ガイド表示を生成したのと同様の手順で、図２８の動作データに基づく演奏ガイドの表示を行うことができる。これにより、ユーザは、押鍵時の演奏テクニックを習得することが可能となる。
【０２７３】
図２９は、同じ押鍵タイミングでの右手および左手の接近により両者の演奏ガイドが衝突しうる楽譜例を示す図である。図２９において、図２６の場合と同様に、ト音記号が付与された上段のパートは右手パートを示し、ヘ音記号が付与された下段のパートは左手パートを示している。図２６の場合と同様に、各音符の上に付与されている１から５の範囲の数字は、押鍵時の指番号を示している。図３０は、図２９の楽譜例に対応し、衝突回避制御を行わないときの衝突が発生する場合の動作データの出力例（その２）を示す図であり、図３０（ａ）が右手パート、図３０（ｂ）が左手パートである。図３１は、図２９の楽譜例に対応し、衝突回避制御を行うときの衝突が発生する場合の動作データの出力例（その２）を示す図であり、図３１（ａ）が右手パート、図３１（ｂ）が左手パートである。図３０および図３１において、図２３および図２４の場合と同様に、濃い灰色のデータ部分は押鍵動作が指定される部分、薄い灰色のデータ部分は押鍵の準備動作が指定される部分である。また、図３０および図３１において、図２７および図２８の場合と同様に、左端の「Ｎｏ」列は各行の動作データのフレーム番号を示している。
【０２７４】
図２９において、第２小節から第３小節にかけての破線枠で囲まれた部分の３つの押鍵タイイングに先行する動作データの出力タイミングにおいて、右手パートでは、音高「６２」の「レ」音と音高「６８」の「ソ＃」音と音高「７１」の「シ」音の押鍵が指示される。一方、左手パートでは、音高「５２」の「ミ」音と音高「６４」の「ミ」音の押鍵が指示される。この結果、右手パートの音高「６２」の「レ」音と左手パートの音高「６４」の「ミ」音で、左手パートの音高のほうが高くなって、右手パートと左手パートで衝突が発生する。
【０２７５】
この場合、もし衝突開始の制御が行われない場合は、例えば図３０の動作データ群が出力される。すなわち、右手パートについては、図２９の破線枠の部分に対応する図３０（ａ）の第３フレームから第７フレームの動作データ群が出力され、左手パートについては、図２９の破線枠の部分に対応する図３０（ｂ）の第１フレームから第５フレームの動作データ群が出力される。このとき、図６のステップＳ６０７の動作データ出力の処理における図１９のステップＳ１８２２の奥行き計算の処理（図２０のフローチャートの処理）により、右手パートの第３フレームから第７フレームの動作データ群の奥行き方向の位置Ｚｐｏｓとして、値「２」が設定される（図３０（ａ）の太実線枠部分）。Ｚｐｏｓ＝２の場合、人差し指、中指、薬指の３本の指を鍵盤上の奥側の黒鍵上に置くことが指示される。この結果、図３０（ａ）において、右手の親指（Ｐｏｓｉｔｉｏｎ＝０）は音高「６２」の「レ」音の白鍵を押鍵し、右手の人差し指（Ｐｏｓｉｔｉｏｎ＝１）は音高「６８」の「ソ＃」音の黒鍵を押鍵し、右手の薬指（Ｐｏｓｉｔｉｏｎ＝３）は音高「７１」の「シ」音の白鍵をそれぞれ押鍵することが指示される。同じく、ステップＳ１８２２の奥行き計算の処理により、左手パートの第１フレームから第５フレームの動作データ群の奥行き方向の位置Ｚｐｏｓとして、値「１」が設定される（図３０（ｂ）の太実線枠部分）。Ｚｐｏｓ＝１の場合、５本の指全てを鍵盤上の手前側の白鍵上に置くことが指示される。この結果、図３０（ｂ）において、左手の小指（Ｐｏｓｉｔｉｏｎ＝４）は音高「５２」の「ミ」音の白鍵を押鍵し、左手の親指（Ｐｏｓｉｔｉｏｎ＝０）は音高「６４」の「ミ」音の白鍵を押鍵することが指示される。
【０２７６】
この結果、衝突回避制御を行わないとした場合の図３０の動作データの例では、図２９の破線枠に対応する右手パートに対応する図３０（ａ）の第３フレームから第７フレームの動作データと左手パートに対応する図３０（ｂ）の第１フレームから第５フレームの動作データの出力タイミングにおいて、右手パートの親指に対する音高「６２」の「レ」音の白鍵の押鍵指示と、左手パートの親指に対する音高「６４」の「ミ」音の白鍵の押鍵指示とが、親指同士がクロスして衝突が発生してしまう。従って、演奏ガイドがうまく表示できず、このため演奏者は、うまく演奏を行うことができなくなってしまう。
【０２７７】
そこで、本実施形態では、以下に示す衝突回避制御によって、例えば図３１（ａ）（右手パート）および図３１（ｂ）（左手パート）の動作データが生成され、その動作データに基づいて演奏ガイドが実行される。すなわち、上述の状態では、図６のステップＳ６０６のパート同士の状態比較の処理における図１７のステップＳ１７０４の判定がＹＥＳとなる。さらに、図２９の破線枠の演奏ガイドの開始時点で、右手パートと左手パートでは同時に押鍵が発生するため、図６のステップＳ６０５のパート毎の状態確認の処理における図９のフローチャートの処理において、ｉＨ＝０（右手パート）およびｉＨ＝１（左手パート）ともにステップＳ９０３の判定はＹＥＳとなって（図６のステップＳ６０３参照）、ステップＳ９０４で押鍵動作フラグ変数ｐｕｓｈＫｅｙ［０］およびｐｕｓｈＫｅｙ［１］ともに値「１」がセットされる。この結果、図１７のステップＳ１７０５の判定がＹＥＳとなって、ステップＳ１７０６で、鍵盤奥方向（黒鍵側）にある右手パートに対応する鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［０］に、例えば正の値「２」がセットされ、手前方向（白鍵側）にある左手パートに対応する鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［１］には、現在の奥行き方向の位置が最低値「１」であるから、補正無しを示す値「０」がセットされる。この結果、図６のステップＳ６０７の動作データ出力の処理における図１８と図１９のフローチャートにおけるステップＳ１８２３の処理により、ｉＨ＝０（右手パート）のときに、奥行き方向の位置ｚｐｏｓ＝２（図３０（ａ）の太実線枠）に鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［０］＝２が加算され、ｉＨ＝０（左手パート）のときに、奥行き方向の位置ｚｐｏｓ＝１（図３０（ｂ）の太実線枠）に鍵盤奥行き方向状態補正値ｚＯｆｆｓｅｔ［１］＝０が加算される。
【０２７８】
以上の制御処理により、右手パートについては、図２９の破線枠の部分に対応する図３１（ａ）の第３フレームから第７フレームの動作データ群において、太実線枠として示されるように、奥行き方向の位置Ｚｐｏｓとして、値「４」が設定される。また、左手パートについては、図２９の破線枠の部分に対応する図３１（ｂ）の第１フレームから第５フレームの動作データ群において、太実線枠として示されるように、奥行き方向の位置Ｚｐｏｓとして、値「１」が設定される。Ｚｐｏｓ＝４の場合、５本の指全てを鍵盤上の奥側の黒鍵上に置くことが指示される。この結果、右手パート全体が鍵盤奥の黒鍵側に移動させられ、左手パート全体は鍵盤手前の白鍵側に置かれるため、両手間の衝突が回避されることになる。すなわち、衝突回避制御が行われた場合の図３１の動作データの例では、図２９の破線枠に対応する右手パートに対応する図３１（ａ）の第３フレームから第７フレームの動作データと左手パートに対応する図３１（ｂ）の第１フレームから第５フレームの動作データの出力タイミングにおいて、右手パートの親指に対する音高「６２」の「レ」音の白鍵の押鍵指示と、左手パートの親指に対する音高「６４」の「ミ」音の白鍵の押鍵指示において、親指同士のクロスによる衝突を回避でき、演奏者は、うまく演奏を行うことが可能となる。そして、このように構成された図３１の動作データに基づいて、図２５に示したような演奏ガイドの表示を行うことができる。具体的には、図２４の動作データから図２５の演奏ガイド表示を生成したのと同様の手順で、図３１の動作データに基づく演奏ガイドの表示を行うことができる。これにより、ユーザは、押鍵時の演奏テクニックを習得することが可能となる。
【０２７９】
以上説明したように、本実施形態によれば、演奏情報と運指情報のみから、押鍵のための情報にとどまらない、演奏動作を遂行する上でのテクニックに相当する情報を生成することが可能となるため、それにより運指とともに演奏動作上のテクニックも演奏ガイドすることが可能となる。また、準備に必要な箇所についてのユーザへの注意を喚起する情報を自動で生成できるなどの、楽器演奏の練習についての有用な情報の提供が可能になる。さらに、演奏情報に、熟達者による付加情報をつける必要がなくなるというメリットも生まれる。
【０２８０】
さらに本実施形態では、左手と右手のパートで練習を行うための演奏ガイドを実行するときに、楽譜上、左手パートと右手パートの間で、演奏される指同士が衝突しそうになったり、あるいは次に演奏する準備を行うべき指を置く場所と演奏中の指が衝突しそうになった場合に、それらの状態を検知して補正することが可能となる。
以上の各実施形態に関して、更に以下の付記を開示する。
【０２８１】
（付記１）
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報を記憶する記憶部から読み出す読み出し手段と、
当該読み出された演奏情報それぞれに基づいて、前記右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定する位置推定手段と、
前記位置推定手段により推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別する判別手段と、
前記判別手段にて条件を満たすと判別された場合に、前記位置推定手段にて推定された前記右手及び左手の位置のうち、少なくとも一方の手の指位置を補正する位置補正手段と、
前記読み出された演奏情報及び前記各手の指位置に基づいて、演奏操作ガイド情報を生成するガイド情報生成手段と、
を備えることを特徴とする演奏操作ガイド装置。
（付記２）
前記判定手段は、前記指位置推定手段により推定された右手の各指位置と左手の各指位置のうち、前記左手の親指位置が、前記右手の親指位置より右側にあるか否かを判別する、
ことを特徴とする付記１に記載の演奏操作ガイド装置。
（付記３）
前記指位置補正手段は、
前記読み出された演奏情報に含まれる発音タイミング情報に基づき、前記演奏装置を演奏している指が前記右手及び左手のいずれに存在しているかを判別する演奏指判別手段をさらに有する、
ことを特徴とする付記１または２のいずれかに記載の演奏操作ガイド装置。
（付記４）
前記指位置補正手段は、
前記演奏指判別手段により、前記右手に前記演奏装置を演奏している指が存在していると判別された場合は、前記左手の指位置を、当該左手方向に補正する一方、前記左手に前記演奏装置を演奏している指が存在していると判別された場合は、前記右手の指位置を、当該右手方向に補正する、
ことを特徴とする付記３に記載の演奏操作ガイド装置。
（付記５）
前記指位置補正手段は、
前記演奏指判別手段により、前記右手及び左手の両方に前記演奏装置を演奏している指が存在していると判別された場合は、前記右手及び左手の少なくとも一方の指位置を、当該右手方向及び左手方向以外の方向に補正する、
ことを特徴とする付記３または４のいずれかに記載の演奏操作ガイド装置。
（付記６）
付記１から５のいずれかに記載の演奏操作ガイド装置と、
演奏者に演奏操作を行わせる演奏操作子と、
前記演奏操作子における演奏操作に応じて楽音を生成して出力する楽音出力部とを備える電子楽器。
（付記７）
演奏操作ガイド装置が、
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報を記憶する記憶部から読み出し、
当該読み出された演奏情報それぞれに基づいて、前記右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定し、
前記推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別し、
前記条件を満たすと判別された場合に、前記推定された右手及び左手の位置のうち、少なくとも一方の手の指位置を補正し、
前記読み出された演奏情報及び前記各手の指位置に基づいて、演奏操作ガイド情報を生成する、演奏操作ガイド方法。
（付記８）
楽曲を構成する楽音夫々の発音タイミング情報と、音高情報と、演奏に用いる手及び指を示す情報と、を含む演奏情報を記憶する記憶部から読み出す読み出しステップ、
当該読み出された演奏情報それぞれに基づいて、前記右手及び左手の指夫々が複数の演奏操作子のいずれの位置にあるかを示す指位置を推定する位置推定ステップと、
前記推定された前記右手及び左手の指位置同士の関係が予め定められた条件を満たすか否か判別する判別ステップと、
前記条件を満たすと判別された場合に、前記推定された右手及び左手の位置のうち、少なくとも一方の手の指位置を補正する位置補正ステップと、
前記読み出された演奏情報及び前記各手の指位置に基づいて、演奏操作ガイド情報を生成するガイド情報生成ステップと、
をコンピュータに実行させる演奏操作ガイドプログラム。
【符号の説明】
【０２８２】
１００  演奏操作ガイド装置
１０１  演奏情報読み出し手段
１０２  操作状態推定手段
１０３  パート同士の状態比較手段
１０４  演奏操作ガイド手段
１０５  記憶部
１０６  第１の演奏操作状態
１０７  第２の演奏操作状態
１０８  演奏情報
２０１  ＣＰＵ
２０２  ＲＯＭ
２０３  ＲＡＭ
２０４  入力部
２０５  表示部
２０６  ＭＩＤＩ  Ｉ／Ｆ（ＭＩＤＩインタフェース部）
２０７  バス
２０８  電子楽器
【図１】
0006427994.tif 000002
【図２】
0006427994.tif 000003
【図３】
0006427994.tif 000004
【図４】
0006427994.tif 000005
【図５】
0006427994.tif 000006
【図６】
0006427994.tif 000007
【図７】
0006427994.tif 000008
【図８】
0006427994.tif 000009
【図９】
0006427994.tif 000010
【図１０】
0006427994.tif 000011
【図１１】
0006427994.tif 000012
【図１２】
0006427994.tif 000013
【図１３】
0006427994.tif 000014
【図１４】
0006427994.tif 000015
【図１５】
0006427994.tif 000016
【図１６】
0006427994.tif 000017
【図１７】
0006427994.tif 000018
【図１８】
0006427994.tif 000019
【図１９】
0006427994.tif 000020
【図２０】
0006427994.tif 000021
【図２１】
0006427994.tif 000022
【図２２】
0006427994.tif 000023
【図２３】
0006427994.tif 000024
【図２４】
0006427994.tif 000025
【図２５】
0006427994.tif 000026
【図２６】
0006427994.tif 000027
【図２７】
0006427994.tif 000028
【図２８】
0006427994.tif 000029
【図２９】
0006427994.tif 000030
【図３０】
0006427994.tif 000031
【図３１】
0006427994.tif 000032