曲を構成する各音を表す複数の音符データを記憶する記憶手段と、前記記憶手段に記憶される複数の音符データと、ユーザの演奏入力に応じて発生した演奏データとの比較に基づきユーザの演奏技量を評価して曲の難易度に応じた達成度を取得する達成度取得手段と、前記達成度取得手段により取得された達成度の向上を図るのに最も効果的なアドバイスを発生してユーザに与えるアドバイス発生手段とを具備することを特徴とする演奏教習装置。前記アドバイス発生手段は、前記達成度取得手段により取得された達成度から第1および第2の状態変数を生成する状態変数生成手段と、前記状態変数生成手段により生成された第1および第2の状態変数に応じて、複数のアドバイス種別の中から最大価値のアドバイスを抽出するアドバイス抽出手段とを備えることを特徴とする請求項1記載の演奏教習装置。前記状態変数生成手段は、前記達成度取得手段により取得された達成度から達成度ランクを取得する第1の状態変数取得手段と、前記達成度取得手段により取得された現在の達成度と前回取得された前回の達成度との差分に応じた達成度ランク変化を取得する第2の状態変数取得手段とを備え、前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した達成度ランクと、前記第2の状態変数取得手段が取得した達成度ランク変化とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から最大価値を有する種別のアドバイスを抽出することを特徴とする請求項2記載の演奏教習装置。演奏入力が行われる毎に開始時刻および終了時刻を記録する時刻記録手段を更に備え、前記状態変数生成手段は、前記時刻記録手段により記録された前回の開始時刻および終了時刻から前回練習時間を取得する第1の状態変数取得手段と、前記時刻記録手段により記録された今回の開始時刻および前回の終了時刻から練習間隔を取得する第2の状態変数取手段とを備え、前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した前回練習時間と、前記第2の状態変数取手段が取得した練習間隔とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から練習時間を長くするのに最も効果的なアドバイスを抽出することを特徴とする請求項2記載の演奏教習装置。前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した前回練習時間と、前記第2の状態変数取手段が取得した練習間隔とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から練習間隔を短くして頻繁に練習させるのに最も効果的なアドバイスを抽出することを特徴とする請求項4記載の演奏教習装置。前記アドバイス発生手段は、前記達成度取得手段により取得された達成度から第1および第2の状態変数を生成する状態変数生成手段と、前記状態変数生成手段により生成された第1および第2の状態変数に応じて、Q学習理論に基づく価値関数テーブルから最大価値のアドバイスを抽出するアドバイス抽出手段とを備えることを特徴とする請求項1記載の演奏教習装置。演奏教習装置に搭載されるコンピュータに、曲を構成する各音を表す複数の音符データと、ユーザの演奏入力に応じて発生した演奏データとの比較に基づきユーザの演奏技量を評価して曲の難易度に応じた達成度を取得する達成度取得ステップと、前記達成度取得ステップにより取得された達成度の向上を図るのに最も効果的なアドバイスを発生してユーザに与えるアドバイス発生ステップとを実行させることを特徴とするプログラム。ところで、上記特許文献1に開示の技術では、単に同じ過ちが繰り返された場合に、演奏ミス仕勝ちな音の演奏を繰り返し練習させるだけなので、ユーザの状態に応じた最適なアドバイスを与えることが出来ないという問題がある。本発明は、このような事情に鑑みてなされたもので、ユーザの状態に応じた最適なアドバイスを与えることができる演奏教習装置およびプログラムを提供することを目的としている。上記目的を達成するため、本発明の演奏教習装置は、曲を構成する各音を表す複数の音符データを記憶する記憶手段と、前記記憶手段に記憶される複数の音符データと、ユーザの演奏入力に応じて発生した演奏データとの比較に基づきユーザの演奏技量を評価して曲の難易度に応じた達成度を取得する達成度取得手段と、前記達成度取得手段により取得された達成度の向上を図るのに最も効果的なアドバイスを発生してユーザに与えるアドバイス発生手段とを具備することを特徴とする。本発明では、ユーザの状態に応じた最適なアドバイスを与えることができる。以下、図面を参照して本発明の実施形態について説明する。[第1実施形態]A.構成図1は、第1実施形態による演奏評価装置100の全体構成を示すブロック図である。この図において、鍵盤10は、演奏入力押離鍵操作に応じたキーオン/キーオフイベント、鍵番号およびベロシティ等を含む演奏情報を発生する。スイッチ部11は、装置パネルに配設される各種操作スイッチを有し、ユーザ操作されるスイッチ種に対応したスイッチイベントを発生する。スイッチ部11に配設される主要なスイッチとしては、例えばパワーオンオフする電源スイッチの他、手本模範演奏となる曲データを選択する曲選択スイッチや、動作の終了を指示する終了スイッチ等がある。表示部12は、LCDパネル等から構成され、CPU13から供給される表示制御信号に応じて、演奏入力する際に曲データを楽譜表示したり、演奏終了後に演奏評価結果を表示したりする他、装置の動作状態や設定状態を表示する。CPU13は、演奏入力に応じて鍵盤10が発生する演奏情報をMIDI形式の演奏データノートオン/ノートオフ等に変換し、変換した演奏データを記憶する一方、音源16に供給して楽音発生を指示する。また、CPU13は、記憶された演奏データと手本模範演奏となる曲データを構成する音符データとの比較に基づきユーザの演奏技量を評価して曲の難易度を加味した達成度を取得し、取得した達成度を更に向上させるのに最も効果的なアドバイスをユーザに与える。こうした本発明に係わるCPU13の特徴的な処理動作については追って詳述する。ROM14には、CPU13にロードされる各種の制御プログラムが記憶される。各種の制御プログラムとは、後述するメインルーチンを構成する該当箇所特定処理、演奏判定処理、達成度算出処理、変数更新処理およひアドバイス処理を含む。なお、該当箇所特定処理は距離算出処理およびDPマッチング処理を含み、変数更新処理は最大Qアクション処理を含む。RAM15は、ワークエリア、演奏データエリアおよび曲データエリアを備える。RAM15のワークエリアには、CPU13の処理に使用される各種レジスタフラグデータが一時記憶される他、演奏技術の種別に対応する難易度が登録される難易度テーブルiFTCostや、Q学習理論に基づき生成された価値関数テーブルvalueを備える。この難易度テーブルiFTCostや価値関数テーブルvalueが意図するところについては追って述べる。RAM15の演奏データエリアには、演奏入力に応じてCPU10が生成する複数の演奏音の演奏データが記憶される。RAM15の曲データエリアには、手本模範演奏となる曲データが複数曲分格納される。曲データは、曲を形成する複数の音符を表す音符データから構成される。曲データを構成する音符データは、右手で弾く右手パート、左手で弾く左手パートおよび両手で弾く左右両パートに区分される。1つの音符データは、iTime、iGate、iPit、iVel、iTechおよびiClearから構成される。iTimeは発音時刻、iGateは音長、iPitはピッチ音高、iVelはベロシティ音量を表す。iTechは演奏技術の種別を表す値である。演奏技術の種別とは、指潜りや指跨ぎ等の指の動かし方の種類を指す。負の値の場合には、演奏技術を要しない音符であることを表し、0以上の値が演奏技術の種別を表す。以下、iTechを演奏技術タイプと称す。iClearは対応する音符が手本通りに正しく弾けたかどうかを表すフラグであり、1の場合に手本通りに正しく弾けたことを表し、0の場合に弾けていないことを表す。以下、iClearをクリアフラグiClearと称す。音源16は、周知の波形メモリ読み出し方式によって構成され、CPU13から供給される演奏データに応じた楽音データを発生して出力する。サウンドシステム17は、音源16から出力される楽音データをアナログ形式の楽音信号に変換した後、その楽音信号から不要ノイズを除去する等のフィルタリングを施してからレベル増幅してスピーカより発音させる。B.動作次に、図2~図9を参照して上記構成による演奏評価装置100の動作を説明する。以下では、CPU13が実行するメインルーチン、該当箇所特定処理、演奏判定処理、達成度算出処理、変数更新処理およひアドバイス処理の各動作について述べる。なお、該当箇所特定処理は距離算出処理およびDPマッチング処理を含み、変数更新処理は最大Qアクション処理を含む。1メインルーチンの動作図2は、メインルーチンの動作を示すフローチャートである。演奏評価装置100がパワーオンされると、CPU13は図2に図示するメインルーチンを実行してステップSA1に処理を進め、装置各部を初期化するイニシャライズを行う。イニシャライズが完了すると、CPU13はステップSA2に進み、終了操作が為された否かを判断する。終了操作が為されなければ、判断結果はNOになり、ステップSA3に進む。ステップSA3では、演奏入力に応じてCPU10が生成する演奏データをRAM15の演奏データエリアに保存する演奏入力処理を実行する。なお、演奏入力処理では、曲選択スイッチ操作により選択された曲データを練習課題とし、当該曲データを表示部12に楽譜表示させ、その楽譜を見てユーザが曲の各音を弾く演奏入力を行うようになっている。次いで、ステップSA4では、ユーザの演奏入力で発生した演奏データが、手本模範演奏となる曲データ中のどの音符データに該当し、かつその該当音符データを右手パート、左手パートおよび左右両パートの何れで弾いたのかを特定する該当箇所特定処理を実行する。続いて、ステップSA5では、上記ステップSA4において特定した音符データのピッチiPitと演奏データの音高とを比較して当該音符データの音が正しく弾かれたかどうかを判定し、正しく弾かれた音符データのクリアフラグiClearを1にセットする演奏判定処理を実行する。そして、ステップSA6では、達成度算出処理を実行する。達成度算出処理では、後述するように、曲データ中の全ての音符データに含まれる演奏技術タイプiTechから演奏技術の種別毎の発生回数およびクリア回数正しく弾かれた回数を抽出し、抽出した発生回数およびクリア回数から得られる演奏技術の種別毎の正解率クリア回数/発生回数に、演奏技術の種別に応じた難易度を乗算して演奏技術の種別毎の達成度を算出し、算出された各達成度を累算することで曲の難易度に応じた達成度achieveValueを取得する。次いで、ステップSA7では、Q学習理論に基づき、現在のアドバイスに従って演奏入力を行った結果得られた達成度achieveValueから価値関数テーブルvalueの状態変数を更新すると共に、更新した状態変数に応じて価値関数テーブルvalueから最も効果的なアドバイスを取得する変数更新処理を実行する。続いて、ステップSA8では、価値関数テーブルvalue[achieve][change][i]から探し出された最も効果的最大Qアクション価値maxQなアドバイス種別actionで指定される種類のアドバイスを演奏入力するユーザに与える。この後、上述のステップSA2に処理を戻し、以後、終了操作が為されるまで上述したステップSA2~SA9を繰り返し実行する。そして、終了操作が為されると、上記ステップSA2の判断結果がYESになり、ステップSA9に進み、変数更新処理ステップSA7において更新された変数前回の達成度ランクprevAchieve、達成度ランク変化prevChange、アドバイス種別prevActionおよび達成度pevAchieveValueを保存する変数保存処理を実行して本処理を終える。2該当箇所特定処理の動作次に、図3を参照して該当箇所特定処理の動作を説明する。上述したメインルーチンのステップSA4図2参照を介して本処理が実行されると、CPU13は図3に図示するステップSB1に処理を進め、レジスタdoDistMinに初期値となる所定値をストアする。レジスタdoDistMinに格納される初期値が意図するところについては追って述べる。続いて、ステップSB2では、ポインタmeorgtar0およびポインタmeorgtar1をゼロリセットする。ポインタmeorgtar0とは、曲データ中の右手パートの音符データの内、ユーザの演奏入力で発生した演奏データに一致した音符データを指定するポインタである。同様に、ポインタmeorgtar1とは、曲データ中の左手パートの音符データの内、ユーザの演奏入力で発生した演奏データに一致した音符データを指定するポインタである。次いで、ステップSB3~SB4では、曲データ中の右手パートの音符データの内、先頭ノート先頭の音符を指定するアドレス値をポインタmeorg[0]にストアし、曲データ中の左手パートの音符データの内、先頭ノート先頭の音符を指定するアドレス値をポインタmeorg[1]にストアする。そして、ステップSB5に進むと、ポインタmeorg[0]、meorg[1]が共に終端でないか否か、つまり曲の終わりに達するまで該当箇所を検索したかどうかを判断する。曲の終わりに達するまで該当箇所を検索していなければ、判断結果はYESになり、ステップSB6に進む。ステップSB6~SB8では、ポインタmeorg[0]およびポインタmeorg[1]を曲の終わりに達するまで歩進させる毎に、ステップSB6の距離算出処理を繰り返し実行する。そして、曲の終わりに達するまで該当箇所を検索し終えると、上記ステップSB5の判断結果がNOとなり、本処理を終える。なお、ステップSB6の距離算出処理では、後述するように、ユーザの演奏入力で発生した演奏データに対し、曲データ中の全ての音符データ右手パート、左手パートおよび左右両パートについて公知のDPマッチングを施して類似度に相当する距離右手パート時の距離、左手パート時の距離および左右両パート時の距離を算出し、算出した距離の中で最も類似度の大きい最小距離となるパートの音符データを、演奏データに該当する箇所と特定する。3距離算出処理の動作次に、図4を参照して距離算出処理の動作を説明する。上述した該当箇所特定処理のステップSB6図3参照を介して本処理が実行されると、CPU13は図4に図示するステップSC1に処理を進め、レジスタiHandに0をストアする。レジスタiHandの値は、曲データ中のパートを指定する。具体的には、0の場合に曲データ中の右手パートを指定し、、1の場合に曲データ中の左手パートを指定し、2の場合に曲データ中の左右両パートを指定する。以下、レジスタiHandの値をパート指定データiHandと称す。続いて、ステップSC2では、パート指定データiHandが3より小さいか否か、すなわち全てのパートについて距離算出し終えたかどうかを判断する。パート指定データiHandが3より小さく、全てのパートについて距離算出し終えていなければ、判断結果はYESとなり、ステップSC3を介してDPマッチング処理を実行する。DPマッチング処理では、後述するように、ユーザの演奏入力で発生した演奏データに対し、曲データ中の全ての音符データ右手パート、左手パートおよび左右両パートについて類似度に相当する距離doDistを取得する。次いで、ステップSC4では、上記ステップSC3のDPマッチング処理にて今回取得した距離doDistが、前回取得した距離doDistMin初回時はステップSB1にてストアした所定値を用いるの95値より小さいか否かを判断する。つまり最小距離を更新したかどうかを判断する。最小距離を更新していなければ、判断結果はNOになり、後述のステップSC10に進む。一方、今回取得した距離doDistが、前回取得した距離doDistMinの95値より小さく、最小距離を更新すると、上記ステップSC4の判断結果はYESになり、ステップSC5に進む。ステップSC5では、距離doDistを距離doDistMinに更新する。また、ステップSC5では、ポインタmeorg[0]の値をポインタmeorgtar0に、ポインタmeorg[1]の値をポインタmeorgtar1にセットする。そして、ステップSC6に進むと、パート指定データiHandが0であるか否か、つまり距離算出対象が右手パートであるかどうかを判断する。右手パートならば、判断結果はYESになり、ステップSC8に進み、ポインタmeorgtar1をゼロリセットし、続くステップSC10では、パート指定データiHandをインクリメントして歩進させた後、上述のステップSC2に処理を戻す。これに対し、パート指定データiHandが0でない場合、つまり距離算出対象が右手パートでなければ、上記ステップSC6の判断結果はNOになり、ステップSC7に進み、パート指定データiHandが1であるか否か、つまり距離算出対象が左手パートであるかどうかを判断する。左手パートならば、判断結果はYESになり、ステップSC9に進み、ポインタmeorgtar0をゼロリセットし、続くステップSC10では、パート指定データiHandをインクリメントして歩進させた後、上述のステップSC2に処理を戻す。一方、距離算出対象が左手パートでない場合、つまり左右両パートであると、上記ステップSC7の判断結果はNOになり、ステップSC10に進み、パート指定データiHandをインクリメントして歩進させた後、上述のステップSC2に処理を戻す。そして、歩進されたパート指定データiHandが3より大きくなると、上記ステップSC2の判断結果はNOになり、本処理を終える。4DPマッチング処理の動作次に、図5~図6を参照してDPマッチング処理の動作を説明する。上述した距離算出処理のステップSC3図4参照を介して本処理が実行されると、CPU13は図5に図示するステップSD1に処理を進め、音符データを指定するポインタIに初期値0をセットする。次いで、ステップSD2では、ポインタmeorg[0]の値をポインタme0orgIに、ポインタmeorg[1]の値をポインタme1orgIにセットする。なお、ポインタmeorg[0]は曲データ中の右手パートの先頭の音符データを指定するポインタ値であり、ポインタmeorg[1]は、曲データ中の左手パートの先頭の音符データを指定するポインタ値である。続いて、ステップSD3では、ポインタIの歩進に応じて、全ての音符データを指定し終えたか否かを判断する。全ての音符データを指定し終えていなければ、判断結果はNOになり、ステップSD4に進み、パート指定データiHandが0、つまりDPマッチングの対象が右手パートであるかどうかを判断する。右手パートならば、判断結果はYESになり、ステップSD5に進み、ポインタme0orgIをポインタmeAorgIにセットした後、図6に図示するステップSD9後述するに処理を進める。DPマッチングの対象が右手パートでなければ、上記ステップSD4の判断結果はNOになり、ステップSD6に進む。ステップSD6では、パート指定データiHandが1、つまりDPマッチングの対象が左手パートであるかどうかを判断する。左手パートならば、判断結果はYESになり、ステップSD7に進み、ポインタme1orgIをポインタmeAorgIにセットした後、図6に図示するステップSD9後述するに処理を進める。DPマッチングの対象が左右両パートであると、上記ステップSD6の判断結果はNOになり、ステップSD8に進む。ステップSD8では、ポインタme0orgIで指定される音符データの発音時刻iTimeと、ポインタme1orgIで指定される音符データの発音時刻iTimeとを比較し、発音時刻の早い音符データを指定する方のポインタをポインタmeAorgIにセットした後、図6に図示するステップSD9後述するに処理を進める。そして、図9に図示するステップSD9に進むと、演奏データを指定するポインタJに初期値0をセットする。次いで、ステップSD10では、ポインタJの歩進に応じて、全ての演奏データを指定し終えたか否かを判断する。全ての演奏データを指定し終えていなければ、判断結果はNOになり、ステップSD11に進む。ステップSD11では、ポインタmeAorgIで指定される音符データのピッチiPitと、ポインタmeBusrJで指定される演奏データのピッチとを比較する。両データのピッチが一致すると、ステップSD12に進み、レジスタdoMissMatch[I][J]に一致値0.0をセットし、一方、両データのピッチが不一致ならば、ステップSD13に進み、レジスタdoMissMatch[I][J]に不一致値1.0をセットする。次いで、ステップSD14では、ポインタJをインクリメントして歩進させた後、上述のステップSD10に処理を戻す。以後、ポインタJを歩進させながら、上述したステップSD10~SD14を繰り返すことによって、ポインタmeAorgIで指定される音符データのピッチiPitに対し、全ての演奏データのピッチについて一致不一致を判別し、その判別結果を一致不一致マトリクスに相当する2次元のレジスタdoMissMatch[I][J]に保存する。ポインタJの歩進に応じて、全ての演奏データを指定し終えると、上記ステップSD10の判断結果がYESになり、ステップSD15に進み、ポインタIをインクリメントして歩進させた後、前述したステップSD3図5参照に処理を戻す。そして、ポインタIの歩進に応じて、全ての音符データを指定し終えると、前述したステップSD3の判断結果がYESになり、ステップSD16に進む。ステップSD16では、パート指定データiHandが0であるか否か、つまりDPマッチングの対象が右手パートであるかどうかを判断する。右手パートならば、判断結果はYESになり、ステップSD17に進み、ポインタme1orgをゼロリセットした後、ステップSD20に進む。一方、パート指定データiHandが0でない場合、つまりDPマッチングの対象が右手パートでなければ、上記ステップSD16の判断結果はNOになり、ステップSD18に進み、パート指定データiHandが1であるか否か、つまりDPマッチングが左手パートであるかどうかを判断する。左手パートならば、判断結果はYESになり、ステップSD19に進み、ポインタme0orgをゼロリセットした後、ステップSD20に進む。DPマッチングの対象が左右両パートの場合には、上記ステップSD16、SD18の各判断結果が何れもNOになり、ステップSD20に進む。そして、ステップSD20では、2次元のレジスタdoMissMatch[I][J]に保存された一致不一致マトリクスに基づく公知のDPマッチングによって、ユーザの演奏入力で発生した演奏データに対し、曲データ中の全ての音符データ右手パート、左手パートおよび左右両パートについて類似度に相当する距離doDistを取得して本処理を終える。5演奏判定処理の動作次に、図7を参照して演奏判定処理の動作を説明する。前述したメインルーチンのステップSA5図2参照を介して本処理が実行されると、CPU13は図7に図示するステップSE1に処理を進め、音符データを指定するポインタIに初期値0をセットする。次いで、ステップSE2では、曲データ中の右手パートの音符データの内、ユーザの演奏入力で発生した演奏データに一致した音符データを指定するポインタmeorgtar0の値を、ポインタme0orgIにセットすると共に、曲データ中の左手パートの音符データの内、ユーザの演奏入力で発生した演奏データに一致した音符データを指定するポインタmeorgtar1の値を、ポインタme1orgIにセットする。続いて、ステップSE3では、ポインタIの歩進に応じて、全ての音符データを指定し終えたか否かを判断する。全ての音符データを指定し終えていなければ、判断結果はNOになり、ステップSE4に進む。ステップSE4では、ポインタme0orgIで指定される音符データの発音時刻iTimeと、ポインタme1orgIで指定される音符データの発音時刻iTimeとを比較し、発音時刻の早い音符データを指定する方のポインタをポインタmeAorgIにセットする。次いで、ステップSE5では、演奏データを指定するポインタJに初期値0をセットし、続くステップSE6では、ポインタJの歩進に応じて、全ての演奏データを指定し終えたか否かを判断する。全ての演奏データを指定し終えていなければ、判断結果はNOになり、次のステップSE7に進む。ステップSE7では、ポインタmeAorgIで指定される音符データのピッチiPitと、ポインタmeBusrJで指定される演奏データのピッチとを比較する。音符データのピッチと演奏データのピッチとが一致すると、ステップSE8に進み、ポインタmeAorgIで指定される音符データのクリアフラグiClearに1をセットし、正しく弾かれた音であること表す。そして、ステップSE9に進み、ポインタJをインクリメントして歩進させた後、上述のステップSE6に処理を戻す。以後、ポインタJを歩進させながら、上述したステップSE6~SE9を繰り返す。そして、ポインタJの歩進に応じて、全ての演奏データを指定し終えると、上記ステップSE6の判断結果がYESになり、ステップSE10に進み、ポインタIをインクリメントして歩進させた後、上述のステップSE3に処理を戻す。ポインタIの歩進に応じて、全ての音符データを指定し終えると、このステップSD3の判断結果がYESになり、本処理を終える。6達成度算出処理の動作次に、図8~図9を参照して達成度算出処理の動作を説明する。前述したメインルーチンのステップSA6図2参照を介して本処理が実行されると、CPU13は図8に図示するステップSF1に処理を進め、レジスタmeに先頭ノート曲頭の音の音符データをストアする。続いて、ステップSF2では、曲データ中の全ての音符データを読み出し終えたかどうかを判断する。全ての音符データを読み出し終えていなければ、判断結果はNOになり、ステップSF3に進む。ステップSF3では、レジスタmeにストアした音符データに含まれる演奏技術タイプiTechが0以上であるか否か、つまり演奏技術を要する音符であるかどうかを判断する。演奏技術タイプiTechが負の値の場合には、演奏技術を要しない音符なので、判断結果はNOになり、ステップSF7に進み、レジスタmeに次の音符データをストアして上述のステップSF2に処理を戻す。一方、レジスタmeにストアした音符データに含まれる演奏技術タイプiTechが0以上であり、演奏技術の種別を表す場合には、上記ステップSF3の判断結果がYESになり、ステップSF4に進む。ステップSF4では、演奏技術タイプiTech別に発生回数を計数するカウンタiFTTypeCnt[iTech]をインクリメントして歩進させる。次いで、ステップSF5では、レジスタmeにストアした音符データに含まれるクリアフラグiClearが1、すなわち正しく弾かれた音であるか否かを判断する。正しく弾かれていない音クリアフラグiClearが0であれば、判断結果はNOになり、ステップSF7に進み、レジスタmeに次の音符データをストアして上述のステップSF2に処理を戻す。これに対し、正しく弾かれた音ならば、上記ステップSF5の判断結果はYESになり、ステップSF6に進む。ステップSF6では、演奏技術タイプiTech別にクリア回数を計数するカウンタiFTTypeClear[iTech]をインクリメントして歩進させる。そして、この後、ステップSF7に進み、レジスタmeに次の音符データをストアして上述のステップSF2に処理を戻す。以後、全ての音符データを読み出し終えるまで、上述したステップSF2~SF7を繰り返すことによって、演奏技術タイプiTech別の発生回数がカウンタiFTTypeCnt[iTech]にて計数されると共に、演奏技術タイプiTech別のクリア回数がカウンタiFTTypeClear[iTech]にて計数される。そして、全ての音符データについて読み出し終えると、上記ステップSF2の判断結果がYESになり、図9に図示するステップSF8に進む。ステップSF8では、演奏技術の種別を指定するポインタIおよびレジスタacをゼロクリアする。なお、レジスタacには、後述するように演奏技量の向上具合を表す達成度がストアされる。以下、レジスタacの値を達成度acと称す。次いで、ステップSF9に進むと、全ての演奏技術の種別毎の達成度acを算出し終えたかどうかを判断する。算出し終えていなければ、判断結果はNOになり、ステップSF10に進む。ステップSF10~SF11では、クリア回数カウンタiFTTypeClear[I]を発生回数カウンタiFTTypeCnt[I]で除して得られる正解率に、ポインタIに応じて難易度テーブルiFTCost[I]から読み出される難易度を乗算することによって、ポインタIで指定される演奏技術の種別における達成度acを算出し、それをポインタIの歩進に応じて累算する。こうして、全ての演奏技術の種別毎の達成度acを算出し終えると、上記ステップSF10では、各演奏技術の種別毎に算出した達成度acが累算され、この結果、ユーザが演奏入力した曲について難易度を加味した達成度acが得られる。また、全ての演奏技術の種別について達成度acを算出し終えると、上記ステップSF9の判断結果がYESになり、ステップSF12に進み、曲の難易度を加味した達成度acをレジスタachieveValue以下、達成度achieveValueと称すにストアして本処理を終える。7変数更新処理の動作強化学習の一種であるQ学習では、現在のルールに従って行動を行い、それにより得られた報酬から価値関数ルール評価を作成すると共に、現在の価値関数から最適なルールを作成することが知られている。変数更新処理では、このようなQ学習理論を適用しており、具体的には現在のアドバイスルールに従って演奏入力行動を行った結果得られる達成度報酬から価値関数テーブルvalueの状態変数を更新すると共に、更新した状態変数に応じて価値関数テーブルvalueから最も効果的なアドバイスルールを取得する。以下、こうした変数更新処理の動作について図10を参照して説明する。前述したメインルーチンのステップSA7図2参照を介して本処理が実行されると、CPU13は図10に図示するステップSG1に処理を進め、達成度レベル数AchieveN定数に、達成率達成度achieveValue/曲の難易度costを乗算し、Q学習における状態変数として扱われる達成度ランクachieveを算出する。続いて、ステップSG2では、現在の達成度achieveValueから前回の達成度prevAchieveValueを減算して達成度差分aを算出する。次いで、ステップSG3では、算出した達成度差分aが0より大きいか否か、すなわち達成度が上昇したかどうかを判断する。達成度が上昇した場合a>0には、判断結果がYESになり、ステップSG4に進み、レジスタchangeに4をセットした後、ステップSG8に進む。以下、レジスタchangeの値を達成度ランク変化と称す。この達成度ランク変化changeは、Q学習における状態変数として扱われる。一方、達成度差分aが0以下、つまり達成度が変わらないか或いは達成度が下降した場合には、上記ステップSG3の判断結果はNOになり、ステップSG5に進む。ステップSG5では、算出した達成度差分aが0か否か、つまり達成度が変わらないかどうかを判断する。達成度が変わらない場合a=0には、判断結果はYESになり、ステップSG6に進み、達成度ランク変化changeを2にセットした後、ステップSG8に進む。これに対し、達成度が下降した場合a<0には、上記ステップSG5の判断結果がNOになり、ステップSG7に進み、達成度ランク変化changeを0にセットした後、ステップSG8に進む。そして、ステップSG8では、達成度ランクachieveおよび達成度ランク変化changeで指定される状態において、アクション番号検索ポインタiを歩進させながら、価値関数テーブルvalue[achieve][change][i]から最も効果的最大Qアクション価値maxQなアドバイス種別actionを探し出す最大Qアクション処理を実行する。次いで、ステップSG9では、達成度ランクachieveおよび達成度ランク変化changeで指定される現在の状態におけるアドバイス種別actionの現在価値afterQを、価値関数テーブルvalue[achieve][change][action]から取得する。続いて、ステップSG10では、達成度ランクprevAchieveおよび達成度ランク変化prevChangeで指定される前回状態における前アドバイス種別prevActionの前回価値vを、価値関数テーブルvalue[prevAchieve][prevChange][prevAction]から取得する。次に、ステップSG11では、次式1に従って現在価値afterQに応じて前回の状態および前回価値vを更新する。value[prevAchieve][prevChange][prevAction]←valpha×gamma×afterQ-vreward...1なお、上記1式において、alphaは学習率、gammaは割引率、rewardは報酬達成度achieveValueである。そして、ステップSG12では、現在の達成度ランクachieve、達成度ランク変化change、アドバイス種別actionおよび達成度achieveValueを、それぞれ前回の達成度ランクprevAchieve、達成度ランク変化prevChange、アドバイス種別prevActionおよび達成度pevAchieveValueに更新して本処理を終える。8最大Qアクション処理の動作次に、図11を参照して最大Qアクション処理の動作を説明する。上述した変数更新処理のステップSG8図10参照を介して本処理が実行されると、CPU13は図11に図示するステップSH1に処理を進める。ステップSH1~SH3では、アクション番号検索ポインタi、最大Qアクション価値maxQおよびアクション種別indexをそれぞれゼロクリアする。続いて、ステップSH4では、全てのアクションについて検索し終えたかどうかを判断する。検索し終えていなければ、判断結果はNOになり、ステップSH5に進み、達成度ランクachieveおよび達成度ランク変化changeで指定される状態において、アクション番号検索ポインタiに応じたアドバイス価値qを、価値関数テーブルvalue[achieve][change][i]から取得する。ここで、図12を参照して、達成度ランクachieveおよび達成度ランク変化changeで指定される状態において、アクション番号検索ポインタiに応じたアドバイス価値qを価値関数テーブルvalueから取得する処理について説明する。例えば達成度ランクachieveが1、達成度ランク変化changeが1の場合、価値関数テーブルvalue[1][1][action]には、図12に図示する一例のように、複数のアクションアドバイスとそれらに対応付けられたアドバイス価値q0~qnが登録されており、上記ステップSH5では、アクション番号検索ポインタiに応じたアドバイス価値qを価値関数テーブルvalue[achieve][change][i]から読み出すようになっている。そして、次のステップSH6では、価値関数テーブルvalue[achieve][change][i]から読み出したアドバイス価値qが、最大Qアクション価値maxQより大きいか否かを判断する。最初のパスでは、上記ステップSH2において最大Qアクション価値maxQはゼロクリアされている為、判断結果はNOになり、ステップSH7に進む。ステップSH7では、アクション番号検索ポインタiをアクション種別indexに保持し、続くステップSH8では、アクション番号検索ポインタiに応じて、価値関数テーブルvalue[achieve][change][i]から読み出したアドバイス価値qを最大Qアクション価値maxQとして保存しておく。次いで、ステップSH9では、アクション番号検索ポインタiをインクリメントして歩進させた後、上述のステップSH4に処理を戻す。以後、アクション番号検索ポインタiの歩進に応じて価値関数テーブルvalue[achieve][change][i]からアドバイス価値qを読み出し、読み出したアドバイス価値qが最大Qアクション価値maxQを超えると、上記ステップSH6の判断結果がYESになり、ステップSH10に進む。ステップSH10~ステップSH13では、検索される最大Qアクション価値maxQが常に同じものとなる単調化を避ける為、ランダムに変化する要素を追加する。すなわち、ステップSH10では、パート指定データiHandが1であるか否か、つまり達成度achieveValueを算出する前段階の距離算出対象が左手パートであったかどうかを判断する。右手パートであったならば、判断結果はNOになり、上述したステップSH9に処理を進め、アクション番号検索ポインタiを歩進させた後、前述のステップSH4に処理を戻す。この場合、ランダムに変化する要素は追加されない。一方、左手パートの場合には、上記ステップSH10の判断結果がYESとなり、ステップSH11に進み、0又は1の乱数を発生させてレジスタrndにストアする。次いで、ステップSH12では、レジスタrndの乱数値が1であるか否かを判断する。レジスタrndの乱数値が0ならば、判断結果はNOになり、上述したステップSH9に進むが、レジスタrndの乱数値が1であると、判断結果はYESになり、ステップSH13に進み、アドバイス種別indexに、アクション番号検索ポインタiをセットして上述のステップSH9に進む。これにより、ランダムに変化する要素が追加されることになる。こうして、ランダムに変化する要素を加味しつつ、アクション番号検索ポインタiの歩進に応じて、価値関数テーブルvalue[achieve][change][i]から全てのアクションアドバイスの種別を検索し終えると、上述したステップSH4の判断結果がYESになり、最大Qアクション価値maxQとなったアドバイス価値qを指定したアクション種別indexを、アドバイス種別actionにセットして本処理を終える。9アドバイス処理の動作次に、図13を参照してアドバイス処理の動作を説明する。前述したメインルーチンのステップSA8図2参照を介して本処理が実行されると、CPU13は図13に図示するステップSJ1に進み、0又は1の乱数値を発生させてレジスタrndにストアし、続くステップSJ2では、レジスタrndの乱数値が1であるか否かを判断する。レジスタrndの乱数値が0であると、判断結果はNOになり、ステップSJ3に進み、アドバイス種別の数の範囲で乱数を発生させ、発生させた乱数値をアドバイス種別actionにセットした後、後述のステップSJ5に進む。一方、レジスタrndの乱数値が1であると、上記ステップSJ2の判断結果はYESになり、ステップSJ4に進む。ステップSJ4では、達成度ランクachieveおよび達成度ランク変化changeで指定される状態において、アクション番号検索ポインタiを歩進させながら、価値関数テーブルvalue[achieve][change][i]から最も効果的最大Qアクション価値maxQなアドバイス種別actionを探し出す最大Qアクション処理図11参照を実行した後、ステップSJ5に進む。そして、ステップSJ5では、アドバイス種別actionで指定される種類のアドバイスを実行して本処理を終える。なお、ここで言うアドバイスの実行とは、例えばアドバイス種別actionで指定されるアドバイスの文言を画面表示したり音声合成したりしてユーザに報知することを指す。以上説明したように、第1実施形態では、ユーザの演奏入力に応じて発生する演奏データが、手本模範演奏となる曲データ中のどの音符データに該当し、かつその該当音符データを右手、左手および両手の何れで弾いたのかを特定し、特定された音符データのピッチiPitと演奏データのピッチとを比較して当該音符データの音が正しく弾かれたかどうかを判定し、正しく弾かれた音符データのクリアフラグiClearを1にセットする。そして、曲データ中の全ての音符データに含まれる演奏技術タイプiTechから演奏技術の種別毎の発生回数およびクリア回数正しく弾かれた回数を抽出し、抽出した発生回数およびクリア回数から得られる演奏技術の種別毎の正解率クリア回数/発生回数に、演奏技術の種別に応じた難易度を乗算して演奏技術の種別毎の達成度を算出し、算出された各達成度を累算することで曲の難易度に応じた達成度achieveValueを取得する。取得した達成度achieveValueに基づき価値関数テーブルvalueの状態変数達成度ランクachieveおよび達成度ランク変化changeを更新し、更新した状態変数に応じて価値関数テーブルvalue[achieve][change][action]から探し出される最も効果的最大Qアクション価値maxQなアドバイス種別actionにより指定される種類のアドバイスを演奏入力するユーザに与えるので、ユーザの状態に応じた最適なアドバイスを与えることが可能になる。なお、上述した第1実施形態では、ユーザの演奏入力に応じて発生する演奏データが、手本模範演奏となる曲データ中のどの音符データに該当し、かつその該当音符データを右手、左手および両手の何れで弾いたのかをDPマッチングを用いて特定するようにしたので、曲データ中のどの音から弾いたとしても、演奏データに該当する音符データを特定することが出来る。[第2実施形態]次に、図14~図16を参照して第2実施形態について説明する。第2実施形態の構成は、第1実施形態と共通するので、その説明については省略する。第2実施形態が第1実施形態と相違する点は、第1実施形態では達成度achieveValueを向上させるのに最も効果的最大Qアクション価値maxQなアドバイスをユーザに与えるのに対し、第2実施形態では練習意欲を向上させ、練習時間を長くするのに最も効果的最大Qアクション価値maxQなアドバイスをユーザに与えることにある。すなわち、図14に図示するように、第2実施形態では、現在の練習時間lenに基づき価値関数テーブルvalueの状態変数state1前回練習時間lenPreおよび状態変数state2練習間隔time-timePreを更新し、更新した状態変数に応じて価値関数テーブルvalue[state1][state2][action]から練習時間を長くする、つまり換言すれば練習意欲の向上を図るのに最も効果的最大Qアクション価値maxQなアドバイスを探し出す。以下では、こうした第2実施形態による変数更新処理および最大Qアクション処理の各動作を説明する。なお、第2実施形態では、演奏入力処理ステップSA3において、演奏入力に応じた演奏データを保存する一方、演奏入力が行われる毎に開始時刻および終了時刻を記録するものとする。1第2実施形態による変数更新処理の動作図15を参照して第2実施形態による変数更新処理の動作を説明する。前述した第1実施形態と同様、メインルーチンのステップSA7図2参照を介して本処理が実行されると、CPU13は図15に図示するステップSK1に処理を進め、前回の練習時間lenPreをレジスタstate1以下、状態変数state1と称すにストアし、続くステップSK2では、今回の開始時刻timeから前回の終了時刻timePreを減算して得た練習間隔をレジスタstate2以下、状態変数state2と称すにストアする。そして、ステップSK3では、状態変数state1および状態変数state2で指定される状態において、アクション番号検索ポインタiを歩進させながら、価値関数テーブルvalue[state1][state2][i]から最も効果的最大Qアクション価値maxQなアドバイス種別actionを探し出す最大Qアクション処理を実行する。次いで、ステップSK4では、状態変数state1および状態変数state2で指定される現在の状態におけるアドバイス種別actionの現在価値afterQを、価値関数テーブルvalue[state1][state2][action]から取得する。続いて、ステップSK5では、前回の状態変数state1Prおよび前回の状態変数state2Prで指定される前回状態における前アドバイス種別prevActionの前回価値vを、価値関数テーブルvalue[state1Pr][state2Pr][prevAction]から取得する。次に、ステップSK6では、次式2に従って現在価値afterQに応じて前回の状態および前回価値vを更新する。value[state1Pr][state2Pr][prevAction]←valpha×gamma×afterQ-vreward...2なお、上記1式において、alphaは学習率、gammaは割引率、rewardは報酬練習時間の長さlenである。そして、ステップSK7では、現在の状態変数state1、状態変数state2およびアドバイス種別actionを、それぞれ前回の状態変数state1Pr、状態変数state2Prおよびアドバイス種別prevActionに更新して本処理を終える。2第2実施形態による最大Qアクション処理の動作次に、図16を参照して第2実施形態による最大Qアクション処理の動作を説明する。上述した変数更新処理のステップSK3図15参照を介して本処理が実行されると、CPU13は図16に図示するステップSL1に処理を進める。ステップSL1~SL3では、アクション番号検索ポインタi、最大Qアクション価値maxQおよびアクション種別indexをそれぞれゼロクリアする。続いて、ステップSL4では、全てのアクションについて検索し終えたかどうかを判断する。検索し終えていなければ、判断結果はNOになり、ステップSL5に進み、状態変数state1および状態変数state2で指定される状態において、アクション番号検索ポインタiに応じたアドバイス価値qを、価値関数テーブルvalue[state1][state2][i]から取得する。そして、ステップSL6では、価値関数テーブルvaluevalue[state1][state2][i]から読み出したアドバイス価値qが、最大Qアクション価値maxQより大きいか否かを判断する。最初のパスでは、上記ステップSL2において最大Qアクション価値maxQはゼロクリアされている為、判断結果はNOになり、ステップSL7に進む。ステップSL7では、アクション番号検索ポインタiをアクション種別indexに保持し、続くステップSL8では、アクション番号検索ポインタiに応じて、価値関数テーブルvalue[state1][state2][i]から読み出したアドバイス価値qを最大Qアクション価値maxQとして保存しておく。次いで、ステップSL9では、アクション番号検索ポインタiをインクリメントして歩進させた後、上述のステップSL4に処理を戻す。以後、アクション番号検索ポインタiの歩進に応じて価値関数テーブルvalue[state1][state2][i]からアドバイス価値qを読み出し、読み出したアドバイス価値qが最大Qアクション価値maxQを超えると、上記ステップSL6の判断結果がYESになり、ステップSL10に進む。ステップSL10~ステップSL13では、検索される最大Qアクション価値maxQが常に同じものとなる単調化を避ける為、ランダムに変化する要素を追加する。すなわち、ステップSL10では、パート指定データiHandが1であるか否か、つまり距離算出対象が左手パートであったかどうかを判断する。右手パートであったならば、判断結果はNOになり、上述したステップSL9に処理を進め、アクション番号検索ポインタiを歩進させた後、前述のステップSL4に処理を戻す。この場合、ランダムに変化する要素は追加されない。一方、左手パートの場合には、上記ステップSL10の判断結果がYESとなり、ステップSL11に進み、0又は1の乱数を発生させてレジスタrndにストアする。次いで、ステップSL12では、レジスタrndの乱数値が1であるか否かを判断する。レジスタrndの乱数値が0ならば、判断結果はNOになり、上述したステップSL9に進むが、レジスタrndの乱数値が1であると、判断結果はYESになり、ステップSL13に進み、アドバイス種別indexに、アクション番号検索ポインタiをセットして上述のステップSH9に進む。これにより、ランダムに変化する要素が追加されることになる。こうして、ランダムに変化する要素を加味しつつ、アクション番号検索ポインタiの歩進に応じて、価値関数テーブルvalue[state1][state2][i]から全てのアクションアドバイスの種別を検索し終えると、上述したステップSL4の判断結果がYESになり、最大Qアクション価値maxQとなったアドバイス価値qを指定したアクション種別indexを、アドバイス種別actionにセットして本処理を終える。以上のように、第2実施形態によれば、現在の練習時間lenに基づき価値関数テーブルvalueの状態変数state1前回練習時間lenPreおよび状態変数state2練習間隔time-timePreを更新し、更新した状態変数に応じて価値関数テーブルvalue[state1][state2][action]から練習時間を長くする、つまり換言すれば練習意欲の向上を図るのに最も効果的最大Qアクション価値maxQなアドバイス種別actionにより指定される種類のアドバイスを演奏入力するユーザに与えるので、ユーザの状態に応じた最適なアドバイスを与えることが可能になる。なお、上述の第2実施形態では、ユーザの練習意欲の向上を図り、練習時間を長くするのに効果的なアドバイスを与えるようにしたが、これに限らず、図17に図示する一例のように、ユーザの練習意欲の向上を図り、練習間隔time-timePreを短くして頻繁に練習させるのに効果的なアドバイスを与える態様とすることも可能であり、この態様でもユーザの状態に応じた最適なアドバイスを与えることが可能になる。以上、本発明の実施の一形態について説明したが、本発明はそれに限定されるものではなく、本願出願の特許請求の範囲に記載された発明とその均等の範囲に含まれる。以下では、本願出願当初の特許請求の範囲に記載された各発明について付記する。付記[請求項1]曲を構成する各音を表す複数の音符データを記憶する記憶手段と、前記記憶手段に記憶される複数の音符データと、ユーザの演奏入力に応じて発生した演奏データとの比較に基づきユーザの演奏技量を評価して曲の難易度に応じた達成度を取得する達成度取得手段と、前記達成度取得手段により取得された達成度の向上を図るのに最も効果的なアドバイスを発生してユーザに与えるアドバイス発生手段とを具備することを特徴とする演奏教習装置。[請求項2]前記アドバイス発生手段は、前記達成度取得手段により取得された達成度から第1および第2の状態変数を生成する状態変数生成手段と、前記状態変数生成手段により生成された第1および第2の状態変数に応じて、複数のアドバイス種別の中から最大価値のアドバイスを抽出するアドバイス抽出手段とを備えることを特徴とする請求項1記載の演奏教習装置。[請求項3]前記状態変数生成手段は、前記達成度取得手段により取得された達成度から達成度ランクを取得する第1の状態変数取得手段と、前記達成度取得手段により取得された現在の達成度と前回取得された前回の達成度との差分に応じた達成度ランク変化を取得する第2の状態変数取得手段とを備え、前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した達成度ランクと、前記第2の状態変数取得手段が取得した達成度ランク変化とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から最大価値を有する種別のアドバイスを抽出することを特徴とする請求項2記載の演奏教習装置。[請求項4]演奏入力が行われる毎に開始時刻および終了時刻を記録する時刻記録手段を更に備え、前記状態変数生成手段は、前記時刻記録手段により記録された前回の開始時刻および終了時刻から前回練習時間を取得する第1の状態変数取得手段と、前記時刻記録手段により記録された今回の開始時刻および前回の終了時刻から練習間隔を取得する第2の状態変数取手段とを備え、前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した前回練習時間と、前記第2の状態変数取手段が取得した練習間隔とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から練習時間を長くするのに最も効果的なアドバイスを抽出することを特徴とする請求項2記載の演奏教習装置。[請求項5]前記アドバイス抽出手段は、前記第1の状態変数取得手段が取得した前回練習時間と、前記第2の状態変数取手段が取得した練習間隔とで指定される状態において、価値関数テーブルに登録される複数のアドバイス種別の中から練習間隔を短くして頻繁に練習させるのに最も効果的なアドバイスを抽出することを特徴とする請求項4記載の演奏教習装置。[請求項6]前記アドバイス発生手段は、前記達成度取得手段により取得された達成度から第1および第2の状態変数を生成する状態変数生成手段と、前記状態変数生成手段により生成された第1および第2の状態変数に応じて、Q学習理論に基づく価値関数テーブルから最大価値のアドバイスを抽出するアドバイス抽出手段とを備えることを特徴とする請求項1記載の演奏教習装置。[請求項7]演奏教習装置に搭載されるコンピュータに、曲を構成する各音を表す複数の音符データと、ユーザの演奏入力に応じて発生した演奏データとの比較に基づきユーザの演奏技量を評価して曲の難易度に応じた達成度を取得する達成度取得ステップと、前記達成度取得ステップにより取得された達成度の向上を図るのに最も効果的なアドバイスを発生してユーザに与えるアドバイス発生ステップとを実行させることを特徴とするプログラム。