(57)【特許請求の範囲】
【請求項１】
演奏者が演奏操作子群に対して行った演奏操作の情報である被験データと、前記演奏操作子群への目標とすべき演奏操作の情報である基準データとから、演奏者の演奏内容を分析する装置であって、
前記被験データの演奏イベントデータと前記基準データの演奏イベントデータの対応関係を検出するイベントマッチ手段と、
前記イベントマッチ手段が検出した対応関係に従って、前記被験データの演奏イベントデータと前記基準データの演奏イベントデータとを対比し、前記演奏イベントデータ毎に、該演奏イベントデータのパラメータの差分、及びイベント発生タイミングの時間の差分を取得する差分取得手段と、
前記差分取得手段が取得した差分の少なくとも１種類の差分を用いて、演奏者の演奏内容を分析する分析手段と、
前記分析手段の分析結果を演奏者に通知する通知手段と、
前記差分取得手段が取得した差分の少なくとも１種類の差分に基づいて前記基準データを変更する演奏データ変更手段と、
前記演奏データ変更手段により変更された前記基準データを再生させる再生手段と、
を具備したことを特徴とする演奏分析装置。
【請求項２】
前記演奏データ変更手段は、前記基準データの変更に用いる差分を強調させた上で前記基準データを変更する、ことを特徴とする請求項１記載の演奏分析装置。
【請求項３】
前記演奏データ変更手段は、演奏者により指定された種類のパラメータの差分に基づいて前記基準データを変更する、ことを特徴とする請求項１記載の演奏分析装置。
【請求項４】
演奏者が演奏操作子群に対して行った演奏操作の情報である被験データと、前記演奏操作子群への目標とすべき演奏操作の情報である基準データとから、演奏者の演奏内容を分析する方法であって、
前記被験データの演奏イベントデータと前記基準データの演奏イベントデータの対応関係を検出し、
該検出した対応関係に従って、前記被験データの演奏イベントデータと前記基準データの演奏イベントデータとを対比し、前記演奏イベントデータ毎に、該演奏イベントデータのパラメータの差分、及びイベント発生タイミングの時間の差分を取得し、
前記取得した差分の少なくとも１種類の差分を用いて、演奏者の演奏内容を分析し、
前記分析の結果を演奏者に通知し、
前記取得した差分の少なくとも１種類の差分に基づいて前記基準データを変更し、
該変更された基準データを再生させる、
ことを特徴とする演奏分析方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、鍵盤等の演奏操作子群に対して演奏者が行った操作（演奏）内容を分析する技術に関する。
【０００２】
【従来の技術及び発明が解決しようとする課題】
電子楽器等においては、近年、多機能化がすすみ、様々な機能が搭載されてきている。電子楽器に搭載されるようになった機能の一つとして、例えばナビゲート機能がある。
【０００３】
ナビゲート機能は、所望の楽曲の演奏において、鍵盤（演奏操作子群）等に対して行うべき操作内容を演奏者に通知する機能である。ナビゲート機能を搭載した電子楽器には、その機能の搭載に合わせて、例えば各鍵に対する操作を個別に指示するためのＬＥＤ群が設けられる。ナビゲート機能による演奏内容の通知は、例えば楽曲の演奏の進行に合わせて、操作すべき鍵のＬＥＤを順次点灯させることで行われる。
【０００４】
なお、演奏内容の通知としては、演奏者が操作すべき鍵とは異なる他の鍵を操作したとき、或いは操作すべき鍵に対する操作が所定時間以上遅れたときに、操作すべき鍵のＬＥＤを点灯させる方法もある。
【０００５】
演奏者は、ナビゲート機能を用いて楽器演奏の独習を行うことができる。しかし、このナビゲート機能は、操作すべき演奏操作子の指示を行うだけか、或いは演奏者の演奏内容についての評価を行う機能を有する場合であっても、音高（鍵）の一致、不一致のみといったように少ない評価項目からそれを評価するだけである。このため、楽器演奏の独習を行う場合、演奏者は、実際に行った演奏についての評価を実質的に自分自身で行うようなものとなっていた。
【０００６】
周知のように、自身が行った演奏を客観的に把握することは非常に困難である。このため、楽器演奏の独習を行う場合には、演奏者は演奏における不具合な点を見つけ、その原因を究明して練習にフィードバックしたりすることが必ずしもできないことから、高い練習効率を得ることができないという問題点が発生していた。
【０００７】
音楽教室に通える人や、個人レッスン等を受けられる人は、教師から指導を受けられるので、上記問題点は回避される。しかし、地理的、金銭的、時間的といった各種の理由により、楽器の演奏を独習する以外に方法がない人も少なくないのが実状である。
【０００８】
このような人々にとって、自身で行った演奏を客観的に示す情報は、演奏における不具合の発見やその原因の究明を容易にしたり、更には演奏技術を向上させるための手助けになる。
【０００９】
本発明の課題は、練習効率を向上させるための情報を演奏者に提供することにある。
【００１０】
【課題を解決するための手段】
本発明の演奏分析装置は、演奏者が演奏操作子群に対して行った演奏操作の情報である被験データと、演奏操作子群への目標とすべき演奏操作の情報である基準データとから、演奏者の演奏内容を分析することを前提とし、被験データの演奏イベントデータと基準データの演奏イベントデータの対応関係を検出するイベントマッチ手段と、イベントマッチ手段が検出した対応関係に従って、被験データの演奏イベントデータと基準データの演奏イベントデータとを対比し、演奏イベントデータ毎に、該演奏イベントデータのパラメータの差分、及びイベント発生タイミングの時間の差分を取得する差分取得手段と、差分取得手段が取得した差分の少なくとも１種類の差分を用いて、演奏者の演奏内容を分析する分析手段と、分析手段の分析結果を演奏者に通知する通知手段と、差分取得手段が取得した差分の少なくとも１種類の差分に基づいて基準データを変更する演奏データ変更手段と、演奏データ変更手段により変更された基準データを再生させる再生手段と、を具備する。
【００１１】
なお、上記の構成において、演奏データ変更手段は、基準データの変更に用いる差分を強調させた上で基準データを変更する、ことが望ましい。
【００１２】
また、演奏データ変更手段は、演奏者により指定された種類のパラメータの差分に基づいて基準データを変更する、ことが望ましい。
【００１３】
本発明の演奏分析方法は、演奏者が演奏操作子群に対して行った演奏操作の情報である被験データと、演奏操作子群への目標とすべき演奏操作の情報である基準データとから、演奏者の演奏内容を分析することを前提とし、被験データの演奏イベントデータと基準データの演奏イベントデータの対応関係を検出し、該検出した対応関係に従って、被験データの演奏イベントデータと基準データの演奏イベントデータとを対比し、演奏イベントデータ毎に、該演奏イベントデータのパラメータの差分、及びイベント発生タイミングの時間の差分を取得し、取得した差分の少なくとも１種類の差分を用いて、演奏者の演奏内容を分析し、分析の結果を演奏者に通知し、取得した差分の少なくとも１種類の差分に基づいて基準データを変更し、変更された基準データを再生させる。
【００２４】
演奏者が自身でその演奏技術を正確に把握するためには、演奏者が行った演奏がどのようなものであるかを情報として演奏者に提供することが望まれる。本発明は、演奏者の演奏内容を手本、或いは基準となる演奏内容と対比して分析し、それらの演奏内容から異なる部分の情報、或いはそれらの間の相違を対比するための情報を具体的な形で演奏者に提供する。これによって、演奏者は自身の演奏内容を客観的、且つ具体的に把握することが可能となり、更には、課題を克服するための効果的な練習を行えるようになる。
【００２５】
本発明は、演奏者の演奏内容を手本、或いは基準となる演奏内容に反映させ、その反映させた演奏内容で再生させる。これにより、演奏者は自身の演奏で悪い点を聴感から認識（把握）することが可能となる。また、演奏者が、演奏の部分的な箇所ではなく、全体的な演奏傾向を認識することも容易となる。
【００２６】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
＜第１の実施の形態＞
図１は、本実施の形態が適用された電子楽器１００の構成を示すブロック図である。図１を参照して、その構成、及び概略動作について説明する。
【００２７】
メインＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ  ）１０１は、プログラムＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０２に予め記憶されているプログラムを読み出し、それを実行することで楽器１００全体の制御を実行する。
【００２８】
コントロールスイッチ群１０３は、特には図示しない各種スイッチをまとめて表現したものである。メインＣＰＵ１０１は、コントロールスイッチ群１０３の各種スイッチに対して行われた操作を検出し、検出した操作内容に応じたモードや音色、テンポといった各種パラメータ等の設定を行い、それらの設定内容を示す情報をワークＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０４の所定の記憶領域上に格納する。
【００２９】
鍵盤装置１０５は、例えば鍵が押鍵されたときの速さ、それが押されている圧力を検出するタッチレスポンス機能を備え、ユーザの操作内容に応じて発生する検出信号を鍵盤情報生成装置１０６に出力する。鍵盤情報生成装置１０６は、鍵盤装置１０５から入力した検出信号を基に、操作された鍵を特定して、その鍵に割り当てられた音高を示すノートナンバー、押鍵時の速さ（ベロシティ）、押鍵されている圧力等の各種情報を、鍵盤情報として出力する。
【００３０】
第１の実施の形態による電子楽器１００は、鍵盤装置１０５の他に、他の演奏操作子として、各種ペダルや、ピッチベンダ等を備えている。これらは図１において他の演奏操作子群１０７として表現している。
【００３１】
メインＣＰＵ１０１は、鍵盤情報生成装置１０６から入力した鍵盤情報、及び他の演奏操作子群１０７の各演奏操作子が操作された内容に応じて、発音命令を生成し、これを楽音発生装置１０８に出力する。
【００３２】
楽音発生装置１０８は、例えばＰＣＭ音源であり、メインＣＰＵ１０１から入力した制御コマンドに従って音色や音響効果等の各種設定を行う。また、メインＣＰＵ１０１が出力した発音命令を入力すると、該発音命令に従って特には図示しない波形メモリから波形データを読み出し、該読み出した波形データに対して設定に応じた処理を施した後、Ｄ／Ａコンバータ１０９に波形データ（波高値）を出力する。
【００３３】
Ｄ／Ａコンバータ１０９は、楽音発生装置１０８から入力した波形データをＤ／Ａ変換して、アナログの波形信号を出力する。Ｄ／Ａコンバータ１０９が出力した波形信号は、アンプ１１０により増幅された後、スピーカ１１１に入力される。これにより、演奏者が鍵盤装置１０５、他の演奏操作子群１０７に対して行った操作に応じて、スピーカ１１１から楽音が発音される。
【００３４】
第１の実施の形態において、基準データＲＡＭ１１２、及び被験データＲＡＭ１１３は、それぞれ演奏データの格納に用いられる。第１の実施の形態では、演奏データはスタンダードＭＩＤＩ（Ｍｕｓｉｃａｌ  Ｉｎｓｔｒｕｍｅｎｔ  Ｄｉｇｉｔａｌ  Ｉｎｔｅｒｆａｃｅ）ファイル（以降、ＳＭＦと記す）の形式で各ＲＡＭ１１２、１１３に格納される。これらのＲＡＭ１１２、１１３に格納される演奏データ（ＭＩＤＩデータ）は、シリアルインターフェイス１１４、ネットワークインターフェイス１１５、及び外部記憶装置１１６から供給される。
【００３５】
周知のように、上記ＳＭＦは、ヘッダーブロックとトラックブロックの２種類から構成される。ヘッダーブロックは、ＳＭＦの先頭に置かれ、それに１つ以上のトラックブロックが続く構成である。
【００３６】
ヘッダーブロックには、ＳＭＦに関する基本的な情報がストアされ、トラックブロックには実際の演奏データがストアされる。その演奏データは、基本的にはＭＩＤＩデータに時間情報を付けたデータストリームから構成される。時間情報は、前のイベントとのデルタタイムで表現される。
【００３７】
上記シリアルインターフェイス１１４は、特には図示しないＭＩＤＩ端子を介して外部の装置とのＭＩＤＩデータの授受を行い、ネットワークインターフェイス１１５は、ネットワークを介して外部の装置とのＭＩＤＩデータの授受を行う。外部記憶装置１１６は、フロッピーディスク、ＣＤ−ＲＯＭ、或いはメモリカード等を記憶媒体として、それに対するアクセスを行うものである。メインＣＰＵ１０１は、コントロールスイッチ群１０３の所定のスイッチに対する操作に応じて、これらネットワークインターフェイス１１５、外部記憶装置１１６から出力される演奏データを基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３に格納させる。なお、図中の手本データＲＡＭ１２０は、第３の実施の形態における構成要素であり、それについての説明は第３の実施の形態を説明するときに行う。
【００３８】
また、メインＣＰＵ１０１は、シリアルインターフェイス１１４、ネットワークインターフェイス１１５、或いは外部記憶装置から供給された演奏データ、基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３に格納されている演奏データから、発音命令を生成し、それを楽音発生装置１０８に出力することにより、自動演奏を行う。
【００３９】
上記基準データＲＡＭ１１２には、演奏者が手本とすべき演奏（基準演奏）の演奏データが格納され、他方の被験データＲＡＭ１１３には、演奏者が行った演奏の演奏データが格納される。以降、基準データＲＡＭ１１２に格納された演奏データを基準データ、被験データＲＡＭ１１３に格納された演奏データを被験データと記載する。
【００４０】
メインＣＰＵ１０１は、自動演奏を行う一方、基準データと被験データを対比して、被験データで表現（再生）される演奏内容を分析し、その分析結果を表示装置１１７に表示させる。また、その分析結果に基づき、演奏者の演奏内容の傾向を強調した形に被験データを変更し、該変更した被験データを再生させる自動演奏を行う。
【００４１】
基準データと被験データの対比は、詳細は後述するが、基準データ、及び被験データのそれぞれから分析に必要なデータをイベント毎にまとめて、ワークＲＡＭ１０４の異なるワークエリア上にそれぞれ別に格納させた後、そのワークエリア上に格納させたそれぞれの分析用データを用いて、１イベント毎に、基準データと被験データの間の対応関係を検出することで行う。その後、その対応関係に従ってイベント毎に、基準データと被験データの間の差分をパラメータ別に求め、そのパラメータ別に求めた差分を用いて分析を行う。
【００４２】
図２は、１音符（ノートデータ）あたりの分析用データの構造を示す図である。ＭＩＤＩでは、音符の発音開始とその終了をそれぞれ指定するようになっている。このため、ノートオンイベントとノートオフイベントのＭＩＤＩデータが１つのノートデータを構成する。そのノートデータは、最も出現頻度の高いイベントデータである。
【００４３】
図２において、ノートナンバー、ベロシティ、押鍵タイミング、離鍵タイミング、押鍵時間（音符長）は、基準データから直接的に得られるデータ（１次データ）である。シリアル番号は、そのイベントデータが発生した順序を示す番号であり、その先頭のノートデータから逐次重複のない番号が与えられる。他方のタイミング番号は、イベントデータが発生したタイミングに対して付けた番号（順序）である。従って、例えばコード（和音）を鳴らすために、演奏者が複数の演奏操作子（鍵）を同時、或いはほぼ同時に操作した場合、それらのノートデータには同じタイミング番号が与えられる。これらシリアル番号、及びタイミング番号は、基準データと被験データの各演奏データ中に含まれているノートデータの対応関係を特定するために用いられる。
【００４４】
ベロシティ差分、押鍵タイミング差分、離鍵タイミング差分、音符長差分は、対応付けした基準データのノートデータと被験データのノートデータとを対比することで得られるデータである。これらはワークＲＡＭ１０４に格納させずに、必要に応じて求めるようにしても良い。制御用フラグは、基準データと被験データ間でノートデータの対応関係を検出した結果として、このノートデータを演奏内容の分析に用いるか否かを示すデータである。
【００４５】
メインＣＰＵ１０１は、図２に示すような分析用データを１音符（ノートデータ）毎にまとめてワークＲＡＭ１０４に所定の形式で格納する。分析用データは、基準データ、及び被験データから、それぞれ作成し、ワークエリアを変えてワークＲＡＭ１０４に格納する。その後、メインＣＰＵ１０１は、ワークＲＡＭ１０４に格納した１音符（ノートデータ）毎の分析用データを用いて各種の演算処理を行い、その演算結果を分析結果として表示装置１１７に出力させる。第１の実施の形態では、平均値、標準偏差、度数分布等をベロシティ、押鍵タイミング等の各パラメータ毎に求め、それを分析結果として表示させている。
【００４６】
なお、第１の実施の形態では、基準データ、及び被験データはともに外部装置、或いは記憶媒体から供給するようにしているが、鍵盤装置１０５に対して行われた操作内容を表現する演奏データを生成し、この生成した演奏データを各ＲＡＭ１１２、或いは１１３に格納するようにしても良い。
【００４７】
以上が、図１に示す電子楽器１００の構成、及び概略動作である。次に、図３〜図１８に示す動作フローチャートを参照して、メインＣＰＵ１０１の動作を詳細に説明する。最初に、メインＣＰＵ１０１が実行する演奏分析処理について、図３に示すその動作フローチャートを参照して詳細に説明する。
【００４８】
この演奏分析処理は、ユーザ（演奏者）がコントロールスイッチ群１０３の所定のスイッチを操作し、演奏傾向の分析を指示した場合に、メインＣＰＵ１０１が、プログラムＲＯＭ１０２に格納されている制御プログラムを読み出してそれを実行することで実現される処理である。
【００４９】
先ず、ステップ３０１では、演奏データ取得処理を実行する。上述したように、第１の実施の形態では、ネットワークインターフェイス１１５、或いは外部記憶装置１１６から基準データ、被験データの各演奏データを取得するようにしている。上記演奏データ取得処理は、例えばユーザがコントロールスイッチ群１０３の所定のスイッチに対する操作に応じて、演奏データを基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３の一方に格納する処理である。取得した演奏データは、スタンダードＭＩＤＩファイルのデータ形式で各ＲＡＭ１１２、１１３に格納される。
【００５０】
ステップ３０１に続くステップ３０２では、所得した基準データ、被験データの各演奏データに含まれているノートデータ数を取得するノート数取得処理を実行する。ノートデータ数を取得すると、続くステップ３０３において、各演奏データから１次データ（図２参照）を取得する１次データ取得処理を実行する。この１次データ取得処理が終了すると、ステップ３０４の処理に移行する。
【００５１】
ステップ３０４では、基準データと被験データ間におけるノートデータの対応関係を求めるノートマッチ処理を実行する。このノートマッチ処理の実行によって、基準データと被験データ間におけるノートデータの対応関係が確定される。図２に示す１音符（ノートデータ）あたりの分析用データとして、シリアル番号、及びタイミング番号が各音符（ノートデータ）毎にワークＲＡＭ１０４に書き込まれる。
【００５２】
ステップ３０４に続くステップ３０５〜３０７では、確定したノートデータの対応関係から、演奏者の演奏傾向を表現する数値を算出する処理を行う。
先ず、ステップ３０５では、基準データと被験データのノートデータを対応させて、パラメータ毎にその差分を求める差分取得処理を実行する。この差分取得処理を実行することによって、図２に示す１音符（ノートデータ）あたりの分析用データとして、ベロシティ差分、押鍵タイミング差分、離鍵タイミング差分、及び音符長差分が各音符（ノートデータ）毎にワークＲＡＭ１０４に書き込まれる。
【００５３】
ステップ３０５に続くステップ３０６では、そのステップ３０５の差分取得処理の実行によりノートデータ（音符）毎に得た各パラメータの差分の平均値を求める平均値取得処理を行う。これに続くステップ３０６では、予め定められた設定に従って被験データ（演奏曲）を区間分けし（例えば複数の小節を１区間とする）、平均値所得処理を実行することによって得た各パラメータの差分の平均値をそれぞれ基準として、各区間毎の度数分布、標準偏差を各パラメータ毎に求める標準偏差取得処理を実行する。この標準偏差取得処理の終了により、演奏者の演奏傾向を表現する数値の算出が終了する。
【００５４】
ステップ３０７に続くステップ３０８では、演奏者の演奏傾向の分析結果、即ちステップ３０７で各パラメータ毎に求めた標準偏差、度数分布を出力する分析結果出力処理を実行する。この分析結果出力処理を実行することにより、表示装置１１７の画面上に、演奏曲を分割した各区間毎に各パラメータの標準偏差、及び度数分布が出力される。度数分布の表示は、例えば各パラメータの差分の最大値、及び最小値に応じて、差分の大きさを複数の段階に分け、各段階毎にその段階に属するノートデータ（音符）数を表示することで行う。
【００５５】
度数分布や標準偏差等は、標本値の分布の特徴を表すのによく用いられる特性量である。基準データと被験データを対応させ、ノートデータ毎に求めた各パラメータの差分の分布を上記特性量で表現することにより、演奏者は自身の演奏傾向を具体的に把握することができるようになる。これにより、例えば、押鍵タイミングが遅れがちであればそれを直すように、演奏上の悪い傾向や欠点を矯正するように意識した練習を行えることから、高い練習効率を得ることができる。
【００５６】
第１の実施の形態では、演奏曲を区間分けし、各区間毎に特性量を求めてそれを表示させている。これには、演奏曲を構成する各メロディを演奏した際に、どのような不具合が生じているかを演奏者が容易に把握できるようにする意味も含まれている。これにより、演奏者は自身の演奏の分析をより細かく具体的に行うことができる。
【００５７】
ステップ３０７に続くステップ３０９では、基準データに対し、ステップ３０５で得た各パラメータの差分を強調させた変更を行い、その変更後の基準データを再生させる差分強調再生処理を実行する。この基準データの再生が終了した後、一連の処理を終了する。
【００５８】
各パラメータの差分を強調させて基準データを再生することにより、演奏者に対して、自己の演奏傾向を具体的に聴感として認識させることができる。このため、演奏者は自己の演奏傾向を容易に把握することができるようになり、楽器演奏の独習に大きく貢献することができる。第１の実施の形態では、この差分を強調させた基準データの再生の他に、ステップ３０８で分析結果を表示させているため、演奏者の楽器の独習により大きく貢献することができる。
【００５９】
次に、上記ステップ３０１〜３０６の各サブルーチン処理について、図４〜図１８を参照して詳細に説明する。
図４は、図３のステップ３０１として実行される演奏データ取得処理の動作フローチャートである。この図４を参照して、最初に演奏データ取得処理について詳細について説明する。
【００６０】
上述したように、この演奏データ取得処理は、ネットワークインターフェイス１１５が受信した、或いは外部記憶装置１１６が読み出した記憶媒体に記憶されたＳＭＦ形式の演奏データを、コントロールスイッチ群１０３の所定のスイッチに対して行われた操作内容に応じて基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３の一方に格納する処理である。
【００６１】
なお、ＳＭＦは、周知のように、データ長、トラックブロック数、分解能等のファイルに関する基本的な情報がストアされているヘッダーブロックと、実際の演奏情報がストアされているトラックブロックの２種類のブロックから構成されているファイルである。ＳＭＦでは、ＭＩＤＩイベントの時間情報は前のイベントからのデルタタイムで表される。トラックブロックにストアされている１イベントのＭＩＤＩデータは、基本的に、上記時間情報と、その時間情報に従って管理されるイベントデータとから構成されている。
【００６２】
先ず、ステップ４０１では、ネットワークインターフェイス１１５、或いは外部記憶装置１１６が出力したヘッダーブロックを受け取り、対象となるＳＭＦのファイルサイズを取得する。ファイルサイズを取得すると、ステップ４０２の処理に移行する。
【００６３】
ステップ４０２では、取得したファイルサイズ分の格納領域をＲＡＭ１１２、或いは１１３に確保する。格納領域の確保が終了すると、続くステップ４０３において、その確保した格納領域の先頭のポインタを取得する。
【００６４】
ステップ４０３に続くステップ４０４では、確保した格納領域の先頭ポインタから、ネットワークインターフェイス１１５、或いは外部記憶装置１１６が出力するＳＭＦ（演奏データ）を順次格納させる。このＳＭＦのロードが終了した後、ステップ４０５の処理に移行する。
【００６５】
ステップ４０５では、データアクセス用のオフセットポインタｓｍｆｃｏｕｎｔをクリアする。ポインタｓｍｆｃｏｕｎｔはメインＣＰＵ１０１内部のレジスタ、或いはワークＲＡＭ１０４に保持される変数である。このポインタｓｍｆｃｏｕｎｔのクリアが終了すると、続くステップ４０６において、ステップ４０４でロードしたＳＭＦのヘッダーブロックの情報（ヘッダーブロックにはその長さ（ヘッダー長）がストアされている）を読み取り、演奏シーケンスデータ、即ちトラックブロックが始まる先頭のオフセットポインタ値、及び演奏データ数を取得する。このオフセットポインタ値、及び演奏データ数を取得した後、一連の処理を終了する。
【００６６】
このようにして、演奏者（ユーザ）の指定に応じて演奏データが基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３に格納される。なお、第１の実施の形態では、ネットワークインターフェイス１１５、及び外部記憶装置１１６が出力した演奏データ（ＳＭＦ）をＲＡＭ１１２、１１３に格納させるようにしているが、演奏データが供給される形態はこれらに限定するものではない。例えば鍵盤装置１０５に対して行われた操作内容（イベント）をＭＩＤＩデータで表現し、それに時間情報を付加してＲＡＭ１１２、或いは１１３に格納するようにしても良い。また、シリアルインターフェイス１１４が受信したＭＩＤＩデータに対しても、時間情報を付けてＳＭＦの形式でＲＡＭ１１２、１１３に格納しても良い。
【００６７】
図５は、図３のステップ３０２として実行されるノート数取得処理の動作フローチャートである。次に、この図５を参照して、ノート数取得処理について詳細に説明する。ノート数取得処理は、基準データ、及び被験データの各演奏データに対して行われるが、ここでは基準データに対して行うことを想定してその説明を行う。これは、この図５のノート数取得処理内で実行される各種サブルーチン処理においても同様である。
【００６８】
このノート数取得処理では、時間情報を無視して基準データＲＡＭ１１２に格納された基準データを先頭から再生し、各チャンネル毎にノートデータ（音符）の数を計数することが行われる。
【００６９】
ステップ５０１〜５０４では、この一連の処理を行ううえでの初期設定に関わる処理が行われる。
先ず、ステップ５０１では、ノートデータをカウントするモードであるカウントモードをセットする。続くステップ５０２では、ノートデータの計数の対象とするトラックのデータ数を変数ｔｏｂｅｒｅａｄにセットする。これは、ＳＭＦのトラックブロックの先頭部分にストアされているトラックデータ長を読み出し、それを変数ｔｏｂｅｒｅａｄにセットすることにより実現される。
【００７０】
変数ｔｏｂｅｒｅａｄにトラックのデータ数をセットした後は、次にステップ５０３において、オフセットポインタｓｍｆｃｏｕｎｔに、図４のステップ４０６で取得した処理対象（基準データ）のＳＭＦのオフセットポインタ値をセットする。続くステップ５０４では、各イベントデータの時間管理を行うための変数であるタイムクロックｃｕｒｒｔｉｍｅをクリアする。上記変数ｔｏｂｅｒｅａｄ、タイムクロックｃｕｒｒｔｉｍｅは、メインＣＰＵ１０１内部のレジスタ、或いはワークＲＡＭ１０４に保持される変数である。
【００７１】
ステップ５０４に続くステップ５０５では、処理対象のＳＭＦからＭＩＤＩデータを読み出すＳＭＦ処理を実行する。このＳＭＦ処理を実行することにより、各チャンネル毎にノートデータ（音符）数が計数される。このＳＭＦ処理が終了した後は、ステップ５０６の処理に移行する。
【００７２】
ステップ５０６では、ステップ５０５で取得した各チャンネル毎のノートデータ（音符）数に対応させて、ワークＲＡＭ１０４にワークエリアを確保する。ステップ５０６に続くステップ５０７では、各チャンネル毎に確保したワークエリアの先頭ポインタを取得する。その後、一連の処理を終了する。なお、ステップ５０７の先頭ポインタの取得は、その先頭ポインタの値を用意した変数にセットすることで実現される処理である。
【００７３】
このノート数取得処理を実行することで、図２に示す分析用データが格納される領域が、各チャンネル毎に得たノートデータ数に応じてワークＲＡＭ１０４に用意される。
【００７４】
次に、上記ステップ５０５のＳＭＦ処理について、図６に示すその動作フローチャートを参照して説明する。
ＳＭＦのトラックブロックには、イベントデータは時間情報と対になってストアされている。時間情報は、例えば２バイトである。他方のイベントデータは、ステータスバイトとデータバイトからなり、データバイト数はステータスバイトの種類によって変化する。例えば、ステータスバイトがノートオンではデータバイト数は２、プログラムチェンジではデータバイト数は１である。このＳＭＦ処理では、ステータスバイトが定義するチャンネルメッセージの種類を判別しながら、トラックブロックを構成する各ＭＩＤＩデータの読み出しを行う。
【００７５】
先ず、ステップ６０１では、イニシャライズを行う。このイニシャライズを行うことにより、変数ｒｕｎｎｉｎｇ、及びｓｔａｔｕｓにはそれぞれ０がセットされる。これらの変数は、メインＣＰＵ１０１内部のレジスタ、或いはワークＲＡＭ１０４に格納される変数である。
【００７６】
ステップ６０１に続くステップ６０２〜６１８では、基準データＲＡＭ１１２に格納された処理対象のトラックのデータ（バイト）数がセットされている変数ｔｏｂｅｒｅａｄを、そのトラックから読み出したデータ（バイト）数に応じて減算しながら、それらの処理が繰り返し行われる。
【００７７】
ステップ６０２では、変数ｔｏｂｅｒｅａｄの値が０よりも大きいか否か判定する。処理するトラックから全てのデータを読み出した場合、その判定はＮＯとなって、ここで一連の処理が終了する。そうでない場合には、その判定はＹＥＳとなってステップ６０３の処理に移行する。そのステップ６０３では、トラックから時間情報を読み出して取得する。時間情報は、２バイトである。このため、このステップ６０３では、時間情報を取得するとともに、時間情報のバイト数を変数ｔｏｂｅｒｅａｄから減算する。ステップ６０３の処理が終了すると、ステップ６０４の処理に移行する。
【００７８】
ステップ６０４では、現在カウントモード或いはパラメータ取得モードが設定されているか否か判定する。カウントモードは、演奏データ中のノートデータ数をカウントするモードであり、一方のパラメータ取得処理は、図２の１次データを取得するモードである。これらのうちの一方のモードが設定されていた場合、その判定はＹＥＳとなってステップ６０５の処理に移行する。そうでない場合には、即ち自動演奏を行うプレイモードが設定されていた場合には、その判定はＮＯとなってステップ６０６の処理に移行する。
【００７９】
ステップ６０５では、現在までの累積時間がセットされる変数ｃｕｒｒｔｉｍｅに取得時間を加算し、その後、ステップ６０７の処理に移行する。他方のステップ６０６では、取得時間の待機を行う。その後、ステップ６０７の処理に移行する。
【００８０】
ステップ６０７では、時間情報に続く次の１バイトをＳＭＦから読み出し、それを変数ｃに代入する。ＳＭＦでは、時間情報の次はステータスバイトである。従って、ステップ６０７の処理を実行することにより、変数ｃにはステータスバイトが代入される。周知のように、このステータスバイトは１バイトである。このため、ステップ６０７では、変数ｔｏｂｅｒｅａｄのデクリメントを合わせて行う。
【００８１】
ステップ６０７に続くステップ６０８では、変数ｃに代入されたデータがチャンネルメッセージのステータスバイトか否か判定する。チャンネルメッセージは、ステータスバイトの下位４ビットにＭＩＤＩチャンネルを持ったメッセージである。その最上位ビットは、ステータスバイトを示す１であり、それに続く３ビットは、ノートオン、ノートオフ、プログラムチェンジ等のチャンネルメッセージの種類を示す情報である。その変数ｃに代入されたデータがチャンネルメッセージであった場合、ステップ６０８の判定はＹＥＳとなってステップ６０９の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ６１０の処理に移行する。ステップ６０９では、変数ｓｔａｔｕｓに変数ｃの値を代入し、変数ｒｕｎｎｉｎｇには０をセットし、その後、ステップ６１２の処理に移行する。
【００８２】
ＭＩＤＩは、片方向送信であることから、スレーブ側が正しくメッセージを受信しているか否かをマスター側がチェックする方法が存在しない。そのため、ＭＩＤＩには、接触不良や断線等の何らかの理由によりＭＩＤＩメッセージを受信できず、音が鳴りっぱなしになるといったトラブルを避けるために、アクティブセンシングという機能が用意されている。このアクティブセンシング機能は、３００ｍｓ以内にメッセージがなにも受信できなかった場合、発音中の音を自動的に止める機能である。このアクティブセンシング機能に対応して、マスター側は、３００ｍｓ以上データ間隔が空かないように、送るべきメッセージがない場合、ダミーとしてアクティブセンシング“ＦＥＨ”（Ｈは１６進数を表す）を送出しなければならない。このアクティブセンシングが変数ｃに代入されていた場合、ステップ６０８の判定はＮＯとなり、ステップ６１０の処理に移行することになる。
【００８３】
ステップ６１０では、変数ｓｔａｔｕｓの値が０か否か判定する。この変数ｓｔａｔｕｓには、変数ｃのデータがチャンネルメッセージであればステップ６０９で変数ｃのデータが代入されることから、変数ｃにアクティブセンシングが代入されていた場合、変数ｓｔａｔｕｓには何らかの値（チャンネルメッセージ）がセットされているはずである。このため、変数ｓｔａｔｕｓの値が０であった場合、即ちアクティブセンシングの前に有効となっているチャンネルメッセージがない場合、その判定はＹＥＳとなり、データ異常として一連の処理を終了する。そうでない場合には、その判定はＮＯとなってステップ６１１の処理に移行する。そのステップ６１１では、変数ｒｕｎｎｉｎｇに１をセットし、その後、ステップ６１２の処理に移行する。変数ｒｕｎｎｉｎｇにセットした１は、現在の状態をそのまま維持する（発音中の音はそのまま鳴らしているように）ことを示す値である。
【００８４】
ステップ６１２では、変数ｃに代入されているデータを解析して、それに続くバイト数ｎｅｅｄｅｄを得る。このバイト数ｎｅｅｄｅｄは、上述したように、例えば変数ｃに代入されているデータがノートオンのチャンネルメッセージであれば２、そのデータはプログラムチェンジのチャンネルメッセージであれば１である。
ステップ６１２に続くステップ６１３では、バイト数ｎｅｅｄｅｄの値が０ではないか否か判定する。バイト数ｎｅｅｄｅｄの値が０であった場合、その判定はＮＯとなってステップ６１４の処理に移行する。そうでない場合には、その判定はＹＥＳとなってステップ６１５の処理に移行する。ステップ６１４の処理に移行するのは、例えば変数ｃにアクティブセンシング（リアルタイム・メッセージ）が代入されていた場合であり、このステップ６１４では、その変数ｃに代入されているメッセージに応じたその他の処理を実行する。その処理が終了した後、ステップ６０２の処理に戻る。
【００８５】
一方、ステップ６１５では、変数ｒｕｎｎｉｎｇの値が０ではないか否か判定する。変数ｒｕｎｎｉｎｇの値が０であった場合、即ち例えば変数ｃにアクティブセンシングが代入されていた場合、その判定はＹＥＳとなってステップ６１６の処理に移行する。そうでない場合には、例えば変数ｃにチャンネルメッセージが代入されていた場合には、その判定はＮＯとなってステップ６１７の処理に移行する。
【００８６】
ステップ６１６では、変数ｃ１に変数ｃの値を代入し、その後、ステップ６１８の処理に移行する。他方のステップ６１７では、ステップ６１２で得たバイト数ｎｅｅｄｅｄに従って、その数のバイトをＳＭＦから読み出し、読み出したそれらのバイトを変数に代入する。このとき、バイト数ｎｅｅｄｅｄが１であれば、ＳＭＦから読み出した１バイトのデータを変数ｃ１に代入する。バイト数ｎｅｅｄｅｄが２であれば、ＳＭＦからさらに読み出した１バイトのデータ（２バイト目のデータ）を変数ｃ２に代入する。このステップ６１７では、バイト数ｎｅｅｄｅｄのデータをＳＭＦから読み出すので、変数ｔｏｂｅｒｅａｄからバイト数ｎｅｅｄｅｄを減算する。これらが終了した後、ステップ６１８の処理に移行する。
【００８７】
ステップ６１８では、チャンネルメッセージ処理を実行する。このチャンネルメッセージ処理には、このＳＭＦ処理から変数ｃ、変数ｃ１、及び変数ｃ２の値が引数として渡され、これら渡された各引数の値、及び現在設定されているモードに応じた内容でチャンネルメッセージ処理は実行される。このチャンネルメッセージ処理が終了した後、ステップ６０２の処理に戻る。
【００８８】
次に、上述したステップ６１８のチャンネルメッセージ処理について、図７に示すその動作フローチャートを参照して詳細に説明する。
上述したように、このチャンネルメッセージ処理には、ＳＭＦ処理から変数ｃ、ｃ１、及びｃ２の各値が引数と渡される。このチャンネルメッセージ処理内において、これらＳＭＦ処理から引数として渡された各変数は、チャンネルメッセージ処理内において、変数ｃは変数ｓｔａｔｕｓ、変数ｃ１は変数ｃ１、変数ｃ２は変数ｃ２として用いらる。
【００８９】
先ず、ステップ７０１では、変数ｃｈａｎに変数ｓｔａｔｕｓの下位４ビットを代入する。これにより、変数ｃｈａｎには、チャンネルメッセージのＭＩＤＩチャンネルが代入されることになる。この代入が終了すると、ステップ７０２の処理に移行する。
【００９０】
ステップ７０２では、現在カウントモードが設定されているか否か判定する。カウントモードは、チャンネルメッセージに応じた発音を行わなくてもよいモードである。そのカウントモードが設定されていた場合、その判定はＹＥＳとなってステップ７０３の処理に移行する。
【００９１】
ステップ７０３では、変数ｃに代入されているチャンネルメッセージの種類がノートオンであるか否か判定する。ノートオンのチャンネルメッセージが変数ｃに代入されていた場合、その判定はＹＥＳとなってステップ７０４の処理に移行する。そうでない場合には、その判定はＮＯとなり、一連の処理を終了する。
【００９２】
ステップ７０４では、変数ｃ２に代入されている値が０ではないか否か判定する。変数ｃにノートオンのチャンネルメッセージが代入されていた場合、変数ｃ１にはノートナンバー、変数ｃ２にはベロシティが代入されている。このベロシティは、鍵を弾いたときの速さを示すパラメータである。それは、１〜１２７段階の精度を持つが、その値が０のときにはノートオフを意味する。このため、ベロシティの値が０であった場合、その判定はＮＯとなって一連の処理を終了する。そうでない場合には、その判定はＹＥＳとなってステップ７０５の処理に移行する。
【００９３】
ステップ７０５では、変数ｃ１に代入されているノートナンバーで発音を行うノートオンコード処理を実行する。このノートオンコード処理では、現在設定されているモードに応じてその内部の処理が行われる。そのノートオンコード処理を終了した後、一連の処理を終了する。なお、このステップ７０５は、カウントモードが設定されていた場合に実行される。このため、ステップ７０５でノートオンコード処理を実行しても、実際の発音は行われない。
【００９４】
現在カウントモードが設定されていない場合、ステップ７０２の判定がＮＯとなり、ステップ７０６の処理に移行する。ステップ７０６〜７２０では、変数ｃに代入されたチャンネルメッセージの種類に応じた処理が行われる。
【００９５】
先ず、ステップ７０６では、そのチャンネルメッセージの種類がノートオフか否か判定する。変数ｃにノートオフのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７０７の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ７０８の処理に移行する。
【００９６】
ノートオフのチャンネルメッセージが変数ｃに代入されている場合、変数ｃ１にはノートナンバーが代入されている。ステップ７０７では、変数ｃ１に代入されているノートナンバーの音を消音させるノートオフコード処理を実行する。その後、一連の処理を終了する。
【００９７】
ステップ７０８では、そのチャンネルメッセージの種類がノートオンか否か判定する。変数ｃにノートオンのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７０９の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ７１１の処理に移行する。
【００９８】
ステップ７０９では、変数ｃ２に代入されている値、即ちベロシティの値が０ではないか否か判定する。ベロシティの値が０の場合、その判定はＮＯとなり、上述したステップ７０７のノートオフコード処理を実行する。ベロシティの値が０ではない場合、その判定はＹＥＳとなり、ステップ７１０のノートオンコード処理を実行する。ノートオンコード処理の終了後、一連の処理を終了する。
【００９９】
ステップ７１１では、そのチャンネルメッセージの種類がキープレッシャか否か判定する。変数ｃにキープレッシャのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７１２の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ７１３の処理に移行する。
【０１００】
変数ｃにキープレッシャのチャンネルメッセージが代入されていた場合、変数ｃ１にはノートナンバー、変数ｃ２にはプレッシャ値が代入されている。ステップ７１２では、変数ｃ１に代入されているノートナンバーのキープレッシャに、変数ｃ２に代入されているプレッシャ値を設定する。これにより、そのノートナンバーは、キープレッシャに応じた音量で発音される。キープレッシャを設定した後に、一連の処理が終了する。
【０１０１】
ステップ７１３では、そのチャンネルメッセージの種類がコントロールチェンジか否か判定する。変数ｃにコントロールチェンジのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７１４の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ７１５の処理に移行する。
【０１０２】
コントロールチェンジは、使用頻度の高い演奏情報であり、主に演奏におけるエフェクト機能の制御に用いられる。変数ｃにコントロールチェンジのチャンネルメッセージが代入されていた場合、変数ｃ１にはコントロールナンバー、変数ｃ２にはその値が代入されている。コントロールナンバーとして、例えばモジュレーションデプスには１、エクスプレッションには１１、トレモロデプスには９２が設定されている。ステップ７１４では、変数ｃ１に代入されているコントロールナンバーが示す種類のパラメータに、変数ｃ２に代入されている値を設定する処理を行う。その後、一連の処理を終了する。
【０１０３】
ステップ７１５では、チャンネルメッセージの種類がプログラムチェンジか否か判定する。変数ｃにプログラムチェンジのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７１６の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ７１７の処理に移行する。
【０１０４】
プログラムチェンジは、音色の切り替えを指示するコマンドである。そのプログラムチェンジのチャンネルメッセージが変数ｃに代入されていた場合、変数ｃ１にはプログラムナンバーが代入されている。プログラムナンバーとして、例えばアコスティックピアノには１、フルートには５が設定されている。ステップ７１６では、変数ｃ１に代入されているプログラムナンバーに従って音色の設定を行う。その後、一連の処理を終了する。
【０１０５】
ステップ７１７では、チャンネルメッセージの種類がチャンネルプレッシャか否か判定する。変数ｃにチャンネルプレッシャのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７１８に移行する。そうでない場合には、その判定はＮＯとなってステップ７１９に移行する。
【０１０６】
チャンネルプレッシャは、１つのチャンネルで１つのアフタータッチ情報を共有して使用するためのコマンドである。そのチャンネルプレッシャのチャンネルメッセージが変数ｃに代入されていた場合、変数ｃ１にはプレッシャ値が代入されている。ステップ７１８では、変数ｃ１に代入されているプレッシャ値に従って、変数ｃｈａｎに代入されているチャンネルのプレッシャを設定する。それが終了した後、一連の処理を終了する。
【０１０７】
ステップ７１９では、チャンネルメッセージの種類がピッチホイールチェンジか否か判定する。変数ｃにピッチホイールチェンジのチャンネルメッセージが代入されていた場合、その判定はＹＥＳとなってステップ７２０に移行する。そうでない場合には、その判定はＮＯとなって一連の処理を終了する。
【０１０８】
ピッチホイールチェンジは、音の音程をシフトさせるためのコマンドである。そのピッチホイールチェンジのチャンネルメッセージが変数ｃに代入されていた場合、変数ｃ１及びｃ２にシフト量が代入されている。ステップ７２０では、変数ｃ１及びｃ２に代入されているシフト量に従って、変数ｃｈａｎに代入されているチャンネルのピッチベンドを設定する。それが終了した後、一連の処理を終了する。
【０１０９】
次に、上述したチャンネルメッセージ処理内で実行されるステップ７０５（及び７１０）のノートオンコード処理、ステップ７０７のノートオフコード処理について、図８、図９の動作フローチャートを参照して詳細に説明する。
【０１１０】
最初に、図８を参照して、ステップ７０５（及び７１０）として実行されるノートオンコード処理について説明する。このノートオンコード処理には、チャンネルメッセージ処理から、変数ｃｈａｎ、変数ｃ１、及び変数ｃ２が引数として渡される。
【０１１１】
先ず、ステップ８０１では、ワークＲＡＭ１０４にアクセスするためのワーク用ポインタをセットする。ワーク用ポインタは、ワークＲＡＭ１０４に、図２に示す分析用データを１音符毎にまとめてワークＲＡＭ１０４のワークエリア上に格納するために用いられるものであり、随時更新される。その初期値は、図５のステップ５０７で取得される。このステップ８０１では、変数ｃｈａｎが示すチャンネルにおいて、音符の分析用データを次に書き込むべきポインタをワーク用ポインタにセットする。ワーク用ポインタのセットが終了すると、ステップ８０２の処理に移行する。
【０１１２】
ステップ８０２では、現在カウントモードが設定されているか否か判定する。現在カウントモードが設定されている場合、その判定はＹＥＳとなってステップ８０３の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ８０４の処理に移行する。
【０１１３】
ステップ８０３では、変数ｃｈａｎのチャンネルに存在する音符数を計数する音符数計数処理を行う。チャンネルメッセージ処理は、図６に示すＳＭＦ処理において、ＳＭＦから１ＭＩＤＩデータを読み出す毎に実行される。このため、音符数計数処理では、それまでのカウント値のインクリメントを行う。それが終了した後、一連の処理を終了する。
【０１１４】
ステップ８０４では、現在パラメータ取得モードが設定されているか否か判定する。上述したように、パラメータ取得モードは、図２に示す分析用データの中の１次データを取得する（ワークＲＡＭ１０４に格納する）ためのモードである。そのパラメータ取得モードが設定されている場合、その判定はＹＥＳとなってステップ８０５の処理に移行する。そうでない場合には（この場合はプレイモードが設定されている）、その判定はＮＯとなってステップ８１４の処理に移行する。
【０１１５】
ステップ８０５〜８１２では、上記１次データを取得するための処理が行われる。
先ず、ステップ８０５では、ワーク用ポインタを別のポインタにセットする。この別のポインタは、現在処理しているノートデータ（音符）とその前のノートデータ（音符）の押鍵タイミングの差分を取得するために用いられる。以降、ノートオンコード処理の説明において、この別のポインタはついては単にポインタと呼ぶことにする。
【０１１６】
ステップ８０５に続くステップ８０６〜８０８では、ワーク用ポインタが示すワークＲＡＭ１０４のワークエリア上に、ノートナンバー（キーコード）、ベロシティ、押鍵タイミングを格納する処理を行う。ノートナンバーは変数ｃ１、ベロシティは変数ｃ２、押鍵タイミングは図６のＳＭＦ処理内のステップ６０５で更新された変数ｃｕｒｒｔｉｍｅから取得する。
【０１１７】
ステップ８０８に続くステップ８０９〜８１３では、上記押鍵タイミングの差分を取得するための処理が行われる。
先ず、ステップ８０９では、現在の処理対象が最初のノートオンイベントのものであるか否か判定する。図６のＳＭＦ処理内のステップ６０７で読み出したステータスバイトが最初のノートオンのチャンネルメッセージであった場合、即ち最初の音符であった場合、その判定はＹＥＳとなってステップ８１３の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ８１０の処理に移行する。
【０１１８】
ステップ８１０では、ステップ８０５でセットしたポインタをデクリメントして、前音符のワークエリア上のポインタを取得する。続くステップ８１１では、現在の押鍵タイミング（時間）からそのポインタが示す分析用データ中の押鍵タイミング（時間）を減算し、押鍵タイミングが前後する２音符間の押鍵タイミング（時間）の差分（図中ではノートオンイベント間タイムクロック）を取得する。その後、ステップ８１２において、ワーク用ポインタを更新（インクリメント）し、その更新が終了した後、一連の処理を終了する。
【０１１９】
なお、ＳＭＦでは、時間情報は分解能（１秒間当たりの演奏用のクロック数）を基準とした時間で表現される。このため、押鍵タイミング、押鍵タイミングの差分においても、それらはクロック数で表現される。
【０１２０】
一方、ステップ８１３では、現在の処理対象が最初の音符であることから、押鍵タイミングの差分（ノートオンイベント間タイムクロック）として、図６のＳＭＦ処理内のステップ６０５で取得した累積時間（変数ｃｕｒｒｔｉｍｅに代入される）を取得する。その後、ステップ８１２の処理に移行する。
【０１２１】
現在プレイモードが設定されている場合、ステップ８０４の判定がＮＯとなり、次にステップ８１４の処理が実行される。このプレイモードは、図２に示す分析用データが基準データ、及び被験データのそれぞれにおいて全て確定した後に設定される。ステップ８１４、及び８１５の処理は、その確定した後の分析用データを用いて行われる。
【０１２２】
ステップ８１４では、ワーク用ポインタが示すワークエリア上のベロシティ、及びその差分を読み出し、この読み出した差分に強調係数を掛けた値と、ベロシティからその差分を減算した値とを加算し、その加算結果を新たなベロシティとして設定する。
【０１２３】
続くステップ８１５では、上記ステップ８１５で得られた新しいベロシティ値を用いて発音処理を行う。この発音処理は、メインＣＰＵ１０１が、変数ｃｈａｎ（チャンネル）、変数ｃ１（ノートナンバー）、及びステップ８１５で得た新しいベロシティから発音命令を生成し、その生成した発音命令を楽音発生装置（音源）に出力することで実現される。
【０１２４】
これにより、演奏者が行った演奏操作の傾向が強調された自動演奏が行われる。この自動演奏により、演奏者は、自身の演奏内容の傾向を聴感から認識することができる。
【０１２５】
なお、第１の実施の形態では、楽音発生装置１０８に発音命令を出力して、演奏者の演奏操作の傾向を強調させた自動演奏を行っているが、ステップ８１４で変更した演奏データ（ＭＩＤＩデータ）を、シリアルインターフェイス１１４等を用いて外部装置に送出するようにしても良い。また、その演奏データを外部記憶装置１１６に出力して、記憶媒体に記憶させても良い。また、基準データの変更を、差分を強調させずに行ってもよい。このようにしても、演奏者に、効果は多少低減するが、自身の演奏内容の傾向を聴感から認識させることができる。
【０１２６】
また、第１の実施の形態では、基準データにおいて変更するパラメータをベロシティとしているが、例えば押鍵タイミングのような他のパラメータとしても良い。また、複数のパラメータであっても良い。更には、基準データのパラメータを、演奏者が指定できるようにしても良い。
【０１２７】
図９は、図７に示すチャンネルメッセージ処理内でステップ７０７として実行されるノートオフコード処理の動作フローチャートである。次に、この図９を参照して、ノートオフコード処理について詳細に説明する。このノートオフコード処理には、チャンネルメッセージ処理から、変数ｃｈａｎ、変数ｃ１、及び変数ｃ２が引数として渡される。
【０１２８】
先ず、ステップ９０１では、ワークＲＡＭ１０４のワークエリアにアクセスするためのポインタを取得する。このポインタには、図８のノートオンコード処理内のステップ８１２で更新されたワーク用ポインタの値がセットされる。
【０１２９】
ステップ９０１に続くステップ９０２では、現在カウントモードが設定されているか否か判定する。現在カウントモードが設定されている場合、その判定はＹＥＳとなって一連の処理を終了する。そうでない場合には、その判定はＮＯとなってステップ９０３の処理に移行する。
【０１３０】
ステップ９０３では、現在パラメータ取得モードが設定されているか否か判定する。パラメータ取得モードが設定されている場合、その判定はＹＥＳとなってステップ９０４の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ９０９の処理に移行する。
【０１３１】
ステップ９０４〜９０８は、図２に示す分析用データ中の押鍵時間（音符長）を取得するための処理が行われる。
先ず、ステップ９０４では、前音符のワークエリア上のポインタを取得する。これは、ステップ９０１で取得したポインタの値をデクリメントすることで行われる。これが終了した後、ステップ９０５の処理に移行する。
【０１３２】
ステップ９０５では、ポインタが示す前音符のノートナンバー（キーコード）が、ノートオフが命令されたノートナンバー（キーコード）と等しいか否か判定する。それらのノートナンバー（キーコード）が等しい場合、その判定はＹＥＳとなってステップ９０７の処理に移行する。そうでない場合には、ステップ９０６の処理に移行する。
【０１３３】
ステップ９０６では、さらに一つ前の音符のワークエリア上のポインタを取得する。これは、ポインタをデクリメントすることにより実現される。ポインタをデクリメントした後、ステップ９０５の処理に戻る。
【０１３４】
ステップ９０５でそれらのノートデータ（キーデータ）が等しい、即ちＹＥＳと判定するまで、ステップ９０５、９０６の処理を繰り返し行うことにより、ワークＲＡＭ１０４のワークエリア上のノートオフさせる音符の分析用データが格納されているポインタが探し出される。
【０１３５】
ステップ９０５の判定がＹＥＳとなることで実行されるステップ９０７では、タイムクロック数で表現される現在の時刻を取得する。現在の時刻は、変数ｃｕｒｒｔｉｍｅに格納されており、その変数の値が、現在のポインタが示すワークエリア上に離鍵タイミングとして格納される。続くステップ９０８では、ステップ９０７で取得した現在時刻から、現在のポインタが示すワークエリア上に格納されている押鍵タイミングを減算し、押鍵時間、即ち音符長を取得する。この取得した音符長は、現在のポインタが示すワークエリア上に格納される。それが終了した後、一連の処理を終了する。
【０１３６】
このように、パラメータ取得処理を設定して、ノートオンコード処理、ノートオフコード処理を実行することにより、図２に示す１音符当たりの分析用データ中の１次データが、ワークＲＡＭ１０４のワークエリア上にチャンネル毎に分けて格納される。
【０１３７】
次に、図３の全体処理内でステップ３０３として実行される１次データ取得処理について、図１０に示すその動作フローチャートを参照して詳細に説明する。この１次データ取得処理は、図２に示す分析用データ中の１次データを取得する処理であり、その１次データの取得は、パラメータ取得モードを設定し、ＳＭＦ処理を実行することで実現される。この１次データ取得処理も、基準データ、及び被験データのそれぞれに対して行われる。
【０１３８】
ステップ１００１〜１００４では、各種の初期設定が行われる。
先ず、ステップ１００１では、パラメータ取得モードをセットする。続くステップ１００２では、処理するトラックのデータ数を変数ｔｏｂｅｒｅａｄにセットする。処理するトラックのデータ数は、図４の演奏データ取得処理内のステップ４０６を実行することで得られたものである。
【０１３９】
ステップ１００２に続くステップ１００３では、変数であるオフセットポインタｓｍｆｃｏｕｎｔのセットを行う。このセットは、図４の演奏データ取得処理内のステップ４０６を実行することで得られたオフセットポインタ値を、オフセットポインタｓｍｆｃｏｕｎｔにセットすることで行われる。ステップ１００３の処理が終了した後に実行されるステップ１００４では、演奏が開始してから経過した時間である累積時間がセットされるタイムクロック（変数）ｃｕｒｒｔｉｍｅをクリアする。
【０１４０】
ステップ１００４に続くステップ１００５では、上述したＳＭＦ処理を実行する。その後、一連の処理を終了する。
上記ＳＭＦ処理は、チャンネルメッセージ処理を呼び出し、そのチャンネルメッセージ処理は、上述したノートオンコード処理、ノートオフコード処理を呼び出す。ステップ１００１ではパラメータ取得モードがセットされているので、ノートオンコード処理、ノートオフコード処理は、そのパラメータ取得モードに応じた内容で行われる。このため、図２の分析用データ中の１次データがワークＲＡＭ１０４のワークエリア上に格納されることになる。
【０１４１】
なお、図３のステップ３０９として実行される差分強調再生処理は、上述した１次データ取得処理とほぼ同じであり、ステップ１００１でパラメータ取得モードの換わりにプレイモードを設定するところだけが異なっている。第１の実施の形態では、図８のノートオンコード処理から判るように、基準データにおいて変更するパラメータ（これが、被験データの演奏内容を反映させるパラメータである）を固定にしている。例えば、演奏者が所望するパラメータを指定できるようにした場合には、差分強調再生処理からその指定されたパラメータをノートオンコード処理に渡すようにし、また、ノートオンコード処理に、各種パラメータの変更を行える機能を追加すれば良い。
【０１４２】
次に、図３の全体処理内でステップ３０４として実行されるノートマッチ処理について、図１１に示すその動作フローチャートを参照して詳細に説明する。このノートマッチ処理は、基準データＲＡＭ１１２にＳＭＦの形式で格納されている基準データ中のノートデータ（音符）と、被験データＲＡＭ１１３にＳＭＦの形式で格納されている被験データ中のノートデータ（音符）の対応関係を検出する処理である。ワークＲＡＭ１０４には、基準データと被験データの各分析用データが異なるワークエリアに格納されている。ノートマッチ処理は、これら各分析用データを対象にして実行される。
【０１４３】
先ずステップ１１０１では、基準演奏の同タイミング押鍵検出処理を実行する。これは、ワークＲＡＭ１０４のワークエリアに格納されている基準データの分析用データを用いて行われる。この同タイミング押鍵検出処理を実行することで、図２の分析用データとして、シリアル番号、及びタイミング番号が新たにワークＲＡＭ１０４のワークエリア上に格納される。
【０１４４】
ステップ１１０１に続くステップ１１０２では、押鍵タイミングによるノートマッチ処理を行う。このノートマッチ処理は、基準データと被験データの各ノートデータを、そのイベントが発生したタイミング、即ち押鍵タイミングに着目して対応関係を検出する処理である。
【０１４５】
ステップ１１０２に続くステップ１１０３では、上記ステップ１１０２の押鍵タイミングによるノートマッチ処理を実行することで得た基準データと被験データ間におけるノートデータの対応関係を補正するノートマッチ補正処理を実行する。その補正は、ノートデータのノートナンバーに着目して行う。このノートマッチ補正処理を終了した後、一連の処理を終了する。
【０１４６】
上記ステップ１１０１〜１１０３は、全てサブルーチン処理として実行される。次に、ステップ１１０１〜１１０３の各サブルーチン処理について詳細に説明する。
【０１４７】
最初に、ステップ１１０１として実行される基準演奏の同タイミング押鍵検出処理について、図１２に示すその動作フローチャートを参照して詳細に説明する。この同タイミング押鍵検出処理は、上述したように、ワークＲＡＭ１０４のワークエリア上に、音符（ノートデータ）毎にまとめて格納された基準データの分析用データを対象にし、ノートデータの押鍵タイミングに着目して行われる。
【０１４８】
ステップ１２０１〜１２０３では、各種変数に対する初期設定が行われる。
先ず、ステップ１２０１では、同一タイミングとすべきノートデータを特定するために用いられるカレントタイミングｐｔｒ＿ｔｉｍｉｎｇに０をセットする。続くステップ１２０２では、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをワークポインタｐｔｒ＿ｍ０にセットする。その後、ステップ１２０３において、カウンタｍに０をセットする。このカウンタｍは、ノートデータにシリアル番号を付けるために、ポインタｐｔｒ＿ｍ０と対応させて用いられる。
【０１４９】
ステップ１２０３に続くステップ１２０４〜１２１０は、カウンタｍとポインタｐｔｒ＿ｍ０をインクリメントしながら、ワークＲＡＭ１０４のワークエリア上に分析用データが格納されているノートデータに、シリアル番号、タイミング番号を付けるための処理が行われる。
【０１５０】
先ず、ステップ１２０４では、カウントｍの値が総ノート数よりも小さいか否か判定する。上記総ノート数は、図５に示すノート数取得処理内でステップ５０５のＳＭＦ処理を実行することにより得た値である。ワークエリア上の全てのノートデータに対してシリアル番号、及びタイミング番号を付けた場合、その判定はＮＯとなって一連の処理を終了する。そうでない場合には、その判定はＹＥＳとなってステップ１２０５の処理に移行する。
【０１５１】
ステップ１２０５では、ポインタｐｔｒ＿ｍ０により示される音符（ノートデータ）のシリアル番号に、カウンタｍの値をセットする。このシリアル番号のセットは、メインＣＰＵ１０１が、ワークＲＡＭ１０４のワークエリア上のポインタｐｔｒ＿ｍ０が示す記憶領域に、カウンタｍの値をシリアル番号として格納することで実現される。
【０１５２】
ステップ１２０５に続くステップ１２０６では、前音符と現在の音符の間の発音開始時間の差、即ちノートオンイベント間の時間が所定時間以下か否か判定する。例えば演奏者が和音を弾いたときのように、そのノートオンイベント間の時間が所定時間以下であった場合、その判定はＹＥＳとなってステップ１２０７の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１２０９の処理に移行する。
【０１５３】
ステップ１２０７では、ポインタｐｔｒ＿ｍ０により示される音符（ノートデータ）のタイミング番号に、カレントタイミングｐｔｒ＿ｔｉｍｉｎｇの値をセットする。後述するように、カレントタイミングｐｔｒ＿ｔｉｍｉｎｇの値は、ノートオンイベント間の時間が所定時間よりも大きかった場合にのみ更新される。このため、ノートオンイベント間の時間が所定時間以下に近接している音符（ノートデータ）には、全て同じ値のタイミング番号が付けられることになる。そのタイミング番号のセットは、メインＣＰＵ１０１が、ワークＲＡＭ１０４のワークエリア上のポインタｐｔｒ＿ｍ０が示す記憶領域に、カレントタイミングｐｔｒ＿ｔｉｍｉｎｇの値をタイミング番号として格納することで実現される。
【０１５４】
ステップ１２０７に続くステップ１２０８では、カウンタｍとポインタｐｔｒ＿ｍ０をインクリメントする。それらのインクリメントが終了した後、ステップ１２０４の処理に戻る。
【０１５５】
一方、ステップ１２０９では、カレントタイミングｐｔｒ＿ｔｉｍｉｎｇにカウンタｍの値をセットして、その更新を行う。それに続くステップ１２１０では、ポインタｐｔｒ＿ｍ０により示される音符（ノートデータ）のタイミング番号に、カウンタｍの値をセットする。その後、上述のステップ１２０８の処理に移行する。
【０１５６】
この基準演奏の同タイミングの押鍵検出処理を実行することにより、各ノートデータには、そのイベントが発生した順番を示す値がシリアル番号として付けられる。また、タイミング番号には、そのイベントの発生が同一のタイミングであるとしたノートデータのなかで、最初にイベントが発生したノートデータのシリアル番号が付けられる。同一のタイミングとするノートデータが一つであれば、タイミング番号にはシリアル番号と同じ値が付けられる。
【０１５７】
図１３は、図１１のステップ１１０２として実行される押鍵タイミングによるノートマッチ処理の動作フローチャートであり、図１４は、その図１３のステップ１３０１として実行される処理の詳細を示す図（動作フローチャート）である。次に、図１３、及び図１４を参照して、押鍵タイミングによるノートマッチ処理について詳細に説明する。この押鍵タイミングによるノートマッチ処理は、ワークＲＡＭ１０４の異なるワークエリア上に格納された基準データと被験データの分析用データを対象として実行される。
【０１５８】
先ず、ステップ１３０１では、ワークＲＡＭ１０４のワークエリア上に、１音符（ノートデータ）毎にまとめて格納された基準データの分析用データにアクセスするためのイニシャライズ処理を行う。図１４を参照して、その詳細を説明する。
【０１５９】
ステップ１４０１〜１４０４では、各種変数に対する初期設定が行われる。
先ず、ステップ１４０１では、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをポインタｐｔｒ＿ｍ１にセットする。続くステップ１４０２では、その先頭ポインタの次のノートデータのポインタ値をポインタｐｔｒ＿ｍ２にセットする。
【０１６０】
ステップ１４０２に続くステップ１４０３では、ポインタｐｔｒ＿ｍ２に対応させて用いる各種カウンタをセットする。具体的には、カウンタｍ、及びｍ１には０をセットし、カウンタｍ２には１をセットする。その後、ステップ１４０４において、各種判定用に用いられるフラグｆｒをセットする。
【０１６１】
ステップ１４０４に続くステップ１４０５では、カウンタｍ２の値が総ノート数よりも小さいか否か判定する。この総ノート数は、図５に示すノート数取得処理を実行することで得た値である。カウンタｍ２の値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１４０６の処理に移行する。そうでない場合には、その判定はＮＯとなって図１３のステップ１３０２の処理に移行する。
【０１６２】
ステップ１４０６では、ポインタｐｔｒ＿ｍ１とポインタｐｔｒ＿ｍ２により示されるノートデータのタイミング番号が同一か否か判定する。それらのタイミング番号が同一であった場合、その判定はＹＥＳとなってステップ１４０７の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１４０８の処理に移行する。
【０１６３】
ステップ１４０７では、カウンタｍ２とポインタｐｔｒ＿ｍ２をインクリメントして、それらを更新する。その後、ステップ１４０５の処理に戻る。一方、ステップ１４０８では、フラグｆｒをクリアし、その後、図１３のステップ１３０２の処理に移行する。
【０１６４】
ステップ１４０５〜１４０７の処理を、ステップ１４０６の判定がＮＯとなるまで繰り返すことにより、ポインタｐｔｒ＿ｍ１とポインタｐｔｒ＿ｍ２には、タイミング番号が異なるノートデータのポインタ値がセットされる。
【０１６５】
図１３の説明に戻る。
ステップ１３０２では、ワークＲＡＭ１０４の被験データの分析用データにアクセスするためのポインタｐｔｒ＿ｔ０に、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをコピーする。続くステップ１３０３では、ポインタｐｔｒ＿ｔ０に対応させて用いるカウンタｔに０をセットする。カウンタｔに０をセットした後、ステップ１３０４の処理に移行する。
【０１６６】
ステップ１３０４〜１３２７の処理の繰り返しでは、カウンタｔとポインタｐｔｒ＿ｔ０を更新しながら、ポインタｐｔｒ＿ｔ０のノートデータに対応する基準データのノートデータの検索が行われる。
【０１６７】
先ず、ステップ１３０４では、カウンタｔの値が被験データの総ノート数よりも小さいか否か判定する。この総ノート数は、図５に示すノート数取得処理を実行することで得た値である。カウンタｔの値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１３０５の処理に移行する。そうでない場合には、その判定はＮＯとなって一連の処理を終了する。
【０１６８】
ステップ１３０５では、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）の分析用データから、押鍵タイミングデータを取得し、それを変数ｔ＿ｔｉｍｅにセットする。続くステップ１３０６では、ポインタｐｔｒ＿ｍ１が示す音符（ノートデータ）の分析用データから、押鍵タイミングデータを取得し、それら音符（ノートデータ）間のイベント発生時刻の時間差（変数）ｄｔｉｍｅ１を取得する。この時間差ｄｔｉｍｅ１は、例えばポインタｐｔｒ＿ｍ１から取得した押鍵タイミングデータをｍｔ１とすれば、時間差ｄｔｉｍｅ１に、ｍｔ１から変数ｔ＿ｔｉｍｅを減算した値（＝ｍｔ１−ｔ＿ｔｉｍｅ）をセットすることで取得する。時間差ｄｔｉｍｅ１を取得した後、ステップ１３０７の処理に移行する。
【０１６９】
ステップ１３０７では、上記フラグｆｒがクリアされているか否か判定する。フラグｆｒがクリアされていた場合、その判定はＹＥＳとなってステップ１３１０の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３０８の処理に移行する。
【０１７０】
ステップ１３０８では、ポインタｐｔｒ＿ｔ０が示す被験データの音符（ノートデータ）に、ポインタｐｔｒ＿ｍ１が示す基準データの音符（ノートデータ）のシリアル番号をタイミング番号として設定する。これは、メインＣＰＵ１０１が、ワークＲＡＭ１０４の被験データの分析用データが格納されているワークエリアのポインタｐｔｒ＿ｔ０が示す領域に、そのシリアル番号を格納することで実現される。このシリアル番号の設定が終了すると、ステップ１３０９の処理に移行し、そこでカウンタｔとポインタｐｔｒ＿ｔ０をインクリメントして、それらの更新を行う。その後、ステップ１３０４の処理に戻る。
このフラグｆｒは、それがクリアされていれば新たにセットされ、被験データの音符（ノートデータ）にマッチする基準データの音符（ノートデータ）が見つかった場合にはクリアされる。従って、フラグｆｒがクリアされないことは、即ちステップ１３０７の判定がＮＯとなることは、被験データの音符（ノートデータ）にマッチする基準データの音符（ノートデータ）が見つからず、それらのマッチが行えなかったことを意味する。このため、第１の実施の形態では、ステップ１３０７の判定がＮＯとなった場合、単にステップ１３０８の処理を実行し、被験データの音符（ノートデータ）にシリアル番号をタイミング番号として設定している。
【０１７１】
一方、フラグｆｒがクリアされていた場合に次に実行されるステップ１３１０では、フラグｆｒをセットする。ステップ１３１０に続くステップ１３１１〜１３２１の繰り返しでは、被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）にマッチする音符（ノートデータ）を、基準データ用に用いられる各種カウンタ、及び各種ポインタを更新しながら検索する。
【０１７２】
先ず、続くステップ１３１１では、カウンタｍ２の値が基準データの総ノート数よりも小さいか否か判定する。カウンタｍ２の値が基準データの総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１３１２の処理に移行する。そうでない場合には、その判定はｎｏとなってステップ１３２２の処理に移行する。
【０１７３】
ステップ１３１２では、ポインタｐｔｒ＿ｍ２が示す音符（ノートデータ）の分析用データから、押鍵タイミングデータを取得し、被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）とのイベント発生時刻の時間差（変数）ｄｔｉｍｅ２を取得する。被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）の押鍵タイミングデータは変数ｔ＿ｔｉｍｅにセットされている。時間差ｄｔｉｍｅ２は、例えばポインタｐｔｒ＿ｍ２から取得した押鍵タイミングデータをｍｔ２とすれば、時間差ｄｔｉｍｅ２に、ｍｔ２から変数ｔ＿ｔｉｍｅを減算（ｍｔ２−ｔ＿ｔｉｍｅ）した値をセットすることで取得する。時間差ｄｔｉｍｅ２を取得した後、ステップ１３１３の処理に移行する。
【０１７４】
ステップ１３１３では、時間差ｄｔｉｍｅ２が０よりも大きいか否か判定する。基準データのポインタｐｔｒ＿ｍ２が示す音符（ノートデータ）のイベント発生時刻が、被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）のそれよりも遅い場合、その判定はＹＥＳとなり、ステップ１３１４の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３１５の処理に移行する。ステップ１３１４では、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）が基準データから見つかったとして、フラグｆｒをクリアする。その後、ステップ１３２２の処理に移行する。
【０１７５】
ステップ１３１５では、カウンタｍ２に１を加算した値（＝ｍ２＋１）が基準データの総ノート数よりも小さいか否か判定する。その値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１３１６の処理に移行する。そうでない場合には、ステップ１３２２の処理に移行する。ステップ１３１６では、カウンタｍ、ｍ１、及びｍ２と、ポインタｐｔｒ＿ｍ１、及びｐｔｒ＿ｍ２をそれぞれインクリメントし、それらの更新を行う。その後、ステップ１３１７の処理に移行する。
【０１７６】
ステップ１３１７では、カウンタｍ２の値が基準データの総ノート数よりも小さいか否か判定する。カウンタｍ２の値がその総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１３１８の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３２２の処理に移行する。
【０１７７】
ステップ１３１８では、ステップ１３１６、或いは１３２０で更新されたポインタｐｔｒ＿ｍ２が示す音符（ノートデータ）の分析用データから、押鍵タイミングデータを取得し、被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）とのイベント発生時刻の時間差（変数）ｄｔｉｍｅ２を新たに取得する。続くステップ１３１９では、時間差ｄｔｉｍｅ１とｄｔｉｍｅ２が等しくないか否か判定する。ポインタｐｔｒ＿ｍ１とｐｔｒ＿ｍ２が示すそれぞれの音符（ノートデータ）のイベント発生時刻が同じであった場合、その判定はＮＯとなってステップ１３２０の処理に移行する。そうでない場合には、ステップ１３２１の処理に移行する。
【０１７８】
ステップ１３２０では、カウンタｍ２とポインタｐｔｒ＿ｍ２をそれぞれインクリメントし、それらを更新する。その後、ステップ１３１７の処理に戻る。一方、ステップ１３２１では、フラグｆｒをクリアし、その後にステップ１３１１の処理に戻る。
【０１７９】
上記ステップ１３１１〜１３２１の処理の実行後、ポインタｐｔｒ＿ｍ２には、被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）のイベント発生時刻よりも遅いイベント発生時刻の音符（ノートデータ）のポインタ値がセットされる。
【０１８０】
ステップ１３２２〜１３２７では、ポインタｐｔｒ＿ｍ１、或いはｐｔｒ＿ｍ２が示す音符（ノートデータ）が、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）にマッチする音符（ノートデータ）であるとして、それら基準データの音符のなかから最も被験データの音符（ノートデータ）にマッチする音符（ノートデータ）を特定するための処理が行われる。
【０１８１】
先ず、ステップ１３２２では、フラグｆｒはクリアされているか否か判定する。被験データのポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）にマッチさせる基準データの音符（ノートデータ）が見つかった場合、その判定はＹＥＳとなってステップ１３２３の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３２７の処理に移行する。
【０１８２】
ステップ１３２３では、時間差ｄｔｉｍｅ１は０以上か否か判定する。ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）のイベント発生時刻が、ポインタｐｔｒ＿ｍ１が示す音符（ノートデータ）のイベント発生時刻と同じか、或いはそれよりも早い場合、その判定はＹＥＳとなってステップ１３２４の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３２５の処理に移行する。
【０１８３】
ステップ１３２４では、ポインタｐｔｒ＿ｔ０が示す被験データの音符（ノートデータ）に、ポインタｐｔｒ＿ｍ１が示す基準データの音符（ノートデータ）のシリアル番号をタイミング番号として設定する。これは、通常、ポインタｐｔｒ＿ｍ１が示す音符（ノートデータ）よりも、ポインタｐｔｒ＿ｍ２が示す音符（ノートデータ）のほうが、イベント発生時刻が遅いためである。そのシリアル番号の設定が終了すると、ステップ１３０９の処理に移行する。
【０１８４】
ステップ１３２５では、時間差ｄｔｉｍｅ１とｄｔｉｍｅ２を加算した値が０以上か否か判定する。ポインタｐｔｒ＿ｍ１とｐｔｒ＿ｍ２が示すそれらの音符（ノートデータ）のイベント発生時刻が、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）のそれと同じか、或いはそれよりも遅い場合、更には、時間差ｄｔｉｍｅ２がｄｔｉｍｅ１と同じか、或いは時間差ｄｔｉｍｅ２のほうがｄｔｉｍｅ１よりも大きい場合には、その判定はＹＥＳとなってステップ１３２６の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１３２７の処理に移行する。
【０１８５】
時間差ｄｔｉｍｅ２のほうがｄｔｉｍｅ１よりも大きい場合は、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）のイベント発生時刻と比較して、ポインタｐｔｒ＿ｍ１が示す音符（ノートデータ）のそれは早く、他方のポインタｐｔｒ＿ｍ２が示す音符（ノートデータ）のそれは遅く、且つポインタｐｔｒ＿ｍ１が示す音符（ノートデータ）のほうがポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）に近接しているということになる。
【０１８６】
このため、ステップ１３２６では、ポインタｐｔｒ＿ｔ０が示す被験データの音符（ノートデータ）に、ポインタｐｔｒ＿ｍ１が示す基準データの音符（ノートデータ）のシリアル番号をタイミング番号として設定する。そのシリアル番号の設定が終了すると、ステップ１３０９の処理に移行する。一方、ステップ１３２７では、ステップ１３２６とは逆に、ポインタｐｔｒ＿ｔ０が示す被験データの音符（ノートデータ）に、ポインタｐｔｒ＿ｍ２が示す基準データの音符（ノートデータ）のシリアル番号をタイミング番号として設定する。そのシリアル番号の設定が終了すると、ステップ１３０９の処理に移行する。
【０１８７】
図１５は、図１１のステップ１１０３として実行されるノートマッチ補正処理の動作フローチャートである。次に、図１５を参照して、ノートマッチ補正処理について詳細に説明する。このノートマッチ補正処理は、上述したように、ステップ１１０２の押鍵タイミングのノートマッチ処理を実行することで得られた基準データと被験データ間における音符（ノートデータ）の対応関係を、ノートナンバーに着目して補正するものである。
【０１８８】
先ず、ステップ１５０１では、ワークＲＡＭ１０４のワークエリアに格納された被験データの分析用データにアクセスするためのポインタｐｔｒ＿ｔ１、及びｐｔｒ＿ｔ２に、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをコピーする。続くステップ１５０２では、それらのポインタに対応させて用いるカウンタｔ１、及びｔ２に０をセットする。これらのカウンタをセットした後は、ステップ１５０３の処理に移行する。
【０１８９】
ステップ１５０３〜１５１８の処理の繰り返しでは、カウンタｔ１とポインタｐｔｒ＿ｔ１を更新しながら、ポインタｐｔｒ＿ｔ０の音符（ノートデータ）にマッチする基準データの音符（ノートデータ）の検索が、ノートナンバーに着目して行われる。
【０１９０】
先ず、ステップ１５０３では、カウンタｔ１の値が被験データの総ノート数よりも小さいか否か判定する。この総ノート数は、図５に示すノート数取得処理を実行することで得た値である。カウンタｔ１の値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１５０４の処理に移行する。そうでない場合には、その判定はＮＯとなって一連の処理を終了する。
【０１９１】
ステップ１５０４では、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）の分析用データから、タイミング番号を取得し、それを変数ｔｉｍｅ＿ｔ１にセットする。続くステップ１５０５では、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）の分析用データから、ノートナンバーを取得し、それを変数ｎｏｔｅ＿ｔ１にセットする。その後、ステップ１５０６のノートナンバーチェック処理を実行する。
【０１９２】
ノートナンバーチェック処理は、基準データのなかから、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）のノートナンバーと等しい音符（ノートデータ）を検索する処理である。このノートナンバーチェック処理へは、ステップ１５０４、及び１５０５で値をセットした変数ｔｉｍｅ＿ｔ１、及び変数ｎｏｔｅ＿ｔ１が引数として渡され、ノートナンバーチェック処理からは、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）のノートナンバーと等しい基準データの音符（ノートデータ）のシリアル番号が引数ｓｅｒｉ＿ｍ１として返される。ノートナンバーが等しい音符（ノートデータ）を検索できなかった場合には、その引数ｓｅｒｉ＿ｍ１にはその旨（エラーＥＲＲ）を示す値（例えば負の値）がセットされる。
【０１９３】
ステップ１５０６に続くステップ１５０７では、引数ｓｅｒｉ＿ｍ１にエラーを示す値がセットされていないか否か判定する。基準データから該当する音符（ノートデータ）が見つけられなかった場合、その判定はＮＯとなってステップ１５０８の処理に移行する。そうでない場合には、その判定はＹＥＳとなってステップ１５０９の処理に移行する。ステップ１５０８では、その検索結果に従い、ポインタｐｔｒ＿ｔ１が示す被験データ側の分析用データに、エラーフラグをセットし、また、それのシリアル番号に、例えば負の値をセットして対応ナンバーをクリアする。その後、ステップ１５１８の処理に移行する。
ステップ１５０９では、引数ｓｅｒｉ＿ｍ１にセットされたシリアル番号の音符（ノートデータ）のポインタｐｔｒ＿ｍ１を取得する。続くステップ１５１０では、このポインタｐｔｒ＿ｍ１の音符（ノートデータ）に、被験データの音符（ノートデータ）のなかでマッチしているものが有るか否かを示すマッチフラグがセットされているか否か判定する。ポインタｐｔｒ＿ｔの音符（ノートデータ）にマッチする被験データの音符（ノートデータ）が存在していた場合、その判定はＹＥＳとなってステップ１５１２の処理に移行する。そうでない場合、その判定はＮＯとなってステップ１５１１の処理に移行する。
【０１９４】
ステップ１５１１では、ポインタｐｔｒ＿ｍ１の音符（ノートデータ）にマッチフラグをセットする一方、ポインタｐｔｒ＿ｔ１が示す被験データ側の音符（ノートデータ）のエラーフラグをクリアし、また、シリアル番号に、それに対応する基準データ側の音符（ノートデータ）のシリアル番号をセットする。その後、ステップ１５１８の処理に移行する。
【０１９５】
ステップ１５１２は、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）にマッチさせる基準データの音符（ノートデータ）が、既に他の被験データの音符（ノートデータ）にマッチさせられていた場合に実行される。このため、ステップ１５１２〜１５１７では、その基準データの音符（ノートデータ）にマッチさせる音符（ノートデータ）を、被験データ側のそれらの音符（ノートデータ）のなかから選択する。
【０１９６】
先ず、ステップ１５１２では、カウンタｔ２の値がカウンタｔ１の値よりも小さいか否か判定する。カウンタｔ２の値がカウンタｔ１の値よりも小さい場合、その判定はＹＥＳとなってステップ１５１３の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１５１８の処理に移行する。
【０１９７】
ステップ１５１３では、引数ｓｅｒｉ＿ｍ１のシリアル番号が、ポインタｐｔｒ＿ｔ２の音符（ノートデータ）にセットされているシリアル番号に等しいか否か判定する。それらシリアル番号が等しい場合、その判定はＹＥＳとなってステップ１５１５の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１５１４の処理に移行する。ステップ１５１４では、カウンタｔ２、及びポインタｐｔｒ＿ｔ２をインクリメントして、それらを更新し、その後、ステップ１５１２の処理に戻る。
【０１９８】
上記ステップ１５１２〜１５１４の繰り返しにより、ポインタｐｔｒ＿ｔ２の値がポインタｐｔｒ＿ｔ１を超えない範囲内で、基準データの音符（ノートデータ）にマッチさせる被験データの音符（ノートデータ）が検索される。ステップ１５１５は、基準データの音符（ノートデータ）にマッチさせる被験データの他の音符（ノートデータ）が検索された場合に実行される。
【０１９９】
ステップ１５１５では、これら被験データの音符（ノートデータ）と基準データの音符（ノートデータ）のイベント発生時刻間の差である時間差ｄｔを算出する。これは、例えば、ポインタｐｔｒ＿ｔ１で示される現在の処理対象の音符（ノートデータ）のイベント発生時刻をｔ１、ポインタｐｔｒ＿ｔ２で示される既にマッチさせられた被験データの音符（ノートデータ）のイベント発生時刻をｔ２、既にマッチさせられた基準データの音符（ノートデータ）のイベントデータをｍ１とした場合、時間差ｄｔは、例えばｄｔ＝（ｍ１−ｔ１）−（ｍ１−ｔ２）として算出する。時間差ｄｔを算出した後、ステップ１５１６の処理に移行する。
【０２００】
ステップ１５１６では、時間差ｄｔが０以下か否か判定する。時間差ｄｔの値が負であった場合、その判定はＹＥＳとなってステップ１５１７の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１５１１の処理に移行する。
【０２０１】
上記のようにして時間差ｄｔを算出した場合、その時間差ｄｔの値が負であることは、その基準データの音符（ノートデータ）に、ポインタｐｔｒ＿ｔ１の音符（ノートデータ）のほうが近接していることを意味する。このため、ステップ１５１７では、ポインタｐｔｒ＿ｔ２が示す既にマッチさせられている音符（ノートデータ）の分析用データに、エラーフラグをセットし、また、それのシリアル番号に、例えば負の値をセットして対応ナンバーをクリアする。その後、ステップ１５１８の処理に移行する。
【０２０２】
ステップ１５１８では、カウンタｔ１及びポインタｐｔｒ＿ｔ１をインクリメントして、それらの更新を行う。それらの更新を行った後、ステップ１５０３の処理に戻る。
【０２０３】
次に、上記ステップ１５０６として実行されるノートナンバーチェック処理について、図１６に示すその動作フローチャートを参照して詳細に説明する。このノートナンバーチェック処理は、上述したように、基準データのなかから、ポインタｐｔｒ＿ｔ１が示す音符（ノートデータ）のノートナンバーと等しい音符（ノートデータ）を検索する処理である。
【０２０４】
先ず、ステップ１６０１では、ワークＲＡＭ１０４のワークエリアに格納された基準データの分析用データにアクセスするためのポインタｐｔｒ＿ｍに初期値を設定する。このとき初期設定される値は、例えば図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタの値である。続くステップ１６０２では、ノートマッチ補正処理に渡す引数ｓｅｒｉａｌ（ノートナンバーチェック処理内ではこの名称である）にエラーを示す値をセットする。その後、ステップ１６０３の処理に移行する。
【０２０５】
ステップ１６０３では、ポインタｐｔｒ＿ｍが示す音符（ノートデータ）のタイミング番号が、引数として受け取ったタイミング番号と等しいか否か判定する。それらのタイミング番号が等しい場合、その判定はＹＥＳとなってステップ１６０５の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１６０４の処理に移行する。ステップ１６０４では、ポインタｐｔｒ＿ｍをインクリメントし、それの更新を行う。その後、ステップ１６０３の処理に移行する。
【０２０６】
ステップ１６０３〜１６０４の処理を繰り返すことにより、押鍵タイミングでマッチさせた基準データの音符（ノートデータ）が検索される。
ステップ１６０５では、ポインタｐｔｒ＿ｍが示す音符（ノートデータ）のノートナンバーが、引数として受け取ったノートナンバーと等しいか否か判定する。それらのノートナンバーが等しい場合、その判定はＹＥＳとなってステップ１６０６の処理に移行する。そうでない場合には、ここで一連の処理を終了する。この場合、ステップ１６０２で引数ｓｅｒｉａｌにセットしたエラーであることを示す値はそのままとなる。
【０２０７】
ステップ１６０６では、引数ｓｅｒｉａｌに、ポインタｐｔｒ＿ｍの音符（ノートデータ）のシリアル番号をセットする。これにより、ノートマッチ補正処理に、基準データにおいてマッチする音符（ノートデータ）のシリアル番号が渡されることになる。その後、一連の処理を終了する。
【０２０８】
図１７は、図３のステップ３０５として実行される差分取得処理の動作フローチャートである。次に、図１７を参照して、差分取得処理について詳細に説明する。
【０２０９】
この差分取得処理は、ワークＲＡＭ１０４の異なるワークエリアにそれぞれ格納されている基準データと被験データの分析用データを対象とし、被験データの各音符（ノートデータ）毎に、それに対応（マッチ）する基準データの音符（ノートデータ）の分析用データを読み出して、それらの間における各パラメータの差分を取得していくものである。
【０２１０】
先ず、ステップ１７０１では、ワークＲＡＭ１０４の被験データの分析用データにアクセスするためのポインタｐｔｒ＿ｔ１に、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをセットする。続くステップ１７０２では、ポインタｐｔｒ＿ｔ１に対応させて用いるカウンタｔ１に０をセットする。カウンタｔ１に０をセットした後、ステップ１７１３の処理に移行する。
【０２１１】
ステップ１７０３〜１７１１では、被験データの音符（ノートデータ）を変更していきながら、音符（ノートデータ）と基準データの音符（ノートデータ）を対応させて、それらの間における各パラメータの差分の取得が行われる。なお、カウンタｔ１の値は、現在処理対象としている被験データの音符（ノートデータ）が、その先頭から何番目に発生したイベントであるか、言い換えれば、現在処理している音符（ノートデータ）の順番を意味する。
【０２１２】
先ずステップ１７０３では、カウンタｔ１の値が被験データの総ノート数よりも小さいか否か判定する。この総ノート数は、図５に示すノート数取得処理を実行することで得た値である。カウンタｔ１の値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１７０４の処理に移行する。そうでない場合には、その判定はＮＯとなって一連の処理を終了する。
【０２１３】
ステップ１７０４では、カウンタｔ１が示す現在処理対象となっている音符（ノートデータ）のノートマッチさせた結果を取得する。この取得は、カウンタｔ１と同じ値をシリアル番号として持つ基準データの音符（ノートデータ）の分析用データを検索することで行う。
【０２１４】
ステップ１７０４に続くステップ１７０５では、そのノートマッチの結果が有効であるか否か判定する。ステップ１７０４で検索した音符（ノートデータ）の分析用データのフラグがエラーフラグであった場合、その判定はＮＯとなってステップ１７１１の処理に移行する。そうでない場合には、その判定はＹＥＳとなってステップ１７０６の処理に移行する。
【０２１５】
ステップ１７０６では、マッチされている基準データの音符（ノートデータ）のポインタｐｔｒ＿ｍ１を取得する。それに続くステップ１７０７〜１７１０では、ポインタｐｔｒ＿ｔ１が示す被験データの音符（ノートデータ）の分析用データと、ポインタｐｔｒ＿ｍ１が示す基準データの音符（ノートデータ）の分析用データを、パラメータの種類別に対比して、それらの間の差分を取得する。具体的には、図２に示すように、ベロシティ、押鍵タイミング、離鍵タイミング、押鍵時間（音符長）の差分をそれぞれ取得する。これらは、例えばポインタｐｔｒ＿ｔ１が示す被験データの音符（ノートデータ）の分析用データ、及びポインタｐｔｒ＿ｍ１が示す基準データの音符（ノートデータ）の分析用データとしてそれぞれに格納される。
【０２１６】
ステップ１７１０に続くステップ１７１１では、カウンタｔ１とポインタｐｔｒ＿ｔ１をそれぞれインクリメントし、それらの更新を行う。それらのインクリメントが終了すると、ステップ１７０３の処理に戻る。
【０２１７】
図１８は、図３のステップ３０６として実行される平均値取得処理の動作フローチャートである。次に、図１８を参照して、平均値取得処理について詳細に説明する。
【０２１８】
この平均値取得処理は、ワークＲＡＭ１０４のワークエリアに格納されている被験データの分析用データを対象として、演奏者（ユーザ）がコントロールスイッチ群１０３の所定のスイッチを操作することで指定したパラメータ（項目）の差分の平均値を算出する処理である。ここで算出された平均値は、これに続くステップ３０７の標準偏差取得処理で使用される。
【０２１９】
ステップ１８０１〜１８０３では、各種変数の初期設定が行われる。
先ず、ステップ１８０１では、ワークＲＡＭ１０４の被験データの分析用データにアクセスするためのポインタｐｔｒ＿ｔ１に、図５に示すノート数取得処理内のステップ５０７の処理を実行することにより得たワークエリアの先頭ポインタをセットする。続くステップ１８０２では、ポインタｐｔｒ＿ｔ１に対応させて用いるカウンタｔ１に０をセットする。その後、ステップ１８０３において、変数である有効サンプルカウンタ、及び差分累算値をそれぞれクリアする。
【０２２０】
ステップ１８０３に続くステップ１８０４〜１８１１では、被験データの音符（ノートデータ）を、カウンタｔ１とともに変更していきながら、その音符（ノートデータ）にマッチする基準データの音符（ノートデータ）の有無に応じて、上記有効サンプルカウンタのインクリメント、差分累算値への有効な差分の加算が行われる。
【０２２１】
先ず、ステップ１８０４では、カウンタｔ１の値が被験データの総ノート数よりも小さいか否か判定する。この総ノート数は、図５に示すノート数取得処理を実行することで得た値である。カウンタｔ１の値が総ノート数よりも小さい場合、その判定はＹＥＳとなってステップ１８０５の処理に移行する。そうでない場合には、その判定はＮＯとなってステップ１８１２の処理に移行する。
【０２２２】
ステップ１８０５では、カウンタｔ１が示す現在処理対象となっている音符（ノートデータ）のノートマッチさせた結果を取得する。この取得は、ポインタｐｔｒ＿ｔ１に従ってアクセスされる分析用データのなかから、制御用フラグ（図２参照）を読み出すか、或いはシリアル番号（ノートマッチが有効でなければ負の値がセットされている）を読み出すことで行う。
【０２２３】
ステップ１８０５に続くステップ１８０６では、そのノートマッチの結果が有効であるか否か判定する。例えばステップ１８０５で読み出した制御用フラグがエラーフラグであった場合、その判定はＮＯとなってステップ１８１１の処理に移行する。そうでない場合には、その判定はＹＥＳとなってステップ１８０７の処理に移行する。
【０２２４】
ステップ１８０７では、有効サンプルカウンタをインクリメントする。続くステップ１８０８では、その音符（ノートデータ）の分析用データのなかから、指定されたパラメータ（項目）の差分を取得する。これに続いて実行されるステップ１８０９では、ステップ１８０８で取得した差分に応じて、指定されたパラメータ（項目）における最大値、及び最小値の更新を行う。その後、ステップ１８０８で得た差分を差分累算値に加算する。
【０２２５】
ステップ１８１０に続くステップ１８１１では、カウンタｔ１とポインタｐｔｒ＿ｔ１をそれぞれインクリメントし、それらの更新を行う。それらのインクリメントが終了すると、ステップ１８０４の処理に戻る。
【０２２６】
ステップ１８１２は、カウンタｔ１の値が総ノート数以上になった場合に実行される。このとき、有効サンプルカウンタには、ノートマッチが有効な音符（ノートデータ）数が保持され、他方の差分累算値には、ノートマッチが有効な全ての音符（ノートデータ）の分析用データから取得される指定されたパラメータ（項目）の差分の累算値が保持される。ステップ１８１２では、差分累算値に保持されている値を、を有効サンプルカウンタの値で割ることにより、指定されたパラメータ（項目）の差分の平均値を取得する。この平均値を取得すると、一連の処理を終了する。
【０２２７】
なお、第１の実施の形態では、分析結果を表示させる対象とするパラメータ（項目）を演奏者が指定するようにしているが、例えば、予め定めたパラメータを全て対象として、各パラメータ毎に分析を行い、その分析結果を、演奏者のスイッチ等に対する操作に応じて選択的に表示させるようにしても良い。このように分析結果を分割して表示させることにより、表示装置１１７の画面が小さくとも、様々な分析結果を表示させることができる。
【０２２８】
また、第１の実施の形態では、分析用データとするデータ（パラメータ）を予め定めた設定に固定させているが、分析用データとするデータ（パラメータ）の種類を、演奏者（ユーザ）が指定するようにしても良い。
【０２２９】
分析用データは、図２に示すように、１音符（ノートデータ）あたり複数のデータで構成されている。このことから、分析結果として表示させる情報としては、度数分布や標準偏差等の他に、或いはそれの換わりに、分析用データのなかの少なくとも一つのデータを表示させても良い。そのデータの表示は、基準データと被験データ間での対比が容易なように、音符（ノートデータ）毎に対応させて表示することが望ましい。その表示させるデータは演奏者（ユーザ）が選択できるようにしても良い。
【０２３０】
そのデータを表示させる形態としては、数値で表示しても良く、直感的にそれらを対比できるように、グラフ等の図形で表示しても良い。当然のことながら、分析用データのなかから表示するデータに対しては、そのデータの意味を演奏者（ユーザ）が容易に把握できるように、何らかの加工を行っても良い。
＜第２の実施の形態＞
上述した第１の実施の形態では、基準データと被験データが共に同じ精度で時間管理されていることを前提としている。しかし、時間管理の精度は、周知のように、装置の基本性能、例えば分解能に応じて変動する。その分解能は、１拍当たりのクロック数であることから、そのクロック数で表されるデルタタイム（イベント間の時間情報）の値が意味する実際の時間も、分解能により変化する。
【０２３１】
一方、基準データと被験データは、異なる装置で別々に作成することができる。これは、基準データと被験データの分解能は、必ずしも一致しないことを意味する。基準データと被験データの分解能が異なっている場合、上記第１の実施の形態は、基準データと被験データの分解能が一致している、即ちクロックの周期が一致していることを前提としているため、それらの間のイベントの対応付け（マッチング）を実質的に行うことができない。第２の実施の形態は、このようなことを回避し、時間管理の精度が異なる演奏データ間でイベントのマッチングを行えるようにしたものである。
【０２３２】
この第２の実施の形態の構成は、図１を参照して説明した第１の実施の形態のそれと基本的に同じである。また、動作においても、一致している部分が多い。このため、第１の実施の形態から異なる部分だけ説明する。
【０２３３】
始めに、第２の実施の形態で採用した演奏分析について説明する。
第１の実施の形態では、演奏分析結果として、押鍵タイミング、ベロシティ等のパラメータ毎に、基準データと被験データとを対比して得られる平均値、標準偏差、度数分布等を表示させている。それらの特性量を表示することで、演奏者は自身が行った演奏の全体的な傾向を知ることができるが、その細部については表示されている特性量から知ることはできず、自分で判断しなければならない。このことから、第２の実施の形態では、演奏者が、自身の演奏の細部まで詳細に把握できるようにしている。具体的には、第２の実施の形態では、パラメータ毎に、基準データと被験データのイベント間の相違を表示することで、演奏の全体、更にはその細部まで演奏者が演奏内容を容易に把握できるようにしている。
【０２３４】
図２１は、第２の実施の形態による分析結果の表示例を示す図である。この分析結果は、図１に示す表示装置１１７に表示されるものである。この図２１を参照して、第２の実施の形態が行う演奏分析について具体的に説明する。
【０２３５】
演奏者は、技術が伴わない場合、楽譜に忠実に従った演奏を行うことができない。具体的には、鍵盤上のある鍵を弾いてから次の鍵を弾くまでの間隔、即ちイベント間の間隔を、例えば楽譜に記譜されているその間隔に常に合わせることができない。イベント間の間隔は、当然のことながら、テンポによっても異なる。このことから、第２の実施の形態では、そのイベント間の間隔をテンポとして仮想的にとらえ、演奏者が行った演奏（被験データ）のテンポと手本（基準）の演奏（基準データ）のそれとの違いをイベント毎に抽出し、それを分析結果として表示させている。上記図２１は、そのテンポの推移例である。
【０２３６】
なお、以降においては、イベント間の間隔の表現に使用するテンポを自動演奏等で一般に指定するテンポと区別するために、前者については仮想テンポ、後者については単にテンポと呼ぶことにする。
【０２３７】
仮想テンポは、演奏者自身の演奏におけるイベント間の間隔が、手本の演奏（基準データ）におけるイベント間の間隔とはどのようにズレているかを相対的に表現する。このため、図２１に示すように、その仮想テンポをイベント毎に表示することで、演奏者は、自身の演奏で各鍵を弾いていったタイミングが、基準の演奏のそれとはどのように異なっているかを詳細、且つ、容易に把握することができる。これにより、第１の実施の形態と比較して、演奏者の独習をより強力に支援することができ、練習効率を更に向上させることができる。
【０２３８】
次に、上記演奏分析を行い、その結果を表示するための動作について、図１９、図２０に示す動作フローチャートを参照して詳細に説明する。
上記図１９は、第２の実施の形態による演奏分析処理の動作フローチャートである。この図１９を参照して、始めに演奏分析処理について詳細に説明する。
【０２３９】
この演奏分析処理は、演奏者（ユーザ）がコントロールスイッチ群１０３の所定のスイッチを操作し、演奏傾向の分析を指示した場合に、メインＣＰＵ１０１が、プログラムＲＯＭ１０２に格納されている制御プログラムを読み出してそれを実行することで実現される処理である。
【０２４０】
先ず、ステップ１９０１では、演奏データ取得処理を実行する。この演奏データ取得処理は、例えばユーザがコントロールスイッチ群１０３の所定のスイッチに対する操作に応じて、ネットワークインターフェイス１１５、或いは外部記憶装置１１６から入力した演奏データを、基準データＲＡＭ１１２、或いは被験データＲＡＭ１１３の一方にＳＭＦのデータ形式で格納する処理である。
【０２４１】
ステップ１９０１に続くステップ１９０２では、所得した基準データ、被験データの各演奏データに含まれているノートデータ数を取得するノート数取得処理を実行する。ノートデータ数を取得すると、続くステップ１９０３では、各演奏データから１次データ（図２参照）を取得する１次データ取得処理を実行する。この１次データ取得処理が終了すると、ステップ１９０４の処理に移行する。
【０２４２】
ステップ１９０４では、基準データと被験データ間におけるノートデータの対応関係を求めるノートマッチ処理を実行する。このノートマッチ処理では、基準データと被験データの各々の分解能を考慮して、演奏データ間におけるノートデータの対応付け（マッチング）を行う。そのノートマッチ処理を実行することで、図２に示す１音符（ノートデータ）あたりの分析用データとして、シリアル番号、及びタイミング番号が各音符（ノートデータ）毎にワークＲＡＭ１０４に書き込まれる。即ち基準データと被験データ間におけるノートデータの対応関係が確定される。
【０２４３】
ステップ１９０４に続くステップ１９０５では、基準データと被験データ間の仮想テンポを演算する仮想テンポ演算処理を実行する。続いて、ステップ１９０６では、その仮想テンポを図２１に示すように出力する分析結果出力処理を実行する。その後、一連の処理を終了する。
【０２４４】
上述したステップ１９０１〜１９０３の各サブルーチン処理の内容は、第１の実施の形態におけるそれらの処理の内容と基本的に同じである。ステップ１９０４のノートマッチ処理では、第１の実施の形態と同様に、図１２〜図１６に示す各種サブルーチン処理が実行される。しかし、基準データと被験データの分解能の違いに対応させるために、それら各種サブルーチン処理のなかにはその内容に若干相違しているものがある。以下、その相違について説明する。
【０２４５】
図１２〜図１６に示す各種サブルーチン処理のなかで、図１３に示す押鍵タイミングによるノートマッチ処理、及び図１５に示すノートマッチ補正処理が第１の実施の形態から相違する部分を有する。
【０２４６】
先ず、押鍵タイミングによるノートマッチ処理では、ステップ１３０５の処理が第１の実施の形態とは異なる。上述したように、第１の実施の形態におけるステップ１３０５では、ポインタｐｔｒ＿ｔ０が示す音符（ノートデータ）の分析用データから、押鍵タイミングデータを取得し、それを変数ｔ＿ｔｉｍｅにセットすることが行われる。ステップ１３０５以降は、変数ｔ＿ｔｉｍｅにセットされた押鍵タイミングデータを基に、基準データと被験データ間の音符（ノートデータ）が対応付けられる。
【０２４７】
上記押鍵タイミングデータは、クロック数で表現された値である。そのクロックの周期は、分解能によって異なる。このため、第２の実施の形態におけるステップ１３０５では、対象としている押鍵タイミングデータを取得すると、それを基準データの分解能とした場合の値に変更し、その変更後の値を変数ｔ＿ｔｉｍｅにセットする。具体的には、被験データの分解能をＶｔ、基準データの分解能をＶｍとした場合には、取得した押鍵タイミングデータの値Ｄに、それら間の比率（＝Ｖｍ／Ｖｔ）を乗算し、その乗算結果（＝Ｄ・Ｖｍ／Ｖｔ）を変数ｔ＿ｔｉｍｅにセットする。これにより、ステップ１３０５以降の処理の内容を変更させることなく、被験データと基準データ間の音符（ノートデータ）の対応付けを行うことができる。
【０２４８】
図１５に示すノートマッチ補正処理では、ステップ１５１５の処理が第１の実施の形態とは異なる。そのステップ１５１５は、被験データのある音符（ノートデータ）に基準データの音符（ノートデータ）を対応付けした後、更にそれに対応付けるべき音符（ノートデータ）を検出した場合に実行される処理である。ステップ１５１５では、被験データの音符（ノートデータ）と基準データの音符（ノートデータ）のイベント発生時刻間の差（時間差）ｄｔを算出する。
【０２４９】
第１の実施の形態では、上述したように、時間差ｄｔを、例えば、ポインタｐｔｒ＿ｔ１で示される現在の処理対象の音符（ノートデータ）のイベント発生時刻をｔ１、ポインタｐｔｒ＿ｔ２で示される既にマッチさせられた被験データの音符（ノートデータ）のイベント発生時刻をｔ２、既にマッチさせられた基準データの音符（ノートデータ）のイベントデータをｍ１とした場合、ｄｔ＝（ｍ１−ｔ１）−（ｍ１−ｔ２）の式から算出する。これに対し、第２の実施の形態では、分解能の違いを考慮し、何れかの分解能に合わせて上記時間差ｄｔを算出している。具体的には、例えば基準データの分解能に合わせて、被験データの分解能をＶｔ、基準データの分解能をＶｍとすると、上記ｔ１、ｔ２には、その基の値に、基準データと被験データの分解能の比率（＝Ｖｍ／Ｖｔ）を乗算して得られる値をセットしている。
【０２５０】
以上が、ノートマッチ処理における第１の実施の形態からの変更部分である。次に、図１９に示す演奏分析処理内でステップ１９０５として実行される仮想テンポ演算処理について、図２０に示すその動作フローチャートを参照して詳細に説明する。
【０２５１】
先ず、ステップ２００１では、基準データＲＡＭ１１２にＳＭＦ形式で格納されている基準データのヘッダー部から、基準演奏のテンポを取得する。続くステップ２００２では、そのヘッダー部から分解能を更に取得する。その後、ステップ２００３の処理に移行する。
【０２５２】
ステップ２００３では、被験データＲＡＭ１１３にＳＭＦ形式で格納されている被験データのヘッダー部から、その演奏の分解能を取得する。続くステップ２００４では、取得した２つの分解能から、それらの比ｒａｔｅを算出する。その分解能比ｒａｔｅは、基準データの分解能を被験データの分解能で割った値である。
【０２５３】
上記ステップ２００１〜２００４の処理は、仮想テンポ演算処理における初期設定を行う処理に相当する。ステップ２００４に続くステップ２００５〜２００９は、処理ループを形成している。この処理ループでは、対象とする音符（ノートデータ）を順次変更しながら（移動させながら）、各音符（ノートデータ）毎に、その音符（ノートデータ）の仮想テンポを算出し、それを分析用データとしてストアすることが行われる。
【０２５４】
ステップ２００５〜２００９の処理ループは、ワークＲＡＭ１０４に格納した基準データ、及び被験データの分析用データを対象にして実行される。その分析用データは、１音符（ノートデータ）毎に、そのイベントの発生順に格納されている。上記処理ループでは、基準データの分析用データを基準にして、基準データと被験データ間の音符（ノートデータ）を対応させながら、各音符（ノートデータ）毎に仮想テンポの算出が行われる。
【０２５５】
先ず、ステップ２００５では、基準データの全ての音符（ノートデータ）を処理したか否か、言い換えれば、各音符（ノートデータ）の仮想テンポの算出が全て終了したか否か判定する。各音符（ノートデータ）の仮想テンポを全て算出した場合、その判定はＹＥＳとなって一連の処理を終了する。そうでない場合には、その判定はＮＯとなってステップ２００６の処理に移行する。
【０２５６】
ステップ２００６では、基準データ中の対象とする音符（ノートデータ）を一つ移動させ、その音符（ノートデータ）とその一つ前の音符（ノートデータ）との間のイベント間時間（クロック数）ｔｉｍｅ＿ｏｒｇを取得する。ここで、対象とする音符（ノートデータ）の指定は、カウンタを用いて行い、イベント間時間ｔｉｍｅ＿ｏｒｇは、対象とする音符（ノートデータ）の押鍵タイミングから、その一つ前の音符（ノートデータ）の押鍵タイミングを減算することで取得する。押鍵タイミングは、図２に示すように、分析用データ中の１次データの一つとして格納されているデータである。
【０２５７】
基準データの音符（ノートデータ）に対応付けられた被験データ中の音符（ノートデータ）は、分析用データ中の対応番号、タイミング対応番号、及び制御用フラグを基に特定する。ステップ２００６に続くステップ２００７では、それらのデータから、基準データ中で対象としている音符（ノートデータ）に対応付けられた被験データの音符（ノートデータ）を特定し、上記と同様にして、その音符（ノートデータ）のイベント間時間ｔｉｍｅ＿ｔａｒｇを取得する。その後、ステップ２００８の処理に移行する。
【０２５８】
ステップ２００８では、ステップ２００７で特定した被験データの音符（ノートデータ）の仮想テンポ値ｖ＿ｔｅｍｐｏを取得する。その仮想テンポ値ｖ＿ｔｅｍｐｏは、ステップ２００１で取得したテンポの値をｔｅｍｐｏ＿ｏｒｇとすると、以下に示す数式によって算出される。
【０２５９】
ｖ＿ｔｅｍｐｏ＝（ｔｉｍｅ＿ｏｒｇ／（ｒａｔｅ・ｔｉｍｅ＿ｔａｒｇ））
・ｔｅｍｐｏ＿ｏｒｇ
ステップ２００８に続くステップ２００９では、ステップ２００８で算出した仮想テンポ値ｖ＿ｔｅｍｐｏを順にストアする。具体的には、例えば仮想テンポ値ｖ＿ｔｅｍｐｏを、ステップ２００７で特定した音符（ノートデータ）に、その分析用データの一つとしてストアする。これは、仮想テンポ値ｖ＿ｔｅｍｐｏを図２に示す分析用データの１項目として追加しても良く、押鍵タイミング差分、或いは離鍵タイミング差分等の換わりに仮想テンポ値ｖ＿ｔｅｍｐｏをストアさせても良い。
【０２６０】
この仮想テンポ値ｖ＿ｔｅｍｐｏのストアが終了すると、ステップ２００５の処理に戻る。このときには、対象とする音符（ノートデータ）を一つ移動して、上記と同様に処理ループが実行される。
【０２６１】
なお、第２の実施の形態では、押鍵イベント発生時刻の間隔に着目して、基準データと被験データを押鍵イベント毎に対比し、その結果を演奏者に演奏傾向を示す情報として提供しているが、押鍵イベントの他に、ベロシティに着目して、各演奏データを押鍵イベント毎に対比した結果を演奏者に提供するようにしても良い。また、押鍵イベント発生時刻、ベロシティ、音符長（発音期間）等の各種パラメータを用意し、そのなかから演奏者がパラメータの種類を選択できるようにしても良い。何れの場合においても、演奏者は、自身の行った演奏の傾向を具体的に把握することができるので、修得すべき演奏技術を特定した効果的な練習を行えるようになる。
【０２６２】
また、第２の実施の形態では、各イベント毎に、その演奏内容の相違を表示しているが、それに加えて、第１の実施の形態のように、演奏の全体的な傾向を示すデータ（標準偏差、度数分布等）を表示するようにしても良い。また、押鍵イベント毎の相違を表示する場合、楽曲の全体、特定の部分の詳細等、演奏者が所望する状態でそれを表示できるようにすることが望ましい。
＜第３の実施の形態＞
周知のように、高度な演奏技術を持つ演奏者は、楽譜等に記譜されている内容に忠実に従って演奏を行うことは実際は少なく、通常、何らかの音楽表現（ゆらぎ）を加えた演奏を行う。演奏技術があまり高くない演奏者にとって、前者と後者の演奏をそれぞれ修得することが目標といえる（普通、修得する順序は、前者、後者の順である）。これは、そのような演奏者（練習者）にとって、参考とすべき演奏は必ずしも１つだけではないことを意味する。このことから、第３の実施の形態は、自身が行った演奏（被験データ）を、複数の他の演奏と対比できるようにしたものである。
【０２６３】
第３の実施の形態では、自身の演奏を、２つの他の演奏と対比できるようにしている。具体的には、２つの他の演奏のうちの一方を基準演奏として、その基準演奏に、演奏者自身の演奏（被験演奏）、及び２つの他の演奏のうちの他方の演奏をそれぞれ対比し、それらと基準演奏の相違を分析結果としてそれぞれ表示している。
【０２６４】
例えば、上記基準演奏としては、楽譜に記譜されている内容に忠実に従った演奏、他方の演奏としては、上級者（例えば音楽の教師）による演奏を想定している。このため、以降、前者についてはこれまでと同様に基準演奏、後者については手本演奏と呼ぶことにする。
【０２６５】
第３の実施の形態の構成は、第２の実施の形態のそれに加えて、図１に示すように、手本演奏の演奏データ（以降、手本データと呼ぶ）を格納するための手本データＲＡＭ１２０を備えている。動作においては、基準演奏を２つの演奏と個別に対比させることから、第３の実施の形態では基準演奏を対比させる演奏数が増えるだけで、基本的な動作は第２の実施の形態のそれと同じである。このため、第２の実施の形態から異なる部分だけ説明する。
【０２６６】
先ず、第３の実施の形態で採用した分析結果の表示法について、図２３を参照して説明する。この図２３は、第３の実施の形態による分析結果の表示例を示す図である。
【０２６７】
第３の実施の形態は、上記第２の実施の形態と同様に、分析結果を仮想テンポで表示する。その仮想テンポは、上述したように、基準演奏に被験演奏と手本演奏を共に対比させることから、２種類ある。このため、図２３に示すように、被験演奏と手本演奏の仮想テンポの推移を重ねて表示させている。この仮想テンポによる分析結果の表示は、図１に示す表示装置１１７の画面上に行われる。
【０２６８】
図２３に示すように分析結果を表示させた場合、基準演奏と被験演奏の相違はもとより、基準演奏と手本演奏の相違、手本演奏と被験演奏の相違を演奏者は容易に認識することができるようになる。例えば、手本演奏と基準演奏（楽譜に従った演奏）の相違からは、豊かな音楽表現を実現するための効果的な押鍵タイミングのズレといったことが判り、その視点からも演奏者は自身の演奏を検討することができる。このように、演奏者はより多くの視点から自身の演奏を検討することができるため、基本的な演奏操作（基準演奏を再現するような演奏操作）の修得だけでなく、上級者が行うような演奏操作（表現力が豊かな演奏操作）といった内容が異なる他の演奏操作も修得することができる。即ち、第２の実施の形態と比較して、演奏者の独習をより強力に支援することができる。
【０２６９】
次に、上記演奏分析を行い、その分析結果を表示するためメインＣＰＵ１０１の動作について詳細に説明する。そのメインＣＰＵ１０１の動作は、プログラムＲＯＭ１０２から読み出した制御プログラムを実行することで実現されるものである。
【０２７０】
第３の実施の形態では、基準演奏と被験演奏を対比させての分析の他に、基準演奏と被験演奏を対比させての分析を行うが、それらの実質的な内容は同じである。このため、第３の実施の形態による自動演奏処理は、図１９に示す第２の実施の形態のそれと基本的に同じとなる。より具体的に言えば、ステップ１９０１の演奏データ取得処理においては、基準データと被験データの取得に加えて、手本データの取得も合わせて行うことになり、他のステップ１９０２〜１９０６の処理にも同様な変更は存在するが、それらはフローチャート自体を変えるものではない。ステップ１９０１〜１９０４の各サブルーチン処理の詳細については既に説明済みであるため、ステップ１９０５として実行される仮想テンポ演算処理だけを、図２２に示すその動作フローチャートを参照して詳細に説明する。
【０２７１】
先ず、ステップ２２０１では、基準データＲＡＭ１１２にＳＭＦ形式で格納されている基準データのヘッダー部から、基準演奏のテンポを取得する。続くステップ２２０２では、そのヘッダー部から分解能を更に取得する。その後、ステップ２２０３の処理に移行する。
ステップ２２０３では、手本データＲＡＭ１２０にＳＭＦ形式で格納されている手本データのヘッダー部から、その演奏の分解能を取得する。続くステップ２２０４では、被験データＲＡＭ１１３にＳＭＦ形式で格納されている被験データのヘッダー部から、その演奏の分解能を取得する。その後、ステップ２２０５の処理に移行する。
【０２７２】
ステップ２２０５では、所得した基準データと被験データの分解能から、それらの比ｒａｔｅ＿ｔ（＝基準データの分解能／被験データの分解能）を算出する。続くステップ２２０６では、所得した基準データと手本データの分解能から、それらの比ｒａｔｅ＿ｍ（＝基準データの分解能／手本データの分解能）を算出する。その後、ステップ２２０７の処理に移行する。
【０２７３】
上記ステップ２２０１〜２２０６の処理は、仮想テンポ演算処理における初期設定を行う処理に相当する。ステップ２２０６に続くステップ２２０７〜２２１３は、処理ループを形成している。この処理ループでは、基準データ中で対象とする音符（ノートデータ）を順次変更しながら（移動させながら）、各音符（ノートデータ）毎に、その音符（ノートデータ）に対応する被験データ、及び手本データ中の音符（ノートデータ）の仮想テンポをそれぞれ算出し、それらを分析用データとしてストアしていくことが行われる。そのステップ２２０７〜２２１３の処理ループにおいて対象とするデータは、ワークＲＡＭ１０４に格納されている基準データ、被験データ、及び手本データの分析用データである。
【０２７４】
先ず、ステップ２２０７では、基準データの全ての音符（ノートデータ）を処理したか否か、言い換えれば、各音符（ノートデータ）の仮想テンポの算出が全て終了したか否か判定する。各音符（ノートデータ）の仮想テンポを全て算出した場合、その判定はＹＥＳとなって一連の処理を終了する。そうでない場合には、その判定はＮＯとなってステップ２２０８の処理に移行する。
【０２７５】
ステップ２２０８では、基準データ中の対象とする音符（ノートデータ）を一つ移動させ、その音符（ノートデータ）とその一つ前の音符（ノートデータ）との間のイベント間時間（クロック数）ｔｉｍｅ＿ｏｒｇを取得する。ここで、対象とする音符（ノートデータ）の指定は、カウンタを用いて行い、イベント間時間ｔｉｍｅ＿ｏｒｇは、対象とする音符（ノートデータ）の押鍵タイミングから、その一つ前の音符（ノートデータ）の押鍵タイミングを減算することで取得する。押鍵タイミングは、図２に示すように、分析用データ中の１次データの一つとして格納されているデータである。
【０２７６】
基準データの音符（ノートデータ）に対応付けられた被験データ中の音符（ノートデータ）は、分析用データ中の対応番号、タイミング対応番号、及び制御用フラグを基に特定する。これは、手本データにおいても同じである。ステップ２２０８に続くステップ２２０９では、それらのデータから、基準データ中で対象としている音符（ノートデータ）に対応付けられた被験データの音符（ノートデータ）を特定し、上記と同様にして、その音符（ノートデータ）のイベント間時間ｔｉｍｅ＿ｔａｒｇを取得する。続くステップ２２１０では、基準データ中で対象としている音符（ノートデータ）に対応付けられた手本データの音符（ノートデータ）を特定して、その音符（ノートデータ）のイベント間時間ｔｉｍｅ＿ｍａｓｔを取得する。その後、ステップ２２１１の処理に移行する。
【０２７７】
ステップ２２１１では、ステップ２２０９で特定した被験データの音符（ノートデータ）の仮想テンポ値ｔｅｍｐｏ＿ｔを取得する。その仮想テンポ値ｔｅｍｐｏ＿ｔは、ステップ２２０１で取得したテンポの値をｔｅｍｐｏ＿ｏｒｇとすると、以下に示す数式によって算出される。
【０２７８】
ｔｅｍｐｏ＿ｔ＝（ｔｉｍｅ＿ｏｒｇ／（ｒａｔｅ＿ｔ・ｔｉｍｅ＿ｔａｒｇ））・ｔｅｍｐｏ＿ｏｒｇ
ステップ２２１１に続くステップ２２１２では、ステップ２２１０で特定した被験データの音符（ノートデータ）の仮想テンポ値ｔｅｍｐｏ＿ｍを取得する。その仮想テンポ値ｔｅｍｐｏ＿ｍは、ステップ２２０１で取得したテンポの値をｔｅｍｐｏ＿ｏｒｇとすると、以下に示す数式によって算出される。
【０２７９】
ｔｅｍｐｏ＿ｔ＝（ｔｉｍｅ＿ｏｒｇ／（ｒａｔｅ＿ｍ・ｔｉｍｅ＿ｍａｓｔ））・ｔｅｍｐｏ＿ｏｒｇ
ステップ２２１２に続くステップ２２１３では、ステップ２２１１、２２１２で算出した仮想テンポ値ｔｅｍｐｏ＿ｔ、ｔｅｍｐｏ＿ｍを順にストアする。具体的には、例えば仮想テンポ値ｔｅｍｐｏ＿ｔを、ステップ２２０９で特定した音符（ノートデータ）の分析用データの一つとしてストアし、他方の仮想テンポ値ｔｅｍｐｏ＿ｍを、ステップ２２１０で特定した音符（ノートデータ）の分析用データの一つとしてストアする。なお、これらの仮想テンポ値ｔｅｍｐｏ＿ｔ、ｔｅｍｐｏ＿ｍは、図２に示す分析用データの１項目として追加しても良く、押鍵タイミング差分、或いは離鍵タイミング差分等の換わりにストアさせても良い。
【０２８０】
これら仮想テンポ値ｔｅｍｐｏ＿ｔ、ｔｅｍｐｏ＿ｍのストアが終了すると、ステップ２２０７の処理に戻る。このときには、対象とする音符（ノートデータ）を一つ移動して、上記と同様に処理ループが実行される。その処理ループにおいて、ステップ２２０７でＹＥＳと判定された場合には、仮想テンポ演算処理が終了して図１９に示すステップ１９０６の分析結果出力処理に移行する。その分析結果出力処理を実行することで、ワークＲＡＭ１０４に格納されている基準データ、被験データ、及び手本データの各分析用データから、図２３に示すような分析結果が表示装置１１７に表示されることになる。
【０２８１】
なお、第３の実施の形態では、図２３に示すように、被験演奏と手本演奏の仮想テンポを共に表示させるようにしているが、それらを選択的に表示できるようにしても良い。また、更に多くの演奏を基準演奏と対比させて、より多くの仮想テンポを表示できるようにしても良い。
【０２８２】
度数分布や標準偏差等を分析結果として表示する第１の実施の形態においては、第３の実施の形態のように、複数の演奏間（例えば基準演奏と被験演奏、基準演奏と手本演奏）の分析をそれぞれ行うようにしても良い。そのように変形した場合であっても、上述した理由により、その動作の流れ（図３に示す演奏分析処理）は基本的には変形前と同じである。
【０２８３】
また、第１および第３の実施の形態を組み合わせて、例えば基準演奏と被験演奏間の相違は仮想テンポ、基準演奏と手本演奏間の相違は度数分布と標準偏差といったように、演奏間の相違を示す情報を演奏者が所望の形態で表示できるようにしても良い。演奏間の相違を基準演奏に反映させた自動再生については、各演奏間毎に行っても良く、演奏者（ユーザ）が選択した演奏間のものに対してのみ行うようにしても良い。
【０２８４】
また、第２および第３の実施の形態では、演奏データの分解能を考慮して演奏データ間の音符（ノートデータ）の対応付けを行っているが、それらの演奏データのテンポが異なることも考えられる。このことから、分解能の他に、テンポを考慮して、演奏データ間の音符（ノートデータ）の対応付けを行うようにしても良い。テンポ、分解能の何れかが変更された場合、それに合わせて１クロックの周期が変化する。このため、例えば１クロックの周期の相違に着目することで、テンポ、及び分解能の少なくとも一方が異なっていても、演奏データ間の音符（ノートデータ）の対応付けを正確に行うことができるようになる。
【０２８５】
第１〜第３の実施の形態は、電子楽器１００に本発明を適用したものであるが、演奏情報をデジタルで扱うＭＩＤＩ規格が定められていることから、本発明は、他の装置、例えばパーソナルコンピュータ（パソコン）に対しても容易に適用することができる。パソコンは、普通、本発明を実現するために必要なハード上の構成（メモリやＣＰＵ、データの入出力装置等）を備えている。このため、パソコンに対しては、本発明の機能（動作）を実現するためのプログラムを格納するだけで、本発明を適用させることができる。そのプログラムは、ＣＤ−ＲＯＭやフロッピーディスク、ＭＯ等の記憶媒体に記憶させて配付してもよく、何らかのネットワークを介して配信しても良い。
【０２８６】
【発明の効果】
以上、説明したように本発明は、演奏者の演奏内容を手本、或いは基準となる演奏内容と対比して分析し、その演奏内容から異なる部分の情報、或いはそれらの間の相違を対比するための情報を具体的に数値、或いは図形（グラフ等）で演奏者に提供する。このため、演奏者は自身の演奏内容を客観的、且つ具体的に把握することができる。また、それによって演奏者は、課題を克服するための効果的な練習を行うことができるので、高い練習効率を得ることができる。
【０２８７】
また、本発明は、演奏者の演奏内容を手本、或いは基準となる演奏内容に反映させ、その反映させた演奏内容を再生させるため、演奏者は自身の演奏で悪い点を聴感から認識（把握）することができる。また、演奏者は、演奏の部分的な箇所を含め、全体的な演奏傾向を容易に認識することができる。これにより、高い練習効率を得ることができる。
【０２８８】
これらを組み合わせた場合には、より高い上記の効果を得ることができる。
【図面の簡単な説明】
【図１】本実施の形態が適用された電子楽器の構成を示すブロック図である。
【図２】１音符当たりの分析用データの構造を示す図である。
【図３】演奏分析処理の動作フローチャートである。
【図４】演奏データ取得処理の動作フローチャートである。
【図５】ノート数取得処理の動作フローチャートである。
【図６】ＳＭＦ処理の動作フローチャートである。
【図７】チャンネルメッセージ処理の動作フローチャートである。
【図８】ノートオンコード処理の動作フローチャートである。
【図９】ノートオフコード処理の動作フローチャートである。
【図１０】１次データ取得処理の動作フローチャートである。
【図１１】ノートマッチ処理の動作フローチャートである。
【図１２】基準演奏の同タイミング押鍵検出処理の動作フローチャートである。
【図１３】押鍵タイミングによるノートマッチ処理の動作フローチャートである。
【図１４】基準データポインタのイニシャル処理の詳細を示す図である。
【図１５】ノートマッチ補正処理の動作フローチャートである。
【図１６】ノートナンバーチェック処理の動作フローチャートである。
【図１７】差分取得処理の動作フローチャートである。
【図１８】平均値取得処理の動作フローチャートである。
【図１９】演奏分析処理の動作フローチャートである（第２の実施の形態）。
【図２０】仮想テンポ演算処理の動作フローチャートである。
【図２１】分析結果の表示例を示す図である。
【図２２】仮想テンポ演算処理の動作フローチャートである（第３の実施の形態）。
【図２３】分析結果の表示例を示す図である（第３の実施の形態）。
【符号の説明】
１０１    メインＣＰＵ
１０２    プログラムＲＯＭ
１０４    ワークＲＡＭ
１０８    楽音発生装置
１１２    基準データＲＡＭ
１１３    被験データＲＡＭ
１１４    シリアルインターフェイス
１１５    ネットワークインターフェイス
１１６    外部記憶装置
１１７    表示装置
１２０    手本データＲＡＭ
【図１】
0003577561.tif 000002
【図２】
0003577561.tif 000003
【図３】
0003577561.tif 000004
【図４】
0003577561.tif 000005
【図５】
0003577561.tif 000006
【図６】
0003577561.tif 000007
【図７】
0003577561.tif 000008
【図８】
0003577561.tif 000009
【図９】
0003577561.tif 000010
【図１０】
0003577561.tif 000011
【図１１】
0003577561.tif 000012
【図１２】
0003577561.tif 000013
【図１３】
0003577561.tif 000014
【図１４】
0003577561.tif 000015
【図１５】
0003577561.tif 000016
【図１６】
0003577561.tif 000017
【図１７】
0003577561.tif 000018
【図１８】
0003577561.tif 000019
【図１９】
0003577561.tif 000020
【図２０】
0003577561.tif 000021
【図２１】
0003577561.tif 000022
【図２２】
0003577561.tif 000023
【図２３】
0003577561.tif 000024