(57)【特許請求の範囲】
【請求項１】
複数の楽音のイベントデータで構成された曲を入力する入力手段と、
この入力手段によって入力された曲のイベントデータの中から楽音の音量があらかじめ楽音の音色毎に設定した音量しきい値より小さい場合および楽音の発音時間があらかじめ楽音の音色毎に設定した時間しきい値より短い場合の少なくとも一つの場合にイベントデータを削除するデータ修正手段と、
このデータ修正手段によって削除されなかったイベントデータに応じて演奏操作をガイドする演奏ガイド手段と、
を備えたことを特徴とする演奏教習装置。
【請求項２】
複数の楽音のイベントデータで構成された曲を入力する入力手順と、
この入力手順によって入力された曲のイベントデータの中から楽音の音量があらかじめ楽音の音色毎に設定した音量しきい値より小さい場合および楽音の発音時間があらかじめ楽音の音色毎に設定した時間しきい値より短い場合の少なくとも一つの場合にイベントデータを削除するデータ修正手順と、
このデータ修正手段によって削除されなかったイベントデータに応じて演奏操作をガイドする演奏ガイド手順と、
を実行する演奏教習処理のプログラムを記憶していることを特徴とする記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、演奏をガイドする演奏教習装置及び演奏教習処理のプログラムを記憶した記憶媒体関する。
【０００２】
【従来の技術】
演奏をガイドするいわゆるナビゲーション機能をもった電子楽器等の演奏教習装置が普及している。例えば、ナビゲーション機能をもつ電子鍵盤楽器においては、鍵盤の各鍵に対応してＬＥＤ等の発光手段を設け、自動演奏の曲の進行にともなって音高に対応する鍵のＬＥＤを押鍵のタイミングに合わせて点灯させ、演奏操作のガイドを行う構成になっている。ナビゲーションのモードの中には、演奏操作がなされるまで曲の進行を一時停止するいわゆる「待ちモード」があるので、初心者にとっても容易に演奏ガイドを受けることができる。ガイドする曲データは、ＲＯＭ等のメモリにあらかじめ記憶されているナビゲーション専用の曲データである。
【０００３】
一方、電子鍵盤楽器の多くはＭＩＤＩ規格に対応しており、スタンダードＭＩＤＩファイル（ＳＭＦ）の曲データを処理することができる。すなわち、フロッピーディスクその他の外部記憶媒体に記憶されているＳＭＦや、ケーブルや通信回線を介して他のＭＩＤＩ対応の外部機器との間で、多種多様の曲データのＳＭＦを送受信する機能をもっている。したがって、外部記憶媒体や外部機器から入力した豊富な種類の曲データについても、ナビゲーション機能を用いて演奏操作のガイドを享受したいという要求が出されている。
【０００４】
【発明が解決しようとする課題】
しかしながら外部からのＳＭＦの曲データはナビゲーション専用にはなっていないので、特に初心者にとっては演奏ガイドには適さない音が含まれている場合が多い。例えば、非常に小さい音量の音や非常に短い音を挿入して曲のいわゆるノリを出したり、同じ音高の音を２つ以上重ねて特殊な効果を狙ったりする場合がある。このような音についてはガイドされたとしても演奏操作を行うことは困難である。ところが「待ちモード」においてはそのような音についても演奏操作をしなければ曲が進行しない。このため一般的なＳＭＦの曲データについては、熟練者しかナビゲーション機能を用いた演奏練習を行うことができず、本来初心者のためのナビゲーション機能が生かされていなかった。
【０００５】
本発明の課題は、外部記憶媒体や外部機器から入力した任意の曲について、ナビゲーション機能を用いて初心者でも容易に演奏ガイドを享受できるようにすることである。
【０００６】
【課題を解決するための手段】
請求項１に記載の演奏教習装置の発明は、複数の楽音のイベントデータで構成された曲を入力する入力手段（実施形態においては、図１のＣＰＵ１並びに、ＦＤＤＣ６及びＦＤＤ１１、又はＭＩＤＩ・Ｉ／Ｆ７に対応する）と、この入力手段によって入力された曲のイベントデータの中から楽音の音量があらかじめ楽音の音色毎に設定した音量しきい値より小さい場合および楽音の発音時間があらかじめ楽音の音色毎に設定した時間しきい値より短い場合の少なくとも一つの場合にイベントデータを削除するデータ修正手段（実施形態においては、ＣＰＵ１及びＲＡＭ３に対応する）と、このデータ修正手段によって削除されなかったイベントデータに応じて演奏操作をガイドする演奏ガイド手段（実施形態においては、ＣＰＵ１並びに、ＬＥＤＣ５及びＬＥＤ１０に対応する）と、を備えた構成になっている。
【０００７】
請求項２に記載の記憶媒体の発明は、複数の楽音のイベントデータで構成された曲を入力する入力手順と、この入力手順によって入力された曲のイベントデータの中から楽音の音量があらかじめ楽音の音色毎に設定した音量しきい値より小さい場合および楽音の発音時間があらかじめ楽音の音色毎に設定した時間しきい値より短い場合の少なくとも一つの場合にイベントデータを削除するデータ修正手順と、このデータ修正手段によって削除されなかったイベントデータに応じて演奏操作をガイドする演奏ガイド手順と、を実行する演奏教習処理のプログラムを記憶している。
【０００８】
請求項１又は請求項２に記載の発明によれば、曲のイベントデータの中から演奏教習に適さない条件のイベントデータを削除して、残りのイベントデータについて演奏ガイドを行う。
【０００９】
【発明の実施の形態】
以下、本発明による演奏教習装置の第１〜第５実施形態について図を参照して説明する。この装置は、電子鍵盤楽器と同様の構成であり、鍵盤、スイッチ、スピーカ等を具備している。
【００１０】
図１は、各実施形態における楽音発生装置のシステム構成を示している。図１において、ＣＰＵ１は、そのシステムバスに接続された各部との間において、データ及びコマンドを授受してこの装置全体を制御する。システムバスには、ＲＯＭ２、ＲＡＭ３、キースキャンＩ／Ｆ（インターフェース）４、ＬＥＤＣ５、ＦＤＤＣ６、ＭＩＤＩ・Ｉ／Ｆ（インターフェース）７、音源８が接続されている。ＲＯＭ２には、ＣＰＵ１が実行する制御プログラムやイニシャライズにおける初期データがあらかじめ記憶されている。ＲＡＭ３は、ＣＰＵ１のワークエリアであり、ＣＰＵ１によって処理される曲データやその他のデータが一時的に記憶される。また、ＲＡＭ３には、制御プログラムの実行に必要な各種のレジスタやフラグのエリアが設けられている。
【００１１】
キースキャンＩ／Ｆ４は、鍵盤及びスイッチ群からなる操作部９に接続されており、ＣＰＵ１のスキャンコマンドに応じて各鍵の押鍵・離鍵の状態、各スイッチのオン・オフの状態を検出する。ＬＥＤＣ５は、各鍵に対応して設けられた複数のＬＥＤに接続されており、ＣＰＵ１の点灯（オン）コマンド及び消灯（オフ）コマンドに応じて各ＬＥＤを駆動する。このＬＥＤの点灯によって演奏ガイドがなされる。
【００１２】
ＦＤＤＣ６は、ＦＤＤ（フロッピーディスク・ドライバ）１１を制御するコントローラであり、ＣＰＵ１のロードコマンドに応じてフロッピーディスクに記憶されているＳＭＦの曲のイベントデータを読み出してＲＡＭ３に一旦ストアする。ＭＩＤＩ・Ｉ／Ｆ７は、外部機器から送信されるＳＭＦの曲のイベントデータを受信してＲＡＭ３に一旦ストアする。音源８は、ＣＰＵ１の発音コマンド又は消音コマンド、並びにＲＡＭ３から読み出された曲のイベントデータ及び音色等のパラメータに応じて楽音信号を生成し、サウンドシステム１２によって発音・消音を制御する。
【００１３】
図２は、本実施形態における曲データのフォーマットを示している。ＳＭＦのデータフォーマットでは、イベントデータとタイムデータとが交互に配列された構成になっているが、本実施形態においては説明を簡便にするために、各アドレスごとのイベントデータがタイムデータを含む構成としている。図２（１）は、フロッピーディスク等の外部記憶媒体に記憶されている曲データの構成を示している。この図において、ＩＤＸは各イベントデータのアドレスを示している。イベントデータは、デルタタイムΔＴ、コマンドＣＭＤ、音高データＮＯＴＥ、及びベロシティデータＶＥＬで構成されている。
【００１４】
ΔＴはそのイベントデータの開始時間を表している。ＣＭＤはイベントデータのコマンドの内容を示し、「９０」はチャンネル０の発音コマンド、「８０」はチャンネル０の消音コマンドを表している。その他、コントロールチェンジやプログラムチェンジ等を表すコマンドがある。図２（１）において、ＩＤＸ「０」及び「１」のイベントデータは、「Ｃ４」の音高が「５０」の音量値で発音され、発音時間「１４」経過後に消音する楽音を表している。また、ＩＤＸ「２」及び「３」のイベントデータは、「Ｃ４」の音高が「０８」の音量値で発音され、発音時間「０８」経過後に消音する楽音を表している。
【００１５】
図２（２）は、後述するデータ修正によって一部のイベントデータが削除された後、ＲＡＭ３にストアされた曲データのフォーマットを示している。この図において、ＡＤはＲＡＭ３のエリアのアドレスを示している。ΔＴ、ＣＭＤ、ＮＯＴＥ、ＶＥＬのデータについては図２（１）と同じである。
【００１６】
次に、第１実施形態における演奏教習処理について、図３〜図７を参照して説明する。
図３はＣＰＵ１によって実行される演奏教習処理のメインフローである。所定のイニシャライズ（ステップＡ１）の後、スイッチ処理（ステップＡ２）、曲ロード処理（ステップＡ３）、ナビゲーション処理（ステップＡ４）、鍵盤処理（ステップＡ５）、音源処理（ステップＡ６）、その他の処理（ステップＡ７）を実行する。そして、パワーオフになったか否かを判別する（ステップＡ８）。パワーオフでない場合には、ステップＡ２からステップＡ７までの処理ループを繰り返す。パワーオフになったときは、パワーオフ処理（ステップＡ９）を行ってこのフローを終了する。
【００１７】
このメインフローの実行中において、２種類のタイマインタラプトが入るとそれぞれ対応するタイマインタラプト処理を実行する。タイマインタラプト１は、５〜１０ｍｓｅｃ程度ごとの割り込みであり、このタイマインタラプト１があるとタイマレジスタＴ１の値をインクリメントして（ステップＡ１０）、メインフローに戻る。タイマインタラプト２は、曲のテンポに対応した分解能での割り込み（クロック割り込み）であり、このタイマインタラプト２があるとタイマレジスタＴ２の値をデクリメントして（ステップＡ１１）、メインフローに戻る。なお、Ｔ１及びＴ２の値は、イニシャライズでは０にリセットされている。
【００１８】
図４及び図５は、図３のメインフローにおけるステップＡ２のスイッチ処理のフローである。図４のフローにおいて、曲ロードスイッチがオンされたか否かを判別し（ステップＢ１）、オンされたときはロードフラグＬＦの値を反転する（ステップＢ２）。そして、反転されたＬＦの値が１（曲ロード）であるか否かを判別する（ステップＢ３）。この値が１である場合には、ＩＤＸの値を０にセットし（ステップＢ４）、ＡＤの値を０にセットする（ステップＢ５）。すなわちフロッピーディスクの曲データの先頭アドレスを指定するとともに、ＲＡＭ３における曲データの記憶エリアの先頭アドレスを指定する。そしてメインフローに戻る。ステップＢ３において、ＬＦの値が０である場合は直ちにメインフローに戻る。
【００１９】
ステップＢ１において、曲ロードスイッチがオンでない場合には、レッスン（０）スイッチがオンされたか否かを判別する（ステップＢ６）。このスイッチがオンされたときは、レッスンモードのレジスタＭＯＤＥの値を０にセットする（ステップＢ７）。このスイッチがオンでない場合には、レッスン（１）スイッチがオンされたか否かを判別する（ステップＢ８）。このスイッチがオンされたときは、ＭＯＤＥの値を１にセットする（ステップＢ９）。このスイッチがオンでない場合には、レッスン（２）スイッチがオンされたか否かを判別する（ステップＢ１０）。このスイッチがオンされたときは、ＭＯＤＥの値を２にセットする（ステップＢ１１）。ＭＯＤＥの値をセットした後はメインフローに戻る。
【００２０】
ＭＯＤＥの値が０の場合には、発音のイベントデータに応じて対応する鍵のＬＥＤ１０を点灯させて演奏ガイドを行うが、押鍵を待つことなく曲データを進行させる。ＭＯＤＥの値が１である場合には、発音のイベントデータに応じて対応する鍵のＬＥＤ１０を点灯させて演奏ガイドを行うとともに、いずれかの鍵の押鍵があるまで曲データの進行を中断する。ＭＯＤＥの値が２である場合には、発音のイベントデータに応じて対応する鍵のＬＥＤ１０を点灯させて演奏ガイドを行うとともに、そのイベントデータに対応する鍵の押鍵があるまで曲データの進行を中断する。
【００２１】
レッスンスイッチ（０）、（１）、（２）のいずれのスイッチもオンでない場合には、図５のフローにおいて、再生スイッチがオンされたか否かを判別する（ステップＢ１２）。このスイッチがオンされたときは、スタートフラグＳＴＦの値を反転させる（ステップＢ１３）。そして、反転されたＳＴＦの値が１（再生）であるか否かを判別する（ステップＢ１４）。この値が１である場合には、ＡＤのアドレス値を０（先頭アドレス）にセットし（ステップＢ１５）、そのアドレスのイベントデータのΔＴの値をＴ２にセットする（ステップＢ１６）。そして、タイマインタラプトを許可し（ステップＢ１７）、メインフローに戻る。
【００２２】
ステップＢ１４においてＳＴＦが０（再生停止）である場合には、タイマインタラプトを禁止する（ステップＢ１８）。そしてメインフローに戻る。。ステップＢ１２において、再生スイッチがオンでない場合には、その他のスイッチがオンされたか否かを判別する（ステップＢ１９）。他のいずれかのスイッチがオンされたときは、そのスイッチに対応する処理を行い（ステップＢ２０）、メインフローに戻る。なお、いずれのスイッチもオンされない場合には、直ちにメインフローに戻る。
【００２３】
図６は、図３のメインフローにおけるステップＡ３の曲ロード処理のフローである。まず、ＬＦの値が１（曲ロード）であるか否かを判別し（ステップＣ１）、この値が０である場合には曲ロードでないので、直ちにメインフローに戻る。ＬＦの値が１である場合には、ＩＤＸのアドレスのイベントデータであるＥＶＥＮＴ（ＩＤＸ）をフロッピーディスクからロードする（ステップＣ２）。そして、そのイベントデータのコマンドＣＭＤ（ＩＤＸ）がノートオンであるか否かを判別する（ステップＣ３）。
【００２４】
ＣＭＤ（ＩＤＸ）がノートオンである場合には、そのイベントデータのベロシティデータであるＶＥＬ（ＩＤＸ）の値があらかじめ設定した最小値より小さいか否かを判別する（ステップＣ４）。ＶＥＬ（ＩＤＸ）の値が最小値以上である場合には、ロードしたイベントデータＥＶＥＮＴ（ＩＤＸ）をＡＤのアドレスで指定するＲＡＭ３のエリアＭＥＭ（ＡＤ）にストアする（ステップＣ５）。次に、ＡＤのアドレスをインクリメントし（ステップＣ６）、ＩＤＸのアドレスをインクリメントする（ステップＣ７）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＣ８）。曲データが終了していない場合には、ステップＣ２に移行して次のイベントデータをロードする。
【００２５】
ステップＣ４において、ＶＥＬ（ＩＤＸ）の値が最小値未満である場合には、そのイベントデータの音高を示すＮＯＴＥ（ＩＤＸ）のデータをレジスタＰＡＳＳにストアする（ステップＣ９）。ＰＡＳＳは配列構造になっており、複数の音高データをストアすることができるが、この配列構造は本発明に直接関係しないので、詳細な説明は省略する。この実施形態及び後述する他の実施形態では、ＰＡＳＳは１つの音高データをストアするレジスタとして機能する。
【００２６】
ステップＣ４において、ＶＥＬ（ＩＤＸ）の値が最小値未満である場合には、そのイベントデータをＲＡＭ３にストアせずに、そのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する（ステップＣ１０）。次に、ＩＤＸのアドレスをインクリメントする（ステップＣ７）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＣ８）。曲データが終了していない場合には、ステップＣ２に移行して次のイベントデータをロードする。
【００２７】
ステップＣ３においてＣＭＤ（ＩＤＸ）がノートオンでない場合には、ＣＭＤ（ＩＤＸ）がノートオフであるか否かを判別する（ステップＣ１１）。ノートオフでなくコントロールチェンジやプログラムチェンジ等のコマンドである場合には、ステップＣ５においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。ステップＣ１１においてＣＭＤ（ＩＤＸ）がノートオフである場合には、その音高データＮＯＴＥ（ＩＤＸ）がステップＣ９においてＰＡＳＳにストアした音高データと同一でないか否かを判別する（ステップＣ１２）。同一でない場合には、ステップＣ５においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００２８】
音高データが同一である場合には、そのノートオフのイベントデータをＲＡＭ３にストアせずに、ＮＯＴＥ（ＩＤＸ）の音高データをＰＡＳＳから削除し（ステップＣ１３）、ステップＣ１０においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。音高データをＰＡＳＳから削除することにより、その後のイベントデータが誤って削除されないようにする。また、デルタタイムの値を次のイベントデータに加算することにより、データ削除による時間ずれの発生を防止する。次に、ステップＣ７においてＡＤのアドレスをインクリメントして、次のイベントデータを指定する。そして、指定したイベントデータがあるか否か、すなわちロードすべき曲データが終了したか否かを判別する（ステップＣ８）。
【００２９】
そして、曲データが終了でない限り、ステップＣ２からステップＣ７に至る処理ループを繰り返し実行して、音量が設定した最小値より小さいイベントデータについてはＲＡＭ３にはストアしない。ステップＣ８においてロードすべき曲データが終了したときは、ＬＦを０にセットして（ステップＣ１４）、メインフローに戻る。
【００３０】
例えば、図２（１）に示す曲データにおいて、アドレスＩＤＸ＝２に対応すエリアのノートオンのイベントデータにおけるＶＥＬの値は０８である。いま音量の最小値が１０に設定されているとすると、このイベントデータ及び対応するノートオフのイベントデータ（ＩＤＸ＝３）はＲＡＭ３にストアせずに削除する。したがって、ＲＡＭ３における曲データは図２（２）に示すように修正される。
【００３１】
図７は、図３のメインフローにおけるステップＡ４のナビゲーション処理のフローである。まず、ＳＴＦが１（ナビゲーション動作状態）であるか否かを判別し（ステップＤ１）、ＳＴＦが１である場合にはＴ２の値が０に達しているか否かを判別する（ステップＤ２）。ステップＤ１においてＳＴＦが０（ナビゲーション停止状態）である場合、又はステップＤ２においてＴ２の値が０に達しておらずイベントデータの開始タイミングに達していない場合には、直ちにこのフローを終了してメインフローに戻る。
【００３２】
ステップＤ２においてＴ２の値が０に達しているときは、ＲＡＭ３のＭＥＭ（ＡＤ）のエリアからＥＶＥＮＴ（ＡＤ）を読み込み（ステップＤ３）、そのＣＭＤ（ＡＤ）がノートオンであるか否かを判別する（ステップＤ４）。ノートオンである場合には、その音高に対応するＬＥＤ駆動用のレジスタであるＬＥＤ［ＮＯＴＥ（ＡＤ）］をオンすなわち点灯にセットする（ステップＤ５）。
【００３３】
次に、ＭＯＤＥの値が１又は２であるか否かを判別する（ステップＤ６）。すなわち押鍵を待つモードであるか否かを判別する。ＭＯＤＥの値が１又は２である場合には、タイマインタラプトを禁止して（ステップＤ７）、押鍵があるか否かを判別する（ステップＤ８）。押鍵があったときはＭＯＤＥの値が２であるか否かを判別する（ステップＤ９）。ＭＯＤＥの値が２である場合には、レジスタＫＥＹのデータである押鍵された鍵番号と、イベントデータの音高データであるＮＯＴＥ（ＡＤ）とが一致しているか否かを判別する（ステップＤ１０）。すなわち、ＬＥＤの点灯に対応した鍵が押鍵されたか否かを判別する。押鍵がされない場合、又はＭＯＤＥが２のとき押鍵された鍵が間違っている場合には、ステップＤ８において押鍵の有無の判別を続行する。
【００３４】
ＭＯＤＥの値が２の場合でかつＬＥＤの点灯に対応した鍵が押鍵されたとき、又は、ＭＯＤＥの値が１でいずれかの鍵が押鍵されたときは、タイマインタラプトを許可する（ステップＤ１１）。この後、又はステップＤ６においてＭＯＤＥの値が０で押鍵を待たないモードの場合には、ＡＤのアドレスをインクリメントして（ステップＤ１２）、次のイベントデータを指定する。そして、指定したイベントデータがあるか否か、すなわち曲データが終了したか否かを判別する（ステップＤ１３）。曲データの終了でなく指定したイベントデータがある場合には、そのイベントデータのΔＴ（ＡＤ）のデルタタイムの値をＴ２にセットする（ステップＤ１４）。そしてメインフローに戻る。
【００３５】
ステップＤ４においてＣＭＤ（ＡＤ）がノートオンでない場合には、ＣＭＤ（ＡＤ）がノートオフであるか否かを判別する（ステップＤ１５）。ノートオフである場合には、その音高に対応するレジスタＬＥＤ［ＮＯＴＥ（ＡＤ）］をオフすなわち消灯にセットする（ステップＤ１６）。そして、ステップＤ１２に移行してＡＤをインクリメントして次のイベントデータを指定する。また、ステップＤ１１においてＣＭＤ（ＡＤ）がノートオフでない場合、すなわちコントロールチェンジやプログラムチェンジ等、押鍵・離鍵に関係ないコマンドである場合には、ステップＤ１２に移行してＡＤをインクリメントして次のイベントデータを指定する。
【００３６】
ステップＤ１３において曲データが終了したときは、タイマインタラプトを禁止して（ステップＤ１７）、ＳＴＦを０（ナビゲーション停止状態）にセットする（ステップＤ１８）。そしてメインフローに戻る。
【００３７】
このように上記第１実施形態においては、曲のイベントデータの中から演奏教習に適さないようなあまりに小さい音量のイベントデータは削除して、音量がある程度大きいイベントデータについて演奏ガイドを行う。
【００３８】
次に、本発明の第２実施形態について説明する。この第２実施形態及び後述する第３〜第５実施形態におけるＣＰＵ１のメインフロー、並びにメインフローにおけるスイッチ処理及びナビゲーション処理は、図３並びに図４、図５及び図７に示したフローと同じであるので、図面及びその説明は省略する。
【００３９】
図８は、第２実施形態における曲ロード処理のフローである。まず、ＬＦの値が１（曲ロード）であるか否かを判別し（ステップＥ１）、この値が０である場合には曲ロードでないので、直ちにメインフローに戻る。ＬＦの値が１である場合には、ＩＤＸのアドレスのイベントデータであるＥＶＥＮＴ（ＩＤＸ）をフロッピーディスクからロードする（ステップＥ２）。そして、そのイベントデータのコマンドＣＭＤ（ＩＤＸ）がノートオンであるか否かを判別する（ステップＥ３）。
【００４０】
ＣＭＤ（ＩＤＸ）がノートオンである場合には、このイベントデータの発音時間（音長）を計測する。まず、現在ロードしているイベントデータより後のイベントデータを先読みするためのポインタｍに、ＩＤＸ＋１の値すなわち次のイベントデータのアドレスをセットする（ステップＥ４）。次に、ＣＭＤ（ｍ）のデータがノートオフであるか否かを判別する（ステップＥ５）。ノートオフでなくコントロールチェンジやプログラムチェンジ等である場合には、ノートオンのイベントデータとノートオフのイベントデータとの間に、ノートデータ以外のデータが挿入されている場合である。この場合には、ΔＴ（ｍ＋１）にΔ（ｍ）の値を加算する（ステップＥ６）。すなわちノートデータ以外のデータのデルタタイムを次のイベントデータに加算する。
【００４１】
次に、ｍをインクリメントして（ステップＥ７）、次のイベントデータを指定する。そしてステップＥ５においてそのイベントデータのＣＭＤ（ｍ）を判別する。ＣＭＤ（ｍ）がノートオフである場合には、そのΔＴ（ｍ）のデルタタイムはステップＥ２においてロードしたＥＶＥＮＴ（ＩＤＸ）の発音時間を示している。したがって、このΔＴ（ｍ）の値があらかじめ設定した最小値より小さいか否かを判別する（ステップＥ８）。
【００４２】
ΔＴ（ｍ）の値が最小値以上である場合には、ロードしたイベントデータをＡＤのアドレスで指定するＲＡＭ３のエリアＭＥＭ（ＡＤ）にストアする（ステップＥ９）。次に、ＡＤのアドレスをインクリメントし（ステップＥ１０）、ＩＤＸのアドレスをインクリメントする（ステップＥ１１）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＥ１２）。曲データが終了していない場合には、ステップＥ２に移行して次のイベントデータをロードする。
【００４３】
ステップＥ８において、ΔＴ（ｍ）の値が最小値未満である場合には、そのイベントデータをＲＡＭ３にストアせずに、そのイベントデータの音高データＮＯＴＥ（ｍ）の値をレジスタＰＡＳＳにストアする（ステップＥ１３）。また、そのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する（ステップＥ１４）。次に、ＩＤＸのアドレスをインクリメントする（ステップＥ１１）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＥ１２）。曲データが終了していない場合には、ステップＥ２に移行して次のイベントデータをロードする。
【００４４】
ステップＥ３においてＣＭＤ（ＩＤＸ）がノートオンでない場合には、ＣＭＤ（ＩＤＸ）がノートオフであるか否かを判別する（ステップＥ１５）。ノートオフでなくコントロールチェンジやプログラムチェンジ等のコマンドである場合には、ステップＥ９においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。ステップＥ１５においてＣＭＤ（ＩＤＸ）がノートオフである場合には、その音高データＮＯＴＥ（ＩＤＸ）がステップＥ１３においてＰＡＳＳにストアした音高データと同一でないか否かを判別する（ステップＥ１６）。同一でない場合には、ステップＥ９においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００４５】
音高データが同一である場合には、そのイベントデータをＲＡＭ３にストアせずに、ＮＯＴＥ（ＩＤＸ）をＰＡＳＳから削除する（ステップＥ１７）。そして、ステップＥ１４においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。次に、ステップＥ１１においてＡＤのアドレスをインクリメントして、次のイベントデータを指定する。そして、指定したイベントデータがあるか否か、すなわちロードすべき曲データが終了したか否かを判別する（ステップＥ１２）。
【００４６】
そして、曲データが終了でない限り、ステップＥ２からステップＥ１１に至る処理ループを繰り返し実行して、発音時間が設定した最小値より小さいイベントデータについては、ＲＡＭ３にはストアせずに削除する。ステップＥ１２において、ロードすべき曲データが終了したときは、ＬＦを０にセットして（ステップＥ１８）、メインフローに戻る。
【００４７】
例えば、図２（１）に示す曲データにおいて、アドレスＩＤＸ＝３に対応すエリアのノートオフのイベントデータにおけるΔＴの値は０８である。いま発音時間の最小値が１０に設定されているとすると、このイベントデータ及び対応するノートオンのイベントデータ（ＩＤＸ＝２）はＲＡＭ３にストアせずに削除する。したがって、ＲＡＭ３における曲データは図２（２）に示すように修正される。
【００４８】
このように上記第２実施形態においては、曲のイベントデータの中から演奏教習に適さないようなあまりに短い発音時間のイベントデータは削除して、発音時間がある程度長いイベントデータについて演奏ガイドを行う。
【００４９】
次に、本発明の第３実施形態について、図９に示すＣＰＵ１のフローを参照して説明する。図９のフローは、ある音高のイベントデータの発音時間が終了する前に、同じ音高のイベントデータの発音が開始する場合の曲ロード処理である。このようなイベントデータの目的は特殊な効果を狙うためであるが、鍵盤楽器では１つの音高に対して１つの鍵のみが対応するので、同じ音高の２つのイベントデータについてナビゲーションをすることはできない。この第３実施形態では、先に発音開始になるイベントデータについてのみ演奏ガイドを行う。
【００５０】
図９のフローにおいて、まず、ＬＦの値が１（曲ロード）であるか否かを判別し（ステップＦ１）、この値が０である場合には曲ロードでないので、直ちにメインフローに戻る。ＬＦの値が１である場合には、ＩＤＸのアドレスのイベントデータであるＥＶＥＮＴ（ＩＤＸ）をフロッピーディスクからロードする（ステップＦ２）。そして、そのイベントデータのコマンドＣＭＤ（ＩＤＸ）がノートオンであるか否かを判別する（ステップＦ３）。
【００５１】
ＣＭＤ（ＩＤＸ）がノートオンである場合には、その音高データＮＯＴＥ（ＩＤＸ）がレジスタＰＡＳＳにストアされている音高データでないか否かを判別する（ステップＦ４）。ＰＡＳＳは削除するイベントデータの音高データをストアするレジスタである。ＮＯＴＥ（ＩＤＸ）がＰＡＳＳにストアされている音高データでない場合には、ポインタｍにＩＤＸ＋１の値すなわち次のイベントデータのアドレスをセットする（ステップＦ５）。そして、ＣＭＤ（ｍ）のデータがノートオンであるか否かを判別する（ステップＦ６）。すなわち、ノートオンのイベントデータの発音時間が終了する前に、別のノートオンのイベントデータがあるか否かを判別する。
【００５２】
ＣＭＤ（ｍ）のデータがノートオンでない場合には、ＣＭＤ（ｍ）のデータがノートオフであるか否かを判別する（ステップＦ７）。ノートオフでなくコントロールチェンジやプログラムチェンジ等である場合には、ｍをインクリメントして（ステップＦ８）、ステップＦ６においてさらに次のイベントデータがノートオンであるか否かを判別する。ＣＭＤ（ｍ）のデータがノートオンである場合には、そのイベントデータの音高データＮＯＴＥ（ｍ）がロードしたイベントデータの音高データＮＯＴＥ（ＩＤＸ）と同じであるか否かを判別する（ステップＦ９）。
【００５３】
両者の音高データが異なる場合には、ロードしたイベントデータをＡＤのアドレスで指定するＲＡＭ３のエリアＭＥＭ（ＡＤ）にストアする（ステップＦ１０）。次に、ＡＤのアドレスをインクリメントし（ステップＦ１１）、ＩＤＸのアドレスをインクリメントする（ステップＦ１２）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＦ１３）。曲データが終了していない場合には、ステップＦ２に移行して次のイベントデータをロードする。
【００５４】
ステップＦ９において、両者の音高データが同じである場合には、ＮＯＴＥ（ｍ）をＰＡＳＳにストアし（ステップＦ１４）、フラグＯＦＦを１にセットする（ステップＦ１５）。そして、ステップＦ１０においてイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。すなわち、先に発音を開始するイベントデータをＲＡＭ３にストアする。この後、ステップＦ１１、ステップＦ１２を経て、ステップＦ１３において曲データの終了でないので、ステップＦ２に移行して次のイベントデータをロードする。
【００５５】
ロードしたイベントデータがノートオンであり、しかもその音高データＮＯＴＥ（ＩＤＸ）がステップＦ１４においてＰＡＳＳにストアした音高データと同じ場合には、そのイベントデータをＲＡＭ３にストアせずに、ステップＦ４からステップＦ１６に移行して、そのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。次に、ＩＤＸのアドレスをインクリメントする（ステップＦ１２）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＦ１３）。曲データが終了していない場合には、ステップＦ２に移行して次のイベントデータをロードする。
【００５６】
ステップＦ３においてＣＭＤ（ＩＤＸ）がノートオンでない場合には、ＣＭＤ（ＩＤＸ）がノートオフであるか否かを判別する（ステップＦ１７）。ノートオフでなくコントロールチェンジやプログラムチェンジ等のコマンドである場合には、ステップＦ１０においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。ステップＦ１７においてＣＭＤ（ＩＤＸ）がノートオフである場合には、その音高データＮＯＴＥ（ＩＤＸ）がステップＦ１４においてＰＡＳＳにストアした音高データと同一でないか否かを判別する（ステップＦ１８）。同一でない場合には、ステップＦ１０においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００５７】
音高データがＰＡＳＳにストアされているものと同一である場合には、ＯＦＦが１であるか否かを判別する（ステップＦ１９）。ＯＦＦが１である場合にはこれを０にセットして（ステップＦ２０）、ステップＦ１０においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。この場合のノートオフのイベントデータは、先に発音指示されたイベントデータ（ＲＡＭ３にストアされたイベントデータ）に対する消音指示のノートオフであるのでＲＡＭ３にストアする。
【００５８】
この後、ステップＦ１１〜ステップＦ１３を経てステップＦ２に移行し、次のイベントデータをロードしたとき、そのＣＭＤ（ＩＤＸ）がノートオフで、しかもＰＡＳＳにストアした音高データと同じである場合には、ステップＦ１７、ステップＦ１８、ステップＦ１９に移行する。そして、ステップＦ１９においてＯＦＦが０になっているので、このイベントデータはＲＡＭ３にストアしない。すなわちこのイベントデータは、後に発音指示されたイベントデータ（削除されたイベントデータ）に対する消音指示のノートオフであるので、ＲＡＭ３にはストアしない。
【００５９】
そして、ＮＯＴＥ（ＩＤＸ）の音高データをＰＡＳＳから削除して（ステップＦ２１）、ステップＦ１６においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。次にステップＦ１２においてＩＤＸをインクリメントし、ステップＦ１３において曲データが終了か否かを判別する。曲データが終了でない限り、ステップＦ２〜ステップＦ１２の処理ループを繰り返し実行する。ステップＦ１３において、ロードすべき曲データが終了したときは、ＬＦを０にセットして（ステップＦ２２）、メインフローに戻る。
【００６０】
このように上記第３実施形態においては、曲のイベントデータの中から同じ音高で発音時間が重複している２つの楽音のイベントデータについては演奏教習に適さないため、後に発音開始した楽音のイベントデータは削除して、先に発音を開始した楽音のイベントデータのみについて演奏ガイドを行う。
【００６１】
なお、上記第３実施形態においては、発音時間が重複している２つの楽音のイベントデータを例にとって説明したが、発音時間が重複している３つ以上のイベントデータについてもデータ削除の処理は基本的に同じである。この場合には、ＰＡＳＳの配列に何番目のイベントデータであるかを識別する情報をストアすればよい。
【００６２】
次に、本発明の第４実施形態について、図１０に示すＣＰＵ１のフローを参照して説明する。図１０のフローは、第３実施形態と同様に、ある楽音のイベントデータの発音時間が終了する前に、同じ音高で別の楽音のイベントデータが発音開始する場合の曲ロード処理である。ただしこの第４実施形態では、２つの楽音のうち音量の小さい楽音のイベントデータは削除して、音量の大きい楽音のイベントデータについてのみ演奏ガイドを行う。
【００６３】
図１０のフローにおいて、まず、ＬＦの値が１（曲ロード）であるか否かを判別し（ステップＧ１）、この値が０である場合には曲ロードでないので、直ちにメインフローに戻る。ＬＦの値が１である場合には、ＩＤＸのアドレスのイベントデータであるＥＶＥＮＴ（ＩＤＸ）をフロッピーディスクからロードする（ステップＧ２）。そして、そのイベントデータのコマンドＣＭＤ（ＩＤＸ）がノートオンであるか否かを判別する（ステップＧ３）。
【００６４】
ＣＭＤ（ＩＤＸ）がノートオンである場合には、その音高データＮＯＴＥ（ＩＤＸ）がレジスタＰＡＳＳにストアされている音高データでないか否かを判別する（ステップＧ４）。ＮＯＴＥ（ＩＤＸ）がＰＡＳＳにストアされている音高データでない場合には、フラグＯＦＦ１が１であるか否かを判別する（ステップＧ５）。ＯＦＦ１が１の場合は、同じ音高データのノートオフのイベントデータのうち、最初にロードしたイベントデータは削除し、後にロードしたイベントデータはＲＡＭ３にストアする。ＯＦＦ１の値によってロードしたノートオフのイベントデータが最初のものか後のものかを識別する。ＯＦＦ１が１である場合には、ＮＯＴＥ（ＩＤＸ）をＰＡＳＳにストアする（ステップＧ６）。
【００６５】
次に、ポインタｍにＩＤＸ＋１の値すなわち次のイベントデータのアドレスをセットする（ステップＧ７）。ＯＦＦ１が０である場合には、ステップＧ６におけるＮＯＴＥ（ＩＤＸ）のＰＡＳＳへのストアを行わず、ステップＧ７においてｍにＩＤＸ＋１の値をセットする。ステップＧ７の後、ＣＭＤ（ｍ）のデータがノートオンであるか否かを判別する（ステップＧ８）。すなわち、ノートオンのイベントデータの発音時間が終了する前に、次のノートオンのイベントデータがあるか否かを判別する。
【００６６】
ＣＭＤ（ｍ）のデータがノートオンでない場合には、ＣＭＤ（ｍ）のデータがノートオフであるか否かを判別する（ステップＧ９）。ノートオフでなくコントロールチェンジやプログラムチェンジ等である場合には、ｍをインクリメントして（ステップＧ１０）、ステップＧ８においてさらに次のイベントデータがノートオンであるか否かを判別する。ＣＭＤ（ｍ）がノートオンである場合には、そのイベントデータの音高データＮＯＴＥ（ｍ）がロードしたイベントデータの音高データＮＯＴＥ（ＩＤＸ）と同じであるか否かを判別する（ステップＧ１１）。
【００６７】
両者の音高データが異なる場合には、ロードしたイベントデータをＡＤのアドレスで指定するＲＡＭ３のエリアＭＥＭ（ＡＤ）にストアする（ステップＧ１２）。次に、ＡＤのアドレスをインクリメントし（ステップＧ１３）、ＩＤＸのアドレスをインクリメントする（ステップＧ１４）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＧ１５）。曲データが終了していない場合には、ステップＧ２に移行して次のイベントデータをロードする。
【００６８】
ステップＧ１１において、両者の音高データが同じ場合には、ＶＥＬ（ｍ）とＶＥＬ（ＩＤＸ）との音量の大小を比較する（ステップＧ１６）。ＶＥＬ（ＩＤＸ）の値がＶＥＬ（ｍ）の値より大きい場合、すなわちロードしたノートオンのイベントデータの音量が次のノートオンのイベントデータの音量よりも大きい場合には、音量の小さい方の楽音を削除するために、その楽音の音高データＮＯＴＥ（ｍ）をＰＡＳＳにストアする（ステップＧ１７）。次に、フラグＯＦＦ２に１をセットする（ステップＧ１８）。
【００６９】
ＯＦＦ１が２の場合は、同じ音高データのノートオフのイベントデータのうち、最初にロードしたイベントデータはＲＡＭ３にストアし、後にロードしたイベントデータは削除する。ＯＦＦ２の値によってロードしたノートオフのイベントデータが最初のものか後のものかを識別する。ＯＦＦ２を１にセットした後、ロードしたイベントデータをＭＥＭ（ＡＤ）にストアする（ステップＧ１２）。そして、ＡＤのアドレスをインクリメントし（ステップＧ１３）、ＩＤＸのアドレスをインクリメントする（ステップＧ１４）。
【００７０】
ステップＧ１６において、ＶＥＬ（ＩＤＸ）の値がＶＥＬ（ｍ）の値より小さい場合、すなわちロードしたノートオンのイベントデータの音量が次のノートオンのイベントデータの音量よりも小さい場合には、ＯＦＦ１を１にセットする（ステップＧ１９）。すなわち、ロードしたノートオンのイベントデータに対応するノートオフのイベントデータを削除するためのフラグ処理を行う。そして、ロードしたノートオンのイベントデータはＲＡＭ３にストアせず、そのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する（ステップＧ２０）。そして、ＩＤＸをインクリメントして次にロードすべきイベントデータを指定する（ステップＧ１４）。
【００７１】
ステップＧ１４においてＩＤＸをインクリメントした後は、ロードすべき曲データが終了したか否かを判別する（ステップＧ１５）。曲データが終了していない場合には、ステップＧ２に移行して次のイベントデータをロードする。ステップＧ３においてＣＭＤ（ＩＤＸ）がノートオンでない場合には、ＣＭＤ（ＩＤＸ）がノートオフであるか否かを判別する（ステップＧ２１）。ノートオフでなくコントロールチェンジやプログラムチェンジ等のコマンドである場合には、ステップＧ１２においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００７２】
また、ステップＧ９においてＣＭＤ（ｍ）がノートオフである場合には、そのイベントデータは、ロードしたノートオンのイベントデータに対するノートオフのイベントデータであるか、あるいは以前にＲＡＭ３にストアした他の音高のノートオフのイベントデータである。この場合には、ロードしたノートオンのイベントデータの楽音の発音時間内に同じ音高の他の楽音は重複していない。したがって、ロードしたノートオンのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする（ステップＧ１２）。
【００７３】
ステップＧ２でロードしたイベントデータのＣＭＤ（ＩＤＸ）がノートオンでなくノートオフである場合（ステップＧ２１）には、その音高データＮＯＴＥ（ＩＤＸ）がステップＧ６においてＰＡＳＳにストアした音高データと同一でないか否かを判別する（ステップＧ２２）。同一の音高データでない場合には、そのイベントデータは、以前にＲＡＭ３にストアした他の音高のノートオフのイベントデータである。この場合には、ロードしたノートオフのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする（ステップＧ１２）。
【００７４】
ステップＧ２２において、ノートオフの音高データがＰＡＳＳにストアされているものと同一である場合には、ＯＦＦ２が１であるか否かを判別する（ステップＧ２３）。ＯＦＦ２が１である場合には、最初のノートオフのイベントデータはＲＡＭ３にストアするので、ＯＦＦ２を０にセットして（ステップＧ２４）、ステップＧ１２においてそのノートオフのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００７５】
ステップＧ２３においてＯＦＦ２が０である場合には、ＯＦＦ１が１であるか否かを判別する（ステップＧ２５）。ＯＦＦ１が１である場合には、ロードしたノートオフのイベントデータを削除する必要がある。この場合には、ＯＦＦ１を０にセットする（ステップＧ２６）。また、後にロードするノートオフのイベントデータを削除しないように、ＮＯＴＥ（ＩＤＸ）をＰＡＳＳから削除する（ステップＧ２７）。そして、ステップＧ２０においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。
【００７６】
ステップＧ２３においてＯＦＦ２が０の場合で、ステップＧ２５においてＯＦＦ１も０の場合には、後にロードしたノートオフのイベントデータを削除する場合である。この場合には、ＮＯＴＥ（ＩＤＸ）をＰＡＳＳから削除する（ステップＧ２７）。そして、ステップＧ２０においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。
【００７７】
次にステップＧ１４においてＩＤＸをインクリメントし、ステップＧ１５において曲データが終了か否かを判別する。曲データが終了でない限り、ステップＧ２〜ステップＧ１４の処理ループを繰り返し実行する。ステップＧ１５において、ロードすべき曲データが終了したときは、ＬＦを０にセットして（ステップＧ２８）、メインフローに戻る。
【００７８】
このように上記第４実施形態においては、曲のイベントデータの中から同じ音高で発音時間が重複している２つの楽音のイベントデータについては演奏教習に適さないため、音量が小さい方の楽音のイベントデータを削除し、音量が大きい方の楽音のイベントデータのみをＲＡＭ３にストアして演奏ガイドを行う。
【００７９】
この場合において、削除した楽音による音量の低下を補うために、ＲＡＭ３にストアする楽音のイベントデータのＶＥＬの値を大きくする修正を施してストアする処理を行ってもよい。
【００８０】
次に、本発明の第５実施形態について、図１１に示すＣＰＵ１のフローを参照して説明する。図１１のフローもまた、ある楽音のイベントデータの発音時間が終了する前に、同じ音高で別の楽音のイベントデータが発音開始する場合の曲ロード処理である。ただしこの第５実施形態では、このような同じ音高２つの楽音を連続した１つの楽音に修正して演奏ガイドを行う。
【００８１】
図１１のフローにおいて、まず、ＬＦの値が１（曲ロード）であるか否かを判別し（ステップＨ１）、この値が０である場合には曲ロードでないので、直ちにメインフローに戻る。ＬＦの値が１である場合には、ＩＤＸのアドレスのイベントデータであるＥＶＥＮＴ（ＩＤＸ）をフロッピーディスクからロードする（ステップＨ２）。そして、そのイベントデータのコマンドＣＭＤ（ＩＤＸ）がノートオンであるか否かを判別する（ステップＨ３）。
【００８２】
ＣＭＤ（ＩＤＸ）がノートオンである場合には、その音高データＮＯＴＥ（ＩＤＸ）がレジスタＰＡＳＳにストアされている音高データでないか否かを判別する（ステップＨ４）。ＰＡＳＳは削除するイベントデータの音高データをストアするレジスタである。ＮＯＴＥ（ＩＤＸ）がＰＡＳＳにストアされている音高データでない場合には、ポインタｍにＩＤＸ＋１の値すなわち次のイベントデータのアドレスをセットする（ステップＨ５）。そして、ＣＭＤ（ｍ）のデータがノートオンであるか否かを判別する（ステップＨ６）。すなわち、ノートオンのイベントデータの発音時間が終了する前に、別のノートオンのイベントデータがあるか否かを判別する。
【００８３】
ＣＭＤ（ｍ）のデータがノートオンでない場合には、ＣＭＤ（ｍ）のデータがノートオフであるか否かを判別する（ステップＨ７）。ノートオフでなくコントロールチェンジやプログラムチェンジ等である場合には、ｍをインクリメントして（ステップＨ８）、ステップＨ６においてさらに次のイベントデータがノートオンであるか否かを判別する。ＣＭＤ（ｍ）のデータがノートオンである場合には、そのイベントデータの音高データＮＯＴＥ（ｍ）がロードしたイベントデータの音高データＮＯＴＥ（ＩＤＸ）と同じであるか否かを判別する（ステップＨ９）。
【００８４】
両者の音高データが異なる場合には、ロードしたイベントデータをＡＤのアドレスで指定するＲＡＭ３のエリアＭＥＭ（ＡＤ）にストアする（ステップＨ１０）。次に、ＡＤのアドレスをインクリメントし（ステップＨ１１）、ＩＤＸのアドレスをインクリメントする（ステップＨ１２）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＨ１３）。曲データが終了していない場合には、ステップＦ２に移行して次のイベントデータをロードする。
【００８５】
ステップＨ９において、両者の音高データが同じである場合には、ＮＯＴＥ（ｍ）をＰＡＳＳにストアし（ステップＨ１４）、ロードしたノートオンのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする（ステップＨ１０）。すなわち、先に発音を開始するイベントデータをＲＡＭ３にストアする。この後、ステップＨ１１、ステップＨ１２を経て、ステップＨ１３において曲データの終了でないので、ステップＨ２に移行して次のイベントデータをロードする。
【００８６】
ステップＨ３においてＣＭＤ（ＩＤＸ）がノートオフで、ロードしたイベントデータがノートオンであり、しかもその音高データＮＯＴＥ（ＩＤＸ）がステップＨ１４においてＰＡＳＳにストアした音高データである場合には、そのイベントデータをＲＡＭ３にストアせずに、そのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する（ステップＨ１５）。次に、ＩＤＸのアドレスをインクリメントする（ステップＨ１２）。そして、ロードすべき曲データが終了したか否かを判別する（ステップＨ１３）。曲データが終了していない場合には、ステップＨ２に移行して次のイベントデータをロードする。
【００８７】
ステップＨ３においてＣＭＤ（ＩＤＸ）がノートオンでない場合には、ＣＭＤ（ＩＤＸ）がノートオフであるか否かを判別する（ステップＨ１６）。ノートオフでなくコントロールチェンジやプログラムチェンジ等のコマンドである場合には、ステップＨ１０においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。ステップＨ１６においてＣＭＤ（ＩＤＸ）がノートオフである場合には、その音高データＮＯＴＥ（ＩＤＸ）がステップＨ１４においてＰＡＳＳにストアした音高データと同一でないか否かを判別する（ステップＨ１７）。同一でない場合には、ステップＨ１０においてそのイベントデータＥＶＥＮＴ（ＩＤＸ）をＭＥＭ（ＡＤ）にストアする。
【００８８】
音高データがＰＡＳＳにストアされているものと同一である場合には、ＮＯＴＥ（ＩＤＸ）の音高データをＰＡＳＳから削除して（ステップＨ１８）、ステップＨ１５においてそのイベントデータのデルタタイムΔＴ（ＩＤＸ）の値を次のアドレス（ＩＤＸ＋１）のイベントデータのデルタタイムΔＴ（ＩＤＸ＋１）の値に加算する。次にステップＨ１２においてＩＤＸをインクリメントし、ステップＨ１３において曲データが終了か否かを判別する。曲データが終了でない限り、ステップＨ２〜ステップＨ１２の処理ループを繰り返し実行する。ステップＨ１３において、ロードすべき曲データが終了したときは、ＬＦを０にセットして（ステップＨ１９）、メインフローに戻る。
【００８９】
このように上記第５実施形態においては、曲のイベントデータの中から同じ音高で発音時間が重複している２つの楽音のイベントデータについては演奏教習に適さないため、同じ音高２つの楽音を連続した１つの楽音に修正して演奏ガイドを行う。
【００９０】
なお、上記各実施形態においては、フロッピーディスクに記憶されている曲のイベントデータについて、演奏教習に適さない条件のイベントデータを削除しながらＲＡＭ３にストアし、全てのイベントデータをストアした後に、データ修正されたイベントデータをＲＡＭ３から読み出して再生する構成にしたが、フロッピーディスクからロードしたイベントデータや、ＭＩＤＩ・Ｉ／Ｆ７によって受信したイベントデータをリアルタイムで再生し、その再生のときにデータ修正を行うようにしてもよい。
【００９１】
また、上記各実施形態においては、フロッピーディスクに記憶されている曲のイベントデータについて、演奏教習に適さない条件のイベントデータを自動的に修正してＲＡＭ３にストアする構成にしたが、データを修正するか否かを演奏者が任意に設定する構成にしてもよい。
【００９２】
また、上記各実施形態においては、演奏教習に適さない条件のイベントデータであるか否かを個々の楽音によって判別する構成にしたが、曲データ全体を統計的な手法を用いて演奏教習に適しているか否かを判別する構成にしてもよい。例えば、イベントデータの音量や音長を標本値として、複数のイベントデータのそれぞれの偏差値を算出する。そして、各イベントデータの偏差値によってデータ削除をするか否かを判別する構成にしてもよい。
【００９３】
また、上記各実施形態においてさらに、楽音の音色（楽器の種類）によってデータの修正を行うか否かを設定する構成にしてもよい。また、第１又は第２実施形態においては、音色ごとに削除するための音量や音長の最小値を設定してもよい。例えば、ヴァイオリンの最小音量の設定値は小さく、トロンボーンの最小音量の設定値は大きく設定する。また、ドラム系の最小音長の設定値は短く、管楽器系の最小音長の設定値は長くする。
【００９４】
また、上記各実施形態においては、ＣＰＵ１はＲＯＭ２にあらかじめ記憶した制御プログラムにより演奏教習処理を行う構成にしたが、フロッピーディスクや光磁気ディスクその他の記憶媒体にこの演奏教習処理の制御プログラムを記憶して、その制御プログラムをＣＰＵ１が読み出して実行する構成にしてもよい。この場合には、記憶媒体の発明を構成する。あるいは、通信回線を介して演奏教習処理の制御プログラムをダウンロードして実行させる構成にしてもよい。
【００９５】
【発明の効果】
本発明によれば、曲のイベントデータの中から演奏教習に適さない条件のイベントデータを削除して、残りのイベントデータについて演奏ガイドを行う。
したがって、外部記憶媒体や外部機器から入力した任意の曲について、ナビゲーション機能を用いて初心者でも容易に演奏ガイドを享受できる。
【図面の簡単な説明】
【図１】本発明の各実施形態における演奏教習装置のシステム構成を示すブロック図。
【図２】曲のイベントデータのフォーマットを示し、（１）はデータ修正前（２）はデータ修正後を示す図。
【図３】各実施形態におけるＣＰＵのメインフローチャート及びタイマインタラプト処理のフローチャート。
【図４】図３のメインフローチャートにおけるスイッチ処理のフローチャート。
【図５】図４に続くスイッチ処理のフローチャート。
【図６】第１実施形態における曲ロード処理のフローチャート。
【図７】図３のメインフローチャートにおけるナビゲーション処理のフローチャート。
【図８】第２実施形態における曲ロード処理のフローチャート。
【図９】第３実施形態における曲ロード処理のフローチャート。
【図１０】第４実施形態における曲ロード処理のフローチャート。
【図１１】第５実施形態における曲ロード処理のフローチャート。
【符号の説明】
１  ＣＰＵ
２  ＲＯＭ
３  ＲＡＭ
４  キースキャンインターフェース
５  ＬＥＤＣ
６  ＦＤＤＣ
７  ＭＩＤＩインターフェース
８  音源
９  操作部
１０  ＬＥＤ
１１  ＦＤＤ
１２  サウンドシステム
【図１】
0003845761.tif 000002
【図２】
0003845761.tif 000003
【図３】
0003845761.tif 000004
【図４】
0003845761.tif 000005
【図５】
0003845761.tif 000006
【図６】
0003845761.tif 000007
【図７】
0003845761.tif 000008
【図８】
0003845761.tif 000009
【図９】
0003845761.tif 000010
【図１０】
0003845761.tif 000011
【図１１】
0003845761.tif 000012