以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。図1は、実施形態の電子鍵盤楽器100の外観図であり、図2は、実施形態の電子鍵盤楽器100のシステム200の構成例を示す図である。
図1に示されるように、本実施形態に係る電子鍵盤楽器100は、複数の鍵101を有する鍵盤110と、LCD表示部102と、操作部103と、を備えている。また各鍵101は内部にLED(Light Emitting Diode:発光ダイオード)等の発光素子を備え、各鍵101の表面を発光させることができる。
LCD表示部102は、操作部103の操作に伴うメッセージの表示や、後述するレッスンモードの選択のための表示等を行うものである。
操作部103は、演奏者が各種の設定等を行う操作ボタンと、電子鍵盤楽器100の電源のオン/オフを切り替える電源スイッチとを有し、操作ボタンは、演奏モードの選択や音量調整等の各種の設定操作等を行うためのものである。
演奏モードとしては、通常演奏モード、自動演奏モード、レッスンモード(右パートレッスンモード、左パートレッスンモード、左右パートレッスンモード)、レッスンモードにおけるコード入力方法などの設定がある。
通常演奏モードは、演奏者がコード進行などに頼らずに、通常の楽器演奏を行うモードである。
自動演奏モードは、ROM202から順次読み出される楽曲データに従って、演奏者の関与なしに自動演奏を行うモードである。
レッスンモードは、ROM202から順次読み出される楽曲データに従って、演奏すべき鍵盤110上の各鍵101を光らせてガイドしながら、演奏者が演奏レッスンを行うモードである。右パートレッスンモードは、主に右手で演奏されるメロディ鍵域で鍵101のLEDが点灯されることにより、メロディガイドが行われ、演奏者が順次光る鍵101を光に追従して押鍵しながら演奏レッスンを行うモードである。左パートレッスンモードは、主に左手で演奏されるコード鍵域でコード音を構成する複数(3又は4個)の鍵101のLEDが点滅(ルート音の場合)又は点灯(それ以外のコード構成音の場合)されることにより、コードガイドが行われ、演奏者が順次光る複数の鍵101を追従して同時に押鍵しながら演奏レッスンを行うモードである。左右パートレッスンモードは、右パートレッスンモードでのメロディレッスンと左パートレッスンモードでのコードレッスンとを同時に行えるモードである。
次に、図2に示される電子鍵盤楽器システム200において、CPU(中央演算処理装置)201と、読取り専用のメモリであるROM(リードオンリーメモリ)202と、読み書きが可能なメモリであるRAM(ランダムアクセスメモリ)203と、検出部204と、LEDコントローラ206と、LCDコントローラ207と、スイッチインタフェース208と、音源LSI210が、システムバス213によって相互に接続されている。
スイッチインタフェース208は、操作部103におけるスイッチ設定状態を検出し、CPU201に通知する。
ROM202は、CPU201がRAM203にロードして実行する制御プログラムや、前述した自動演奏モード、レッスンモードにおける楽曲データを記憶する。
RAM203は、ROM202から転送される制御プログラム、楽曲データ、その他、プログラム実行の各種変数データなどを記憶する。
CPU201は、ROM202からRAM203にロードされた制御プログラムに従って、音源LSI210への楽音の発音/消音指示、自動演奏又は演奏レッスンのための各種制御を行う。この制御動作の詳細は、図3のデータ構成図と、図4から図14のフローチャートを用いて後述する。
タイマ209は、後述するソング再生割込み処理において使用される。
図2のLED205は、夫々の鍵101(白鍵又は黒鍵)の操作子に対応して設けられており、各操作子のLED205に対向する部分は、LED205の光が透過することができる。LED205は、レッスンモード時に、次に押鍵すべき鍵101において、点滅(コードのルート音の場合)又は点灯(メロディ音又はルート音以外のコードの構成音の場合)される。
図2のLEDコントローラ206は、CPU201からの指示に基づいて、各鍵101に具備される各LED205の点滅又は点灯、及び消灯を行う。
音源LSI(LSI:大規模集積回路)210は、CPU201からの指示に従って楽音データを発生する。
D/A変換部211は、音源LSI210が発生したデジタルの楽音データをアナログ楽音信号に変換する。このアナログ楽音信号は、アンプ212を介してスピーカ213から放音される。
以上の構成を有する本実施形態の概略動作について説明する。図2のCPU201は、RAM203にロードした制御プログラムを実行することにより、演奏者が選曲しROM202からRAM203にロードされた楽曲データを順次読み出して実行することにより、楽曲中の夫々のコードの進行に従い、コードの構成音に対応する鍵101を例えばLED205によって光ガイドしながら、コードの構成音と検出部204で押鍵が検出された1つ以上の鍵101の押鍵音との関係に基づいて、押鍵が正解か否かを判定する判定処理を実行する。そして、CPU201は、判定処理の判定結果が不正解となった場合に、不正解に対応する発音を指示する発音制御データを音源LSI210に対して発行し、音源LSI210が対応する発音処理を実行する。CPU201は、判定処理の判定結果が正解となった場合には、コードの構成音を同時に発音する複数の発音制御データを音源LSI210に対して発行し、音源LSI210がコード音を発音処理する。これにより、演奏者は、例えば左パートレッスンモードにおいて、コード判定が正解でない鍵101を押鍵した場合に、演奏者が不正解を認識できるようにして、演奏者に違和感や故障等の誤解を与えたりしないようにすることが可能となる。
一つの実施形態として、CPU201は、上述の発音処理において、例えば、不正解に対応する発音を、音源LSI210を介して、押鍵に対応して決定される不正解コードのスタティックコードで発音処理する。ここで、スタティックコードとは、どの鍵が押鍵されているかに関わらず、決定されたコードの構成音の全てが専用の音色で押鍵している間持続的に鳴るものをいう。この処理の詳細は、図12のフローチャートを用いて、コードレッスン再生処理の第1の実施形態として説明する。これにより、演奏者は、コード判定が不正解の場合に、スタティックコードにより不正解を自然に認識することが可能となる。
他の一つの実施形態として、CPU201は、上述の発音処理において、検出部204で押鍵が検出された1つ以上の鍵101が示す音高の夫々が楽曲中の夫々のコードの進行に従って決定される正解コードの構成音に含まれない場合に、押鍵が検出された1つ以上の鍵101が示す音高の夫々に対応する楽音を、音源LSI210を介して発音処理する。これにより、演奏者は、正解コードの構成音でないコード鍵域の楽音の鍵101を押鍵してしまったことを認識することが可能となる。
更に他の一つの実施形態として、CPU201は、上述の発音処理において、検出部204で夫々押鍵が検出された鍵101が示す各音高に対応する楽音を、音源LSI210を介して発音処理すると共に、判定処理の判定結果が正解となった場合に、発音中の楽音を消音した後に、正解コードの各構成音を発音する。これにより、不正解時の不要な発音を消音しつつ正解のコード構成音をレッスン演奏することができ、演奏者が不快感を感じることを防止することが可能となる。
ここで、CPU201は、判定処理の判定結果が不正解となった場合に、不正解の度合いに応じた評価音声、例えば「まだまだ!」や「おしい!」、或いは全然だめな場合には爆発音などを発音する評価音声の発音処理を音源LSI210を介して更に実行してもよい。これにより、演奏者は、楽しく演奏レッスンを行うことができる。
また、鍵101のLED205による光ガイドに加えて、図1のLCD表示部102に、鍵盤110と同じ画像を表示すると共に、コードの構成音に対応する複数の鍵101を夫々ガイド表示として表示指示するようにしてもよい。これにより、演奏者は光る鍵101に加えて、LCD表示部102でもレッスンガイドを確認することができる。
また、鍵101のLED205による光ガイドに加えて、コードの構成音に対応する複数の鍵101を夫々押鍵するための指番号を、音源LSI210を介してガイド音声として指示発音するようにしてもよい。これにより、演奏者は光る鍵101に加えて、ガイド音声によって運指を確認することができる。
また、鍵101のLED205による光ガイドに加えて、コードの構成音に対応する複数の鍵101に夫々対応するノート音名を、音源LSI210を介してガイド音声として指示発音するようにしてもよい。これにより、演奏者は光る鍵101に加えて、ガイド音声によって押鍵すべき鍵101を確認することができる。
図3は、本実施形態において、図2のROM202からRAM203に読み込まれる楽曲データのデータ構成例を示す図である。このデータ構成例は、MIDI(Musical Instrument Digital Interface)用ファイルフォーマットの一つであるスタンダードMIDIファイルのフォーマットに準拠している。この楽曲データは、チャンクと呼ばれるデータブロックから構成される。具体的には、楽曲データは、データサイズやフォーマット情報を示すヘッダチャンクと、それに続くメロディパート用のメロディ演奏データが格納されるトラックチャンク1と、コードパート用のコード演奏データが格納されるトラックチャンク2とから構成される。なお、コードパートはベースパターンやリズムパターンを含む伴奏パターンデータであってもよい。
トラックチャンク1、2はそれぞれ、ChunkID、ChunkSizeと、DeltaTime_1[i]及びEvent_1[i](トラックチャンク1/メロディパートの場合)又はDeltaTime_2[i]及びEvent_2[i](トラックチャンク2/コードパートの場合)からなる演奏データ組(0≦i≦L:トラックチャンク1/メロディパートの場合、0≦i≦M:トラックチャンク2/コードパートの場合)とからなる。
DeltaTime_1[i]は、その直前のEvent_1[i-1]の実行時刻からの待ち時間(相対時間)を示す1~4バイトの可変長データである。同様に、DeltaTime_2[i]は、その直前のEvent_2[i-1]の実行時刻からの待ち時間(相対時間)を示す1~4バイトの可変長データである。Event_1[i]は、トラックチャンク1/メロディパートにおいて、メロディの発声タイミングと音高を指示するメタイベントである。Event_2[i]は、トラックチャンク2/コードパートにおいて、ノートオン又はノートオフを指示するMIDIイベント、又は拍子を指示するメタイベントである。トラックチャンク1/メロディパートに対して、各演奏データ組DeltaTime_1[i]及びEvent_1[i]において、その直前のEvent_1[i-1]の実行時刻からDeltaTime_1[i]だけ待った上でEvent_1[i]が実行されることにより、メロディの発音進行が実現される。一方、トラックチャンク2/コードパートに対して、各演奏データ組DeltaTime_2[i]及びEvent_2[i]において、その直前のEvent_2[i-1]の実行時刻からDeltaTime_2[i]だけ待った上でEvent_2[i]が実行されることにより、コードの発音進行が実現される。
図4は、本実施形態における電子楽器の制御処理例を示すメインフローチャートである。この制御処理は例えば、図2において、CPU201が、ROM202からRAM203にロードされた制御処理プログラムを実行する動作である。
CPU201は、まず初期化処理を実行した後(ステップS401)、ステップS402からS407の一連の処理を繰り返し実行する。
この繰返し処理において、CPU201はまず、スイッチ処理を実行する(ステップS402)。ここでは、CPU201は、図2のスイッチインタフェース208からの割込みに基づいて、図1の操作部103でのスイッチ操作に対応する処理を実行する。スイッチ処理の詳細例については、図6のフローチャートを用いて後述する。
次に、CPU201は、図2の検出部204からの割込みに基づいて図1の鍵盤110の何れかの鍵101が操作されたか否かを判定して処理する鍵処理を実行する(ステップS403)。ここでは、CPU201は、演奏者による何れかの鍵の押鍵又は離鍵の操作に応じて、図2の音源LSI204に対して、ノートオン(発音開始)又はノートオフ(発音停止)を指示する発音制御データを出力する。鍵処理の詳細例については、図7のフローチャートを用いて後述する。
次に、CPU201は、図1のLCD表示部102に表示すべきデータを処理し、そのデータを、図2のLCDコントローラ207を介してLCD表示部102に表示する表示処理を実行する(ステップS404)。LCD表示部102に表示されるデータとしては例えば、演奏されるレッスンモードなどで使用される楽曲の楽譜、鍵鍵盤110に対応する鍵盤画像上での各鍵101に対応する各鍵画像のレッスンガイド表示、及び各種設定情報がある。
次に、CPU201は、楽曲再生処理を実行する(ステップS405)。この処理においては、メロディレッスン再生処理や、コードレッスン再生処理、自動演奏再生処理などが実行される。楽曲再生処理の詳細例については、図10のフローチャートを用いて後述する。
続いて、CPU201は、音源処理を実行する(ステップS406)。音源処理において、CPU201は、音源LSI204における発音中の楽音のエンベロープ制御等の処理を実行する。
最後にCPU201は、演奏者が特には図示しないパワーオフスイッチを押してパワーオフしたか否かを判定する(ステップS407)。ステップS407の判定がNOならば、CPU201は、ステップS402の処理に戻る。ステップS407の判定がYESならば、CPU201は、図4のフローチャートで示される制御処理を終了し、電子鍵盤楽器100の電源を切る。
図5(a)、(b)、及び(c)はそれぞれ、図4のステップS401の初期化処理の詳細例、図4のステップS402のスイッチ処理における後述する図6のステップS602のテンポ変更処理の詳細例、及び同じく図6のステップS606のソング開始処理の詳細例を、それぞれ示すフローチャートである。
まず、図4のステップS401の初期化処理の詳細例を示す図5(a)において、CPU201は、TickTimeの初期化処理を実行する。本実施形態において、メロディの進行及びコードの進行は、TickTimeという時間を単位として進行する。図3の楽曲データのヘッダチャンク内のTimeDivision値として指定されるタイムベース値は4分音符の分解能を示しており、この値が例えば480ならば、4分音符は480TickTimeの時間長を有する。また、図3の楽曲データのトラックチャンク内の待ち時間DeltaTime_1[i]値及びDeltaTime_2[i]値も、TickTimeの時間単位によりカウントされる。ここで、1TickTimeが実際に何秒になるかは、楽曲データに対して指定されるテンポによって異なる。今、テンポ値をTempo[ビート/分]、上記タイムベース値をTimeDivisionとすれば、TickTimeの秒数は、次式により算出される。
TickTime[秒]=60/Tempo/TimeDivision (1)
そこで、図5(a)のフローチャートで例示される初期化処理において、CPU201はまず、上記(1)式に対応する演算処理により、TickTime[秒]を算出する(ステップS501)。なお、テンポ値Tempoは、初期状態では図2のROM202に所定の値、例えば60[ビート/秒]が記憶されているとする。或いは、不揮発性メモリに、前回終了時のテンポ値が記憶されていてもよい。
次に、CPU201は、図2のタイマ209に対して、ステップS501で算出したTickTime[秒]によるタイマ割込みを設定する(ステップS502)。この結果、タイマ209において上記TickTime[秒]が経過する毎に、CPU201に対してメロディ進行及びコード進行のための割込み(以下「ソング再生割込み」と記載)が発生する。従って、このソング再生割込みに基づいてCPU201で実行されるソング再生割込み処理(後述する図8及び図9)では、1TickTime毎にメロディ及びコードを進行させる制御処理が実行されることになる。
続いて、CPU201は、図2のRAM203の初期化等のその他初期化処理を実行する(ステップS503)。その後、CPU201は、図5(a)のフローチャートで例示される図4のステップS401の初期化処理を終了する。
図5(b)及び(c)のフローチャートについては、後述する。
図6は、図4のステップS402のスイッチ処理の詳細例を示すフローチャートである。CPU201はまず、図1の操作部103内のテンポ変更スイッチによりメロディ進行及びコード進行のテンポが変更されたか否かを判定する(ステップS601)。その判定がYESならば、CPU201は、テンポ変更処理を実行する(ステップS602)。この処理の詳細は、図5(b)を用いて後述する。ステップS601の判定がNOならば、CPU201は、ステップS602の処理はスキップする。
次に、CPU201は、操作部103において何れかのソング曲が選曲されたか否かを判定する(ステップS603)。その判定がYESならば、CPU201は、ソング曲読込み処理を実行する(ステップS604)。この処理は、図3で説明したデータ構造を有する楽曲データを、図2のROM202からRAM203に読み込む処理である。これ以降、図3に例示されるデータ構造内のトラックチャンク1又は2に対するデータアクセスは、RAM203に読み込まれた楽曲データに対して実行される。ステップS603の判定がNOならば、CPU201は、ステップS604の処理はスキップする。
続いて、CPU201は、図1の操作部103においてソング開始スイッチが操作されたか否かを判定する(ステップS605)。その判定がYESならば、CPU201は、ソング開始処理を実行する(ステップS606)。この処理の詳細は、図5(c)を用いて後述する。ステップS605の判定がNOならば、CPU201は、ステップS606の処理はスキップする。
続いて、CPU201は、図1の操作部103においてレッスンモードスイッチ及び右パートスイッチがオンされることによりメロディレッスンを示す右パートレッスンが選択されたか否かを判定する(ステップS607)。その判定がYESならば、CPU201は、右パートレッスンをオンする処理を実行する(ステップS608)。具体的には、CPU201は、RAM203上の変数である右パートレッスンフラグをオン(値「1」)に設定する。ステップS607の判定がNOならば、CPU201は、ステップS608の処理はスキップする。
更に、CPU201は、図1の操作部103においてレッスンモードスイッチ及び左パートスイッチがオンされることによりコードレッスンを示す左パートレッスンが選択されたか否かを判定する(ステップS609)。その判定がYESならば、CPU201は、左パートレッスンをオンする処理を実行する(ステップS610)。具体的には、CPU201は、RAM203上の変数である左パートレッスンフラグをオン(値「1」)に設定する。ステップS609の判定がNOならば、CPU201は、ステップS610の処理はスキップする。
なお、メロディレッスンに対応する右パートレッスンとコードレッスンに対応する左パートレッスンは、同時にオンすることができる。即ち、右パートレッスンと左パートレッスンを同時に行うことができる。
最後に、CPU201は、図1の操作部103においてその他のスイッチが操作されたか否かを判定し、各スイッチ操作に対応する処理を実行する(ステップS611)。ここでは例えば、演奏者が、図1の操作部103において、自動演奏スイッチをオンした状態と所望の自動演奏楽曲を選択したことなどが検知され、RAM203上の変数である自動演奏フラグをオン(値「1」)にし、更に選択された自動演奏楽曲に対応する図3に例示されるデータ構成の楽曲データをROM202からRAM203に転送する。その後、CPU201は、図6のフローチャートで例示される図4のステップS402のスイッチ処理を終了する。
図5(b)は、図6のステップS602のテンポ変更処理の詳細例を示すフローチャートである。前述したように、テンポ値が変更されるとTickTime[秒]も変更になる。図5(b)のフローチャートでは、CPU201は、このTickTime[秒]の変更に関する制御処理を実行する。
まず、CPU201は、図4のステップS401の初期化処理で実行された図5(a)のステップS501の場合と同様にして、前述した(1)式に対応する演算処理により、TickTime[秒]を算出する(ステップS511)。なお、テンポ値Tempoは、図1の操作部103内のテンポ変更スイッチにより変更された後の値がRAM203等に記憶されているものとする。
次に、CPU201は、図4のステップS401の初期化処理で実行された図5(a)のステップS502の場合と同様にして、図2のタイマ209に対して、ステップS511で算出したTickTime[秒]によるタイマ割込みを設定する(ステップS512)。その後、CPU201は、図5(b)のフローチャートで例示される図6のステップS602のテンポ変更処理を終了する。
図5(c)は、図6のステップS606のソング開始処理の詳細例を示すフローチャートである。
まず、CPU201は、自動演奏又はレッスンモードの進行において、TickTimeを単位として、直前のイベントの発生時刻からの相対時間をカウントするためのRAM203上の変数DeltaT_1(トラックチャンク1)及びDeltaT_2(トラックチャンク2)の値を共に0に初期設定する。次に、CPU201は、図3に例示される楽曲データのトラックチャンク1内の演奏データ組DeltaTime_1[i]及びEvent_1[i](1≦i≦L-1)の夫々iを指定するためのRAM203上の変数AutoIndex_1と、同じくトラックチャンク2内の演奏データ組DeltaTime_2[i]及びEvent_2[i](1≦i≦M-1)の夫々iを指定するためのRAM203上の変数AutoIndex_2の各値を共に0に初期設定する(以上、ステップS521)。これにより、図3の例では、初期状態としてまず、トラックチャンク1内の先頭の演奏データ組DeltaTime_1[0]とEvent_1[0]、及びトラックチャンク2内の先頭の演奏データ組DeltaTime_2[0]とEvent_2[0]がそれぞれ参照される。
次に、CPU201は、楽曲データのトラックチャンク1内の現在のメロディイベントを指示するRAM203上の変数MelodyIndexの値と、楽曲データのトラックチャンク2内の現在のコードイベント群を示すRAM203上の配列変数CodeIndex()の各要素値をそれぞれNull値(未定義値)に初期設定する(ステップS522)。なお、本実施例におけるコードは、3又は4音で構成されるいわゆるテンション音を含まないコードであるとする。従って、CodeIndex()は、3又は4つの要素値を有する変数配列である。
更に、CPU201は、メロディ及びコードの進行をするか(値「1」)しないか(値「0」)を示すRAM203上の変数SongStartの値を「1」(進行する)に初期設定する(ステップS523)。その後、CPU201は、図5(c)のフローチャートで例示される図6のステップS606のソング開始処理を終了する。
図7は、図4のステップS403の鍵処理の詳細例を示すフローチャートである。まず、CPU201は、RAM203上の各変数右パートレッスンフラグ又は左パートレッスンフラグの値をチェックすることにより、右パートレッスン又は左パートレッスンがオンにされているか否か(ステップS608、S610参照)を判定する(ステップS701)。
右パートレッスン及び左パートレッスンの何れもオンにされていない(ステップS701の判定がNO)の場合には、CPU201は更に、検出部204を介して何れかの鍵101において押鍵が発生したか否かを判定する(ステップS702)。
ステップS702の判定がYESならば、CPU201は、検出部204を介して検出された押鍵されたノート番号(押鍵ノート)によるノートオンを指示する発音制御データを音源LSI210に対して発行して発音を指示する(ステップS703)。即ち、レッスンモード以外のモードにおいて、演奏者が何れかの鍵101を押鍵した場合には、演奏者の押鍵の通りに楽音が発音される。
ステップS702で押鍵の発生が検出されなかった(ステップS702の判定がNOである)場合又はステップS703の処理の後に、CPU201は、検出部204を介して何れかの鍵101において離鍵が発生したか否かを判定する(ステップS704)。
ステップS704の判定がYESならば、CPU201は、検出部204を介して検出された離鍵されたノート番号(離鍵ノート)についてのノートオフを指示する発音制御データを音源LSI210に対して発行して消音を指示する(ステップS705)。
ステップS705の処理の後、又はステップS704の判定がNOの場合に、CPU201は、図7のフローチャートで例示される図4のステップS403の鍵処理を終了する。また、右パートレッスン又は左パートレッスンがオンでレッスンモードが指定されている場合には、ステップS701の判定がYESとなることにより、演奏者の押鍵、離鍵操作は、鍵処理によっては実質的に処理されず、後述する図4のステップS405の楽曲再生処理によって処理される。
図8及び図9は、図2のタイマ209においてTickTime[秒]毎に発生する割込み(図5(a)のステップS502又は図5(b)のステップS512を参照)に基づいて、図4のメイン処理に割込みをかけて実行されるソング再生割込み処理の詳細例を示すフローチャートである。以下の処理は、図3に例示される楽曲データのトラックチャンク1及び2の演奏データ組に対して実行される。
まず、CPU201は、トラックチャンク1に対応する一連の処理(ステップS801からS813)を実行する。始めにCPU201は、RAM203上の変数であるSongStart値が1であるか否か、即ちメロディ及びコードの進行が指示されているか否かを判定する(ステップS801)。
メロディ及びコードの進行が指示されていないと判定された(ステップS801の判定がNOである)場合には、CPU201は、メロディ及びコードの進行は行わずに図8及び図9のフローチャートで例示されるソング再生割込み処理をそのまま終了する。
メロディ及びコードの進行が指示されていると判定された(ステップS801の判定がYESである)場合には、CPU201は、右パートレッスン又は自動演奏がオンされているか否かを判定する(ステップS802)。
右パートレッスン及び自動演奏の何れもオンされていない(ステップS802の判定がNOである)場合には、CPU201は、ステップS803からS813で示されるトラックチャンク1のメロディパートに関する制御処理を実行せずに、図9のステップS814のトラックチャンク2のコードパートに関する処理に移行する。
右パートレッスン又は自動演奏の何れかがオンされている(ステップS802の判定がYESである)場合には、CPU201は、トラックチャンク1に関するステップS803からS813の一連の処理を実行する。
まず、CPU201は、トラックチャンク1に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_1値が、AutoIndex_1値が示すこれから実行しようとする演奏データ組の待ち時間DeltaTime_1[AutoIndex_1]に一致したか否かを判定する(ステップS803)。
ステップS803の判定がNOならば、CPU201は、トラックチャンク1に関して、前回のイベントの発生時刻からの相対時刻を示すDeltaT_1値を+1インクリメントさせて、今回の割込みに対応する1TickTime単位分だけ時刻を進行させる(ステップS813)。その後、CPU201は、後述する図9のステップS814のトラックチャンク2のコードパートに関する処理に移行する。
ステップS803の判定がYESになると、CPU201は、AutoIndex_1値が示す演奏データ組のイベントEvent[AutoIndex_1]が、トラックチャンク1のメロディ楽曲データの最後を示すEOT(エンドオブトラック)(図3参照)であるか否かを判定する(ステップS804)。
ステップS804の判定がYESならば、CPU201は、メロディ楽曲データの処理を終了して、図9のステップS814のトラックチャンク2のコードパートに関する処理に移行する。
ステップS804の判定がNOの場合には、CPU201は、トラックチャンク1に関して、AutoIndex_1値が示す演奏データ組のイベントEvent[AutoIndex_1]が、ノートオンイベントであるか否かを判定する(ステップS805)。
ステップS805の判定がNOならば、CPU201は、AutoIndex_1値が示す演奏データ組のイベントEvent[AutoIndex_1]をすぐに実行する(ステップS810)。その後、CPU201は、ステップS811の処理に移行する。
ステップS805の判定がYESならば、CPU201は、トラックチャンク1に関するAutoIndex_1値を、RAM203上の変数MelodyIndexに格納する(ステップS806)。CPU201は、このノートオンイベントをここでは実行せずに、後述する図4のステップS405の楽音再生処理内で、演奏者によるメロディ鍵域での判定を行った上で、変数MelodyIndexに基づいて発音処理する(後述する図10のステップS1002内の図11のステップS1107を参照)。
次に、CPU201は、AutoIndex_1値が示す現在の演奏データ組のイベントEvent[AutoIndex_1]に格納されているノートオンのノート番号に対応する鍵101のLED205を、図2のLEDコントローラ206を介して消灯させる(ステップS807)。
続いて、CPU201は、AutoIndex_1値の次に発生するノートオンイベントに対応するαイベント先(α≧1)の演奏データ組を検索しそのイベントEvent[AutoIndex_1+α]に格納されているノートオンのノート番号に対応する鍵101のLED205を、図2のLEDコントローラ206を介して点灯させる(ステップS808)。該当するイベントがない場合には、CPU201は、ステップS808の点灯動作は実行しない。
本実施形態では、演奏者が演奏をもたつかないようにするために、演奏者が現在押鍵しようとする鍵101の次に押鍵すべき鍵101を先行して光ガイドする。このため、演奏者が現在押鍵しようとする鍵101のLED205は、現在の1つ前のタイミングでの押鍵時に既に点灯しており、今回の押鍵タイミングの到来によりこれ以上点灯させる必要はなくなるため、まずステップS807で、演奏者が現在押鍵しようとする鍵101のLED205が消灯させられる。その後、ステップS808で、演奏者が現在押鍵しようとする鍵101の次に押鍵すべき鍵101のLED205が先行して点灯させられるのである。
続いて、CPU201は、ステップS808の場合と同様に、αイベント先の演奏データ組のイベントEvent[AutoIndex_1+α]に格納されているノートオンに対応するガイド音の発音処理を実行する(ステップS809)。具体的には、CPU201は例えば、Event[AutoIndex_1+α]に格納されているノートオンに対応する鍵101を押鍵すべき運指情報に対応する音声(「いち」「に」「さん」「よん」「ご」の何れかの音声)の発音を、音源LSI210に指示してよい。この代わりに例えば、CPU201は、Event[AutoIndex_1+α]に格納されているノートオンのノート番号に対応するノート名(「しー」(C)から「びー」(B)の何れか)の発音を、音源LSI210に指示してよい。音源LSI210は例えば、これらの音声データを、例えばPCM音声として保持しており、これらの音声データを読み出すことにより発音を行うことができる。
上記ステップS809の処理の後、又はEvent[AutoIndex_1]がノートオンイベントではない(ステップS805の判定がNOである)場合に実行されるステップS810の処理の後に、CPU201は、トラックチャンク1内の演奏データ組を参照するためのAutoIndex_1値を+1インクリメントする(ステップS811)。
また、CPU201は、トラックチャンク1に関して今回参照したソングイベントの発生時刻からの相対時刻を示すDeltaT_1値を0にリセットする(ステップS812)。その後、CPU201は、図9のステップS814のトラックチャンク2のコードパートに関する処理に移行する。
続いて、図9のフローチャートの説明に移り、CPU201は、左パートレッスン又は自動演奏がオンされているか否かを判定する(ステップS814)。
左パートレッスン及び自動演奏の何れもオンされていない(ステップS814の判定がNOである)場合には、CPU201は、ステップS815からS828で示されるトラックチャンク2のコードパートに関する制御処理を実行せずに、図8及び図9のフローチャートで示される今回のソング再生割込み処理を終了し、リターンして図4のメイン処理の割込み時点の処理の実行に戻る。
左パートレッスン又は自動演奏の何れかがオンされている(ステップS814の判定がYESである)場合には、CPU201は、トラックチャンク2に関するステップS815からS828の一連の処理を実行する。
まず、CPU201は、トラックチャンク2に関する前回のイベントの発生時刻からの相対時刻を示すDeltaT_2値が、AutoIndex_2値が示すこれから実行しようとする演奏データ組の待ち時間DeltaTime_2[AutoIndex_2]に一致したか否かを判定する(ステップS815)。
ステップS815の判定がNOならば、CPU201は、トラックチャンク2に関して、前回のイベントの発生時刻からの相対時刻を示すDeltaT_2値を+1インクリメントさせて、今回の割込みに対応する1TickTime単位分だけ時刻を進行させる(ステップS828)。その後、CPU201は、図8及び図9のフローチャートで示される今回のソング再生割込み処理を終了し、リターンして図4のメイン処理の割込み時点の処理の実行に戻る。
ステップS815の判定がYESになると、CPU201は、AutoIndex_2値が示す演奏データ組のイベントEvent[AutoIndex_2]が、トラックチャンク2のコード楽曲データの最後を示すEOT(図3参照)であるか否かを判定する(ステップS816)。
ステップS816の判定がYESならば、CPU201は、コード楽曲データの処理を終了して、図8及び図9のフローチャートで示される今回のソング再生割込み処理を終了し、リターンして図4のメイン処理の割込み時点の処理の実行に戻る。
ステップS816の判定がNOの場合には、CPU201は、トラックチャンク2に関して、AutoIndex_2値が示す演奏データ組のイベントEvent[AutoIndex_2]が、ノートオンイベントであるか否かを判定する(ステップS817)。
ステップS817の判定がNOならば、CPU201は、AutoIndex_2値が示す演奏データ組のイベントEvent[AutoIndex_2]をすぐに実行する(ステップS824)。その後、CPU201は、ステップS825の処理に移行する。
ステップS817の判定がYESならば、CPU201は、トラックチャンク2に関するAutoIndex_2値を、RAM203上の配列変数CodeIndex()の末尾要素に格納する(ステップS818)。CPU201は、このノートオンイベントをここでは実行せずに、後述する図4のステップS405の楽音再生処理内で、演奏者によるコード鍵域での判定を行った上で、配列変数CodeIndex()に基づいて発音処理する(後述する図10のステップS1004内の図12、図13、又は図14のステップS1207を参照)。
次に、CPU201は、AutoIndex_2値が示す現在の演奏データ組のイベントEvent[AutoIndex_2]に格納されているノートオンのノート番号に対応する鍵101のLED205を、図2のLEDコントローラ206を介して消灯させる(ステップS819)。この処理は、メロディパートに関するステップS807の処理と同様である。
続いて、CPU201は、AutoIndex_2値の次に発生するノートオンイベントに対応するβイベント先(β≧1)の演奏データ組を検索しそのイベントEvent[AutoIndex_2+β]に格納されているノートオンのノート番号が或るコードのルート音であるか否かを判定する(ステップS820)。ルート音であるか否かを示す情報は、Event[AutoIndex_2+β]に格納されている。
ステップS820でルート音であると判定された場合には、CPU201は、Event[AutoIndex_2+β]に格納されているノートオンのノート番号に対応する鍵101のLED205を、図2のLEDコントローラ206を介して点滅させる(ステップS821)。該当するイベントがない場合には、CPU201は、ステップS821の点滅動作は実行しない。
ステップS820でルート音ではないと判定された場合には、CPU201は、Event[AutoIndex_2+β]に格納されているノートオンのノート番号に対応する鍵101のLED205を、図2のLEDコントローラ206を介して点灯させる(ステップS822)。該当するイベントがない場合には、CPU201は、ステップS821の点滅動作は実行しない。
このように、本実施形態では、鍵101上でルート音とそれ以外のコード構成音とを区別してガイドできるため、演奏者は複雑なコードに対しても転回形を意識した適切な押鍵が可能となる。上述のステップS821及びステップS822における「+β」の動作は、メロディパートにおける図8のステップS808の「+α」の動作と同様である。
ステップS821又はステップS822の処理の後、CPU201は、βイベント先の演奏データ組のイベントEvent[AutoIndex_2+β]に格納されているノートオンに対応するガイド音の発音処理を実行する(ステップS823)。この動作は、メロディパートにおける図8のステップS809の処理と同様である。
上記ステップS823の処理の後、又はEvent[AutoIndex_2]がノートオンイベントではない(ステップS817の判定がNOである)場合に実行されるステップS824の処理の後、CPU201は、トラックチャンク2内の演奏データ組を参照するためのAutoIndex_2値を+1インクリメントする(ステップS825)。
また、CPU201は、トラックチャンク2に関して今回参照したコードイベントの発生時刻からの相対時刻を示すDeltaT_2値を0にリセットする(ステップS826)。
そして、CPU201は、AutoIndex_2値が示す次に実行されるトラックチャンク2上の演奏データ組の待ち時間DeltaTime_2[AutoIndex_2]が0であるか否か、即ち、今回のイベントと同時に実行されるコードに関するイベントであるか否かを判定する(ステップS827)。
ステップS827の判定がNOならば、CPU201は、コード楽曲データの処理を終了して、図8及び図9のフローチャートで示される今回のソング再生割込み処理を終了し、リターンして図4のメイン処理の割込み時点の処理の実行に戻る。
ステップS827の判定がYESならば、CPU201は、ステップS816に戻って、AutoIndex_2値が示すトラックチャンク2上で次に実行される演奏データ組のイベントEvent_2[AutoIndex_2]に関する制御処理を繰り返す。CPU201は、今回同時に実行されるコードを構成する構成音の数分だけ、ステップS816からステップS827の処理を繰り返し実行する。以上の処理シーケンスは、今回のコードパートの処理のように複数のノートオンイベントが同時タイミングで発音されるような場合に実行される。
以上のステップS816からステップS827の処理の繰返しにより、RAM203上の配列変数CodeIndex()に、今回のタイミングでコード判別されるコードの構成音を示すイベント群を参照するインデックス群が得られる。
図10は、図4のステップS405の楽曲再生処理の詳細例を示すフローチャートである。まず、CPU201は、RAM203上の変数である右パートレッスンフラグの値をチェックすることにより、右パートレッスンがオンにされているか否か(ステップS608)を判定する(ステップS1001)。
右パートレッスンがオンにされている(ステップS1001の判定がYESである)場合には、CPU201は、メロディレッスン再生処理を実行する(ステップS1002)。この処理の詳細例については、図11のフローチャートを用いて後述する。
右パートレッスンがオンにされていない(ステップS1001の判定がNOである)場合には、CPU201は、ステップS1002のメロディレッスン再生処理はスキップする。
次に、CPU201は、RAM203上の変数である左パートレッスンフラグの値をチェックすることにより、左パートレッスンがオンにされているか否か(ステップS610)を判定する(ステップS1003)。
左パートレッスンがオンにされている(ステップS1003の判定がYESである)場合には、CPU201は、コードレッスン再生処理を実行する(ステップS1004)。この処理の詳細例については、図12から図14のフローチャートを用いて後述する。
左パートレッスンがオンにされていない(ステップS1003の判定がNOである)場合には、CPU201は、ステップS1004のコードレッスン再生処理はスキップする。
その後、CPU201は、自動演奏がオンにされているか否かを判定する(ステップS1005)。演奏者は、図1の操作部103において、自動演奏スイッチをオンし、更に自動演奏楽曲を選択することにより、それらの情報がRAM203に記憶される(図6のステップS611参照)。ステップS1005では、CPU201は、RAM203上の変数である自動演奏フラグがオンになっているか否かを判定する。
ステップS1005の判定がYESならば、CPU201は、RAM203上の変数MelodyIndexによって、RAM203に記憶されている自動演奏の楽曲データのトラックチャンク1(メロディパート)(図3参照)上のノートオンイベントEvent_1[MelodyIndex](図8のステップS805、S806参照)を取得し、そのイベントが示す発音制御データを音源LSI210(図2)に対して発行し、音源LSI210が自動演奏メロディの発音処理を実行する(ステップS1006)。
続けて、CPU201は、RAM203上の配列変数CodeIndex()によって、RAM203に記憶されている自動演奏の楽曲データ上のトラックチャンク2(コードパート)(図3参照)上の複数のノートオンイベント群Event_2[CodeIndex()](図9のステップS817、S818参照)を取得し、それらのイベント群が示すコード音を指定する複数の発音制御データを音源LSI210(図2)に対して発行する(ステップS1007)。CodeIndex()は配列変数なので、実際にはコード構成音を示す3又は4個のノートオンイベントEvent_2[CodeIndex(0)]、Event_2[CodeIndex(1)]、Event_2[CodeIndex(3)]、Event_2[CodeIndex(4)]等の夫々に対応するノートオンを示す各発音制御データが、CPU201から音源LSI210に対して発行され、音源LSI210が自動演奏コードの発音処理を実行することになる。
自動演奏がオンの場合には、上述のステップS1006とS1007によって、演奏者が指定した楽曲のメロディパートと演奏パートが、音源LSI210を介して自動演奏される。演奏者は、この自動演奏に合わせて、鍵101上で押鍵又は離鍵の演奏操作を行うことにより、図4のステップS403の鍵処理の詳細例である図7のステップS701の判定がNOとなって、押鍵ノートによる発音処理(ステップS703)、又は離鍵ノートによる消音処理(ステップS705)が実行される。この結果、演奏者は、自動伴奏に合わせて演奏を楽しむことができる。
ステップS1005の判定がNOならば、CPU201は、ステップS1006とS1007の処理はスキップする。その後、CPU201は、図10のフローチャートで例示される図4のステップS405の楽曲再生処理を終了する。
図11は、図10のステップS1002のメロディレッスン再生処理の詳細例を示すフローチャートである。この処理は、演奏者がメロディパートのレッスンを行うために実行される制御処理である。
まず、CPU201は、図8のステップS805からS806の処理によってRAM203に記憶された変数MelodyIndexが示すインデックス値について、メロディ判定処理が未処理であるか否かを判定する(ステップS1101)。
RAM203上の変数に変数MelodyIndexが示すインデックス値が処理済みであることが記録されている(ステップS1101の判定がNOである)場合には、CPU201は、図11のフローチャートで例示される図10のステップS1002のメロディレッスン再生処理を終了する。
RAM203上の変数に変数MelodyIndexが示すインデックス値が処理済みであることが記録されておらず未処理(ステップS1101の判定がYES)である場合には、CPU201は、RAM203の適当な変数に変数MelodyIndexが処理済みであることを記録した後、図8及び図9のフローチャートで例示されるソング再生割込み処理のためのタイマ209によるソング再生割込みをブロックし、一時的にソング再生割込み処理が実行されないようにする(ステップS1102)。この結果、演奏者が正しいメロディ音の押鍵操作を行うまで、レッスンモードの進行がストップする。
その後、CPU201は、検出部204を介してメロディ鍵域の鍵101からの演奏者による押鍵待ちの状態となる(ステップS1103)。メロディ鍵域で押鍵が発生しない間は、ステップS1103の判定がNOとなって、ステップS1103の判定処理が繰り返し実行される。
メロディ鍵域で押鍵が発生すると(ステップS1103の判定がYESになると)、CPU201は、RAM203上の変数MelodyIndexによって参照される、RAM203に記憶されている自動演奏の楽曲データ上のトラックチャンク1(メロディパート)(図3参照)上のノートオンイベントEvent_1[MelodyIndex](図8のステップS805、S806参照)を取得し、そのイベントが示すノート番号が、検出部204から通知された押鍵ノートに等しいか否かを判定する(ステップS1104)。即ちここでは、鍵101上で光ガイド表示されていたメロディパートの鍵101と同じ鍵を、演奏者が正しく押鍵したか否かが判定されることになる。
ステップS1104の判定がNOの場合、即ち演奏者のメロディ鍵域での押鍵が不正解であった場合には、CPU201は、音源LSI210を介して、不正解専用の音色で演奏者が押鍵した音高の音を発音する(ステップS1105)。これにより、演奏者は、メロディ判定が不正解の場合に、不正解を自然に認識することが可能となる。
ステップS1105に続いて、CPU201は、評価音声発音処理を実行する(ステップS1106)。この処理では、CPU201は、メロディパートの不正解の度合いに応じた評価音声、例えば「メロディまだまだやね!」や「メロディおしい!」、或いは全然だめな場合には爆発音などの発音を指示する発音制御データを音源LSI210に対して発行し、音源LSI210がこれらの評価音声の発音処理を実行することになる。これにより、演奏者は、楽しくメロディパートの演奏レッスンを行うことができる。その後、CPU201は、ステップS1103の押鍵待ちの状態に戻る。
ステップS1104の判定がYESの場合、即ち演奏者のメロディ鍵域での押鍵が正解であった場合には、CPU201は、RAM203上の変数MelodyIndexによって参照される、RAM203に記憶されている自動演奏の楽曲データ上のトラックチャンク1(メロディパート)(図3参照)上のノートオンイベントEvent_1[MelodyIndex](図8のステップS805、S806参照)を取得し、そのイベントが示すノートオンの発音制御データを音源LSI210(図2)に対して発行し、音源LSI210がメロディ発音処理を実行する(ステップS1107)。
その後、CPU201は、図8及び図9のフローチャートで例示されるソング再生処理のためのタイマ209によるソング再生割込みのブロックを解除し、ソング再生割込み処理が再開されるようにする(ステップS1108)。この結果、レッスンモードの進行が再開される。そして、CPU201は、図11のフローチャートで例示される図10のステップS1002のメロディレッスン再生処理を終了する。
図12は、図10のステップS1004のコードレッスン再生処理の第1の実施形態の詳細例を示すフローチャートである。この処理は、演奏者がコードパートのレッスンを行うために実行される制御処理である。
まず、CPU201は、図9のステップS817からS818の処理によってRAM203に記憶された変数CodeIndexが示すインデックス値について、コード判定処理が未処理であるか否かを判定する(ステップS1201)。
RAM203上の変数に変数CodeIndexが示すインデックス値が処理済みであることが記録されている(ステップS1201の判定がNOである)場合には、CPU201は、図12のフローチャートで例示される図10のステップS1004のコードレッスン再生処理を終了する。
RAM203上の変数に変数CodeIndexが示すインデックス値が処理済みであることが記録されておらず未処理(ステップS1201の判定がYES)である場合には、CPU201は、RAM203の適当な変数に変数CodeIndexが処理済みであることを記録した後、図8及び図9のフローチャートで例示されるソング再生割込み処理のためのタイマ209によるソング再生割込みをブロックし、一時的にソング再生割込み処理が実行されないようにする(ステップS1202)。この結果、演奏者が正しいコードの押鍵操作を行うまで、レッスンモードの進行がストップする。
その後、CPU201は、検出部204を介してコード鍵域の鍵101からの演奏者による押鍵待ちの状態となる(ステップS1203)。コード鍵域で押鍵が発生しない間は、ステップS1203の判定がNOとなって、ステップS1203の判定処理が繰り返し実行される。
コード鍵域での押鍵が発生すると(ステップS1203の判定がYESになると)、CPU201は、RAM203上の配列変数CodeIndex()によって参照される、RAM203に記憶されているレッスン楽曲データ上のトラックチャンク2(コードパート)(図3参照)上の複数のノートオンイベント群Event_2[CodeIndex()](図9のステップS817、S818参照)を取得し、それらのイベント群で定まる正解コードを、今回いままでに発生している押鍵による各押鍵ノートによって確定できるか否かをコード判定する(ステップS1204)。コード判定の手法としては、演奏者の演奏レッスンの習熟度に応じて、ルート音を押鍵するだけでメジャーコードを確定できたり、ルート音ともう1音を押鍵すればコードを確定できたり、全部のコード構成音を押鍵しないとコードを確定できなかったり、様々な判定レベルの判定技術を採用することができる。このため、演奏者が、操作部103においてコードレッスンの難易度のレベルを指定できるようにしてもよい。コード判定方式としては、例えば「特開2018-54713号公報」に記載の技術を採用することができるため、その詳細な説明は省略する。
ステップS1204でのコード判定処理の結果、CPU201は、正解コードが確定したか否かを判定する(ステップS1205)。
演奏者による現在までの押鍵操作によって正解コードが確定しなかった(ステップS1205の判定がNOである)場合には、CPU201は、音源LSI210を介して、現在までの押鍵操作により確定することができる不正解コードをスタティックコードで発音する(ステップS1206)。ここで、スタティックコードとは、どの鍵が押鍵されているかに関わらず、決定されたコード構成音の全てが専用の音色で押鍵している間持続的に鳴るものをいう。これにより、演奏者は、コード判定が不正解の場合に、不正解を自然に認識することが可能となる。ここでの不正解コードは演奏者が押鍵した正解コードを構成しない音高をルート音としたメジャーコードとしたり、何等かのコードに確定することが可能な複数の押鍵があった場合はその確定可能なコードとしてもよい。
ステップS1206に続いて、CPU201は、評価音声発音処理を実行する(ステップS1207)。この処理では、CPU201は、コードパートの不正解の度合いに応じた評価音声、例えば「コードまだまだやね!」や「コードおしい!」、或いは全然だめな場合には爆発音などの発音を指示する発音制御データを音源LSI210に対して発行し、音源LSI210がこれらの評価音声の発音処理を実行することになる。これにより、演奏者は、楽しくコードパートの演奏レッスンを行うことができる。その後、CPU201は、ステップS1203の押鍵待ちの状態に戻る。
ステップS12005の判定がYESの場合、即ち演奏者のコード鍵域での押鍵が正解コードを確定できた場合には、CPU201は、RAM203上の配列変数CodeIndex()によって参照される、RAM203に記憶されているレッスン楽曲データ上のトラックチャンク2(コードパート)(図3参照)上の複数のノートオンイベント群Event_2[CodeIndex()](図9のステップS817、S818参照)を取得し、それらのイベント群が示すコード音を指定する複数の発音制御データを音源LSI210(図2)に対して発行する(ステップS1208)。図10のステップS1007の場合と同様に、CodeIndex()は配列変数なので、実際にはコード構成音を示す3又は4個のノートオンイベントEvent_2[CodeIndex(0)]、Event_2[CodeIndex(1)]、Event_2[CodeIndex(3)]、Event_2[CodeIndex(4)]等の夫々に対応するノートオンを示す各発音制御データが、CPU201から音源LSI210に対して発行され、音源LSI210が正解コードの発音処理を実行することになる。
その後、CPU201は、図8及び図9のフローチャートで例示されるソング再生処理のためのタイマ209によるソング再生割込みのブロックを解除し、ソング再生割込み処理が再開されるようにする(ステップS1209)。この結果、レッスンモードの進行が再開される。そして、CPU201は、図12のフローチャートで例示される図10のステップS1004のコードレッスン再生処理を終了する。
図13は、図10のステップS1004のコードレッスン再生処理の第2の実施形態の詳細例を示すフローチャートである。この処理は、演奏者がコードパートのレッスンを行うために実行される制御処理である。図12に例示されるコードレッスン再生処理の第1の実施形態の詳細例の場合と同じ処理を行うステップについては、図12の場合と同じステップ番号を付与してある。
従ってまず、図13のステップS1201、S1202、及びS1203の各ステップの処理は、図12の第1の実施形態の場合と同様である。
コード鍵域での押鍵が発生すると(図13のステップS1203の判定がYESになると)、CPU201は、RAM203上の配列変数CodeIndex()によって参照される、RAM203に記憶されているレッスン楽曲データのトラックチャンク2(コードパート)(図3参照)上の複数のノートオンイベント群Event_2[CodeIndex()](図9のステップS817、S818参照)を取得する。そして、CPU201は、ステップS1203での押鍵検出において、上記イベント群で定まる正解コードの構成音の何れかが今回押鍵されたか否かを判定する(ステップS1301)。
ステップS1301の判定がNOならば、CPU201は、ステップS1203で検出部204を介して検出された押鍵ノートによるノートオンを指示する発音制御データを、音源LSI210に対して発行する(ステップS1302)。この結果、音源LSI210が、正解コードの構成音ではない楽音の発音処理を実行する。
ステップS1302の発音処理の後、CPU201は、図12のステップS1207の場合と同様の評価音声発音処理を実行する(図13のステップS1207)。その後、CPU201は、図13のステップS1203の押鍵待ち状態に戻る。
ステップS1301の判定がYESならば、CPU201は、今回いままでに複数のノートオンイベント群Event_2[CodeIndex()]で定まる正解コードの構成音以外の楽音の鍵101が押鍵されていないか否かを判定する(ステップS1303)。
正解コードの構成音以外の楽音の鍵101が押鍵されている(ステップS1303の判定がNOである)場合には、CPU201は、ステップS1207の評価音声発音処理を実行した後、図13のステップS1203の押鍵待ち状態に戻る。
正解コードの構成音以外の楽音の鍵101が押鍵されていない(ステップS1303の判定がYESである)場合には、CPU201は、図12の場合と同様にして、正解コードのコード判定処理(図13のステップS1204)、及び確定判定処理(図13のステップS1205)を実行する。
この結果、正解コードが確定できなかった(図13のステップS1205の判定がNOである)場合には、CPU201は、ステップS1207の評価音声発音処理を実行した後、図13のステップS1203の押鍵待ち状態に戻る。
正解コードが確定できた(図13のステップS1205の判定がYESである)場合には、CPU201は、図12の場合と同様にして、正解コードの発音処理を実行する(図13のステップS1208)。
そして、CPU201は、図12の場合と同様にして、ソング再生割込みのブロックを解除した後(図13のステップS1209)、図13のフローチャートで例示される図10のステップS1004のコードレッスン再生処理を終了する。
以上のようにしてコードレッスン再生処理の第2の実施形態によれば、演奏者は、正解コードの構成音でないコード鍵域の楽音の鍵101を押鍵してしまったことを認識することが可能となる。
図14は、図10のステップS1004のコードレッスン再生処理の第3の実施形態の詳細例を示すフローチャートである。この処理は、演奏者がコードパートのレッスンを行うために実行される制御処理である。図12に例示されるコードレッスン再生処理の第1の実施形態の詳細例の場合と同じ処理を行うステップについては、図12の場合と同じステップ番号を付与してある。
従ってまず、図13のステップS1201、S1202、及びS1203の各ステップの処理は、図12の第1の実施形態の場合と同様である。
コード鍵域での押鍵が発生すると(図14のステップS1203の判定がYESになると)、CPU201は、検出部204から通知された押鍵ノートによるノートオンを指示する発音制御データを音源LSI210に対して発行する(ステップS1401)。この結果、音源LSI210は、押鍵された鍵101に対応する楽音を発音処理する。
次に、CPU201は、図12の場合と同様にして、今回いままで検出された押鍵により正解コードを確定できるか否かをコード判定し(図14のステップS1204)、正解コードを確定できたか否かを判定する(図14のステップS1205)。
正解コードが確定できない(ステップS1205の判定がNOである)場合には、CPU201は、図12のステップS1207の場合と同様の評価音声発音処理を実行した後(図14のステップS1207)、図14のステップS1203の押鍵待ち状態に戻る。
正解コードが確定できた(ステップS1205の判定がYESである)場合には、CPU201は、今回いままでの押鍵によりステップS1401に基づいて発音中の楽音の消音を指示する発音制御データを音源LSI210に対して発行する。
続けて、CPU201は、図12の場合と同様にして、正解コードの発音処理を実行する(図14のステップS1208)。
そして、CPU201は、図12の場合と同様にして、ソング再生割込みのブロックを解除した後(図14のステップS1209)、図14のフローチャートで例示される図10のステップS1004のコードレッスン再生処理を終了する。
以上のようにしてコードレッスン再生処理の第3の実施形態によれば、不正解時の不要な発音を消音しつつ正解のコード構成音をレッスン演奏することができ、演奏者が不快感を感じることを防止することが可能となる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
複数の鍵と、
前記鍵の操作を検出する検出部と、
制御部と、
を備え、前記制御部は、
楽曲のコードの進行に従い、前記コードに対応する鍵をガイドし、前記コードの構成音と前記検出部で押鍵が検出された鍵との関係に基づき前記押鍵が正解か否かを判定する判定処理と、
前記判定処理の判定結果が不正解となった場合に、前記不正解に対応する発音を行う発音処理と、
を実行する演奏装置。
(付記2)
前記制御部は、前記発音処理において、前記不正解に対応する発音を、前記押鍵が検出された1つ以上の鍵により決定される不正解コードの構成音を発音する、付記1に記載の演奏装置。
(付記3)
前記制御部は、前記発音処理において、
前記押鍵が検出された鍵が前記判定処理の正解を構成する複数の鍵に含まれない場合に、前記押鍵が検出された鍵に対応する楽音を発音し、
前記判定処理の判定結果が正解となった場合に、前記コードの構成音を発音する、
付記1に記載の演奏装置。
(付記4)
前記制御部は、前記発音処理において、
前記検出部で押鍵が検出された鍵に対応する楽音を発音し、
前記判定処理の判定結果が正解となった場合に、発音中の前記楽音を消音した後に、前記コードの構成音を発音する、
付記1に記載の演奏装置。
(付記5)
前記制御部は、前記判定処理の判定結果が不正解となった場合に、前記不正解の度合いに応じた評価音声を発音する処理を更に実行する、付記1乃至4の何れかに記載の演奏装置。
(付記6)
前記ガイドにおいて、演奏者が押鍵すべき鍵を光らせる、付記1乃至5の何れかに記載の演奏装置。
(付記7)
前記ガイドにおいて、表示装置に演奏者が押鍵すべき鍵を表示指示する、付記1乃至6の何れかに記載の演奏装置。
(付記8)
前記ガイドにおいて、演奏者が押鍵すべき鍵に対応する指の番号をガイド音声として発音指示する、付記1乃至7の何れかに記載の演奏装置。
(付記9)
前記ガイドにおいて、演奏者が押鍵すべき鍵の音名をガイド音声として発音指示する、付記1乃至7の何れかに記載の演奏装置。
(付記10)
楽曲のコードの進行に従い、前記コードに対応する鍵をガイドし、前記コードの構成音と検出部で押鍵が検出された鍵との関係に基づき前記押鍵が正解か否かを判定する判定処理と、
前記判定処理の判定結果が不正解となった場合に、前記不正解に対応する発音を行う発音処理と、
を実行する演奏レッスン方法。
(付記11)
楽曲のコードの進行に従い、前記コードに対応する鍵をガイドし、前記コードの構成音と検出部で押鍵が検出された鍵との関係に基づき前記押鍵が正解か否かを判定する判定処理と、
前記判定処理の判定結果が不正解となった場合に、前記不正解に対応する発音を行う発音処理と、
をコンピュータに実行させるためのプログラム。