(57)【要約】【課題】ユーザが手本の演奏に合わせて演奏したユーザ演奏の演奏達成状況を表示する技術に関し、ユーザの演奏について、音高、リズム、テンポに関する演奏達成状況を判定評価して、容易に認識可能な形態にて表示可能とする。【解決手段】演奏範囲判定処理において、少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定する。曲全体の判定処理において、決定された評価値に基づいて、リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する。【選択図】図７
2014186215.tif 000002
【特許請求の範囲】
【請求項１】
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定する演奏評価手段と、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する演奏達成状況表示手段と、
を備えることを特徴とする演奏達成状況表示装置。
【請求項２】
前記演奏評価手段は、ユーザによって今回演奏された楽曲の演奏範囲について、該ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定し、
前記演奏達成状況表示手段は、当該演奏範囲について、前記決定された各音符の、リズム、およびテンポの少なくとも一方の評価値に基づいて、達成状況を算出して表示する、
ことを特徴とする請求項１に記載の演奏達成状況表示装置。
【請求項３】
過去になされた前記ユーザ演奏における、前記楽曲の音符毎の、リズム、およびテンポの少なくとも一方の最高評価値を記憶する最高値記憶手段をさらに備え、
前記演奏達成状況表示手段は、今回の前記ユーザ演奏において、前記演奏評価手段によって決定された各音符の評価値が、前記最高値記憶手段に記憶された対応する音符の最高評価値を越える評価値である場合に、前記対応する音符の最高評価値として、当該今回決定された評価値により更新するとともに、前記更新された各音符の最高評価値に基づいて前記楽曲の最高評価値を算出して表示する、
ことを特徴とする請求項１または２に記載の演奏達成状況表示装置。
【請求項４】
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、その発音開始時刻と該音符の直前の音符の発音開始時刻との時間差である発音時間間隔を前記ユーザ演奏および前記楽曲情報のそれぞれについて算出し、該各音符の発音時間間隔に基づいて前記リズムおよび前記テンポを判定する、
ことを特徴とする請求項１から３のいずれかに記載の演奏達成状況表示装置。
【請求項５】
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、
前記ユーザ演奏の総時間に対する前記ユーザ演奏の発音時間間隔の割合と、前記楽曲情報の総時間に対する前記楽曲情報の発音時間間隔の割合との差分を算出し、当該差分に基づいて前記音符に対応するリズムの評価値として算出する、
ことを特徴とする請求項１から４のいずれかに記載の演奏達成状況表示装置。
【請求項６】
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、
前記ユーザの演奏の発音時間間隔と前記楽曲情報の発音時間間隔の比の値を算出し、当該比の値を前記音符に対応するテンポの評価値として算出する、
ことを特徴とする請求項１から５のいずれかに記載の演奏達成状況表示装置。
【請求項７】
前記演奏達成状況表示手段は、前記ユーザ演奏と前記楽曲情報とで対応する音符ごとの前記リズムの評価値の平均値を、前記演奏範囲での前記ユーザ演奏の前記楽曲情報に対するリズムの達成状況として算出する、
ことを特徴とする請求項５に記載の演奏達成状況表示装置。
【請求項８】
前記演奏達成状況表示手段は、前記ユーザ演奏と前記楽曲情報とで対応する音符ごとの前記テンポの評価値の平均値を、前記演奏範囲での前記ユーザ演奏の前記楽曲情報に対するテンポの達成状況として算出する、
ことを特徴とする請求項６に記載の演奏達成状況表示装置。
【請求項９】
請求項１から８のいずれかに記載の演奏達成状況表示装置と
前記ユーザ演奏が入力される入力手段と、
前記入力手段による前記ユーザ演奏に応じた発音を行う発音手段と、
を備える電子楽器。
【請求項１０】
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定し、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する、
ことを特徴とする演奏達成状況表示方法。
【請求項１１】
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定するステップと、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示するステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザが手本の演奏に合わせて演奏したユーザ演奏の演奏達成状況を表示する装置、方法、およびプログラムに関する。
【背景技術】
【０００２】
ユーザがある楽曲を演奏したときのユーザ演奏について、その演奏の達成状況を評価する技術として従来、例えば１つの楽曲を演奏したときの音高等の手本の演奏に対するユーザ演奏の一致度を判定して、このミスタッチ数に基づいて、ユーザの演奏を評価する技術が知られている（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−１３４２０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ここで、ユーザは、自己の演奏について、音高が正しく弾けたかどうか以外にも、リズムやテンポなどの、音楽的な他の諸要素についても正しく弾けていたか否かをも知りたいと思うのが通常である。しかしながら、従来は、演奏範囲ごとに音高、リズム、テンポなどの各要素に関する演奏達成状況を、きめ細かく評価して表示することはできず、特に初心者にとっては、現在の演奏達成状況を知ることが困難であるという問題点を有していた。
【０００５】
本発明は、ユーザの演奏について、音高、リズム、テンポに関する演奏達成状況を判定評価して、容易に認識可能な形態にて表示可能とすることを目的とする。
【課題を解決するための手段】
【０００６】
態様の一例では、少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定する演奏評価手段と、その決定された評価値に基づいて、リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する演奏達成状況表示手段とを備える。
【発明の効果】
【０００７】
本発明によれば、ユーザの演奏について、音高、リズム、テンポに関する演奏達成状況を判定評価して、容易に認識可能な形態にて表示することが可能となる。
【図面の簡単な説明】
【０００８】
【図１】本発明による演奏達成状況表示装置の一実施形態の構成図である。
【図２】手本の演奏の演奏情報のデータ構成例を示す図である。
【図３】ユーザ押鍵情報バッファのデータ構成例を示す図である。
【図４】判定用バッファのデータ構成例を示す図である。
【図５】演奏達成状況制御処理の全体処理を示すフローチャートである。
【図６】押鍵情報処理を示すフローチャートである。
【図７】判定処理を示すフローチャートである。
【図８】判定用バッファ更新処理を示すフローチャートである。
【図９】本実施形態による演奏範囲判定処理の説明図である。
【図１０】演奏範囲判定処理を示すフローチャート（その１）である。
【図１１】演奏範囲判定処理を示すフローチャート（その２）である。
【図１２】演奏範囲判定処理を示すフローチャート（その３）である。
【図１３】曲全体の判定処理を示すフローチャートである。
【図１４】演奏達成状況の表示例を示す図である。
【発明を実施するための形態】
【０００９】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図１は、本発明による演奏達成状況表示装置の一実施形態の構成図である。
【００１０】
演奏達成状況表示装置１００は、例えば鍵盤楽器である電子楽器１１０と、ＭＩＤＩ（Ｍｕｓｉｃａｌ  Ｉｎｓｔｒｕｍｅｎｔ  Ｄｉｇｉｔａｌ  Ｉｎｔｅｒｆａｃｅ）インターフェース１０６（演奏達成状況表示装置１００側）およびＭＩＤＩインターフェース１１３（電子楽器１１０側）により接続される。これにより、演奏達成状況表示装置１００と電子楽器１１０は、相互に演奏情報を通信する。
【００１１】
演奏達成状況表示装置１００は、ＣＰＵ（中央演算処理装置）１０１、ＲＡＭ（ランダムアクセスメモリ）１０２、ＲＯＭ（リードオンリーメモリ）１０３、入力部１０４、表示部１０５、および上述のＭＩＤＩインターフェース１０６が、バス１０７によって接続される構成を有する。
【００１２】
電子楽器１１０は、例えば鍵盤楽器であり、ユーザが演奏入力を行う鍵盤であるキーボード１１１、キーボード１１１からの演奏入力に従って楽音波形を生成し出力する音源・サウンドシステム１１２、および前述したＭＩＤＩインターフェース１１３を備える。
【００１３】
本実施形態では、ユーザが入力部１０４を操作する等により、あらかじめ練習する楽曲を選択指示すると、その楽曲の手本の演奏データが取得され、この手本の演奏データとユーザの演奏とを比較することで、演奏達成状況制御処理が行われる。ユーザがキーボード１１１によって演奏を行うと、その演奏のデータが、音源・サウンドシステム１１２に送られてあらかじめ選択された楽音で発音されるとともに、ＭＩＤＩインターフェース１１３およびＭＩＤＩインターフェース１０６を介して演奏達成状況表示装置１００に送信され、演奏達成状況表示装置１００は、このユーザ演奏入力データに基づいて、演奏達成状況制御処理を実行する。
【００１４】
そして、上述のユーザの演奏動作に合わせて、演奏達成状況表示装置１００において、ＣＰＵ１０１は、ＲＯＭ１０３に記憶された後述するフローチャート群で示される演奏達成状況制御プログラムを実行しながら、図２から図４に示される各種制御データを制御することにより、演奏達成状況制御処理を実行する。
【００１５】
演奏達成状況表示装置１００の入力部１０４は、ユーザが、本発明に係る演奏達成状況表示装置を動作させて演奏達成状況制御処理の実行を指示するための各種入力指示を行うスイッチ群である。
【００１６】
演奏達成状況表示装置１００の表示部１０５は、ユーザが演奏を行った後、本発明に係る演奏達成状況制御処理を行った結果としての演奏達成状況を表示する。
【００１７】
図２は、本実施形態において、図１のＲＡＭ１０２に記憶されるある楽曲の手本の演奏の演奏情報のデータ構成例を示す図である。Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・Ｎｏｔｅ［Ｎ］は、手本の演奏を構成する１つ１つの音符の情報を示している。
図２の先頭の演奏情報Ｎｏｔｅ［０］に例示されるように、「Ｔｉｍｅ」項目には発音開始時間（システム時刻）が格納される。「Ｇａｔｅ」項目には、発音継続時間が格納される。「Ｐｉｔｃｈ」項目にはその音符の音高が格納される。「Ｔｒａｃｋ」項目には、その音符のパートとして右手パートを示す情報または左手パートを示す情報が、値１または２として格納される。「ｍａｔｃｈ＿ｔｅｍｐ」項目には、ユーザ演奏の今回の押鍵がその演奏情報と対応付けられて音高が一致したか否かの判定結果が、１（一致）または０（不一致）の値として格納される。「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目には、その演奏情報の音符に対するユーザ演奏の今回の押鍵のリズムの判定結果（リズム評価値）が格納される。「ｔｅｍｐｏ＿ｔｅｍｐ」項目には、その演奏情報の音符に対するユーザ演奏の今回の押鍵のテンポの判定結果（テンポ評価値）が格納される。「ｍａｔｃｈ＿ｂｅｓｔ」項目には、ユーザの今回までの演奏におけるその音符の通算の押鍵において、音高に関する評価値で最高の評価値となったときの、その評価値が格納される。「ｒｈｙｔｈｍ＿ｂｅｓｔ」項目には、その演奏情報の音符に対するユーザの今回までの演奏の、通算の押鍵における最良のリズムの判定結果（リズム評価値）が格納される。「ｔｅｍｐｏ＿ｂｅｓｔ」項目には、その演奏情報の音符に対するユーザの今回までの演奏の、通算の押鍵における最良のテンポの判定結果（テンポ評価値）が格納される。
【００１８】
図３は、図１の演奏達成状況表示装置１００のＲＡＭ１０２に記憶されるユーザ押鍵情報バッファのデータ構成例を示す図である。このユーザ押鍵情報バッファには、図１の電子楽器１１０のキーボード１１１を用いたユーザ演奏に基づいて図１の電子楽器１１０から演奏達成状況表示装置１００に入力された押鍵情報が格納される。このユーザ押鍵情報バッファは、図２のＮ個の演奏情報に対応して、最大でＮ個の押鍵情報ＭｉｄｉＩｎ［０］、ＭｉｄｉＩｎ［１］、・・・、ＭｉｄｉＩｎ［Ｎ］を記憶できる。図３の最初の押鍵情報ＭｉｄｉＩｎ［０］に示されるように、ユーザ押鍵情報バッファは、押鍵情報として、「ｎｏｔｅｏｎ」、「ｎｏｔｅｏｆｆ」、および「ｐｉｔｃｈ」の各項目値を記憶する。「ｎｏｔｅｏｎ」項目には押鍵時刻（システム時刻）が格納される。「ｎｏｔｅｏｆｆ」項目には離鍵時刻（システム時刻）が格納される。「ｐｉｔｃｈ」項目には、音高が格納される。
また、ユーザ押鍵情報バッファの先頭の変数領域ＵｓｅｒＮｏｔｅｓには、本バッファに入っている押鍵情報の数が格納される。この情報は、新たな押鍵情報が入力される毎にインクリメントされる。
【００１９】
図４は、図１の演奏達成状況表示装置１００のＲＡＭ１０２に記憶される判定用バッファのデータ構成例を示す図である。この判定用バッファには、ユーザ演奏の演奏達成状況を判定するために、ユーザ演奏の押鍵情報のうち手本の演奏の演奏情報と対応付けがなされた押鍵情報である判定用バッファ情報が格納される。この判定用バッファは、図２のＮ個の演奏情報に対応して、最大でＮ個の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］、ＥｖａｌＢｕｆｆｅｒ［１］、・・・、ＥｖａｌＢｕｆｆｅｒ［Ｎ］を記憶できる。図４の最初の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］に示されるように、判定用バッファは、判定用バッファ情報として、「ｄｅｌｔａｔｉｍｅ」、「ｐｉｔｃｈ」、「ｎｏｔｅｉｎｄｅｘ」、および「ｍａｔｃｈｒｅｓｕｌｔ」の各項目を記憶する。「ｄｅｌｔａｔｉｍｅ」項目には、今回の押鍵の押鍵時刻と直前の押鍵の押鍵時刻との時間差を示す押鍵時間が格納される。これは、ＭＩＤＩ形式のステップタイム（ＳＴ）に相当する値である。「ｐｉｔｃｈ」項目には、今回演奏情報との対応付けがなされた押鍵の音高が格納される。「ｎｏｔｅｉｎｄｅｘ」項目には、今回の押鍵に対応付けされた演奏情報のインデックス（何番目の演奏情報かを示す番号情報）が格納される。「ｍａｔｃｈｒｅｓｕｌｔ」項目には、今回の押鍵の音高がその押鍵に対応付けられた演奏情報の音高と一致しているか否かを示す値１（一致）または０（不一致）が格納される。
【００２０】
図５は、上述の図２から図４の各制御データを用いて図１のＣＰＵ１０１によって実行される演奏達成状況処理の全体処理を示すフローチャートである。
【００２１】
まず、ＣＰＵ１０１は、初期化処理を実行する（図５のステップＳ５０１）。ここでは例えば、図１のＲＡＭ１０２に記憶される図３のユーザ押鍵情報バッファの内容と図４の判定用バッファの内容がクリアされる。
【００２２】
次に、ＣＰＵ１０１は、演奏情報読込み処理を実行する（図５のステップＳ５０２）。この処理では、ユーザによる入力部１０４からの指示により、ユーザが指定した楽曲の手本の演奏の演奏情報が、例えばＲＯＭ１０３の所定のエリアからＲＡＭ１０２に図２に示されるデータフォーマットで読み込まれる。
【００２３】
その後、ＣＰＵ１０１は、図５のステップＳ５０３からＳ５０７で示されるループ処理を実行する。
【００２４】
このループ処理において、まずＣＰＵ１０１は、図１の入力部１０４からユーザが終了指示を行ったか否かを判定する（図５のステップＳ５０３）。
【００２５】
ユーザが終了指示をしておらずステップＳ５０３の判定がＮＯならば、ＣＰＵ１０１は、ユーザが電子楽器１１０のキーボード１１１を押鍵して図１のＭＩＤＩインターフェース１０６から押鍵情報が入力されたか否かを判定する（図５のステップＳ５０４）。
【００２６】
押鍵情報が入力されステップＳ５０４の判定がＹＥＳになると、ＣＰＵ１０１は、押鍵情報処理を実行する（図５のステップＳ５０５）。この処理では、ＭＩＤＩインターフェース１０６から入力された押鍵情報をＲＡＭ１０２内の図３に示されるユーザ押鍵情報バッファに書き込む処理が実行される。この処理の詳細は、図６のフローチャートを用いて後述する。
【００２７】
押鍵情報が入力されずステップＳ５０４の判定がＮＯならば、ＣＰＵ１０１は、ユーザが図１の入力部１０４を介して演奏の判定を指示したか否かを判定する（図５のステップＳ５０６）。
【００２８】
ユーザが演奏の判定を指示しステップＳ５０６の判定がＹＥＳになると、ＣＰＵ１０１は、演奏の判定処理を実行する（ステップＳ５０７）。この処理では、ユーザが演奏を行った演奏範囲におけるユーザ演奏の押鍵情報および手本の演奏の演奏情報の対応する各ノート（音符）毎に、音高、リズム、およびテンポを判定する処理が実行される。この処理の詳細については、図７から図１４を用いて後述する。
【００２９】
ユーザが演奏の判定を指示しておらずステップＳ５０６の判定がＮＯならば、ＣＰＵ１０１は、ステップＳ５０３の処理に戻って、上述のステップＳ５０３からＳ５０７までのループ処理を繰返し実行する。
【００３０】
図６は、図５のステップＳ５０５の押鍵情報処理を示すフローチャートである。
【００３１】
まず、ＣＰＵ１０１は、ＭＩＤＩインターフェース１０６から入力された押鍵情報がノートオン（ＮｏｔｅＯｎ）であるか否かを判定する（図６のステップＳ６０１）。
【００３２】
入力された押鍵情報がノートオンでステップＳ６０１の判定がＹＥＳならば、ＣＰＵ１０１は、入力した押鍵情報から音高を取得しＲＡＭ１０２上の変数ｐｉｔに格納する（図６のステップＳ６０２）。
【００３３】
続いて、ＣＰＵ１０１は、図３のユーザ押鍵情報バッファの、次の音を記録すべきバッファ番号を記憶しているポインタＵｓｅｒＮｏｔｅｓの値を＋１だけインクリメントする（図６のステップＳ６０３）（図中「＋＋」は＋１のインクリメント演算を示す）。
【００３４】
次に、ＣＰＵ１０１は、ユーザ押鍵情報バッファ内で、ポインタＵｓｅｒＮｏｔｅｓが示す押鍵情報ＭｉｄｉＩｎ［ＵｓｅｒＮｏｔｅｓ］の、「ｐｉｔｃｈ」項目（ＭｉｄｉＩｎ［ＵｓｅｒＮｏｔｅｓ］．ｐｉｔｃｈ）に、ステップＳ６０２で変数ｐｉｔに格納された音高を格納する。また、ＣＰＵ１０１は、「ｎｏｔｅｏｎ」項目（ＭｉｄｉＩｎ［ＵｓｅｒＮｏｔｅｓ］．ｎｏｔｅ）に、ＣＰＵ１０１が管理する現在のシステム時刻を押鍵時刻として格納する（以上、図６のステップＳ６０４）。
【００３５】
ステップＳ６０４の後、ＣＰＵ１０１は、図６のフローチャートで示される図５のステップＳ５０５の押鍵情報処理を終了する。
【００３６】
入力された押鍵情報がノートオンではなくステップＳ６０１の判定がＮＯならば、ＣＰＵ１０１は、入力された押鍵情報がノートオフ（ＮｏｔｅＯｆｆ）であるか否かを判定する（図６のステップＳ６０５）。
【００３７】
入力された押鍵情報がノートオフであり、ステップＳ６０５の判定がＹＥＳならば、ＣＰＵ１０１は、入力した押鍵情報から音高を取得しＲＡＭ１０２上の変数ｐｉｔに格納する（図６のステップＳ６０６）。
【００３８】
続いて、ＣＰＵ１０１は、以下の処理で検索ループ処理を行うためのＲＡＭ１０２上のポインタ変数ｉに、図３のユーザ押鍵情報バッファの、次の音を記録すべきバッファ番号ポインタＵｓｅｒＮｏｔｅｓの値から１を減じたものを格納する（図６のステップＳ６０７）。これはすなわち、現在までにすでに押鍵情報が記録されているユーザ押鍵情報バッファの（ｉ−１）番目から０番目の各バッファの情報について、順次検索しながら、どの押鍵情報についてノートオフが行われたのかを判定するためである。
【００３９】
次に、ＣＰＵ１０１は、変数ｉの値が０以下になったか否かを判定する（図６のステップＳ６０８）。
【００４０】
変数ｉの値が０以下になっておらずステップＳ６０８の判定がＮＯならば、ＣＰＵ１０１は、変数ｉに対応するＲＡＭ１０２内のユーザ押鍵情報ＭｉｄｉＩｎ［ｉ］の「ｐｉｔｃｈ」項目の値（ＭｉｄｉＩｎ［ｉ］．ｐｉｔｃｈ）がステップＳ６０６で変数ｐｉｔに格納された入力した押鍵情報の音高に等しく、かつユーザ押鍵情報ＭｉｄｉＩｎ［ｉ］の「ｎｏｔｅｏｆｆ」項目の値（ＭｉｄｉＩｎ［ｉ］．ｎｏｔｅｏｆｆ）が０である（未だノートオフされていない）か否かを判定する（図６のステップＳ６０９）。
【００４１】
ステップＳ６０９の判定がＮＯならば、ｉで示される当該押鍵がノートオフされたわけでは無いと判るので、ＣＰＵ１０１は、変数ｉの値を−１だけデクリメントする（図６のステップＳ６１０）（図中「――」は−１のデクリメント演算を示す）。
【００４２】
その後、ＣＰＵ１０１は、ステップＳ６０８の処理に戻って、新たな押鍵情報ＭｉｄｉＩｎ［ｉ］に対してステップＳ６０９の判定処理を実行し、入力されたノートオフ情報に対応する押鍵情報を検索する処理を繰り返す。
【００４３】
上記繰返し処理においてステップＳ６０９の判定がＹＥＳになると、ＣＰＵ１０１は、変数ｉに対応するＲＡＭ１０２内のユーザ押鍵情報ＭｉｄｉＩｎ［ｉ］の「ｎｏｔｅｏｆｆ」項目（ＭｉｄｉＩｎ［ｉ］．ｎｏｔｅｏｆｆ）に、ノートオフ時刻として、ＣＰＵ１０１が管理する現在のシステム時刻を格納する（図６のステップＳ６１１）。
【００４４】
ステップＳ６１１の後、ＣＰＵ１０１は、図６のフローチャートで示される図５のステップＳ５０５の押鍵情報処理を終了する。
【００４５】
入力された押鍵情報がノートオフではなくステップＳ６０５の判定がＮＯならば、ＣＰＵ１０１は、何もせずに、図６のフローチャートで示される図５のステップＳ５０５の押鍵情報処理を終了する。
【００４６】
以上のようにして、ＭＩＤＩインターフェース１０６から入力された押鍵情報による押鍵または離鍵に対応して、ＲＡＭ１０２上のユーザ押鍵情報バッファの内容が適切に更新される。
【００４７】
図７は、図５のステップＳ５０７の演奏の判定処理を示すフローチャートである。
【００４８】
まず、ＣＰＵ１０１は、ユーザ演奏によってＲＡＭ１０２のユーザ押鍵情報バッファ（図３）に得られた押鍵情報群に基づいて、ＲＡＭ１０２上の図４に示されるデータ形式を有する判定用バッファを更新する処理を実行する（図７のステップＳ７０１）。
【００４９】
上記ステップＳ７０１の処理の詳細について、図８の判定用バッファ更新処理を示すフローチャートによって説明する。
【００５０】
図８においてまず、ＣＰＵ１０１は、ＲＡＭ１０２上の変数ｉに値１を格納する（図８のステップＳ８０１）。
【００５１】
次に、ＣＰＵ１０１は、ＲＡＭ１０２上のユーザ押鍵情報バッファ内の先頭の押鍵情報ＭｉｄｉＩｎ［０］の押鍵時刻項目「ｎｏｔｅｏｎ」の値ＭｉｄｉＩｎ［０］．ｎｏｔｅｏｎを、ＲＡＭ１０２上の直前の押鍵の押鍵時刻を示す変数ｌａｓｔに格納する（図８のステップＳ８０２）。
【００５２】
その後、ＣＰＵ１０１は、図８のステップＳ８０３からＳ８０６までのループ処理を実行する。
【００５３】
まず、ＣＰＵ１０１は、変数ｉの値が図３のユーザ押鍵情報バッファに記録されたユーザの押鍵のデータ数を示す変数ＵｓｅｒＮｏｔｅｓの値よりも小さいか否かを判定する（図８のステップＳ８０３）。
【００５４】
ＣＰＵ１０１は、ステップＳ８０３の判定がＹＥＳならば、変数ｉが示す図３のユーザ押鍵情報バッファ内の押鍵情報ＭｉｄｉＩｎ［ｉ］の押鍵時刻項目「ｎｏｔｅｏｎ」の値である、押鍵情報ＭｉｄｉＩｎ［ｉ］．ｎｏｔｅｏｎから、変数ｌａｓｔに格納されている直前の押鍵時刻の値を減算する。そして、ＣＰＵ１０１はその減算結果を、変数ｉが示す図４の判定用バッファ内の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の押鍵時間項目「ｄｅｌｔａｔｉｍｅ」（ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｄｅｌｔａｔｉｍｅ）に、押鍵時間として格納する。
これと共にＣＰＵ１０１は、図３のユーザ押鍵情報バッファ内の変数ｉが示す押鍵情報ＭｉｄｉＩｎ［ｉ］の音高項目「ｐｉｔｃｈ」の値である、押鍵情報ＭｉｄｉＩｎ［ｉ］．ｐｉｔｃｈを、変数ｉが示す図４の判定用バッファ内の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の音高項目「ｐｉｔｃｈ」（ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｐｉｔｃｈ）に、格納する（以上、図８のステップＳ８０４）。
【００５５】
その後、ＣＰＵ１０１は、変数ｉが示すＲＡＭ１０２上のユーザ押鍵情報バッファ内の押鍵情報ＭｉｄｉＩｎ［ｉ］の押鍵時刻項目「ｎｏｔｅｏｎ」の値ＭｉｄｉＩｎ［ｉ］．ｎｏｔｅｏｎを、ＲＡＭ１０２上の直前の押鍵の押鍵時刻を示す変数ｌａｓｔに格納する（図８のステップＳ８０５）。
【００５６】
そして、ＣＰＵ１０１は、変数ｉの値を＋１だけインクリメントし（図８のステップＳ８０６）、ステップＳ８０３の処理に戻って、処理を順次進める。
【００５７】
以上のステップＳ８０３からＳ８０６の一連の処理の繰返しにより、ＲＡＭ１０２上の図４に示される判定用バッファには、ＲＡＭ１０２上の図３に示されるユーザ押鍵情報バッファ内の各押鍵情報ＭｉｄｉＩｎ［０］、ＭｉｄｉＩｎ［１］、・・・、ＭｉｄｉＩｎ［Ｎ］にそれぞれ対応して、判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］、ＥｖａｌＢｕｆｆｅｒ［１］、・・・、ＥｖａｌＢｕｆｆｅｒ［Ｎ］が生成される。そして、図８のフローチャートの処理により、各判定用バッファ情報には、図４の「ｄｅｌｔａｔｉｍｅ」項目の値と「ｐｉｔｃｈ」項目の値がそれぞれセットされる。なお、先頭の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］の「ｄｅｌｔａｔｉｍｅ」項目は、それより前の押鍵情報が存在しないため、例えば値０が格納される。
上述の図７のステップＳ７０１での判定用バッファ更新処理により、ユーザが演奏した演奏範囲におけるユーザ演奏の押鍵情報のノートオン毎に、そのノートオンの時刻とそのノートオンの直前の有効なノートオンの時刻との時間差である押鍵時間間隔が「ｄｅｌｔａｔｉｍｅ」項目値として算出される。
【００５８】
図７のフローチャートの処理に戻って、ＣＰＵ１０１は、ステップＳ７０１で判定用バッファに得られた各判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］、ＥｖａｌＢｕｆｆｅｒ［１］、・・・、ＥｖａｌＢｕｆｆｅｒ［Ｎ］について、それぞれの押鍵情報に対応する手本の演奏の演奏情報を、ＲＡＭ１０２上の図２に示される演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］から検索する。各判定用バッファ情報の押鍵情報に対して対応する演奏情報をマッチングさせて検索する処理は、例えばＤＰマッチングなどの手法を用いることで実現可能であり、また、特許第３５７７５６１号公報（特開平９−２３７０８８号公報）に記載された手法を用いることでも実現することができる。
これにより、ＣＰＵ１０１は、各判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］、ＥｖａｌＢｕｆｆｅｒ［１］、・・・、ＥｖａｌＢｕｆｆｅｒ［Ｎ］について、ＲＡＭ１０２上の図２に示される演奏情報Ｎｏｔｅ［０］、Ｎｏｔｅ［１］、・・・、Ｎｏｔｅ［Ｎ］のうちの対応するもののインデックス（「０」、「１」、・・・、「Ｎ」）を算出する。ＣＰＵ１０１は、この算出したインデックス値を、図４に示される判定用バッファ情報内の「ｎｏｔｅｉｎｄｅｘ」項目に格納する。例えば、判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｎｏｔｅｉｎｄｅｘ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｎｏｔｅｉｎｄｅｘが「ｊ」であれば、判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］に対応する押鍵情報ＭｉｄｉＩｎ［ｉ］（図３）は、手本の演奏の演奏情報Ｎｏｔｅ［ｊ］に対応してユーザが演奏した押鍵の情報であることを意味する。
ＣＰＵ１０１は、以上のようにして判定用バッファ情報（押鍵情報）と演奏情報との対応付けを行った後、それぞれの音高の値（「ｐｉｔｃｈ」項目値（図４参照）と「Ｐｉｔｃｈ」項目値（図２参照））が一致するか否かを判定する。そして、ＣＰＵ１０１は、音高が一致する場合には、判定用バッファ情報内の「ｍａｔｃｈｒｅｓｕｌｔ」項目に値１を格納し、音高が一致しない場合には、上記項目に値０を格納する（以上、図７のステップＳ７０２）。
【００５９】
以上の図７のステップＳ７０１とＳ７０２の処理によって、押鍵情報と演奏情報とで対応付けがとれた判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］、ＥｖａｌＢｕｆｆｅｒ［１］、・・・、ＥｖａｌＢｕｆｆｅｒ［Ｎ］を用いて、ＣＰＵ１０１は、以下のようにして、ユーザが演奏を行った演奏範囲におけるユーザ演奏の押鍵情報および手本の演奏の演奏情報の対応する各ノートオン毎に、音高、リズム、およびテンポを判定する。
【００６０】
図９は、本実施形態による演奏範囲判定処理の説明図である。
いま、図７のステップＳ７０１とＳ７０２の処理により、例えば判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］と演奏情報Ｎｏｔｅ［ｉ］が対応付けられ、判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ−１］と演奏情報Ｎｏｔｅ［ｉ−１］が対応づけられたとする。
ここで、手本の演奏について、演奏情報Ｎｏｔｅ［ｉ］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｉ］．Ｔｉｍｅとその直前の演奏情報Ｎｏｔｅ［ｉ−１］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｉ−１］．Ｔｉｍｅとの差分を図９に示されるｔＳｔｅｐと定義する。すなわち、
ｔＳｔｅｐ＝Ｎｏｔｅ［ｉ］．Ｔｉｍｅ−Ｎｏｔｅ［ｉ−１］．Ｔｉｍｅ    （１）
である。
また、押鍵情報ＭｉｄｉＩｎ［ｉ］の押鍵時刻項目「ｎｏｔｅｏｎ」の値ＭｉｄｉＩｎ［ｉ］．ｎｏｔｅｏｎとその直前の押鍵情報ＭｉｄｉＩｎ［ｉ−１］の押鍵時刻項目「ｎｏｔｅｏｎ」の値ＭｉｄｉＩｎ［ｉ−１］．ｎｏｔｅｏｎとの差分を、図９に示されるｓＳｔｅｐと定義する。これは、図８のステップＳ８０４より、判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｄｅｌｔａｔｉｍｅ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｄｅｌｔａｔｉｍｅに等しいから、
ｓＳｔｅｐ＝ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｄｅｌｔａｔｉｍｅ    （２）
である。
また、手本の演奏の演奏範囲の総時間を、図９に示されるｔＬｅｎと定義する。同様に、ユーザ演奏の演奏範囲の総時間を、図９に示されるｓＬｅｎと定義する。
【００６１】
以上の情報を用いて、本実施形態では、押鍵情報ＭｉｄｉＩｎ［ｉ］に対応するリズム評価値ｒｈｙｔｈｍを、次式で定義する。
ｒｈｙｔｈｍ＝｜ｔＳｔｅｐ／ｔＬｅｎ−ｓＳｔｅｐ／ｓＬｅｎ｜    （３）
このように、本実施形態では、対象とした演奏範囲におけるユーザ演奏の総時間ｓＬｅｎに対する、ユーザ演奏の押鍵時間間隔ｓＳｔｅｐの割合と、対象とした演奏範囲における手本の演奏の総時間ｔＬｅｎに対する、手本の演奏の押鍵時間間隔ｔＳｔｅｐの割合との差分の絶対値が算出され、その絶対値が現在のノートオンに対応するリズムの判定の評価値ｒｈｙｔｈｍとして算出される。上記（３）式により、ノートオン毎のリズムを定量的に評価することが可能となる。
【００６２】
また、本実施形態では、押鍵情報ＭｉｄｉＩｎ［ｉ］に対応するテンポ評価値ｔｅｍｐｏを、次式で定義する。
ｔｅｍｐｏ＝ｓＳｔｅｐ／ｔＳｔｅｐ    （４）
このように、本実施形態では、ユーザ演奏の押鍵時間間隔ｓＳｔｅｐと手本の演奏の押鍵時間間隔ｔＳｔｅｐの比の値が算出され、その比の値が現在のノートオンに対応するテンポの判定の評価値ｔｅｍｐｏとして算出される。上記（４）式により、ノートオン毎のリズムを定量的に評価することが可能となる。
【００６３】
以上の動作をＣＰＵ１０１が図７のステップＳ７０３の演奏範囲判定処理として実行することにより、演奏判定手段の機能が実現される。
【００６４】
また、図７のステップＳ７０３において、ＣＰＵ１０１は、上記ノートオン毎に（３）式により算出されるリズム評価値ｒｈｙｔｈｍと、（４）式により算出されるテンポ評価値ｔｅｍｐｏのそれぞれについて、ユーザが演奏を行った演奏範囲内の全ノートの各評価値の平均値を算出する。これにより、演奏範囲でのユーザ演奏の手本の演奏に対するリズムおよびテンポの達成状況を算出することができる。
【００６５】
次に、ＣＰＵ１０１は、曲全体の判定処理を実行する（図７のステップＳ７０４）。この処理では、上記ノートオン毎に（３）式により算出されるリズム評価値ｒｈｙｔｈｍと、（４）式により算出されるテンポ評価値ｔｅｍｐｏについて、手本の演奏データとして登録されている楽曲全体の範囲にわたって、それぞれ平均値が算出される。これにより、楽曲全体でのユーザ演奏の手本の演奏に対するリズムおよびテンポの達成状況を算出することができる。
また、ステップＳ７０４では、上記ノートオン毎に（３）式により算出されるリズム評価値ｒｈｙｔｈｍと、（４）式により算出されるテンポ評価値ｔｅｍｐｏについて、手本の演奏データとして登録されている楽曲全体の範囲にわたって、それぞれの最良値の平均値が算出される。これにより、ユーザ演奏の手本の演奏に対するリズムおよびテンポの最良の達成状況を算出することが可能となる。
【００６６】
以上のような演奏達成状況は、ＣＰＵ１０１によって、図１の表示部１０５に後述する図１４のような形式で表示される。これにより、演奏達成状況算出表示手段の機能が実現される。
【００６７】
図１０から図１２は、図７のステップＳ７０３の演奏範囲判定処理の詳細を示すフローチャートである。
【００６８】
まず、ＣＰＵ１０１は、ユーザ演奏が両手、右手、左手のどの演奏パートに対応するかを、ＲＡＭ１０２上の変数ｈに読み込む（図１０のステップＳ１０００）。この情報は、例えば図７のステップＳ７０２の処理におけるＤＰマッチングの過程で、ユーザ演奏がどの演奏パートに最もマッチしているかとして算出することができる。ＣＰＵ１０１は、ユーザ演奏が両手パートである場合は値０を変数ｈに格納し、ユーザ演奏が右手パートである場合は値１を変数ｈに格納し、ユーザ演奏が左手パートである場合は値２を変数ｈに格納する。
【００６９】
次に、ＣＰＵ１０１は、ＲＡＭ１０２上の変数ｉに初期値１を格納する（図１０のステップＳ１００１）。
【００７０】
次に、ＣＰＵ１０１は、図４の判定用バッファ内の先頭の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］内の「ｎｏｔｅｉｎｄｅｘ」項目値ＥｖａｌＢｕｆｆｅｒ［０］．ｎｏｔｅｉｎｄｅｘを、直前の演奏情報のインデックス値を示すＲＡＭ１０２上の変数ｔＬａｓｔに格納する（図１０のステップＳ１００２）。
【００７１】
次に、ＣＰＵ１０１は、手本の演奏およびユーザ演奏の演奏範囲のそれぞれの総時間を示すＲＡＭ１０２上の変数ｔＬｅｎおよびｓＬｅｎ（図９参照）に、値０を格納する（図１０のステップＳ１００３）。
【００７２】
次に、ＣＰＵ１０１は、図１０のステップＳ１００４で変数ｉの値が、ＲＡＭ１０２上のユーザ押鍵情報バッファに記録された押鍵情報の数を示す変数値ＵｓｅｒＮｏｔｅよりも小さいと判定される間、図１０のステップＳ１００９で変数ｉの値を＋１ずつインクリメントしながら、図１０のステップＳ１００５からＳ１００８の一連の処理を実行する。
【００７３】
まず、ＣＰＵ１０１は、変数ｉが示す図４の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｎｏｔｅｉｎｄｅｘ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｎｏｔｅｉｎｄｅｘを、ＲＡＭ１０２上の変数ｔＩｎｄｅｘに格納する（図１０のステップＳ１００５）。
【００７４】
次に、ＣＰＵ１０１は、変数ｔＩｎｄｅｘが示すＲＡＭ１０２上の演奏情報Ｎｏｔｅ［ｔＩｎｄｅｘ］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｔＩｎｄｅｘ］．Ｔｉｍｅから変数ｔＬａｓｔが示すＲＡＭ１０２上の演奏情報Ｎｏｔｅ［ｔＬａｓｔ］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｔＬａｓｔ］．Ｔｉｍｅを減算し、その減算結果を変数ｔＬｅｎに累算する（図１０のステップＳ１００６）（図中「＋＝」はその左辺の変数に右辺の値を累算する演算を示す）。すなわち、今対象となっているノートと前回の対象ノートとの間の、手本の演奏上の発音時刻の差をｔＬｅｎに累積加算していき、ユーザ押鍵情報バッファに格納されているユーザ演奏データに対応する、手本の演奏データの部分の時間長を算出する。
【００７５】
また、ＣＰＵ１０１は、変数ｉが示す図４の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｄｅｌｔａｔｉｍｅ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｄｅｌｔａｔｉｍｅを、変数ｓＬｅｎに累算する（図１０のステップＳ１００７）。すなわち、今対象となっているユーザ押鍵と前回の対象のユーザ押鍵の押鍵時刻の差をｓＬｅｎに累積加算していき、ユーザ演奏の時間長を算出する。
【００７６】
そして、ＣＰＵ１０１は、変数ｔＩｎｄｅｘの値を直前の演奏情報を示す変数ｔＬａｓｔに格納する（図１０のステップＳ１００８）。
【００７７】
以上の図１０のステップＳ１００４からＳ１００９までの一連の処理が繰り返されることにより、演奏情報および判定用バッファ情報（押鍵情報）のそれぞれについて、隣り合う押鍵間の時間差情報が変数ｔＬｅｎおよびｓＬｅｎに累算され、手本の演奏およびユーザ演奏の演奏範囲での総時間が算出される（図９参照）。
【００７８】
その後、ＣＰＵ１０１は、前述した（１）式から（４）式で示されるリズム評価値およびテンポ評価値を算出するための処理、ならびに音高の一致率を算出するための処理を実行する。
【００７９】
まず、ＣＰＵ１０１は、ＲＡＭ１０２上の変数ｔｉｍｅｒａｔｉｏに値１．０を格納する（図１０のステップＳ１０１０）。
【００８０】
次に、ＣＰＵ１０１は、手本の演奏の総時間を示す変数ｔＬｅｎの値が０より大きいか否かを判定する（図１０のステップＳ１０１１）。
ＣＰＵ１０１は、ステップＳ１０１１の判定がＹＥＳならば、手本の演奏の総時間に対するユーザ演奏の総時間の比「ｓＬｅｎ／ｔＬｅｎ」を算出し、その結果を変数ｔｉｍｅｒａｔｉｏに格納する（図１０のステップＳ１０１２）。
ＣＰＵ１０１は、ステップＳ１０１１の判定がＮＯならば、ステップＳ１０１０で設定した値１．０を、そのまま変数ｔｉｍｅｒａｔｉｏの値として使用する。
変数ｔｉｍｅｒａｔｉｏの値は、後述する図１１のステップＳ１０２７で利用される。
【００８１】
次に、ＣＰＵ１０１は、ＲＡＭ１０２上の変数ｉに初期値１を格納する（図１１のステップＳ１０１３）。
【００８２】
次に、ＣＰＵ１０１は、ステップＳ１００２と同様に、図４の判定用バッファ内の先頭の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［０］内の「ｎｏｔｅｉｎｄｅｘ」項目値ＥｖａｌＢｕｆｆｅｒ［０］．ｎｏｔｅｉｎｄｅｘを、直前の演奏情報のインデックス値を示すＲＡＭ１０２上の変数ｔＬａｓｔに格納する（図１１のステップＳ１０１４）。
【００８３】
次に、ＣＰＵ１０１は、それぞれＲＡＭ１０２上の変数であるリズム評価値累算値ｒＥｖａｌ、テンポ評価値累算値ｔＥｖａｌ、および音高一致カウンタｃｏｒｒｅｃｔのそれぞれに値０を格納する（図１１のステップＳ１０１５）。
【００８４】
その後、ＣＰＵ１０１は、図１１のステップＳ１０１６で変数ｉの値が、ＲＡＭ１０２上のユーザ押鍵情報バッファに記録された押鍵情報の数を示す変数値ＵｓｅｒＮｏｔｅよりも小さいと判定される間、図１２のステップＳ１０３８で変数ｉの値を＋１ずつインクリメントしながら、図１１乃至図１２のステップＳ１０１７からＳ１０３７の一連の処理を実行する。
【００８５】
まず、ＣＰＵ１０１は、ステップＳ１００５と同様に、変数ｉが示す図４の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｎｏｔｅｉｎｄｅｘ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｎｏｔｅｉｎｄｅｘを、ＲＡＭ１０２上の変数ｔＩｎｄｅｘに格納する（図１１のステップＳ１０１７）。
【００８６】
次に、ＣＰＵ１０１は、現在のノートオンに対応するＲＡＭ１０２上の変数であるリズム評価値ｒｈｙｔｈｍおよびテンポ評価値ｔｅｍｐｏに、最悪値ＲＷＯＲＳＴおよびＴＷＯＲＳＴをそれぞれ格納しておく（図１１のステップＳ１０１８）。これは、以下の処理のステップＳ１０１９で、ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｍａｔｃｈｒｅｓｕｌｔが０である、すなわち、押鍵情報ＭｉｄｉＩｎ［ｉ］で表される演奏情報の音高がその押鍵に対応付けられた演奏情報の音高と一致していなかった場合に、リズム評価値ｒｈｙｔｈｍおよびテンポ評価値ｔｅｍｐｏが最悪の評価値となるようにするためである。このＲＷＯＲＳＴとＴＷＯＲＳＴは、これらの各評価値のとりうる値の範囲や、１音のミスタッチについての曲全体の評価値への影響度等を考慮して、あらかじめ定められた値を用いるものとする。
【００８７】
次に、ＣＰＵ１０１は、変数ｉに対応する判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］内の、対応付けられた演奏情報との音高の一致有無を示す項目「ｍａｔｃｈｒｅｓｕｌｔ」の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｍａｔｃｈｒｅｓｕｌｔが１であるか否か、すなわち音高が一致しているか否かを判定する（図１１のステップＳ１０１９）。
【００８８】
判定用バッファ情報（押鍵情報）と、対応付けられた演奏情報とで音高が一致しておらずステップＳ１０１９の判定がＮＯならば、以下のステップＳ１０２０からＳ１０２８の処理は実行せずに、図１２のステップＳ１０２９の処理に移行する。
【００８９】
判定用バッファ情報（押鍵情報）と、対応付けられた演奏情報とで音高が一致しステップＳ１０１９の判定がＹＥＳならば、ＣＰＵ１０１はまず、音高一致カウンタｃｏｒｒｅｃｔの値を＋１インクリメントする（図１１のステップＳ１０２０）。
【００９０】
次に、ＣＰＵ１０１は、ステップＳ１００６と同様に、変数ｔＩｎｄｅｘが示すＲＡＭ１０２上の演奏情報Ｎｏｔｅ［ｔＩｎｄｅｘ］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｔＩｎｄｅｘ］．Ｔｉｍｅから変数ｔＬａｓｔが示すＲＡＭ１０２上の演奏情報Ｎｏｔｅ［ｔＬａｓｔ］の発音開始時間項目「Ｔｉｍｅ」の値Ｎｏｔｅ［ｔＬａｓｔ］．Ｔｉｍｅを減算し、その減算結果を変数ｔＳｔｅｐに格納する（図１１のステップＳ１０２１）。これにより、前述の（１）式が計算される。
【００９１】
次に、ＣＰＵ１０１は、上記変数ｔＳｔｅｐの値をステップＳ１００４からＳ１００９のループ処理で変数ｔＬｅｎに算出されている手本の演奏の総時間で除算し、その除算結果をＲＡＭ１０２上の変数ｔｒａｔｉｏに格納する（図１１のステップＳ１０２２）。
これにより、前述した（３）式の右辺第１項が算出される。
【００９２】
次に、ＣＰＵ１０１は、ステップＳ１００７と同様に、変数ｉが示す図４の判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］の「ｄｅｌｔａｔｉｍｅ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｄｅｌｔａｔｉｍｅを、変数ｓＳｔｅｐに格納する（図１０のステップＳ１０２３）。これにより、前述した（２）式が計算される。
【００９３】
次に、ＣＰＵ１０１は、上記変数ｓＳｔｅｐの値をステップＳ１００４からＳ１００９のループ処理で変数ｓＬｅｎに算出されているユーザ演奏の総時間で除算し、その除算結果をＲＡＭ１０２上の変数ｓｒａｔｉｏに格納する（図１１のステップＳ１０２４）。
これにより、前述した（３）式の右辺第２項が算出される。
【００９４】
次に、ＣＰＵ１０１は、変数ｔｒａｔｉｏの値から変数ｓｒａｔｉｏの値を減算し、その減算結果の絶対値を算出した結果を、リズム評価値ｒｈｙｔｈｍに格納する（図１１のステップＳ１０２５）。これにより、前述した（３）式が計算される。
【００９５】
次に、ＣＰＵ１０１は、ステップＳ１０２１で算出した変数ｔＳｔｅｐの値が０よりも大きいか否かを判定する（図１１のステップＳ１０２６）。
【００９６】
ＣＰＵ１０１は、ステップＳ１０２６の判定がＹＥＳならば、変数ｓＳｔｅｐの値を変数ｔＳｔｅｐの値で除算し、その除算結果をテンポ評価値ｔｅｍｐｏに格納する（図１１のステップＳ１０２８）。これにより、前述した（４）式が計算される。
【００９７】
ＣＰＵ１０１は、ステップＳ１０２６の判定がＮＯならば、テンポ評価値ｔｅｍｐｏに、図１０のステップＳ１０１０からＳ１０１２で計算しておいた変数ｔｉｍｅｒａｔｉｏの値を格納する（図１１のステップＳ１０２７）。
【００９８】
ＣＰＵ１０１は、ステップＳ１０２７またはＳ１０２８の処理の後、あるいはステップＳ１０１９の判定がＮＯとなった後に、図１２のステップＳ１０２９の処理に進む。
【００９９】
図１２のステップＳ１０２９で、ＣＰＵ１０１は、変数ｉに対応する判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］内の「ｍａｔｃｈｒｅｓｕｌｔ」項目の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｍａｔｃｈｒｅｓｕｌｔを、上記判定用バッファ情報（押鍵情報）に対応付けられている変数ｔＩｎｄｅｘが示す演奏情報Ｎｏｔｅ［ｔＩｎｄｅｘ］内の「ｍａｔｃｈ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｔＩｎｄｅｘ］．ｍａｔｃｈ＿ｔｅｍｐとして格納する。
【０１００】
次に、ＣＰＵ１０１は、リズム評価値累算値ｒＥｖａｌに、現在のノートオンに対応するリズム評価値ｒｈｙｔｈｍを累算する（図１２のステップＳ１０３０）。
【０１０１】
次に、ＣＰＵ１０１は、現在のリズム評価値ｒｈｙｔｈｍを、変数ｔＩｎｄｅｘが示す演奏情報Ｎｏｔｅ［ｔＩｎｄｅｘ］内の「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｔＩｎｄｅｘ］．ｒｈｙｔｈｍ＿ｔｅｍｐとして格納する（図１２のステップＳ１０３１）。
【０１０２】
次に、ＣＰＵ１０１は、テンポ評価値累算値ｔＥｖａｌに、現在のノートオンに対応するテンポ評価値ｔｅｍｐｏを累算する（図１２のステップＳ１０３２）。
【０１０３】
次に、ＣＰＵ１０１は、現在のテンポ評価値ｔｅｍｐｏを、変数ｔＩｎｄｅｘが示す演奏情報Ｎｏｔｅ［ｔＩｎｄｅｘ］内の「ｔｅｍｐｏ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｔＩｎｄｅｘ］．ｔｅｍｐｏ＿ｔｅｍｐとして格納する（図１２のステップＳ１０３３）。
【０１０４】
続いて、ＣＰＵ１０１は、変数ｉの値が１であるか否か、すなわち現在の処理が先頭の処理（最初の入力音の処理）であるか否かを判定する（図１２のステップＳ１０３４）。
【０１０５】
現在の処理が先頭の処理ではなくステップＳ１０３４の判定がＮＯならば、ＣＰＵ１０１は、ステップＳ１０３８の処理に移行する。
【０１０６】
現在の処理が先頭の処理でステップＳ１０３４の判定がＹＥＳならば、ＣＰＵ１０１は、変数ｉに対応する判定用バッファ情報ＥｖａｌＢｕｆｆｅｒ［ｉ］内の演奏情報との音高の一致有無を示す項目「ｍａｔｃｈｒｅｓｕｌｔ」の値ＥｖａｌＢｕｆｆｅｒ［ｉ］．ｍａｔｃｈｒｅｓｕｌｔが１であるか否か、すなわち音高が一致しているか否かを判定する（図１２のステップＳ１０３５）。
【０１０７】
ステップＳ１０３５の判定がＹＥＳならば、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｍａｔｃｈ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｍａｔｃｈ＿ｔｅｍｐとして、音高一致を示す値１を格納する。また、ＣＰＵ１０１は、音高一致カウンタｃｏｒｒｅｃｔの値を＋１インクリメントする。さらに、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｒｈｙｔｈｍ＿ｔｅｍｐとして、図１１のステップＳ１０２５で算出した最後のリズム評価値ｒｈｙｔｈｍの値を格納する。加えて、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｔｅｍｐｏ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｔｅｍｐｏ＿ｔｅｍｐとして、図１１で算出したテンポ評価値ｔｅｍｐｏの値を格納する（以上、図１２のステップＳ１０３７）。
【０１０８】
ステップＳ１０３５の判定がＮＯならば、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｍａｔｃｈ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｍａｔｃｈ＿ｔｅｍｐとして、音高不一致を示す値０を格納する。また、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｒｈｙｔｈｍ＿ｔｅｍｐとして、リズム評価値の最悪値ＲＷＯＲＳＴを格納する。加えて、ＣＰＵ１０１は、先頭の演奏情報Ｎｏｔｅ［０］の「ｔｅｍｐｏ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［０］．ｔｅｍｐｏ＿ｔｅｍｐとして、テンポ評価値の最悪値ＴＷＯＲＳＴを格納する（以上、図１２のステップＳ１０３６）。
【０１０９】
ステップＳ１０３７またはＳ１０３６の処理の後、ステップＳ１０３８の処理に進む。
【０１１０】
そして、ステップＳ１０３８で変数ｉの値を＋１ずつインクリメントしながら、図１１乃至図１２のステップＳ１０１７からＳ１０３７の一連の処理をループ実行する。なお、このステップＳ１０３８で変数ｉをインクリメントしてステップＳ１０１６へ戻ってループ処理を繰り返す前に、ステップＳ１００８と同様に変数ｔＩｎｄｅｘの値を直前の演奏情報を示す変数ｔＬａｓｔに格納する。
以上の図１１のステップＳ１０１６から図１２のステップＳ１０３８までの繰返し処理の結果、変数ｉの値が変数ＵｓｅｒＮｏｔｅｓに達し図１１のステップＳ１０１６の判定がＮＯになると、ＣＰＵ１０１は、図１１のステップＳ１０３９を実行する。ここでは、ＣＰＵ１０１は、音高一致カウンタｃｏｒｒｅｃｔの値をユーザ押鍵情報の数ＵｓｅｒＮｏｔｅｓで除算し、その結果を変数ｈが示す演奏パートのＲＡＭ１０２上の音高一致度変数ｍＥｖａｌ［ｈ］に格納する。また、ＣＰＵ１０１は、リズム評価値累算値ｒＥｖａｌをユーザ押鍵情報の数ＵｓｅｒＮｏｔｅｓで除算し、その結果を変数ｈが示す演奏パートのＲＡＭ１０２上のリズム評価値平均値ｒＥｖａｌ［ｈ］に格納する。さらに、ＣＰＵ１０１は、テンポ評価値累算値ｔＥｖａｌをユーザ押鍵情報の数ＵｓｅｒＮｏｔｅｓで除算し、その結果を変数ｈが示す演奏パートのＲＡＭ１０２上のテンポ評価値平均値ｔＥｖａｌ［ｈ］に格納する。
【０１１１】
ステップＳ１０３９の処理の後、ＣＰＵ１０１は、図７のステップＳ７０３の演奏範囲判定処理を終了する。
【０１１２】
図１３は、図７のステップＳ７０４の曲全体の判定処理の詳細を示すフローチャートである。
【０１１３】
まず、ＣＰＵ１０１は、演奏パートを示すＲＡＭ１０２上の変数ｈに値０（両手パートに対応する）を格納する（図１３のステップＳ１３０１）。
【０１１４】
次に、ＣＰＵ１０１は、変数ｈの値が３よりも小さいか否かを判定する（図１３のステップＳ１３０２）。
【０１１５】
ステップＳ１３０２の判定がＹＥＳならば、ＣＰＵ１０１は、ＲＡＭ１０２の変数ｉと演奏情報数をカウントする演奏情報数カウンタｃｏｕｎｔの値を０にクリアする（図１３のステップＳ１３０３）。
【０１１６】
次に、ＣＰＵ１０１は、今回音高一致度変数ｍＥｖａｌＴｅｍｐ［ｈ］と今回リズム評価値平均値ｒＥｖａｌＴｅｍｐ［ｈ］と今回テンポ評価値平均値ｔＥｖａｌＴｅｍｐ［ｈ］にそれぞれ値０を格納する（図１３のステップＳ１３０４）。
【０１１７】
また、ＣＰＵ１０１は、最良音高一致度変数ｍＥｖａｌＢｅｓｔ［ｈ］と最良リズム評価値平均値ｒＥｖａｌＢｅｓｔ［ｈ］と最良テンポ評価値平均値ｔＥｖａｌＢｅｓｔ［ｈ］にそれぞれ値０を格納する（図１３のステップＳ１３０５）。
【０１１８】
次に、ＣＰＵ１０１は、変数ｉの値が演奏情報の総数よりも小さいか否かを判定する（図１３のステップＳ１３０６）。
【０１１９】
ステップＳ１３０６の判定がＹＥＳならば、ＣＰＵ１０１は、演奏パートを示す変数ｈの値が０（両手パート）であるか、または（図中「｜｜」は「または」を示す演算子）、変数ｉに対応する演奏情報Ｎｏｔｅ［ｉ］の「Ｔｒａｃｋ」項目の値Ｎｏｔｅ［ｉ］．Ｔｒａｃｋの値が変数ｈの値に等しいかのどちらかであるか否かを判定する（図１３のステップＳ１３０７）。これはすなわち、ｈ＝０すなわち、両手パートについての評価値算出のときには、全演奏情報を対象に評価値を累積計算するのに対し、ｈ＝１（右手パートに対応する）またはｈ＝２（左手パートに対応する）の場合は、このいずれかのパートの演奏情報のみを対象として評価値を累積計算していくようにするためである。
【０１２０】
ステップＳ１３０７の判定がＮＯならば、ＣＰＵ１０１は、図１３のステップＳ１３１７の処理に進む。
【０１２１】
ステップＳ１３０７の判定がＹＥＳならば、ＣＰＵ１０１はまず、演奏情報数カウンタｃｏｕｎｔの値を＋１インクリメントする（図１３のステップＳ１３０８）。
【０１２２】
次に、ＣＰＵ１０１は、変数ｉに対応する演奏情報Ｎｏｔｅ［ｉ］の「ｍａｔｃｈ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｍａｔｃｈ＿ｂｅｓｔが０であって、かつ（図中「＆＆」は「かつ」を示す演算子）、演奏情報Ｎｏｔｅ［ｉ］の「ｍａｔｃｈ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｍａｔｃｈ＿ｔｅｍｐが１であるか否かを判定する（図１３のステップＳ１３０９）。
ＣＰＵ１０１は、ステップＳ１３０９の判定がＹＥＳならば、Ｎｏｔｅ［ｉ］．ｍａｔｃｈ＿ｂｅｓｔの値を１に変更する（図１３のステップＳ１３１０）。すなわち、現在対象となっている音符について、過去に音高一致していなかった（音高を正しく演奏できていなかった）が、今回の演奏で音高を正しく演奏できた場合には、最良の音高一致評価として、「一致」を表す「１」を格納することに相当する。
【０１２３】
ステップＳ１３０９またはＳ１３１０の後、ＣＰＵ１０１は、変数ｉに対応する演奏情報Ｎｏｔｅ［ｉ］の「ｒｈｙｔｈｍ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｂｅｓｔが、演奏情報Ｎｏｔｅ［ｉ］の「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｔｅｍｐよりも大きいか（悪い評価値であるか）否かを判定する（図１３のステップＳ１３１１）。すなわち、リズム評価値に関して、現在対象となっている音符について、過去の最良の評価値が、今回の演奏の評価値よりも悪い評価値であるか否かを判定する。
ＣＰＵ１０１は、ステップＳ１３１１の判定がＹＥＳならば、Ｎｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｂｅｓｔにＮｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｔｅｍｐの値を格納する（図１３のステップＳ１３１２）。すなわち、リズム評価値に関して、今回の演奏の評価値の方が、これまでの最良の評価値よりも良い評価値であった場合には、今回の演奏の評価値を、「最良の評価値」に登録することに相当する。
【０１２４】
ステップＳ１３１１またはＳ１３１２の後、ＣＰＵ１０１は、変数ｉに対応する演奏情報Ｎｏｔｅ［ｉ］の「ｔｅｍｐｏ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｂｅｓｔが、演奏情報Ｎｏｔｅ［ｉ］の「ｔｅｍｐｏ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｔｅｍｐよりも大きいか（悪い評価値であるか）否かを判定する（図１３のステップＳ１３１３）。
ＣＰＵ１０１は、ステップＳ１３１３の判定がＹＥＳならば、Ｎｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｂｅｓｔにＮｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｔｅｍｐの値を格納する（図１３のステップＳ１３１４）。これは、上記のリズム評価値の場合と同様、テンポ評価値に関して、今回の演奏の評価値の方が、これまでの最良の評価値よりも良い評価値であった場合には、今回の演奏の評価値を、「最良の評価値」に登録することに相当する。
【０１２５】
その後、ＣＰＵ１０１は、変数ｈの演奏パートに対応する今回音高一致度変数ｍＥｖａｌＴｅｍｐ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｍａｔｃｈ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｍａｔｃｈ＿ｔｅｍｐを累算する。
また、ＣＰＵ１０１は、変数ｈの演奏パートに対応する今回リズム評価値平均値ｒＥｖａｌＴｅｍｐ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｒｈｙｔｈｍ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｔｅｍｐを累算する。
さらに、ＣＰＵ１０１は、変数ｈの演奏パートに対応する今回テンポ評価値平均値ｔＥｖａｌＴｅｍｐ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｔｅｍｐｏ＿ｔｅｍｐ」項目の値Ｎｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｔｅｍｐを累算する（以上、図１３のステップＳ１３１５）。
【０１２６】
同様に、ＣＰＵ１０１は、変数ｈの演奏パートに対応する最良音高一致度変数ｍＥｖａｌＢｅｓｔ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｍａｔｃｈ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｍａｔｃｈ＿ｂｅｓｔを累算する。
また、ＣＰＵ１０１は、変数ｈの演奏パートに対応する最良リズム評価値平均値ｒＥｖａｌＢｅｓｔ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｒｈｙｔｈｍ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｒｈｙｔｈｍ＿ｂｅｓｔを累算する。
さらに、ＣＰＵ１０１は、変数ｈの演奏パートに対応する最良テンポ評価値平均値ｔＥｖａｌＢｅｓｔ［ｈ］に、演奏情報Ｎｏｔｅ［ｉ］の「ｔｅｍｐｏ＿ｂｅｓｔ」項目の値Ｎｏｔｅ［ｉ］．ｔｅｍｐｏ＿ｂｅｓｔを累算する（以上、図１３のステップＳ１３１６）。
【０１２７】
ステップＳ１３１６の処理の後、ステップＳ１３１７の処理に進む。
【０１２８】
以上の図１３のステップＳ１３０６からステップＳ１３１７までの繰返し処理の結果、変数ｉの値が演奏情報総数に達しステップＳ１３０６の判定がＮＯになると、ＣＰＵ１０１は、図１３のステップＳ１３１８とＳ１３１９を実行する。
【０１２９】
ステップＳ１３１８では、ＣＰＵ１０１は、変数ｈの演奏パートに対応する今回音高一致度変数ｍＥｖａｌＴｅｍｐ［ｈ］の累算値を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ今回音高一致度変数ｍＥｖａｌＴｅｍｐ［ｈ］に格納する。
また、ＣＰＵ１０１は、累算値となっている、変数ｈの演奏パートに対応する今回リズム評価値平均値ｒＥｖａｌＴｅｍｐ［ｈ］を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ今回リズム評価値平均値ｒＥｖａｌＴｅｍｐ［ｈ］に正しい平均値として格納する。
さらに、ＣＰＵ１０１は、累算値となっている、変数ｈの演奏パートに対応する今回テンポ評価値平均値ｔＥｖａｌＴｅｍｐ［ｈ］を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ今回テンポ評価値平均値ｔＥｖａｌＴｅｍｐ［ｈ］に正しい平均値として格納する。
【０１３０】
ステップＳ１３１９では、ＣＰＵ１０１は、変数ｈの演奏パートに対応する最良音高一致度変数ｍＥｖａｌＢｅｓｔ［ｈ］の累算値を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ裁量音高一致度変数ｍＥｖａｌＢｅｓｔ［ｈ］に格納する。
また、ＣＰＵ１０１は、累算値となっている、変数ｈの演奏パートに対応する最良リズム評価値平均値ｒＥｖａｌＢｅｓｔ［ｈ］を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ最良リズム評価値平均値ｒＥｖａｌＢｅｓｔ［ｈ］に正しい平均値として格納する。
さらに、ＣＰＵ１０１は、累算値となっている、変数ｈの演奏パートに対応する最良テンポ評価値平均値ｔＥｖａｌＢｅｓｔ［ｈ］を演奏情報数カウンタｃｏｕｎｔの値で除算し、その結果を同じ最良テンポ評価値平均値ｔＥｖａｌＢｅｓｔ［ｈ］に正しい平均値として格納する。
【０１３１】
ステップＳ１３１９の処理の後、ＣＰＵ１０１は、演奏パートを表す変数ｈの値＋１し（図１３のステップＳ１３２０）、図１３のステップＳ１３０２の処理に戻り、次の演奏パートに対して上記と同様の処理を繰り返し実行する。なお、このｈの値は、ｈ＝０の場合が両手パートに対応し、ｈ＝１の場合が右手パートに対応し、ｈ＝２の場合が左手パートに対応する。
【０１３２】
上記処理の結果、図１３のステップＳ１３０２の判定がＮＯとなると、ＣＰＵ１０１は、図７のステップＳ７０４の曲全体の判定処理を終了する。
【０１３３】
以上の処理の後、ＣＰＵ１０１は、図１１のステップＳ１０３９の計算結果、および図１３のステップＳ１３１８とＳ１３１９の計算結果を、例えば図１４に示されるような形式で、ユーザにディスプレイ表示する。
【０１３４】
ＣＰＵ１０１は、例えば、図１３のステップＳ１３１９の最良音高一致度変数ｍＥｖａｌＢｅｓｔ［ｈ］、最良リズム評価値平均値ｒＥｖａｌＢｅｓｔ［ｈ］、最良テンポ評価値平均値ｔＥｖａｌＢｅｓｔ［ｈ］を、ｈの値が０、１、２ごとに「両手」「右手」「左手」のパートに分割して、白の棒グラフまたは数値文字列として表示する。
【０１３５】
また、ＣＰＵ１０１は、例えば、図１３のステップＳ１３１８の今回音高一致度変数ｍＥｖａｌＴｅｍｐ［ｈ］、今回リズム評価値平均値ｒＥｖａｌＴｅｍｐ［ｈ］、今回テンポ評価値平均値ｔＥｖａｌＴｅｍｐ［ｈ］を、ｈの値が０、１、２ごとに「両手」「右手」「左手」のパートに分割して、黒の棒グラフまたは数値文字列として表示する。
【０１３６】
さらに、ＣＰＵ１０１は、例えば、図１１のステップＳ１０３９の、ユーザが演奏した演奏範囲における音高一致度変数ｍＥｖａｌ［ｈ］、リズム評価値平均値ｒＥｖａｌ［ｈ］、テンポ評価値平均値ｔＥｖａｌ［ｈ］を、ｈの値が０、１、２ごとに「両手」「右手」「左手」のパートに分割して、折れ線グラフまたは数値文字列として表示する。
【０１３７】
以上のようにして、ユーザは、手本の演奏の楽曲の部分的な演奏範囲および全体の演奏範囲の双方で音高、リズム、テンポに関する演奏達成状況を判定して表示することが可能となる。
【０１３８】
なお、上記で説明した本発明は、ユーザが楽曲のある範囲の演奏を終了したタイミングで、その一連の演奏を一括して評価することとしても良いし、一方で、ユーザが演奏をしているときに、これと並行して、逐次評価値を計算・表示するようにしても良い。
【０１３９】
また、上記で説明した図１４の画面表示例やその算出方法については、これに限られるものではなく、種々の方法を用いることが可能である。例えば、図１４の白棒グラフとして、各音符ごとの各要素ごとの最高の評価値を曲全体についてそれぞれ加算し、曲全体の音符数で除算した、曲全体の最良の評価値平均値を表示しても良い。また例えば図１４の黒棒グラフとして、現在ユーザが演奏した範囲については現在の演奏についての各音符ごとの各要素ごとの評価値を加算し、現在ユーザが演奏しなかった範囲については各音符ごとの各要素ごとの過去の演奏における最高の評価値を加算し、これらの加算値の合計を、曲全体の音符数で除算した評価値を表示することとしても良い。これはつまり、過去の最高評価値のうち、現在ユーザの演奏した部分については現在の演奏の評価値に置き換えて、その他の部分は過去の最高評価値を用いて、その合成の評価値の平均値を表示することとなる。さらに、例えば図１４の折れ線グラフとして、現在ユーザの演奏した演奏範囲のみについての各音符ごとの各要素ごとの評価値を加算し、現在ユーザの演奏した演奏範囲の音符数で除算した評価値を表示することとしても良い。さらには、図１４には図示していないが、これに加えて、現在ユーザの演奏した演奏範囲のみについての各音符ごとの各要素ごとの過去の演奏における最高の評価値を加算し、この加算値を、現在ユーザの演奏した演奏範囲の音符数で除算した評価値を、任意の形態で表示することとしても良い。このようにすることで、現在のユーザの演奏範囲に特に焦点を当てた形で、過去最高の評価値と今回の演奏の評価値とを明確に比較することのできる表示が可能となる。
【０１４０】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定する演奏評価手段と、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する演奏達成状況表示手段と、
を備えることを特徴とする演奏達成状況表示装置。
（付記２）
前記演奏評価手段は、ユーザによって今回演奏された楽曲の演奏範囲について、該ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定し、
前記演奏達成状況表示手段は、当該演奏範囲について、前記決定された各音符の、リズム、およびテンポの少なくとも一方の評価値に基づいて、達成状況を算出して表示する、
ことを特徴とする付記１に記載の演奏達成状況表示装置。
（付記３）
過去になされた前記ユーザ演奏における、前記楽曲の音符毎の、リズム、およびテンポの少なくとも一方の最高評価値を記憶する最高値記憶手段をさらに備え、
前記演奏達成状況表示手段は、今回の前記ユーザ演奏において、前記演奏評価手段によって決定された各音符の評価値が、前記最高値記憶手段に記憶された対応する音符の最高評価値を越える評価値である場合に、前記対応する音符の最高評価値として、当該今回決定された評価値により更新するとともに、前記更新された各音符の最高評価値に基づいて前記楽曲の最高評価値を算出して表示する
ことを特徴とする付記１または２に記載の演奏達成状況表示装置。
（付記４）
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、その発音開始時刻と該音符の直前の音符の発音開始時刻との時間差である発音時間間隔を前記ユーザ演奏および前記楽曲情報のそれぞれについて算出し、該各音符の発音時間間隔に基づいて前記リズムおよび前記テンポを判定する、
ことを特徴とする付記１から３のいずれかに記載の演奏達成状況表示装置。
（付記５）
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、
前記ユーザ演奏の総時間に対する前記ユーザ演奏の発音時間間隔の割合と、前記楽曲情報の総時間に対する前記楽曲情報の発音時間間隔の割合との差分を算出し、当該差分に基づいて前記音符に対応するリズムの評価値として算出する、
ことを特徴とする付記１から４のいずれかに記載の演奏達成状況表示装置。
（付記６）
前記演奏評価手段は、前記ユーザ演奏と前記楽曲情報の対応する音符ごとに、
前記ユーザの演奏の発音時間間隔と前記楽曲情報の発音時間間隔の比の値を算出し、当該比の値を前記音符に対応するテンポの評価値として算出する、
ことを特徴とする付記１から５のいずれかに記載の演奏達成状況表示装置。
（付記７）
前記演奏達成状況表示手段は、前記ユーザ演奏と前記楽曲情報とで対応する音符ごとの前記リズムの評価値の平均値を、前記演奏範囲での前記ユーザ演奏の前記楽曲情報に対するリズムの達成状況として算出する、
ことを特徴とする付記５に記載の演奏達成状況表示装置。
（付記８）
前記演奏達成状況表示手段は、前記ユーザ演奏と前記楽曲情報とで対応する音符ごとの前記テンポの評価値の平均値を、前記演奏範囲での前記ユーザ演奏の前記楽曲情報に対するテンポの達成状況として算出する、
ことを特徴とする付記６に記載の演奏達成状況表示装置。
（付記９）
付記１から８のいずれかに記載の演奏達成状況表示装置と
前記ユーザ演奏が入力される入力手段と、
前記入力手段による前記ユーザ演奏に応じた発音を行う発音手段と、
を備える電子楽器。
（付記１０）
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定し、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示する、
を備えることを特徴とする演奏達成状況表示方法。
（付記１１）
少なくともユーザ演奏における各音符の演奏のタイミングと、記憶部に記憶された対応する楽曲情報の対応する音符のタイミングとを比較することにより、前記ユーザ演奏の各音符の、リズム、およびテンポの少なくとも一方の評価値を決定するステップと、
該決定された評価値に基づいて、前記リズム、およびテンポの少なくとも一方の達成状況を算出して表示部に表示するステップと、
をコンピュータに実行させるためのプログラム。
【符号の説明】
【０１４１】
１００  演奏達成状況表示装置
１０１  ＣＰＵ
１０２  ＲＡＭ
１０３  ＲＯＭ
１０４  入力部
１０５  表示部
１０６、１１３  ＭＩＤＩインターフェース
１０７  バス
１１０  電子楽器
１１１  キーボード
１１２  音源・サウンドシステム
【図１】
2014186215.tif 000003
【図５】
2014186215.tif 000004
【図６】
2014186215.tif 000005
【図７】
2014186215.tif 000006
【図８】
2014186215.tif 000007
【図１０】
2014186215.tif 000008
【図１１】
2014186215.tif 000009
【図１２】
2014186215.tif 000010
【図１３】
2014186215.tif 000011
【図２】
2014186215.tif 000012
【図３】
2014186215.tif 000013
【図４】
2014186215.tif 000014
【図９】
2014186215.tif 000015
【図１４】
2014186215.tif 000016