(57)【特許請求の範囲】
【請求項１】
曲の演奏を行うための複数の操作子と、
この各操作子に対応して設けられた発光手段と、
操作すべき操作子に対応する音高データ、発音期間を表す発音開始及び発音終了タイミングを示す時間データを含む音符データからなる曲データを取得する曲データ取得手段と、
この曲データ取得手段により得られた曲データを構成する音符データのうち、発音期間の一部が重複している複数の音符データについては当該発音期間の全てが重複するように補正するデータ補正手段と、
このデータ補正手段により補正された曲データを構成する音符データを、当該音符データに含まれる時間データに基づいたタイミングで順次読み出すとともに、当該読み出された音符データの音高データに対応する発光手段を当該音符データの発音開始タイミングに合わせて発光させた後、当該読み出しを停止させる読み出し制御手段と、
前記読み出し制御手段によって操作すべき操作子に対応する発光手段が発光されている際に、前記操作子の操作に応答して前記読み出し制御手段の読み出しを再開させるとともに、当該発光手段の発光開始から所定時間内に操作すべき操作子が操作されたことが検出されない場合には警告報知を行う演奏判定手段と、
を備えたことを特徴とする演奏教習装置。
【請求項２】
曲の演奏を行うための複数の操作子と、この各操作子に対応して設けられた発光手段を有する演奏教習装置に適用されるプログラムを記憶する記憶媒体であって、
操作すべき操作子に対応する音高データ、発音期間を表す発音開始及び発音終了タイミングを示す時間データを含む音符データからなる曲データを取得する曲データ取得順と、
この曲データ取得手段により得られた曲データを構成する音符データのうち、発音期間の一部が重複している複数の音符データについては当該発音期間の全てが重複するように補正するデータ補正手順と、
このデータ補正手段により補正された曲データを構成する音符データを、当該音符データに含まれる時間データに基づいたタイミングで順次読み出すとともに、当該読み出された音符データの音高データに対応する発光手段を当該音符データの発音開始タイミングに合わせて発光させた後、当該読み出しを停止させる読み出し制御手順と、
前記読み出し制御手段によって操作すべき操作子に対応する発光手段が発光されている際に、前記操作子の操作に応答して前記読み出し制御手段の読み出しを再開させるとともに、当該発光手段の発光開始から所定時間内に操作すべき操作子が操作されない場合には警告報知を行う演奏判定手順と、
を実行する演奏教習プログラムを記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、演奏を教習する演奏教習装置及び演奏教習処理プログラムを記録した記録媒体に関する。
【０００２】
【従来の技術】
演奏を教習するナビゲーション機能を有する演奏教習装置が普及している。例えば、ナビゲーション機能をもつ鍵盤装置においては、操作子である鍵盤の各鍵内にＬＥＤ等の発光手段を設けて、曲の音符データの進行に合わせて音高データに対応する鍵を発音タイミングに合わせて発光させ、曲の演奏教習を行っている。このようなナビゲーション機能を有する鍵盤装置の中には、複数のレッスンモードで演奏を教習するものもある。例えば、第１のレッスンモード及び第２のレッスンモードの２つのレッスンモードを持ったものがある。第１のレッスンモードでは、押鍵するタイミングのみを習得するためのナビゲーションを行う。このモードにおいては、発光している鍵に限らずどの鍵を押鍵しても、押鍵のタイミングと鍵数とが合っていれば正しいと判定する。第２のレッスンモードでは、押鍵するタイミングだけでなく押鍵の音高も合っている場合に正しいと判定する。
【０００３】
【発明が解決しようとする課題】
しかしながら、第１のレッスンモード１及び第２のレッスンモードの２つのレッスンモードを持った従来の鍵盤装置においては、和音を含む曲の演奏教習には以下のような問題があった。
演奏時には同時に押鍵する和音であっても、ＳＭＦ（Ｓｔａｎｄａｒｄ  Ｍｉｄｉ  Ｆｉｌｅ）等の汎用の曲データでは、ノートオンやノートオフ等のイベントデータがシリアルに配列されているので、鍵の発光開始時間が少しずつずれてしまう。また、演奏法的に故意に和音の各構成音を同時に押鍵せずに微妙な時間差で押鍵する場合もある。
ところが、発音期間の少なくとも一部が重複している複数の音符については、譜面の上では同時に演奏すべき和音として演奏者が解釈するのが普通である。こため、第１のレッスンモードでは、和音を構成する音数分の押鍵がないと正しいと判定しないため、押鍵するタイミングのみを習得することができなかった。一方、第２のレッスンモードでは、ＳＭＦの曲データの場合に、和音の各構成音の発音タイミングの順番通りに押鍵しなければ正しいと判定しないため、本来の和音の演奏を習得することができなかった。
本発明の課題は、和音を含む曲データを異なるレッスンモードで練習する場合に、それぞれのレッスンモードの習得目的に合った演奏教習ができるようにすることである。
【０００４】
【課題を解決するための手段】
請求項１に記載の演奏教習装置は、曲の演奏を行うための複数の操作子と、この各操作子に対応して設けられた発光手段と、操作すべき操作子に対応する音高データ、発音期間を表す発音開始及び発音終了タイミングを示す時間データを含む音符データからなる曲データを取得する曲データ取得手段と、この曲データ取得手段により得られた曲データを構成する音符データのうち、発音期間の一部が重複している複数の音符データについては当該発音期間の全てが重複するように補正するデータ補正手段と、このデータ補正手段により補正された曲データを構成する音符データを、当該音符データに含まれる時間データに基づいたタイミングで順次読み出すとともに、当該読み出された音符データの音高データに対応する発光手段を当該音符データの発音開始タイミングに合わせて発光させた後、当該読み出しを停止させる読み出し制御手段と、前記読み出し制御手段によって操作すべき操作子に対応する発光手段が発光されている際に、前記操作子の操作に応答して前記読み出し制御手段の読み出しを再開させるとともに、当該発光手段の発光開始から所定時間内に操作すべき操作子が操作されたことが検出されない場合には警告報知を行う演奏判定手段と、を備えた構成になっている。
【０００５】
請求項2に記載の記憶媒体は、曲の演奏を行うための複数の操作子と、この各操作子に対応して設けられた発光手段を有する演奏教習装置に適用されるプログラムを記憶する記憶媒体であって、操作すべき操作子に対応する音高データ、発音期間を表す発音開始及び発音終了タイミングを示す時間データを含む音符データからなる曲データを取得する曲データ取得順と、この曲データ取得手段により得られた曲データを構成する音符データのうち、発音期間の一部が重複している複数の音符データについては当該発音期間の全てが重複するように補正するデータ補正手順と、このデータ補正手段により補正された曲データを構成する音符データを、当該音符データに含まれる時間データに基づいたタイミングで順次読み出すとともに、当該読み出された音符データの音高データに対応する発光手段を当該音符データの発音開始タイミングに合わせて発光させた後、当該読み出しを停止させる読み出し制御手順と、前記読み出し制御手段によって操作すべき操作子に対応する発光手段が発光されている際に、前記操作子の操作に応答して前記読み出し制御手段の読み出しを再開させるとともに、当該発光手段の発光開始から所定時間内に操作すべき操作子が操作されない場合には警告報知を行う演奏判定手順と、を実行する演奏教習プログラムを記録している。
【０００８】
請求項１又は請求項２の発明によれば、曲データにおいて発音期間の一部が重複している音符データについて対応する発光手段を発光させる際に、その発音期間の全てが重複するように補正し、操作開始タイミングを習得するためのレッスンモードにおいては、発光開始時間から所定時間内に任意の操作子が操作開始されない場合は警告報知を行う。
【００１０】
【発明の実施の形態】
以下、本発明における演奏教習装置の第１及び第２実施形態について、鍵盤装置を例に採って図を参照して説明する。
図１は、各実施形態における鍵盤装置のシステム構成である。ＣＰＵ１は、システムバスを介して、ＲＯＭ２、ＲＡＭ３、キースキャンインターフェース４、ＬＥＤＣ（ＬＥＤコントローラ）５、ＦＤＤＣ（フロッピーディスク・ドライブ・コントローラ）６、ＭＩＤＩインターフェース７に接続されている。ＲＯＭ２は、ＣＰＵ１によって実行される演奏教習処理プログラムを記憶している。ＲＡＭ３は、ＣＰＵ１によって処理される各種データを一時的に記憶する。キースキャンインターフェース４は、複数の操作子からなる鍵盤及びスイッチ群を備えたキーボード８に接続され、その操作状態をスキャンしてＣＰＵ１に入力する。ＬＥＤＣ５は、各鍵内に設けられた発光手段であるＬＥＤ（発光ダイオード）９の発光及び消光を制御する。ＦＤＤＣ６は、ＦＤＤ（フロッピーディスク駆動装置）１０を制御する。ＭＩＤＩインターフェース７は、外部のＭＩＤＩ装置から入力したＭＩＤＩデータを取り込んでＲＡＭ３にストアするとともに、ＣＰＵ１によって作成されたＭＩＤＩデータを外部のＭＩＤＩ音源に出力する。
【００１１】
図２（１）は、図２（２）に示す音符をＳＭＦ形式で表わしたデータフォーマットである。図２（１）に示すように、アドレスＡＤごとの音符データは、ＮＯＴＥＯＮやＮＯＴＥＯＦＦ等のイベントデータ（ＥＶＥＮＴ）、イベント開始までのデルタタイム（ＤＴＩＭＥ）、及び音高データで構成されている。このほか、ベロシティデータ等も含まれるが、説明の便宜を図るために省略する。アドレス２、３、４のＮＯＴＥＯＮのイベントデータは発音開始タイミングが同じで和音を構成しているが、データとしてはシリアルデータの配列になっている。なお、曲データの最後はＥＮＤデータになっている。
【００１２】
図３は、各実施形態において使用するレジスタ群、フラグ群等を示している。Ｔ１は実時間レジスタであり、ナビゲーションがスタートすると、５〜１０ｍｓｅｃごとに入るタイマインタラプトによってこのレジスタの時間データがインクリメントされる。Ｔ２はデルタタイムレジスタであり、曲の音符データのアドレスの進行に応じてデルタタイムがストアされる。ＬＦは曲ロードフラグであり、このフラグが「１」のときに曲データをＲＡＭにロードする。ＭＯＤＥはモードレジスタであり、このレジスタの値が「０」の場合はマニュアル演奏モードであり、「１」の場合は第１のレッスンモードであり、「２」の場合は第２のレッスンモードである。各レッスンモードについては後述する。ＳＴＦはスタートフラグであり、このフラグが「１」になるとナビゲーションがスタートし、「０」になるとナビゲーションがストップする。ＡＤは前述したように、音符データのアドレスを指定するレジスタである。
【００１３】
ＴＡはタイムレジスタであり、ＬＥＤの発光開始時間がストアされる。ＴＢもタイムレジスタであり、押鍵開始時間がストアされる。ＢＵＦＡはナビゲーションガイド用のバッファであり、ＢＵＦＢは押鍵・離鍵用のバッファである。ｎ、ｋ、ｍは、それぞれ鍵番号、バッファＢＵＦＡのエリア、バッファＢＵＦＢのエリアを指定するポインタである。ＴＣはタイムレジスタであり、ＬＥＤ消光開始時間がストアされる。ＴＤもタイムレジスタであり、離鍵開始時間がストアされる。Ｔ３は判定レジスタであり、このレジスタの値によって演奏結果が正しいか否かを判定する。Ｔ４（ｍ）は第２実施形態において使用する判定レジスタである。ＨＦ（ｍ）は第２実施形態において使用する判定フラグである。各実施形態において使用するレジスタ群、フラグ群等についてはさらに後述する。
【００１４】
次に、第１実施形態における演奏教習処理について、ＣＰＵ１のフローチャート等を参照して詳細に説明する。図４はメインフローである。所定のイニシャライズ処理（ステップＡ１）の後、スイッチ処理（ステップＡ２）、曲ロード処理（ステップＡ３）、ＬＥＤ処理（ステップＡ４）、鍵盤処理（ステップＡ５）、発音処理（ステップＡ６）を繰り返し実行する。図５は、タイマインタラプト１のフローであり、一定時間（５〜１０ｍｓｅｃ）ごとに実時間を計数するためにＴ１の値をインクリメントする。図６は、タイマインタラプト２のフローであり、一定時間ごとにストアされているデルタタイムの値をデクリメントする。
【００１５】
図７及び図８は、メインフローにおけるステップＡ２のスイッチ処理のフローである。このフローにおいては、曲ロードスイッチがオンされたか否かを判別し（ステップＢ１）、このスイッチがオンされたときは、フラグＬＦを「１」にセットする（ステップＢ２）。そして、このフローを終了してメインフローに戻る。曲ロードスイッチがオンされない場合には、モードスイッチがオンされたか否かを判別する（ステップＢ３）。このスイッチがオンされたときは、選択されたモードを判別する（ステップＢ４）。通常の演奏であるマニュアルモードが選択されたときは、レジスタＭＯＤＥを「０」にセットする（ステップＢ５）。第１のレッスンモードが選択されたときは、ＭＯＤＥを「１」にセットする（ステップＢ６）。第２のレッスンモードが選択されたときは、ＭＯＤＥを「２」にセットする（ステップＢ７）。ＭＯＤＥをセットした後は、このフローを終了してメインフローに戻る。
【００１６】
曲ロードスイッチもモードスイッチもオンされない場合には、図８のフローにおいて、スタート／ストップスイッチがオンされたか否かを判別する（ステップＢ８）。このスイッチがオンされたときは、フラグＳＴＦを反転する（ステップＢ９）。そして、反転したＳＴＦが「１」であるか否かを判別する（ステップＢ１０）。ＳＴＦが「１」である場合には、レジスタＡＤを「０」にセットして（ステップＢ１１）、曲データの最初のアドレスを指定する。次に、指定した最初のアドレスにおけるデルタタイムＤＴＩＭＥ（ＡＤ）をレジスタＴ２にセットする（ステップＢ１２）。次に、タイマインタラプト１及び２を解除する（ステップＢ１３）。そして、このフローを終了してメインフローに戻る。
【００１７】
ステップＢ１０においてＳＴＦが「０」である場合には、タイマインタラプト１及び２を禁止する（ステップＢ１４）。そして、このフローを終了してメインフローに戻る。上記各スイッチがオンされない場合には、その他のスイッチがオンされたか否かを判別し（ステップＢ１５）、他のスイッチがオンされたときは、オンされたスイッチに対応するその他の処理を実行する（ステップＢ１６）。そして、このフローを終了してメインフローに戻る。
【００１８】
図１０は、図４のメインフローにおけるステップＡ３の曲ロード処理のフローである。このフローにおいては、フラグＬＦが「１」すなわち曲ロードであるか否かを判別する（ステップＣ１）。ＬＦが「０」である場合には、曲ロードではないので直ちにこのフローを終了してメインフローに戻る。ＬＦが「１」である場合には、曲データをロードする（ステップＣ２）。ロードする曲データは、図１に示したＦＤＤＣ６及びＦＤＤ１０を介してフロッピーディスクからの場合、又は、ＭＩＤＩインターフェース７を介して図示しない外部のＭＩＤＩ装置からの場合がある。
【００１９】
曲データをロードした際に、複数の音符データの発音期間の一部が重複しているか否か、すなわちその曲データが和音であるか否かを判別し（ステップＣ３）、発音期間の一部が重複している場合、すなわち和音が含まれている場合には、その発音期間の全てが重複するように補正する処理（この明細書ではクオンタイズ処理と称する）を実行する（ステップＣ４）。図１０に示すように、クオンタイズ処理の前は、和音を構成する各音高データの発音開始タイミング及び消音タイミングがずれているが、クオンタイズ処理の後では、各音高データの発音開始タイミング及び消音タイミングが一致している。次に曲データが終了か否かを判別し（ステップＣ５）、終了でない場合にはステップＣ２に移行して曲データのロード処理を続行する。曲データが終了したときは、ＬＦを「０」にセットして（ステップＣ６）、このフローを終了してメインフローに戻る。
【００２０】
図１１〜図１４は、図４のメインフローにおけるステップＡ４のＬＥＤ処理のフローである。このフローにおいては、ＭＯＤＥにストアされているデータが「１」又は「２」のいずれかであるか否かを判別する（ステップＤ１）。ＭＯＤＥのデータが「０」すなわちマニュアル演奏モードである場合には、直ちにこのフローを終了してメインフローに戻る。ＭＯＤＥのデータが「１」又は「２」である場合、すなわちナビゲーション演奏モードである場合には、ＳＴＦが「１（スタート）」であるか否かを判別する（ステップＤ２）。ＳＴＦが「０（ストップ）」である場合には、このフローを終了してメインフローに戻る。ＳＴＦが「１」である場合には、レジスタＴ２にストアされているタイムデータが、図６のタイマインタラプト２の処理によってデクリメントされて「０」に達したか否かを判別する（ステップＤ３）。Ｔ２のタイムデータが「０」に達していない場合には、まだイベントの処理開始時間になっていないので、このフローを終了してメインフローに戻る。
【００２１】
Ｔ２のタイムデータが「０」に達している場合には、レジスタＡＤで指定したアドレスのイベントデータがノートオンであるか否かを判別する（ステップＤ４）。このデータがノートオンである場合には、図１２のフローにおいて、ＢＵＦＡのエリアを指定するポインタｋを「１」にセットする（ステップＤ５）。次に、ノートオンのイベントデータの音高（ＮＯＴＥ）に対応するＬＥＤを点灯して発光させる（ステップＤ６）。そして、ＡＤで指定されたノートオンのイベントデータの音高データＮＯＴＥ｛ＥＶＥＮＴ（ＡＤ）｝をＢＵＦＡのｋで指定するエリアにストアする（ステップＤ７）。そして、ｋをインクリメントしてＢＵＦＡの次のエリアを指定し（ステップＤ８）、ＡＤをインクリメントして次のアドレスのイベントデータを指定する（ステップＤ９）。
【００２２】
そして、次のイベントデータが同じくノートオンであるか否かを判別する（ステップＤ１０）。同じくノートオンであるである場合には、そのイベントデータのデルタタイムが「０」であるか否かを判別する（ステップＤ１１）。すなわち、前のイベントデータと共に和音を構成するイベントデータであるか否かを判別する。和音を構成するイベントデータである場合には、ステップＤ６において対応するＬＥＤを発光させ、ステップＤ７においてＢＵＦＡにそのイベントデータの音高データをストアする。そして、次のイベントデータを指定し、そのイベントデータが同じく和音を構成する場合には、ＬＥＤの発光及びＢＵＦＡのストアを繰り返す。
【００２３】
ステップＤ１０において次のイベントデータがノートオンでない場合、又は、ステップＤ１１において次のイベントデータのデルタタイムが「０」でなく、和音を構成しない場合には、タイマインタラプト２を禁止して（ステップＤ１２）、音符データの進行を中止する。すなわち、ナビゲーションに応じた押鍵操作を待つ。次に、ＡＤで指定したイベントデータのデルタタイムをＴ２にストアする（ステップＤ１３）。そして、レジスタＴＡにレジスタＴ１の実時間のデータをストアする（ステップＤ１４）。したがって、ＬＥＤの発光開始時間のデータがＴＡにストアされる。そして、このフローを終了してメインフローに戻る。
【００２４】
図１１のステップＤ４において、ＡＤで指定したアドレスのイベントデータがノートオンでない場合には、図１３のフローにおいて、そのイベントデータがノートオフであるか否かを判別する（ステップＤ１５）。そのイベントデータがノートオフである場合には、ＢＵＦＡのエリアを指定するポインタｋを「１」にセットする（ステップＤ１６）。次に、ノートオフのイベントデータの音高（ＮＯＴＥ）に対応するＬＥＤを消灯して発光を停止させる（ステップＤ１７）。そして、ＡＤで指定されたノートオフのイベントデータの音高データＮＯＴＥ｛ＥＶＥＮＴ（ＡＤ）｝と同じ音高データをＢＵＦＡから捜す。すなわち、ＥＶＥＮＴ（ＡＤ）の音高データとＢＵＦＡ（ｋ）の音高データとが一致しているか否かを判別する（ステップＤ１８）。
【００２５】
音高データが一致していない場合には、ｋをインクリメントして（ステップＤ１９）、ＢＵＦＡの次のエリアを指定する。そして、ｋが最大値より大きくなったか否かを判別する（ステップＤ２０）。最大値より大きくなったときは、ｋを「１」にセットして最初のエリアを指定する（ステップＤ２１）。ｋが最大値以下である場合、又はｋを「１」にセットした場合は、ステップＤ１８に移行して、ＥＶＥＮＴ（ＡＤ）の音高データとＢＵＦＡ（ｋ）の音高データとが一致しているか否かを判別する。音高データが一致したときは、そのエリアＢＵＦＡ（ｋ）に「−１」をストアする（ステップＤ２２）。この「−１」の値は、ノートオンからノートオフに変化したことを示すデータである。そして、ｋをインクリメントして（ステップＤ２３）、ＢＵＦＡの次のエリアを指定する。また、ＡＤをインクリメントして（ステップＤ２４）、ＡＤで指定するイベントデータが前のイベントデータと同じくノートオフであるか否かを判別する（ステップＤ２５）。
【００２６】
イベントデータががノートオフである場合には、そのデルタタイムが「０」であるか否かを判別する（ステップＤ２６）。すなわち、前のイベントデータと共に和音を構成するイベントデータであるか否かを判別する。和音を構成する場合にはステップＤ１７に移行してＬＥＤの発光停止を行い、ステップＤ２２においてＢＵＦＡ（ｋ）に［−１］をストアする。そして、次のイベントデータを指定し、そのイベントデータが同じく和音を構成する場合には、ＬＥＤの発光停止及びＢＵＦＡへの「−１」のストアを繰り返す。
【００２７】
ステップＤ２５において次のイベントデータがノートオフでない場合、又は、ステップＤ２６において次のイベントデータのデルタタイムが「０」でなく、和音を構成しない場合には、タイマインタラプト２を禁止して（ステップＤ２７）、音符データの進行を中止する。すなわち、ナビゲーションに応じた離鍵操作を待つ。次に、ＡＤで指定したイベントデータのデルタタイムをＴ２にストアする（ステップＤ２８）。そして、レジスタＴＣにレジスタＴ１の実時間のデータをストアする（ステップＤ２９）。したがって、ＬＥＤの発光停止時間のデータがＴＣにストアされる。そして、このフローを終了してメインフローに戻る。
【００２８】
ＡＤで指定したイベントデータが、図１１のステップＤ４においてノートオンでなく、かつ、図１３のステップＤ１５においてノートオフでない場合には、そのイベントデータが曲の終了を示すＥＮＤデータであるか否かを判別する（ステップＤ３０）。そのイベントデータがＥＮＤデータである場合には、ＳＴＦを「０」にセットして（ステップＤ３１）、タイマインタラプト１及び２を禁止して（ステップＤ３２）、このフローを終了してメインフローに戻る。
【００２９】
ステップＤ３０において、イベントデータがＥＮＤデータでない場合、すなわち、そのイベントデータがノートデータ以外のプログラムチェンジ等のデータである場合には、図１４のフローにおいて、そのイベントデータに応じた処理を行う（ステップＤ３３）。次に、ＡＤをインクリメントして（ステップＤ３４）、ＡＤで指定するイベントデータのデルタタイムをＴ２にストアする（ステップＤ３５）。そして、図１１のステップＤ３に移行する。
【００３０】
図１５〜図１８は、図４のメインフローにおけるステップＡ５の鍵盤処理のフローである。このフローにおいては、キースキャンインターフェースを介して鍵を走査し（ステップＥ１）、押鍵操作又は離鍵操作による鍵変化があるか否かを判別する（ステップＥ２）。鍵変化がない場合には直ちにこのフローを終了してメインフローに戻る。押鍵による鍵変化（オン）があったときは、鍵番号を指定するポインタｎを「１」にセットすると共に、鍵変化用のバッファＢＵＦＢのエリアを指定するポインタｍを「１」にセットする（ステップＥ３）。
【００３１】
そして、ｎをインクリメントしながら、下記のループ処理を実行して押鍵された鍵番号を検索する。すなわち、ｎで指定する音高（ＮＯＴＥ）の鍵がオンであるか否かを判別し（ステップＥ４）、オンである場合にはその鍵番号ｎをＢＵＦＢ（ｍ）にストアする（ステップＥ５）。そして、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＥ６）。この後、又はステップＥ４においてｎで指定する音高（ＮＯＴＥ）の鍵がオンでない場合には、ｎをインクリメントして次の鍵番号を指定する（ステップＥ７）。そして、ｎが鍵数より大きい値になったか否かを判別する（ステップＥ８）。ｎが鍵数以下である場合には、ステップＥ４に移行して、ｎで指定する音高（ＮＯＴＥ）の鍵がオンであるか否かを判別する。
【００３２】
ステップＥ８においてｎが鍵数より大きい値になった場合、すなわち、すべての鍵の走査が終了したときは、レジスタＴＢにＴ１の実時間データをストアする（ステップＥ９）。したがって、ＴＢには押鍵開始時間のデータがストアされる。次に、ＴＢのデータからＴＡのデータを減算して、その結果をレジスタＴ３にストアする（ステップＥ１０）。したがって、押鍵すべき鍵に対応するＬＥＤの発光開始時間から、実際に押鍵された操作開始時間を減算した値、すなわち、押鍵をガイドした時から押鍵操作までの時間差をＴ３にストアする。
【００３３】
次に、図１６のフローにおいて、Ｔ３にストアされたデータが所定時間以内であるか否かを判別する（ステップＥ１１）。この所定時間は、運指に要する時間であり、曲のテンポや演奏者の熟練度によって変化する時間である。この所定時間はあらかじめ設定されている。Ｔ３のデータが所定時間以内である場合には、音符データの進行に対して操作開始タイミングが遅れていない場合である。この場合には、レッスンモードを判別する。すなわち、ＭＯＤＥの値が「２」で第２のレッスンモードであるか否かを判別する（ステップＥ１２）。ＭＯＤＥの値が「２」である場合には、ＢＵＦＡにストアされた全ての音高データが、ＢＵＦＢにストアされた全ての音高データと一致しているか否かを判別する（ステップＥ１３）。すなわち、押鍵をガイドされた鍵が正しく押鍵されたか否かを判別する。
【００３４】
全ての音高データが一致している場合には、演奏結果を正しいと判定し、タイマインタラプト２を解除して（ステップＥ１４）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ１５）、このフローを終了してメインフローに戻る。ステップＥ１２においてＭＯＤＥの値が「１」である場合、すなわち第１のレッスンモードである場合には、押鍵をガイドされた鍵が正しく押鍵されていなくとも、操作開始タイミングが遅れていなければ演奏結果を正しいと判定するので、タイマインタラプト２を解除して（ステップＥ１４）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ１５）、このフローを終了してメインフローに戻る。
【００３５】
ステップＥ１１において、Ｔ３の値が所定時間を超えている場合、すなわち、操作開始タイミングが遅れている場合には、その旨の警告を表示する（ステップＥ１６）。また、ステップＥ１３において、ＢＵＦＡにストアされた全ての音高データが、ＢＵＦＢにストアされた全ての音高データと一致していない場合にも、その旨の警告を表示する（ステップＥ１６）。警告表示の後は、タイマインタラプト２を解除して（ステップＥ１４）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ１５）、このフローを終了してメインフローに戻る。
【００３６】
図１５のステップＥ２において、鍵変化が離鍵（オフ）によるものである場合には、図１７のフローにおいて、鍵番号を指定するポインタｎを「１」にセットすると共に、鍵変化用のバッファＢＵＦＢのエリアを指定するポインタｍを「１」にセットする（ステップＥ１７）。そして、ｎをインクリメントしながら、下記のループ処理を実行して離鍵された鍵番号を検索する。すなわち、ｎで指定する音高（ＮＯＴＥ）の鍵がオフであるか否かを判別する（ステップＥ１８）。その鍵がオフである場合には、その鍵番号ＮＯＴＥ（ｎ）とＢＵＦＢ（ｍ）のエリアにストアされている鍵番号ＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが同じであるか否かを判別する（ステップＥ１９）。同じでない場合には、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＥ２０）。そして、ｍが最大値より大きいか否かを判別する（ステップＥ２１）。最大値より大きくなったときは、ｍを「１」にセットして最初のエリアを指定する（ステップＥ２２）。
【００３７】
ｍが最大値以下である場合、又はｍを「１」にセットした場合は、ステップＥ１９に移行して、鍵番号ＮＯＴＥ（ｎ）と鍵番号ＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが同じであるか否かを判別する。鍵番号が同じである場合には、そのエリアＢＵＦＢ（ｍ）に「−１」をストアする（ステップＥ２３）。そして、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＥ２４）。この後、又はステップＥ１８においてｎで指定する音高（ＮＯＴＥ）がオフでない場合には、ｎをインクリメントして次の鍵番号を指定する（ステップＥ２５）。そして、ｎが鍵数より大きい値になったか否かを判別する（ステップＥ２６）。ｎが鍵数以下である場合には、ステップＥ１８に移行して、ｎで指定する音高（ＮＯＴＥ）の鍵がオフであるか否かを判別する。
【００３８】
ステップＥ２６においてｎが鍵数より大きい値になった場合、すなわち、すべての鍵の走査が終了したときは、レジスタＴＤにＴ１の実時間データをストアする（ステップＥ２７）。したがって、ＴＤには離鍵開始時間のデータがストアされる。次に、ＴＤのデータからＴＣのデータを減算して、その結果をレジスタＴ３にストアする（ステップＥ２８）。したがって、離鍵すべき鍵に対応するＬＥＤの発光停止時間から、実際に離鍵された操作開始時間を減算した値、すなわち、離鍵をガイドした時から離鍵操作までの時間差をＴ３にストアする。
【００３９】
次に、図１８のフローにおいて、Ｔ３にストアされたデータが所定時間以内であるか否かを判別する（ステップＥ２９）。Ｔ３のデータが所定時間以内である場合には、音符データの進行に対して操作開始タイミングが遅れていない場合である。この場合には、レッスンモードを判別する。すなわち、ＭＯＤＥの値が「２」で第２のレッスンモードであるか否かを判別する（ステップＥ３０）。ＭＯＤＥの値が「２」である場合には、ＢＵＦＢの全てのデータが「−１」であるか否かを判別する（ステップＥ３１）。すなわち、離鍵をガイドされた鍵が正しく離鍵されたか否かを判別する。
【００４０】
ＢＵＦＢの全てのデータが「−１」である場合には、演奏結果を正しいと判定し、タイマインタラプト２を解除して（ステップＥ３２）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ３３）、このフローを終了してメインフローに戻る。ステップＥ３０においてＭＯＤＥの値が「１」である場合、すなわち第１のレッスンモードである場合には、離鍵をガイドされた鍵が正しく離鍵されていなくとも、離鍵の操作開始タイミングが遅れていなければ演奏結果を正しいと判定するので、タイマインタラプト２を解除して（ステップＥ３２）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ３３）、このフローを終了してメインフローに戻る。
【００４１】
ステップＥ２９において、Ｔ３の値が所定時間を超えている場合、すなわち、離鍵の操作開始タイミングが遅れている場合には、離鍵が遅れている旨の警告を表示する（ステップＥ３４）。また、ステップＥ３１において、ＢＵＦＢの全てのデータが「−１」でない場合にも、離鍵の鍵が誤っている旨の警告を表示する（ステップＥ３４）。警告表示の後は、タイマインタラプト２を解除して（ステップＥ３２）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＥ３３）、このフローを終了してメインフローに戻る。
【００４２】
このように、上記第１実施形態においては、鍵盤は、曲の演奏を行うための複数の操作子である。また、ＬＥＤは、操作すべき鍵に対応する音高データ及び操作開始タイミングを示す時間データを含む曲の音符データの進行に合わせて、演奏を教習するために各鍵に対応して設けられた発光手段である。そして、ＣＰＵ１は、発音期間の一部が重複している複数の音符データについては、その発音期間の全てが重複するように補正して、演奏すべき音符データとするデータ補正手段を構成し、演奏すべき音符データの音高データに対応するＬＥＤを操作開始タイミングに合わせて発光させる発光制御手段を構成する。
【００４３】
ＣＰＵ１はまた、複数の鍵に対応するＬＥＤが発光された場合には、第１のレッスンモードにおいては、その発光開始時間から所定時間内に任意の鍵が操作開始された演奏結果を正しいと判定し、第２のレッスンモードにおいては、その発光開始時間から所定時間内に、その発光されたＬＥＤに対応する複数の鍵が操作開始された場合には、その操作開始順序にかかわらず演奏結果を正しいと判定する演奏判定手段を構成する。
【００４４】
したがって、和音を含む曲データを異なるレッスンモードで練習する場合に、それぞれのレッスンモードの習得目的に合った演奏教習ができる。
【００４５】
この場合において、データ補正手段としてのＣＰＵ１は、曲の音符データの進行に先立って発音期間の一部が重複している複数の音符データの発音期間を補正する構成になっているが、他の実施形態として、ＣＰＵ１は、曲の音符データの進行に伴って発音期間の一部が重複している複数の音符データの発音期間を補正する構成にしてもよい。
【００４６】
また、上記第１実施形態においては、演奏教習装置として鍵盤装置を例に採って説明したが、本発明の適用できる装置としては、鍵盤装置に限定するものではない。例えば、管楽器の装置にも適用できる。この場合には、曲の演奏を行うための複数の操作子はキーであるので、各キーに対応してＬＥＤを設ける構成となる。
【００４７】
次に、第２実施形態における演奏教習処理について説明する。第２実施形態においては、ＣＰＵ１のメインフロー、タイマインタラプト１及び２のフロー、並びに、メインフローにおけるイニシャライズ処理、スイッチ処理、曲ロード処理、発音処理については、第１実施形態と同じであるので、図面及びその説明については省略する。したがって、この第２実施形態においては、第１実施形態と異なる処理である、ＬＥＤ処理及び鍵盤処理について説明する。
【００４８】
図１９〜図２３は、第２実施形態におけるＬＥＤ処理のフローである。このフローにおいては、ＭＯＤＥにストアされているデータが「１」又は「２」のいずれかであるか否かを判別する（ステップＦ１）。ＭＯＤＥのデータが「０」すなわちマニュアル演奏モードである場合には、直ちにこのフローを終了してメインフローに戻る。ＭＯＤＥのデータが「１」又は「２」である場合、すなわちナビゲーション演奏モードである場合には、ＳＴＦが「１（スタート）」であるか否かを判別する（ステップＦ２）。ＳＴＦが「０（ストップ）」である場合には、このフローを終了してメインフローに戻る。ＳＴＦが「１」である場合には、レジスタＴ２にストアされているタイムデータが、タイマインタラプト２の処理によってデクリメントされて「０」に達したか否かを判別する（ステップＦ３）。Ｔ２のタイムデータが「０」に達していない場合には、まだイベントの処理開始時間になっていないので、このフローを終了してメインフローに戻る。
【００４９】
Ｔ２のタイムデータが「０」に達している場合には、レジスタＡＤで指定したアドレスのイベントデータがノートオンであるか否かを判別する（ステップＦ４）。このデータがノートオンである場合には、図２０のフローにおいて、ＢＵＦＡのエリアを指定するポインタｋを「１」にセットする（ステップＦ５）。次に、ノートオンのイベントデータの音高（ＮＯＴＥ）に対応するＬＥＤを点灯して発光させる（ステップＦ６）。そして、ＡＤで指定されたノートオンのイベントデータの音高データＮＯＴＥ｛ＥＶＥＮＴ（ＡＤ）｝をＢＵＦＡのｋで指定するエリアにストアする（ステップＦ７）。次に、ｋをインクリメントしてＢＵＦＡの次のエリアを指定し（ステップＦ８）、ＡＤをインクリメントして次のアドレスのイベントデータを指定する（ステップＦ９）。
【００５０】
そして、次のイベントデータが同じくノートオンであるか否かを判別する（ステップＦ１０）。同じくノートオンであるである場合には、そのイベントデータのデルタタイムが「０」であるか否かを判別する（ステップＦ１１）。すなわち、前のイベントデータと共に和音を構成するイベントデータであるか否かを判別する。和音を構成するイベントデータである場合には、ステップＦ６において対応するＬＥＤを発光させ、ステップＦ７においてＢＵＦＡにそのイベントデータの音高データをストアする。そして、次のイベントデータを指定し、そのイベントデータが同じく和音を構成する場合には、ＬＥＤの発光及びＢＵＦＡのストアを繰り返す。
【００５１】
ステップＦ１０において次のイベントデータがノートオンでない場合、又は、ステップＦ１１において次のイベントデータのデルタタイムが「０」でなく、和音を構成しない場合には、タイマインタラプト２を禁止して（ステップＦ１２）、音符データの進行を中止する。すなわち、ナビゲーションに応じた押鍵操作を待つ。次に、ＡＤで指定したイベントデータのデルタタイムをＴ２にストアする（ステップＦ１３）。そして、レジスタＴＡにレジスタＴ１の実時間のデータをストアする（ステップＦ１４）。したがって、ＬＥＤの発光開始時間のデータがＴＡにストアされる。
【００５２】
次に、図２１のフローにおいて、ＢＵＦＡのエリアを指定するポインタｋを「１」にセットすると共に、ＢＵＦＢのエリアを指定するポインタｍを「１」にセットする（ステップＦ１５）。そして、ｋ及びｍをインクリメントしながら、以下のループ処理を実行する。すなわち、ＢＵＦＡ（ｋ）の音高データであるＮＯＴＥ｛ＢＵＦＡ（ｋ）｝と、ＢＵＦＢ（ｍ）の音高データであるＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが一致しているか否かを判別する（ステップＦ１６）。すなわち、押鍵すべき鍵に対応するＬＥＤの発光開始を行ったときに、すでにその鍵が押鍵されているか否かを判別する。
【００５３】
音高データが一致しない場合、すなわち、発光開始を行ったときにまだその鍵が押鍵されていない場合には、ｍをインクリメントして（ステップＦ１７）、ＢＵＦＢの次のエリアを指定する。そして、ｍが最大値より大きい値であるか否かを判別する（ステップＦ１８）。ｍが最大値以下である場合には、ステップＦ１６に移行して、音高データの一致を判別する。ステップＦ１８において、ｍが最大値より大きい値になった場合は、ＢＵＦＡ（ｋ）の音高データと同じ音高データがＢＵＦＢの全てのエリアにない場合である。この場合には、ｍを「１」にセットし（ステップＦ１９）、ｋをインクリメントする（ステップＦ２０）。そして、ｋが最大値より大きい値になったか否かを判別する（ステップＦ２１）。ｋが最大値以下である場合には、ステップＦ１６に移行して、音高データの一致を判別する。
【００５４】
音高データが一致した場合、すなわち、発光開始を行ったときに、すでにその鍵が押鍵されている場合には、ＢＵＦＢの各エリアに対応して設けられているレジスタＴ４（１）〜Ｔ４（ＭＡＸ）の中のｍで指定するレジスタＴ４（ｍ）に、ＴＢ｛ＢＵＦＢ（ｍ）｝のデータからＴＡのデータを減算した結果をストアする（ステップＦ２２）。すなわち、ＬＥＤの発光開始時間より前にすでに対応する鍵が押鍵されているので、その操作開始時間から発光開始時間を減算した時間差のデータをＴ４（ｍ）にストアする。そして、Ｔ４（ｍ）にストアされたデータが一定時間Ｔ０以内であるか否かを判別する（ステップＦ２３）。
【００５５】
この場合は、押鍵ガイドよりも少し早く押鍵された状態である。すなわち、演奏者の習熟度が向上して、押鍵ガイドを待つまでもなく演奏ができた場合である。ただし、Ｔ４（ｍ）にストアされたデータがあまりに大きい値の場合には、演奏者の習熟度が向上したためでなく、誤って偶然に押鍵したか又は演奏のテンポが曲のテンポとずれた場合である。したがって、Ｔ４（ｍ）のデータがＴ０以内である場合に、その演奏結果を正しいと判定して、判定フラグＨＦ（ｍ）を「１」にセットする（ステップＦ２４）。ＨＦ（ｍ）を「１」にセットした後、又は、ステップＦ２３において、Ｔ４（ｍ）のデータがＴ０のデータを超えている場合には、ｍをインクリメントして（ステップＦ２５）、ＢＵＦＢの次のエリアを指定する。そして、ｍが最大値より大きい値であるか否かを判別する（ステップＦ１８）。
【００５６】
図１９のステップＦ４において、ＡＤで指定したアドレスのイベントデータがノートオンでない場合には、図２２のフローにおいて、そのイベントデータがノートオフであるか否かを判別する（ステップＦ２６）。そのイベントデータがノートオフである場合には、ＢＵＦＡのエリアを指定するポインタｋを「１」にセットする（ステップＦ２７）。次に、ノートオフのイベントデータの音高（ＮＯＴＥ）に対応するＬＥＤを消灯して発光を停止させる（ステップＦ２８）。そして、ＡＤで指定されたノートオンのイベントデータの音高データＮＯＴＥ｛ＥＶＥＮＴ（ＡＤ）｝と同じ音高データをＢＵＦＡから捜す。すなわち、ＥＶＥＮＴ（ＡＤ）の音高データとＢＵＦＡ（ｋ）の音高データとが一致しているか否かを判別する（ステップＦ２９）。
【００５７】
音高データが一致していない場合には、ｋをインクリメントして（ステップＦ３０）、ＢＵＦＡの次のエリアを指定する。そして、ｋが最大値より大きくなったか否かを判別する（ステップＦ３１）。最大値より大きくなったときは、ｋを「１」にセットして最初のエリアを指定する（ステップＦ３２）。ｋが最大値以下である場合、又はｋを「１」にセットした場合は、ステップＦ２８に移行して、ＥＶＥＮＴ（ＡＤ）の音高データとＢＵＦＡ（ｋ）の音高データとが一致しているか否かを判別する。音高データが一致したときは、そのエリアＢＵＦＡ（ｋ）に「−１」をストアする（ステップＦ２２）。この「−１」の値は、ノートオンからノートオフに変化したことを示すデータである。そして、ｋをインクリメントして（ステップＦ３４）、ＢＵＦＡの次のエリアを指定する。また、ＡＤをインクリメントして（ステップＦ３５）、ＡＤで指定するイベントデータが前のイベントデータと同じくノートオフであるか否かを判別する（ステップＦ３６）。
【００５８】
イベントデータががノートオフである場合には、そのデルタタイムが「０」であるか否かを判別する（ステップＦ３７）。すなわち、前のイベントデータと共に和音を構成するイベントデータであるか否かを判別する。和音を構成する場合にはステップＦ２８に移行してＬＥＤの発光停止を行い、ステップＦ３３においてＢＵＦＡ（ｋ）に［−１］をストアする。そして、次のイベントデータを指定し、そのイベントデータが同じく和音を構成する場合には、ＬＥＤの発光停止及びＢＵＦＡへの「−１」のストアを繰り返す。
【００５９】
ステップＦ３６において次のイベントデータがノートオフでない場合、又は、ステップＦ３７において次のイベントデータのデルタタイムが「０」でなく、和音を構成しない場合には、タイマインタラプト２を禁止して（ステップＦ３８）、音符データの進行を中止する。すなわち、ナビゲーションに応じた離鍵操作を待つ。次に、ＡＤで指定したイベントデータのデルタタイムをＴ２にストアする（ステップＦ３９）。そして、レジスタＴＣにレジスタＴ１の実時間のデータをストアする（ステップＦ４０）。したがって、ＬＥＤの発光停止時間のデータがＴＣにストアされる。そして、このフローを終了してメインフローに戻る。
【００６０】
ＡＤで指定したイベントデータが、図１９のステップＦ４においてノートオンでなく、かつ、図２２のステップＦ２６においてノートオフでない場合には、そのイベントデータが曲の終了を示すＥＮＤデータであるか否かを判別する（ステップＦ４１）。そのイベントデータがＥＮＤデータである場合には、ＳＴＦを「０」にセットして（ステップＦ４２）、タイマインタラプト１及び２を禁止して（ステップＦ４３）、このフローを終了してメインフローに戻る。
【００６１】
ステップＦ４１において、イベントデータがＥＮＤデータでない場合、すなわち、そのイベントデータがノートデータ以外のプログラムチェンジ等のデータである場合には、図２３のフローにおいて、そのイベントデータに応じた処理を行う（ステップＦ４４）。次に、ＡＤをインクリメントして（ステップＦ４５）、ＡＤで指定するイベントデータのデルタタイムをＴ２にストアする（ステップＦ４６）。そして、図１９のステップＦ３に移行する。
【００６２】
図２４〜図２７は、メインフローにおける鍵盤処理のフローである。このフローにおいては、キースキャンインターフェースを介して鍵を走査し（ステップＧ１）、押鍵操作又は離鍵操作による鍵変化があるか否かを判別する（ステップＧ２）。鍵変化がない場合には直ちにこのフローを終了してメインフローに戻る。押鍵による鍵変化（オン）があったときは、鍵番号を指定するポインタｎを「１」にセットすると共に、鍵変化用のバッファＢＵＦＢのエリアを指定するポインタｍを「１」にセットする（ステップＧ３）。
【００６３】
そして、ｎをインクリメントしながら、下記のループ処理を実行して押鍵された鍵番号を検索する。すなわち、ｎで指定する音高（ＮＯＴＥ）の鍵がオンであるか否かを判別し（ステップＧ４）、オンである場合には、そのＮＯＴＥ（ｎ）の音高データとＢＵＦＢ（ｍ）の音高データであるＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが一致しているか否かを判別する（ステップＧ５）。音高データが一致していない場合には、ｍをインクリメントして（ステップＧ６）、ＢＵＦＢの次のエリアを指定する。そして、ｍが最大値より大きい値になったか否かを判別する（ステップＧ７）。ｍが最大値以下である場合には、ステップＧ５に移行して、音高データの一致を判別する。ｍが最大値より大きくなったときは、ｍを「１」にセットしてＢＵＦＢの最初のエリアを指定する（ステップＧ８）。
【００６４】
ステップＧ５において音高データが一致したときは、すでに同じ音高データがＢＵＦＢにストアされている場合である。この場合には、ポインタｍに対応する判定フラグＨＦ（ｍ）が「０」であるか否かを判別する（ステップＧ９）。ＨＦ（ｍ）が「０」である場合には、すでにストアされている音高データが古いデータであり、演奏結果の判定対象にならないデータである。したがって、改めて今回押鍵された鍵の鍵番号ｎをＢＵＦＢ（ｍ）にストアする（ステップＧ１０）。すなわち、やり直された押鍵による音高データをストアする。そして、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＧ１１）。ステップＧ９において、ＨＦ（ｍ）が「１」である場合には、すでにストアされている音高データが正しい演奏結果によるものと判定する。この場合には、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＧ１１）。
【００６５】
ｍをインクリメントした後、又はステップＧ４においてｎで指定する音高（ＮＯＴＥ）の鍵がオンでない場合には、ｎをインクリメントして次の鍵番号を指定する（ステップＧ１２）。そして、ｎが鍵数より大きい値になったか否かを判別する（ステップＧ１３）。ｎが鍵数以下である場合には、ステップＧ４に移行して、ｎで指定する音高（ＮＯＴＥ）の鍵がオンであるか否かを判別する。ステップＧ１３においてｎが鍵数より大きい値になった場合、すなわち、すべての鍵の走査が終了したときは、レジスタＴＢにＴ１の実時間データをストアする（ステップＧ１４）。したがって、ＴＢには今回の押鍵開始時間のデータがストアされ、、ＬＥＤの発光開始時間より前に押鍵されてＢＵＦＢにストアされている音高データの操作開始時間は無視される。次に、ＴＢのデータからＴＡのデータを減算して、その結果をレジスタＴ３にストアする（ステップＧ１５）。したがって、押鍵すべき鍵に対応するＬＥＤの発光開始時間より後に押鍵された操作開始時間を減算した値、すなわち、押鍵をガイドした後の押鍵操作までの時間差をＴ３にストアする。
【００６６】
次に、図２５のフローにおいて、Ｔ３にストアされたデータが所定時間以内であるか否かを判別する（ステップＧ１６）。この所定時間は、運指に要する時間であり、曲のテンポや演奏者の熟練度によって変化する時間であり、あらかじめ設定されている。Ｔ３のデータが所定時間以内である場合には、音符データの進行に対して操作開始タイミングが遅れていない場合である。この場合には、レッスンモードを判別する。すなわち、ＭＯＤＥの値が「２」で第２のレッスンモードであるか否かを判別する（ステップＧ１７）。ＭＯＤＥの値が「２」である場合には、ＢＵＦＡにストアされた全ての音高データが、ＢＵＦＢにストアされた全ての音高データと一致しているか否かを判別する（ステップＧ１８）。すなわち、押鍵をガイドされた鍵が正しく押鍵されたか否かを判別する。
【００６７】
全ての音高データが一致している場合には、演奏結果を正しいと判定し、タイマインタラプト２を解除して（ステップＧ１９）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ２０）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ２１）。そして、このフローを終了してメインフローに戻る。ステップＧ１７においてＭＯＤＥの値が「１」である場合、すなわち第１のレッスンモードである場合には、押鍵をガイドされた鍵が正しく押鍵されていなくとも、操作開始タイミングが遅れていなければ演奏結果を正しいと判定するので、タイマインタラプト２を解除して（ステップＧ１９）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ２０）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ２１）。そして、このフローを終了してメインフローに戻る。
【００６８】
ステップＧ１６において、Ｔ３の値が所定時間を超えている場合、すなわち、操作開始タイミングが遅れている場合には、押鍵タイミングが遅れている旨の警告を表示する（ステップＧ２２）。また、ステップＧ１８において、ＢＵＦＡにストアされた全ての音高データが、ＢＵＦＢにストアされた全ての音高データと一致していない場合には、押鍵された鍵が誤っている旨の警告を表示する（ステップＧ２２）。警告表示の後は、タイマインタラプト２を解除して（ステップＧ１９）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ２０）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ２１）。そして、このフローを終了してメインフローに戻る。
【００６９】
図２４のステップＧ２において、離鍵による鍵変化（オフ）である場合には、図２６のフローにおいて、鍵番号を指定するポインタｎを「１」にセットすると共に、鍵変化用のバッファＢＵＦＢのエリアを指定するポインタｍを「１」にセットする（ステップＧ２３）。そして、ｎをインクリメントしながら、下記のループ処理を実行して離鍵された鍵番号を検索する。すなわち、ｎで指定する音高（ＮＯＴＥ）の鍵がオフであるか否かを判別する（ステップＧ２４）。その鍵がオフである場合には、その鍵番号ＮＯＴＥ（ｎ）とＢＵＦＢ（ｍ）のエリアにストアされている鍵番号ＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが同じであるか否かを判別する（ステップＧ２５）。同じでない場合には、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＧ２６）。そして、ｍが最大値より大きいか否かを判別する（ステップＧ２７）。最大値より大きくなったときは、ｍを「１」にセットして最初のエリアを指定する（ステップＧ２８）。
【００７０】
ｍが最大値以下である場合、又はｍを「１」にセットした場合は、ステップＧ２５に移行して、鍵番号ＮＯＴＥ（ｎ）と鍵番号ＮＯＴＥ｛ＢＵＦＢ（ｍ）｝とが同じであるか否かを判別する。鍵番号が同じである場合には、そのエリアＢＵＦＢ（ｍ）に「−１」をストアする（ステップＧ２９）。そして、ｍをインクリメントしてＢＵＦＢの次のエリアを指定する（ステップＧ３０）。この後、又はステップＧ２４においてｎで指定する音高（ＮＯＴＥ）がオフでない場合には、ｎをインクリメントして次の鍵番号を指定する（ステップＧ３１）。そして、ｎが鍵数より大きい値になったか否かを判別する（ステップＧ３２）。ｎが鍵数以下である場合には、ステップＧ２４に移行して、ｎで指定する音高（ＮＯＴＥ）の鍵がオフであるか否かを判別する。
【００７１】
ステップＧ３２においてｎが鍵数より大きい値になった場合、すなわち、すべての鍵の走査が終了したときは、レジスタＴＤにＴ１の実時間データをストアする（ステップＧ３３）。したがって、ＴＤには離鍵開始時間のデータがストアされる。次に、ＴＤのデータからＴＣのデータを減算して、その結果をレジスタＴ３にストアする（ステップＧ３４）。したがって、離鍵すべき鍵に対応するＬＥＤの発光停止時間から、実際に離鍵された操作開始時間を減算した値、すなわち、離鍵をガイドした時から離鍵操作までの時間差をＴ３にストアする。
【００７２】
次に、図２７のフローにおいて、Ｔ３にストアされたデータが所定時間以内であるか否かを判別する（ステップＧ３５）。Ｔ３のデータが所定時間以内である場合には、音符データの進行に対して操作開始タイミングが遅れていない場合である。この場合には、レッスンモードを判別する。すなわち、ＭＯＤＥの値が「２」で第２のレッスンモードであるか否かを判別する（ステップＧ３６）。ＭＯＤＥの値が「２」である場合には、ＢＵＦＢの全てのデータが「−１」であるか否かを判別する（ステップＧ３７）。すなわち、離鍵をガイドされた鍵が正しく離鍵されたか否かを判別する。
【００７３】
ＢＵＦＢの全てのデータが「−１」である場合には、演奏結果を正しいと判定し、タイマインタラプト２を解除して（ステップＧ３８）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ３９）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ４０）。そして、このフローを終了してメインフローに戻る。ステップＧ３６においてＭＯＤＥの値が「１」である場合、すなわち第１のレッスンモードである場合には、離鍵をガイドされた鍵が正しく離鍵されていなくとも、離鍵の操作開始タイミングが遅れていなければ演奏結果を正しいと判定するので、タイマインタラプト２を解除して（ステップＧ３８）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ３９）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ４０）。そして、このフローを終了してメインフローに戻る。
【００７４】
ステップＧ３５において、Ｔ３の値が所定時間を超えている場合、すなわち、離鍵の操作開始タイミングが遅れている場合には、離鍵が遅れている旨の警告を表示する（ステップＧ４１）。また、ステップＧ３７において、ＢＵＦＢの全てのデータが「−１」でない場合にも、離鍵の鍵が誤っている旨の警告を表示する（ステップＧ４１）。警告表示の後は、タイマインタラプト２を解除して（ステップＧ３８）、音符データの進行を再開する。そして、ＢＵＦＡ及びＢＵＦＢをクリアして（ステップＧ３９）、フラグＨＦ（１）〜（ＭＡＸ）をすべて「０」にセットする（ステップＧ４０）。このフローを終了してメインフローに戻る。
【００７５】
このように、上記第２実施形態においては、第１実施形態の場合と同様に、鍵盤は、曲の演奏を行うための複数の操作子である。また、ＬＥＤは、操作すべき鍵に対応する音高データ及び操作開始タイミングを示す時間データを含む曲の音符データの進行に合わせて、演奏を教習するために各鍵に対応して設けられた発光手段である。そして、ＣＰＵ１は、発音期間の一部が重複している複数の音符データについては、その発音期間の全てが重複するように補正して、演奏すべき音符データとするデータ補正手段を構成し、演奏すべき音符データの音高データに対応するＬＥＤを操作開始タイミングに合わせて発光させる発光制御手段を構成する。
【００７６】
しかしながら、第２実施形態におけるＣＰＵ１は、複数の鍵に対応するＬＥＤが発光された場合には、第１のレッスンモードにおいては、その発光開始時間から所定時間以前に任意の鍵が操作開始された演奏結果も正しいと判定し、第２のレッスンモードにおいては、その発光開始時間から所定時間以前に、その発光されたＬＥＤに対応する複数の鍵が操作開始された場合でも、その操作開始順序にかかわらず演奏結果を正しいと判定する演奏判定手段を構成する。
【００７７】
したがって、この第２実施形態においても、和音を含む曲データを異なるレッスンモードで練習する場合に、それぞれのレッスンモードの習得目的に合った演奏教習ができる。
【００７８】
なお、上記第１実施形態及び第２実施形態においては、ＲＯＭ等のメモリに格納された演奏教習処理プログラムを実行する装置について説明したが、フロッピーディスクやＣＤ等の汎用の記録媒体に、各実施形態においてフローチャートによって示した演奏教習処理プログラムを記録し、パソコン等の汎用の情報処理装置によってこの記録媒体から演奏教習処理プログラムを読み出して実行させる構成にしてもよい。
【００７９】
【発明の効果】
本発明によれば、和音を含む曲データを異なるレッスンモードで練習する場合に、それぞれのレッスンモードの習得目的に合った演奏教習ができる。
【図面の簡単な説明】
【図１】本発明による演奏教習装置の各実施形態のブロック図。
【図２】各実施形態において演奏教習の対象となる曲データのフォーマットを示す図。
【図３】図１のＲＡＭに設けられたレジスタやフラグの内容を示す図。
【図４】各実施形態におけるＣＰＵのメインフローチャート。
【図５】各実施形態におけるタイマインタラプト１のフローチャート。
【図６】各実施形態におけるタイマインタラプト２のフローチャート。
【図７】各実施形態におけるスイッチ処理のフローチャート。
【図８】図７に続くスイッチ処理のフローチャート。
【図９】各実施形態における曲ロード処理のフローチャート。
【図１０】和音のクオンタイズ処理の説明図。
【図１１】第１実施形態におけるＬＥＤ処理のフローチャート。
【図１２】図１１に続くＬＥＤ処理のフローチャート。
【図１３】図１１に続くＬＥＤ処理のフローチャート。
【図１４】図１３に続くＬＥＤ処理のフローチャート。
【図１５】第１実施形態における鍵盤処理のフローチャート。
【図１６】図１５に続く鍵盤処理のフローチャート。
【図１７】図１５に続く鍵盤処理のフローチャート。
【図１８】図１７に続く鍵盤処理のフローチャート。
【図１９】第２実施形態におけるＬＥＤ処理のフローチャート。
【図２０】図１９に続くＬＥＤ処理のフローチャート。
【図２１】図２０に続くＬＥＤ処理のフローチャート。
【図２２】図１９に続くＬＥＤ処理のフローチャート。
【図２３】図２２に続くＬＥＤ処理のフローチャート。
【図２４】第２実施形態における鍵盤処理のフローチャート。
【図２５】図２４に続く鍵盤処理のフローチャート。
【図２６】図２４に続く鍵盤処理のフローチャート。
【図２７】図２６に続く鍵盤処理のフローチャート。
【符号の説明】
１  ＣＰＵ
２  ＲＯＭ
３  ＲＡＭ
４  キースキャンインターフェース
５  ＬＥＤコントローラ
６  ＦＤＤコントローラ
７  ＭＩＤＩインターフェース
８  キーボード
９  ＬＥＤ
【図１】
0003800867.tif 000002
【図２】
0003800867.tif 000003
【図３】
0003800867.tif 000004
【図４】
0003800867.tif 000005
【図５】
0003800867.tif 000006
【図６】
0003800867.tif 000007
【図７】
0003800867.tif 000008
【図８】
0003800867.tif 000009
【図９】
0003800867.tif 000010
【図１０】
0003800867.tif 000011
【図１１】
0003800867.tif 000012
【図１２】
0003800867.tif 000013
【図１３】
0003800867.tif 000014
【図１４】
0003800867.tif 000015
【図１５】
0003800867.tif 000016
【図１６】
0003800867.tif 000017
【図１７】
0003800867.tif 000018
【図１８】
0003800867.tif 000019
【図１９】
0003800867.tif 000020
【図２０】
0003800867.tif 000021
【図２１】
0003800867.tif 000022
【図２２】
0003800867.tif 000023
【図２３】
0003800867.tif 000024
【図２４】
0003800867.tif 000025
【図２５】
0003800867.tif 000026
【図２６】
0003800867.tif 000027
【図２７】
0003800867.tif 000028