"演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段と、を具備することを特徴とする演奏練習装置。前記メンバ評価手段は、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量と、前記演奏技量記憶手段に記憶される各メンバの演奏技量とを比較し、更新によりユーザの演奏技量がレベルアップした場合にはユーザよりも演奏技量の高いメンバから褒められる評価を与え、一方、更新によりユーザの演奏技量がレベルダウンした場合にはユーザよりも演奏技量の高いメンバから叱られる評価を与えることを特徴とする請求項1記載の演奏練習装置。前記演奏評価値取得手段は、少なくとも正答率、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値を、評価値として取得することを特徴とする請求項1記載の演奏練習装置。前記ユーザ演奏技量更新手段は、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度に、前記演奏評価値取得手段により取得された正答率を乗じて演奏得点を算出し、算出した演奏得点よりもユーザの演奏技量が高ければ、当該ユーザの演奏技量をレベルアップさせ、一方、算出した演奏得点よりもユーザの演奏技量が低ければ、当該ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。前記ユーザ演奏技量更新手段は、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値に基づき適正押鍵タイミング率を算出し、この適正押鍵タイミング率が所定値より小さく、かつユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より高ければ、ユーザの演奏技量をレベルアップさせ、一方、適正押鍵タイミング率が所定値より大きいか、あるいはユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より低ければ、ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。前記演奏技量記憶手段は、ユーザに対する各メンバの忠誠度を記憶し、前記メンバ評価手段は、更新によりユーザの演奏技量がレベルアップした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を上げ、一方、更新によりユーザの演奏技量がレベルダウンした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を下げる忠誠度更新手段を備えることを特徴とする請求項1記載の演奏練習装置。前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、所定値より小さい忠誠度のメンバを、ユーザとの共演から脱退を希望する脱退希望メンバとして検出する脱退希望メンバ検出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。前記演奏技量記憶手段にユーザと共演する各メンバの他に、ユーザと共演しない他のメンバの演奏技量を記憶しておき、これら他のメンバの内、ユーザの演奏技量とのレベル差が所定以上のメンバを入替候補メンバとして抽出する入替候補メンバ抽出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段とを備えた装置のコンピュータで実行されるプログラムであって、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏ステップと、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得ステップと、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得ステップにより取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新ステップと、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段ステップとを実行させることを特徴とするプログラム。ところで、上記特許文献1,2に開示の技術は、間違えた箇所の演奏を繰り返したり、間違えたフレーズを先頭からやり直したりする独習に終始する為、単調で面白味に欠け、練習意欲の低下を招致する。言い換えれば、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来ない、という問題がある。本発明は、このような事情に鑑みてなされたもので、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることができる演奏練習装置およびプログラムを提供することを目的としている。上記目的を達成するため、本発明による演奏練習装置は、演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段とを具備することを特徴とする。本発明では、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。以下、図面を参照して本発明の実施形態について説明する。A.全体構成図1は、本発明の実施の一形態による演奏練習装置100の全体構成を示すブロック図である。この図において、操作部10は、装置動作を終了させる終了スイッチ、演奏モード処理後述するの実行を指示する演奏スイッチおよび訓練モード処理後述するの実行を指示する訓練スイッチなどを備え、これらスイッチの各操作に応じた操作イベントを発生してCPU11に供給する。CPU11は、ROM12に格納される各種プログラムを実行して装置各部を制御する。本発明の要旨に係わるCPU11の特徴的名処理動作については追って述べる。ROM12は、CPU11にロードされる各種制御プログラムを記憶する。各種制御プログラムとは、後述するメインルーチンおよび当該メインルーチンからコールされる演奏モード処理を含む。演奏モード処理は、伴奏パート選択処理、再生処理スレッド、MIDI入力スレッド、評価結果計算処理、メンバによる評価処理およびメンバ入替候補処理から構成される。なお、再生処理スレッドはTick時刻計算処理、発音処理および消音処理を含む。MIDI入力処理スレッドは、発音中バッファ検索処理およびパートデータ検索処理を含む。RAM13は、図2に図示するように、CPU11の処理に用いられる各種レジスタフラグデータを一時記憶するワークエリアWEの他、ユーザデータベースUDB、メンバデータベースMDB、曲データエリアSDE、トラックデータエリアPDE、音符データエリアMDE、再生制御データRCDおよび発音中バッファNOBを備える。ワークエリアWEを除く上記各エリアに格納される主要なデータ構成については追って述べる。表示部14は、CPU11の制御の下に、例えば演奏練習する曲データを楽譜表示したり、図27~図28に図示する一例の演奏評価画面PDE1、PED2を画面表示する。MIDIインタフェース部15は、課題となる曲を演奏練習するユーザの演奏操作に応じて、外部のMIDI楽器から出力される演奏データMIDIイベントを、CPU11の制御の下に取り込む。音源16は、公知の波形メモリ読み出し方式で構成され、CPU11の制御の下に、MIDIインタフェース部15を介して取り込まれた演奏データMIDIイベントに応じた楽音データを発生する。サウンドシステム17は、音源16が生成した楽音データをアナログ形式の楽音信号に変換すると共に、その楽音信号に対してノイズ除去やレベル制御を施した後、スピーカから楽音として発音させる。B.RAM13のデータ構成次に、図3~図9を参照してRAM13のユーザデータベースUDB、メンバデータベースMDB、曲データエリアSDE、トラックデータエリアPDE、音符データエリアMDE、再生制御データplayerおよび発音中バッファエリアOBEにそれぞれ格納される各種データの構成について説明する。1ユーザデータベースUDBの構成図3は、RAM13のユーザデータベースUDBの構成を示す図である。ユーザデータベースUDBは、本装置100を使用する各ユーザの属性を表すユーザデータuser[0]~user[N]から構成される。1つのユーザデータuser[]は、識別データID、ユーザ名Name、フレーズ演奏技量熟練度を表すフレーズスキルPhraseLv、リズム演奏技量熟練度を表すリズムスキルRhythmLv、練習回数PracticeCnt、練習ポイントPracticePt、メンバMember後述する、前ユーザデータを指定するポインタprevおよび次ユーザデータを指定するポインタnextから構成される。メンバMemberとは、伴奏パートを擬人化した呼称であり、ユーザが演奏パートを演奏練習する際に、あたかもバンドで共演するかのように複数のメンバ伴奏パートが登録される。1つのメンバMembers[]は、メンバ忠誠度Loyaltyおよびメンバ状態Statusを備える。メンバ忠誠度Loyaltyは、-の場合に低い忠誠度メンバから脱退したいを表し、0の場合に中立の忠誠度を表し、の場合に高い忠誠度メンバを続けたいを表す。メンバ状態Statusは、-1の場合にメンバからの脱退希望の状態を表し、0の場合に特に無しの状態を表し、1の場合にメンバ参加に前向きの状態を表す。2メンバデータベースMDBの構成図4は、メンバデータベースMDBの構成を示す図である。メンバデータベースMDBは、擬人化した伴奏パートの属性を表すメンバデータMembers0~MembersNから構成される。1つのメンバデータMembers[]は、識別データID、メンバ名Name、楽器番号InstrID、パートデータ配列番号iTrackID、フレーズスキルPhraseLv、リズムスキルRhythmLv、フラグiFlag、演奏評価LastCommentおよび性格Characterを備える。3曲データエリアSDEの構成図5は、曲データエリアSDEの構成を示す図である。曲データエリアSDEは、演奏練習の課題となる曲の内容を表す曲データSongs0~SongsNから構成される。1つの曲データSongsは、識別データID、曲名Name、フレーズスキルPhraseLv、リズムスキルRhythmLv、演奏パートトラックポインタPlayTrack、伴奏パートトラックポインタAccompTrack、マスタートラックポインタMasterTrack、次の曲データを指定するポインタprevおよび次の曲データを指定するポインタnextから構成される。4トラックデータエリアPDEの構成図6は、トラックデータエリアPDEの構成を示す図である。トラックデータエリアPDEは、曲データSongs中の演奏パートトラックポインタPlayTrackおよび伴奏パートトラックポインタAccompTrackで指定されるパートトラックと、曲データSongs中のマスタートラックポインタMasterTrackで指定されるマスタートラックとから構成される。パートトラックは、パートトラックデータTrack0~TrackNから構成される。1つのパートトラックデータTrackは、配列番号TrackID、トラック種類iTrackType1:演奏パート、2:伴奏パート、トラック選択状況iPlayType0:選択なし、1:演奏パート、2:伴奏パート、トラック先頭の音符データを指定する音符ポインタpFirstMe、楽器番号InstrID、フレーズスキルPhraseLvおよびリズムスキルRhythmLvから構成される。マスタートラックは、テンポデータTempo0~TempoNから構成される。1つのテンポデータTempoは、テンポ変更Tick時間lTime、テンポ値iTempo、前のテンポデータを指定するポインタprevおよび次のテンポデータを指定するポインタnextから構成される。5音符データエリアMDEの構成図7は、音符データエリアMDEの構成を示す図である。音符データエリアMDEは、音符データMidiEvent0~MidiEventNから構成される。1つの音符データMidiEventは、発音開始ティックlTime、ゲートタイムlGate、ピッチPitch、ベロシティVel、前音符データを指定するポインタprevおよび次音符データを指定するポインタnextから構成される。6再生制御データplayerの構成図8は、再生制御データplayerの構成を示す図である。再生制御データplayerは、現在Tick時刻lNowTick、各トラックの次の音符データMidiEvents、テンポ値iNoeTempo、最後にTick時刻を更新したシステム時刻lTickUpdate、再生中断用フラグinterruption、再生中に発音した伴奏パートの音符数iNoteCount、再生中に正しく弾けた音符数iOKCount、再生中に正しく弾けた音符における押鍵時間差lKeyOnDif、再生中に正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDif、発音中バッファエリアOBEの音符データmePlayingおよび状態フラグiStatus0:再生停止、1:再生中から構成される。7発音中バッファエリアOBEの構成図9は、発音中バッファエリアOBEの構成を示す図である。発音中バッファエリアOBEには、発音中の音符データmePlaying0~mePlayingNが格納される。1つの音符データmePlayingは、音符データエリアMDE中で該当する音符データMidiEventを指定する音符ポインタpMeおよび押鍵フラグiStatus0:押鍵なし、1:押鍵有りから構成される。B.動作次に、図10~図28を参照して上記構成による演奏練習装置100の動作について説明する。以下では、演奏練習装置100のCPU11が実行するメインルーチンおよび当該メインルーチンからコールされる演奏モード処理の各動作を説明する。なお、演奏モード処理は、伴奏パート選択処理、再生処理スレッド、MIDI入力処理スレッド、評価結果計算処理、メンバによる評価処理およびメンバ入替候補処理から構成される。また、再生処理スレッドはTick時刻計算処理、発音処理および消音処理を含み、MIDI入力処理スレッドは発音中バッファ検索処理およびパートデータ検索処理を含む。1メインルーチンの動作上記構成による演奏練習装置100がパワーオンされると、CPU11は図10に図示するメインルーチンを実行してステップSA1に進み、RAM13のワークエリアWEに格納される各種レジスタやフラグデータをゼロリセットしたり初期値セットしたりするイニシャライズを行う。イニシャライズが完了すると、ステップSA2に進み、RAM13のユーザデータベースUDBに登録されるユーザデータuser[0]~user[N]の内、演奏練習するユーザ自身のユーザデータuser[]を選択する。続いて、ステップSA3~SA4では、操作部10に配設される終了スイッチ、演奏スイッチおよび訓練スイッチの操作の有無を判別する。ユーザが終了スイッチをオン操作した場合には、ステップSA3の判断結果がYESになり、本処理を終える。ユーザが演奏スイッチをオン操作した場合には、ステップSA4の判断結果がYESになり、ステップSA6に進み、脱退希望メンバの存在の有無を判断する。メンバとは、伴奏パートを擬人化した呼称である。メンバの脱退希望とは、演奏練習の評価結果で得られるユーザの演奏技量フレーズスキルPhraseLv、リズムスキルRhythmLvがメンバより低い状態が継続し、メンバからがっかりされる評価を一定量以上与えられた場合に、ユーザに対して更なる演奏練習の必要性を促す為にメンバがバンドからの脱退を言い渡すものである。そして、脱退希望メンバが存在すると、上記ステップSA6の判断結果がYESになり、ステップSA7に進み、ユーザの演奏技量を向上させる訓練モード処理を実行した後、上述のステップSA3に処理を戻す。一方、脱退希望メンバが存在しない場合には、上記ステップSA6の判断結果はNOになり、ステップSA8を介して演奏モード処理後述するを実行した後、上述のステップSA3に処理を戻す。2演奏モード処理の動作次に、図11を参照して演奏モード処理の動作を説明する。上述したメインルーチンのステップSA8図10参照を介して本処理が実行されると、CPU11は図11に図示するステップSB1に進み、RAM13の曲データエリアSDEに記憶される曲データSongs0~SongsNの中からユーザが指定するレベルの演奏技量フレーズスキルPhraseLv、リズムスキルRhythmLvを備える曲データSongsを選択する。次いで、ステップSB2では、選択した曲データSongsの内容、すなわち図5に図示する識別データID、曲名Name、フレーズスキルPhraseLv、リズムスキルRhythmLv、演奏パートトラックポインタPlayTrack、伴奏パートトラックポインタAccompTrack、マスタートラックポインタMasterTrack、次の曲データを指定するポインタprevおよび次の曲データを指定するポインタnextを読み込みRAM13のワークエリアWEに一時記憶する。続いて、ステップSB3に進むと、ユーザに登録された全てのメンバに伴奏パートをアサインする伴奏パート選択処理を実行する。この後、ステップSB4に進み、再生処理スレッドを起動させる。再生処理スレッドでは、後述するように、課題曲の演奏パートおよび伴奏パートの進行を管理すると共に、伴奏パートトラックの各音を再生する。次いで、ステップSB5では、MIDI入力処理スレッドを起動させる。MIDI入力処理スレッドでは、後述するように、演奏練習するユーザの演奏操作に従って外部MIDI楽器が出力する演奏情報ノートオンメッセージを受信し、当該演奏情報に応じた楽音を発音させる一方、受信した演奏情報ノートオンメッセージが演奏パートの音符データと一致するかどうかを発音中バッファおよびパートトラックの双方から検索し、その検索結果に基づきユーザの演奏を評価するための評価値正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDifを算出する。続いて、ステップSB6では、課題終端曲の終わりまで演奏したか否かを判断する。課題終端に達していなければ、判断結果はNOになり、ステップSB7に進み、ユーザによる中断指示の有無を判断する。中断指示が無ければ、判断結果はNOになり、上記ステップSB6に処理を戻す。以後、課題終端に達するか、あるいは中断指示が発生するまでステップSB6~SB7を繰り返す。そして、課題終端に達するか、あるいは中断指示が発生すると、上記ステップSB6、SB7の何れかの判断結果がYESになり、ステップSB8に進む。ステップSB8では、評価結果計算処理を実行する。評価結果計算処理では、後述するように、課題曲の演奏パートの難易度に相当するフレーズスキルPhraseLvに、演奏練習したユーザの正答率player.iOKCount/player.iNoteCountを乗じて算出した演奏評価スコアiScoreよりユーザのフレーズスキルPhraseLvが高ければ、ユーザのフレーズスキルPhraseLvをレベルアップ1させ、一方、演奏評価スコアiScoreよりユーザのフレーズスキルPhraseLvが低いと、ユーザのフレーズスキルPhraseLvをレベルダウン-1させる。また、正しく弾けた一音符当たりの平均押鍵時間差再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDifを判定許容時間で除した値を1から減算して適正押鍵タイミング率iScoreを算出し、この適正押鍵タイミング率iScoreが0.5より小さく、かつユーザのリズムスキルRhythmLvが演奏パートのリズムスキルRhythmLvより高ければ、ユーザのリズムスキルRhythmLvをレベルアップ1させ、一方、適正押鍵タイミング率iScoreが0.5より大きいか、あるいはユーザのリズムスキルRhythmLvが演奏パートのリズムスキルRhythmLvより低いと、ユーザのリズムスキルRhythmLvをレベルダウン-1させる。次いで、ステップSB9では、上記ステップSB8の評価結果計算処理によってユーザのフレーズ演奏技量フレーズスキルPhraseLv又はリズム演奏技量リズムスキルRhythmLvの何れかがレベルアップしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを上げ、ユーザよりもスキルの高いメンバから褒められる評価を与え、一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを下げ、ユーザよりもスキルの高いメンバから叱られる評価を与えるメンバによる評価処理を実行する。続いて、ステップSB10では、メンバ入替候補処理を実行する。メンバ入替候補処理では、後述するように、ユーザのバンドに参加しているメンバユーザデータuserに登録されたメンバMemberの中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバを探し出して脱退希望リストに登録する一方、ユーザデータuserに未登録バンド不参加のメンバの内、メンバの演奏技量とユーザの演奏技量の差が入替レベル差CNG_LVを超えるメンバを入替候補として探し出し、この入替候補の中からフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたユーザよりも優れた演奏技量を持つメンバや、フレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたユーザよりも劣る演奏技量を持つメンバを参加希望リストに登録する。そして、ステップSB11に進むと、上記ステップSB10において脱退希望リストあるいは参加希望リストに登録されたメンバが生じた場合に、メンバの脱退あるいは新規参加させるメンバ変更指示する操作イベントの有無を判断する。メンバ変更指示する操作イベントが発生しなければ、判断結果はNOとなり、本処理を終えるが、メンバ変更指示する操作イベントが発生すると、ステップSB12に進み、ユーザデータuserに登録されたメンバMemberの脱退や新たなメンバMemberを登録するプロファイル更新を行った後、本処理を終える。3伴奏パート選択処理の動作次に、図12を参照して伴奏パート選択処理の動作を説明する。上述した演奏モード処理のステップSB3を介して本処理が実行されると、CPU11は図12に図示するステップSC1に進み、ユーザ自身のユーザデータuser中のメンバデータMembers図3参照を指定するポインタuser.Membersを、メンバ検索ポインタmemにセットする。続いて、ステップSC2では、メンバ検索ポインタmemがNULL、つまりユーザに登録されたメンバの全てを検索し終えたか否かを判断する。ユーザに登録されたメンバの全てを検索し終えていなければ、判断結果はNOになり、ステップSC3に進む。ステップSC3では、メンバ検索ポインタmemで指定されるメンバデータMembers中のパートデータ配列番号iTrackIDで表されるパートトラックデータTrackmem.iTrackIDをポインタtrにセットする。そして、ステップSC4では、このポインタtrで指定されるパートトラックデータTrack中のトラック選択状況iPlayTypetr.iPlayTypeに伴奏パートを示す2をストアする。次いで、ステップSC5に進むと、次のメンバを検索すべくメンバ検索ポインタmemを更新mem.nextした後、上述のステップSC2に処理を戻す。以後、ユーザに登録されたメンバの全てを検索し終える迄、上記ステップSC2~SC5を繰り返すことによって、ユーザに登録された全てのメンバのに伴奏パートをアサインする。そして、更新されたメンバ検索ポインタmem.nextで指定されるデータがNULLとなり、ユーザに登録されたメンバの全てを検索し終えると、上記ステップSC2の判断結果がYESとなり、本処理を終える。4再生処理スレッドの動作次に、図13を参照して再生処理スレッドの動作を説明する。前述した演奏モード処理のステップSB4図11参照を介して本処理が起動されると、CPU11は図13に図示するステップSD1に進み、再生用変数を初期化し、続くステップSD2では、再生開始Tick時刻を、再生制御データplayer中の現在Tick時刻lNowTick図8参照にストアする。次いで、ステップSD3では、トラック検索ポインタiTrに初期値0をセットする。そして、ステップSD4に進むと、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。トラック検索中ならば、判断結果はYESになり、ステップSD5に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中の音符ポインタpFirstMeTrack[iTr].pFirstMe、つまりトラック検索ポインタiTrで指定されるパートトラック先頭の音符データを指定するポインタをポインタmeにストアする。続いて、ステップSD6では、ポインタmeで指定される音符データMidiEvent中の発音開始ティックlTimeme.lTimeが、再生制御データplayer中の現在Tick時刻lNowTickplayer.lNowTickより小さいか否か、つまりポインタmeで指定される音符データMidiEventが未発音であるかどうかを判断する。ポインタmeで指定される音符データMidiEventが発音タイミングを過ぎて発音済みならば、上記ステップSD6の判断結果はNOになり、ステップSD7に進み、次の音符データMidiEventを指定させるべくポインタmeを更新me.nextさせた後、上記ステップSD6に処理を戻す。そして、ポインタmeで指定される音符データMidiEventが発音タイミングに達しておらず未発音であると、上記ステップSD6の判断結果がYESになり、ステップSD8に進む。ステップSD8では、ポインタmeを、再生制御データplayer中の、トラック検索ポインタiTrで指定されるトラックの次の音符データMidiEventsiTrとしてストアする。この後、ステップSD9に進み、次のパートトラックについて検索する為、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSD4に処理を戻す。以後、歩進されたトラック検索ポインタiTrが最大トラック数MAX_TRACKを超える迄、上述のステップSD5~SD6の処理を繰り返すことによって、各パートトラックにおける次の音符データMidiEventを指定するポインタmeが再生制御データplayer.MidiEvents[iTr]としてセットされる。そして、トラック検索ポインタiTrが最大トラック数MAX_TRACKを超えてトラック検索が完了すると、上記ステップSD4の判断結果がNOになり、ステップSD10に進む。ステップSD10では、再生制御データplayer中の現在Tick時刻lNowTickplayer.lNowTickが、曲データ末尾以前であるか否かを判断する。曲データ末尾を超えて演奏練習の終了になると、判断結果はNOになり、ステップSD15に進み、オールノートオフを音源16に指示して発音中の全ての楽音を消音させて本処理を終える。一方、再生制御データplayer中の現在Tick時刻lNowTickplayer.lNowTickが、曲データ末尾以前の場合、すなわち演奏練習中であると、上記ステップSD10の判断結果はYESになり、ステップSD11に進む。ステップSD11では、曲の進行を管理するTick時刻を生成するTick時刻計算処理後述するを実行する。続いて、ステップSD12では、発音タイミングとなった伴奏パートトラックの各音を発音させながら、発音した伴奏パートの音符数iNoteCountを計数する発音処理後述するを実行する。次いで、ステップSD13では、消音タイミングとなった伴奏パートトラックの各音を消音させる消音処理後述するを実行する。そして、ステップSD14に進むと、再生制御データplayer中の再生中断用フラグinterruption図8参照がFALSEであるか否か、すなわちユーザにより再生中断操作が為されていないかどうかを判断する。再生中断操作が為されていない場合には、判断結果がYESになり、上述のステップSD10に処理を戻すが、再生中断操作が為された場合には、判断結果がNOになり、ステップSD15に進み、音源16にオールノートオフを指示して本処理を終える。5Tick時刻計算処理の動作次に、図14を参照してTick時刻計算処理の動作を説明する。上述した再生処理スレッドのステップSD11図13参照を介して本処理が実行されると、CPU11は図14に図示するステップSE1に進み、再生制御データplayerにおける発音中の音符データmePlayingにて指定される発音中バッファの押鍵フラグiStatusが1、つまり発音すべき音が押鍵されているかどうかを判断する。押鍵されていなければ、判断結果はNOになり、本処理を終えるが、押鍵されていると、判断結果はYESになり、ステップSE2に進む。ステップSE2では、CPU11が計時するシステム時刻から再生制御データplayer中のシステム時刻iTickUpdateplayer.lTickUpdate:最後にTick時刻を更新したシステム時刻を差し引いた時刻差lSysGateを算出する。続いて、ステップSE3では、次式1に基づき上記ステップSE2で算出した時刻差lSysGateを、テンポ値Tempoに応じたTick値lTickTmpに変換する。lTickTmp=60000/Tempo/Resolution/lSysGate...1なお、上記1式において、Resolutionは分解能を表す。次いで、ステップSE4では、上記ステップSE3において算出されたlTickTmpが0より大きいか否かを判断する。算出されたlTickTmpが0より小さければ、判断結果はNOになり、本処理を終えるが、0より大きいと、判断結果はYESになり、ステップSE5に進み、再生制御データplayer中のシステム時刻iTickUpdateplayer.lTickUpdateをシステム時刻に更新する。そして、ステップSE6に進み、再生制御データplayer中の現在Tick時刻lNowTickに、上記ステップSE3で算出したlTickTmpを加算し、当該現在Tick時刻lNowTickを更新して本処理を終える。これにより、演奏開始時点からの経過時間を表す現在Tick時刻lNowTickが生成される。6発音処理の動作次に、図15~図16を参照して発音処理の動作を説明する。前述した再生処理スレッドのステップSD12図13参照を介して本処理が実行されると、CPU11は図15に図示するステップSF1に進み、トラック検索ポインタiTrをゼロリセットし、続くステップSF2では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果がNOとなり、本処理を終えるが、トラック検索中であれば、判断結果はYESになり、ステップSF3に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが2、つまり選択された曲の伴奏パートであるかどうかを判断する。トラック検索ポインタiTrで指定されるパートが選択された曲の伴奏パートでなければ、判断結果はNOとなり、ステップSF4に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSF2に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが2、つまり選択された曲の伴奏パートであると、上記ステップSF3の判断結果はYESになり、ステップSF5に進む。ステップSF5では、再生制御データplayer中の音符データMidiEventsiTrをポインタmeにセットする。このポインタmeは、トラック検索ポインタiTrで指定されるパートトラックにおける次の音符データを指し示す。この後、図16に図示するステップSF6に進み、ポインタmeで指定される音符データMidiEvent中の発音開始ティックlTimeが、再生制御データplayer中の現在Tick時刻lNowTickより小さいか否か、つまり発音タイミング前であるかどうかを判断する。発音タイミング後であれば、上記ステップSF6の判断結果はNOになり、前述のステップSF4図15参照に処理を戻してトラック検索ポインタiTrを歩進させ、次のトラック検索を進める。一方、発音タイミング前ならば、上記ステップSF6の判断結果はYESになり、ステップSF7に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSF8では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlayingの配列数発音数より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果はNOになり、後述のステップSF12に進むが、バッファ検索ポインタiの値が発音数より小さければ、判断結果はYESになり、ステップSF9に進む。ステップSF9では、再生制御データplayer中の音符データmePlayingiをポインタmep1にストアする。次いで、ステップSF10では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlayingmep1の音符ポインタpMeがNULLであるか否か、つまり音符ポインタpMeで指定される音符の音が消音されているかどうかを判断する。音符ポインタpMeで指定される音符の音が消音されていると、判断結果はYESになり、ステップSF11に進み、ポインタiをインクリメントして歩進させた後、上述のステップSF8に処理を戻す。これに対し、音符ポインタpMeで指定される音符の音が消音されていなければ、上記ステップSF10の判断結果はNOになり、ステップSF12に進み、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlayingmep1の押鍵フラグiStatusを1押鍵有りにセットする。次いで、ステップSF13では、ポインタmeで指定される音符データMidiEvent中のベロシティVelを、レジスタmep1.iVelosityにストアする。そして、ステップSF14に進むと、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが2、つまり伴奏パートであるかどうかを判断する。伴奏パートでなければ、判断結果はNOになり、ステップSF17に進み、ポインタmeを、次音符を指定するポインタme.nextに更新させた後、前述のステップSF6に処理を戻す。一方、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTrが伴奏パートであると、上記ステップSF14の判断結果がYESとなり、ステップSF15に進み、ポインタmep1で指定される音符データMidiEventの発音を音源16に指示する。これにより、伴奏パートが再生される。そして、ステップSF16に進むと、再生制御データplayerに含まれ、再生中に発音した伴奏パートの音符数iNoteCountをインクリメントして歩進させる。この後、ステップSF17に進み、ポインタmeを、次音符を指定するポインタme.nextに更新させた後、前述のステップSF6に処理を戻す。7消音処理の動作次に、図17を参照して消音処理の動作を説明する。前述した再生処理スレッドのステップSD13図13参照を介して本処理が実行されると、CPU11は図17に図示するステップSG1に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSG2では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlayingの配列数発音数より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果はNOになり、本処理を終えるが、バッファ検索ポインタiの値が発音数より小さければ、判断結果はYESになり、ステップSG3に進む。ステップSG3では、再生制御データplayer中の音符データmePlayingiをポインタmep1にストアし、続くステップSG4では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlayingmep1の音符ポインタpMeがNULLであるか否か、つまり音符ポインタpMeで指定される音符が消音されているかどうかを判断する。音符ポインタpMeで指定される音符が消音されていると、判断結果はYESになり、ステップSG5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSG2に処理を戻す。一方、音符ポインタpMeで指定される音符が消音されていなければ、上記ステップSG4の判断結果はNOになり、ステップSG6に進む。ステップSG6では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlayingmep1における音符ポインタpMeを介して指定される音符データMidiEventの発音開始ティックlTimeとゲートタイムlGateとを加算した時刻が、再生制御データplayer中の現在Tick時刻lNowTickを過ぎているか否か、つまり消音タイミングに達したかどうかを判断する。消音タイミングに達していなければ、判断結果はNOになり、ステップSG5に進み、ポインタiをインクリメントして歩進させた後、前述のステップSG2に処理を戻す。これに対し、発音開始ティックlTimeとゲートタイムlGateとを加算した時刻が現在Tick時刻lNowTickを過ぎ、消音タイミングに達していると、上記ステップSG6の判断結果がYESとなり、ステップSG7に進み、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlayingmep1における音符ポインタpMeを介して指定される音符データMidiEventの消音を音源16に指示し、続くステップSG8では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlayingmep1の音符ポインタpMeをNULLにして消音を表した後、ステップSG5に進み、ポインタiをインクリメントして歩進させた後、前述のステップSG2に処理を戻す。8MIDI入力処理スレッドの動作次に、図18を参照してMIDI入力処理スレッドの動作を説明する。前述した演奏モード処理のステップSB5図11参照を介して本処理が実行されると、CPU11は図18に図示するステップSH1に進み、外部MIDI楽器からノートオンメッセージを受信したか否かを判断する。ノートオンメッセージを受信しない場合には、判断結果がNOになり、後述のステップSH7に処理を進めるが、演奏練習するユーザの演奏操作に応じて外部MIDI楽器からノートオンメッセージを受信した場合には、判断結果がYESとなり、ステップSH2に進む。ステップSH2では、受信したノートオンメッセージから音高pitchおよびベロシティvelを取得する。次いで、ステップSH3では、取得した音高pitchおよびベロシティvelをレジスタmePlayにストアする。そして、ステップSH4では、受信した演奏情報ノートオンメッセージが演奏パートの音符データと一致するかどうかを発音中バッファから検索し、その検索結果に基づきユーザの演奏を評価するための評価値正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDifを算出する発音中バッファ検索処理後述するを実行する。続いて、ステップSH5では、受信した演奏情報ノートオンメッセージが演奏パートの音符データと一致するかどうかをパートトラックから検索し、その検索結果に基づきユーザの演奏を評価するための評価値正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDifを算出するパートデータ検索処理後述するを実行する。そして、ステップSH6に進み、上記ステップSH2において取得したピッチおよびベロシティの楽音を発音するよう音源16に指示する。続いて、ステップSH7では、再生制御データplayer中の再生中断用フラグinterruption図8参照がFALSEであるか否か、すなわちユーザにより再生中断操作が為されていないかどうかを判断する。再生中断操作が為されると、判断結果はNOになり、本処理を終えるが、再生中断操作が為されていなければ、判断結果がYESになり、ステップSH8に進む。ステップSH8では、再生制御データplayer中の状態フラグiStatus図8参照が0でないか、つまり再生中であるかどうかを判断する。再生中であると、判断結果はYESになり、上述のステップSH1に処理を戻すが、再生停止ならば、判断結果がNOになり、本処理を終える。9発音中バッファ検索処理の動作次に、図19を参照して発音中バッファ検索処理の動作を説明する。上述したMIDI入力処理スレッドのステップSH4図18参照を介して本処理が実行されると、CPU11は図19に図示するステップSJ1に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSJ2では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlayingの配列数発音数より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果はNOになり、本処理を終えるが、バッファ検索ポインタiの値が発音数より小さければ、判断結果はYESになり、ステップSJ3に進む。ステップSJ3では、再生制御データplayer中の音符データmePlayingiをポインタmep1にストアし、続くステップSJ4では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlayingmep1の押鍵フラグiStatusが0、つまり押鍵無しであるかどうかを判断する。押鍵されていなければ、判断結果はYESになり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻す。一方、押鍵されていると、上記ステップSJ4の判断結果はYESになり、ステップSJ6に進む。ステップSJ6では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlayingmep1における音符ポインタpMeを介して指定される音符データMidiEventの発音開始ティックlTimeと、再生制御データplayer中の現在Tick時刻lNowTickとの差が許容時間内であるか否かを判断する。許容時間を超えていると、判断結果はNOになり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻す。これに対し、発音タイミング発音開始ティックlTimeと押鍵タイミング現在Tick時刻lNowTickとの差が許容時間内ならば、上記ステップSJ6の判断結果はYESになり、ステップSJ7に進み、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlayingmep1における音符ポインタpMeを介して指定される音符データMidiEventの音高pitchと、レジスタmePlayにストアした音高pitchとが一致するか否かを判断する。不一致ならば、判断結果はNOになり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻すが、一致すると、判断結果がYESになり、ステップSJ8に進む。ステップSJ8では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlayingmep1における音符ポインタpMeを介して指定される音符データMidiEventを、レジスタmeplayにストアする。次いで、ステップSJ9に進むと、許容時間内に音高ミス無く行われた適正な押鍵に対応して、再生制御データplayer中の、正しく弾けた音符数iOKCountをインクリメントして歩進させる。続いて、ステップSJ10では、上記ステップSJ6で取得した発音タイミング発音開始ティックlTimeと押鍵タイミング現在Tick時刻lNowTickとの時間差を再生制御データplayer中のlKeyOnDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差lKeyOnDifを更新すると共に、発音タイミング発音開始ティックlTimeと押鍵タイミング現在Tick時刻lNowTickとの時間差絶対値を再生制御データplayer中のlKeyOnABSDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差絶対値lKeyOnDifを更新して本処理を終える。10パートデータ検索処理の動作次に、図20を参照してパートデータ検索処理の動作を説明する。前述したMIDI入力処理スレッドのステップSH5図18参照を介して本処理が実行されると、CPU11は図20に図示するステップSK1に進み、レジスタmeplayの内容がNULL、つまり演奏情報ノートオンメッセージから取得した音高pitchおよびベロシティvelがストアされていない状態であるかどうかを判断する。押鍵に応じた演奏情報がレジスタmeplayにストアされていなければ、判断結果はYESになり、本処理を終えるが、押鍵に応じた演奏情報がレジスタmeplayにストアされていると、判断結果がNOになり、ステップSK2に進む。ステップSK2では、トラック検索ポインタiTrをゼロリセットし、続くステップSK3では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果がNOとなり、本処理を終えるが、トラック検索中ならば、判断結果はYESになり、ステップSK4に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが1、つまり選択された曲の演奏パートであるかどうかを判断する。トラック検索ポインタiTrで指定されるパートが選択された曲の演奏パートでなければ、判断結果はNOとなり、ステップSK5に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSK3に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが1、つまり選択された曲の演奏パートならば、上記ステップSK4の判断結果がYESになり、ステップSK6に進む。ステップSK6では、再生制御データplayer中の音符データMidiEventsiTrをポインタmepにセットする。このポインタmepは、トラック検索ポインタiTrで指定されるパートトラックにおける次の音符データMidiEventを指し示す。そして、ステップSK7に進むと、ポインタmepで指定される音符データMidiEventがNULL、すなわち曲終端であるかどうかを判断する。曲終端でなければ、判断結果がNOになり、ステップSK8に進む。ステップSK8では、再生制御データplayer中の現在Tick時刻lNowTickと、ポインタmepで指定される音符データMidiEventの発音開始ティックlTimeとの差が許容時間内であるか否かを判断する。許容時間を超えていると、判断結果はNOになり、本処理を終えるが、許容時間内ならば、判断結果はYESになり、ステップSK9に進む。ステップSK9では、ポインタmepで指定される音符データMidiEventの音高pitchと、レジスタmeplayにストアした音高pitchとが一致するか否かを判断する。不一致ならば、判断結果はNOになり、ステップSK13に進み、ポインタmepを歩進mep.nextさせた後、上述のステップSK7に処理を戻すが、一致すると、上記ステップSK9の判断結果がYESになり、ステップSK10に進み、演奏パートのトラックTrack[iTr]においてポインタmepにより指定される音符データMidiEventを、レジスタmeplayにストアする。次いで、ステップSK11に進むと、許容時間内に音高ミス無く行われた適正な押鍵に対応して、再生制御データplayer中の、正しく弾けた音符数iOKCountをインクリメントして歩進させる。続いて、ステップSK12では、上記ステップSK8で取得した発音開始ティックlTimeと現在Tick時刻lNowTickとの時間差を再生制御データplayer中のlKeyOnDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差lKeyOnDifを更新すると共に、その時間差絶対値を再生制御データplayer中のlKeyOnABSDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDifを更新する。この後、ステップSK13に進み、ポインタmepを歩進mep.nextさせた後、上述のステップSK7に処理を戻す。そして、歩進されたポインタmepが曲終端に達すると、ステップSK7の判断結果がYESとなり、本処理を終える。11評価結果計算処理の動作次に、図21~図22を参照して評価結果計算処理の動作を説明する。前述した演奏モード処理のステップSB8を介して本処理が実行されると、CPU11は図21に図示するステップSL1に進み、トラック検索ポインタiTrをゼロリセットし、続くステップSL2では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果がNOとなり、本処理を終えるが、トラック検索中ならば、判断結果はYESになり、ステップSL3に進む。ステップSL3では、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが1、つまり選択された曲の演奏パートであるかどうかを判断する。トラック検索ポインタiTrで指定されるパートが選択された曲の演奏パートでなければ、判断結果はNOとなり、ステップSL4に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSL2に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のトラック選択状況iPlayTypeが1、つまり選択された曲の演奏パートであれば、上記ステップSL3の判断結果はYESになり、ステップSL5に進む。ステップSL5では、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のフレーズスキルPhraseLvに、正答率player.iOKCount/player.iNoteCountを乗じて演奏評価スコアiScoreを算出する。次いで、ステップSL6では、自己演奏練習するユーザ自身のユーザデータuser中のフレーズスキルPhraseLvが、算出した演奏評価スコアiScoreより低いか否かを判断する。フレーズスキルPhraseLvが演奏評価スコアiScoreより高ければ、判断結果はNOになり、ステップSL7に進み、自己のユーザデータuser中のフレーズスキルPhraseLvをインクリメントしてレベルアップさせる。そして、ステップSL8に進み、フレーズ変更フラグiPLvCngを1にセットした後、図22に図示するステップSL11に進む。一方、フレーズスキルPhraseLvが演奏評価スコアiScoreより低いと、上記ステップSL6の判断結果はYESになり、ステップSL9に進み、自己のユーザデータuser中のフレーズスキルPhraseLvをデクリメントしてレベルダウンさせる。そして、ステップSL10に進み、フレーズ変更フラグiPLvCngを-1にセットした後、図22に図示するステップSL11に進む。ステップSL11では、正しく弾けた一音符当たりの平均押鍵時間差再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDifを判定許容時間で除した値を1から減算して適正押鍵タイミング率iScoreを算出する。次いで、ステップSL12では、自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のリズムスキルRhythmLvより高く、かつ上記ステップSL11で算出した適正押鍵タイミング率iScoreが0.5より小さいか否かを判断する。自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のリズムスキルRhythmLvより高く、かつ適正押鍵タイミング率iScoreが0.5より小さければ、判断結果はYESになり、ステップSL13に進み、自己のユーザデータuser中のリズムスキルRhythmLvをインクリメントしてレベルアップさせる。そして、ステップSL14に進み、リズム変更フラグiRLvCngを1にセットして本処理を終える。これに対し、自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrackiTr中のリズムスキルRhythmLvより低いか、あるいは適正押鍵タイミング率iScoreが0.5より大きいと、上記ステップSL12の判断結果がNOになり、ステップSL15に進み、自己のユーザデータuser中のリズムスキルRhythmLvをデクリメントしてレベルダウンさせる。そして、ステップSL16に進み、リズム変更フラグiRLvCngを-1にセットして本処理を終える。12メンバによる評価処理の動作次に、図23~図24を参照してメンバによる評価処理の動作を説明する。前述した演奏モード処理のステップSB9図11参照を介して本処理が実行されると、CPU11は図23に図示するステップSM1に進み、自己のユーザデータuser中のメンバMemberを指定するポインタをメンバ検索ポインタmemにセットする。次いで、ステップSM2では、メンバ検索ポインタmemで指定されるメンバMemberがNULLでないか否か、すなわち自己のユーザデータUserに登録された全てのメンバMemberについて検索し終えたかどうかを判断する。登録された全てのメンバMemberについて検索し終えていなければ、上記ステップSM2の判断結果はYESになり、ステップSM3に進む。ステップSM3では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが0より大きいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたか否かを判断する。ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップした場合には、上記ステップSM3の判断結果がYESになり、ステップSM4に進む。ステップSM4では、下記条件1,2の何れかを満足するか否かを判断する。条件1:メンバ検索ポインタmemで指定されるメンバデータMembers中のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか条件2:メンバ検索ポインタmemで指定されるメンバデータMembers中のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか上記の条件1,2の何れも満足しなければ、上記ステップSM4の判断結果はNOになり、ステップSM5に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをインクリメントしてレベルアップさせた後、後述のステップSM7に進む。一方、上記の条件1,2の何れかを満足すると、上記ステップSM4の判断結果がYESになり、ステップSM6に進む。ステップSM6では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastComment前回評価が褒める内容の成果コメントgCom[]であるか否かを判断する。演奏評価LastComment前回評価が褒める内容の成果コメントgCom[]であると、判断結果はYESになり、ステップSM5に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをインクリメントしてレベルアップさせた後、後述のステップSM7に進む。これに対し、演奏評価LastComment前回評価が褒める内容の成果コメントgCom[]でなければ、上記ステップSM6の判断結果がNOになり、ステップSM7に進む。ステップSM7では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastCommentを、今回の評価結果として褒める内容の成果コメントgCom[]に更新する。この後、図24に図示するステップSM12に進み、メンバ検索ポインタmemを歩進mem.nextさせた後、前述のステップSM2に処理を戻す。さて一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンした場合には、上述したステップSM3の判断結果がNOになり、図24に図示するステップSM8に進み、下記条件1,2の何れかを満足するか否かを判断する。条件1:メンバ検索ポインタmemで指定されるメンバデータMembers中のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか条件2:メンバ検索ポインタmemで指定されるメンバデータMembers中のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか上記の条件1,2の何れも満足しなければ、上記ステップSM8の判断結果はNOになり、ステップSM9に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをデクリメントしてレベルダウンさせた後、後述のステップSM11に進む。一方、上記の条件1,2の何れかを満足すると、上記ステップSM8の判断結果がYESになり、ステップSM10に進む。ステップSM10では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastComment前回評価が叱る内容の成果コメントbCom[]であるか否かを判断する。演奏評価LastComment前回評価が叱る内容の成果コメントbCom[]であると、判断結果はYESになり、ステップSM9に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをデクリメントしてレベルダウンさせた後、後述のステップSM11に進む。これに対し、演奏評価LastComment前回評価が叱る内容の成果コメントbCom[]でなければ、上記ステップSM10の判断結果がNOになり、ステップSM11に進む。ステップSM11では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastCommentを、今回の評価結果として叱る内容の成果コメントbCom[]に更新する。この後、ステップSM12に進み、メンバ検索ポインタmemを歩進mem.nextさせた後、前述のステップSM2に処理を戻す。そして、登録された全てのメンバMemberについて検索し終えると、このステップSM2の判断結果がNOになり、本処理を終える。13メンバ入替候補処理の動作次に、図25~図26を参照してメンバ入替候補処理の動作を説明する。前述した演奏モード処理のステップSB10図11参照を介して本処理が実行されると、CPU11は図25に図示するステップSN1に進み、自己演奏練習するユーザ自身のユーザデータuser中のメンバMemberを指定するポインタをメンバ検索ポインタmemにセットする。次いで、ステップSM2では、メンバ検索ポインタmemで指定されるメンバMemberがNULLでないか否か、すなわち自己のユーザデータUserに登録された全てのメンバMemberについて検索し終えたかどうかを判断する。登録された全てのメンバMemberについて検索し終えていなければ、上記ステップSN2の判断結果はYESになり、ステップSN3に進む。ステップSN3では、メンバ検索ポインタmemで指定されるメンバデータMembers中のメンバ忠誠度Loyaltyが閾値DRAWALより小さいか否かを判断する。メンバ忠誠度Loyaltyが閾値DRAWALより大きければ、判断結果はNOになり、後述のステップSN6に処理を進める。一方、メンバ忠誠度Loyaltyが閾値DRAWALより小さいと、上記ステップSN3の判断結果はYESになり、ステップSN4に進み、低い忠誠度メンバから脱退したいを表す値-1を、メンバ検索ポインタmemで指定されるメンバデータMembers中のメンバ忠誠度Loyaltyにストアする。続いて、ステップSN5では、メンバ忠誠度Loyaltyが-1となったメンバデータMembersを脱退希望リスト後述するに登録する。そして、ステップSN6に進むと、メンバ検索ポインタmemを歩進mem.nextさせた後、前述のステップSN2に処理を戻す。以後、自己のユーザデータuserに登録された全てのメンバMemberの中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバを探し出して脱退希望リストに登録する処理を進め、全てのメンバMemberについて検索し終えると、上記ステップSN2の判断結果がNOになり、ステップSN7に進み、メンバ識別ポインタidをゼロリセットする。次いで、図26に図示するステップSN8に進み、メンバ識別ポインタidがメンバデータベースMDB図4参照の末端まで達していなかどうかを判断する。末端まで達していなければ、判断結果はYESになり、ステップSN9に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]が、自己演奏練習するユーザ自身のユーザデータuser中のメンバMemberとして登録済みであるか否かを判断する。既にメンバ登録済みならば、判断結果はYESになり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。一方、メンバ識別ポインタidで指定されるメンバデータMembers[id]が、自己のユーザデータuser中のメンバMemberとして登録されていなければ、上記ステップSN9の判断結果はNOになり、ステップSN10に進む。ステップSN10では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフレーズスキルPhraseLvをレジスタPLvに、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のリズムスキルRhythmLvをレジスタRLvにそれぞれストアする。次いで、ステップSN11では、レジスタPLvに格納したメンバデータMembers[id]のフレーズスキルPhraseLvと自己のユーザデータuser中のフレーズスキルPhraseLvとの差分絶対値absPLv-user.PhraseLvと、レジスタRLvに格納したメンバデータMembers[id]のリズムスキルRhythmLvと自己のユーザデータuser中のフレーリズムスキルRhythmLvとの差分絶対値absRLv-user.RhythmLvとの加算値が、入替レベル差CNG_LVより大きいか否かを判断する。メンバの演奏技量とユーザの演奏技量の差が小さく、入替レベル差CNG_LVを超えなければ、メンバ入替の対象とならない為、判断結果はNOになり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、前述のステップSN8に処理を戻す。これに対し、メンバの演奏技量とユーザの演奏技量の差が大きく、入替レベル差CNG_LVを超えると、メンバ入替の対象となる為、上記ステップSN11の判断結果がYESになり、ステップSN12に進む。そして、ステップSN12では、下記条件1,2の何れかを満足するか否かを判断する。条件1:レジスタPLvに格納したメンバデータMembers[id]のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか条件2:レジスタRLvに格納したメンバデータMembers[id]のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか上記の条件1,2の何れかを満足する場合、すなわちユーザよりメンバのフレーズ演奏技量又はリズム演奏技量が優れている場合には、上記ステップSN12の判断結果がYESになり、ステップSN13に進む。ステップSN13では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが0より大きいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたか否かを判断する。ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしていれば、判断結果はNOになり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。これに対し、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップすると、上記ステップSN13の判断結果がYESになり、ステップSN14に進む。ステップSN14では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフラグiFlagに1をセットすると共に、メンバ識別ポインタidで指定されるメンバデータMembers[id]中の演奏評価LastCommentに、ユーザに対して上から目線で述べる参加コメントuCom[]をセットする。そして、ステップSN15に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]を参加希望リスト後述するに追加する。この後、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。さて一方、上記条件1,2の何れも満足しない場合、すなわちメンバよりユーザのフレーズ演奏技量又はリズム演奏技量が優れている場合には、上記ステップSN12の判断結果はNOになり、ステップSN16に進む。ステップSN16では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが0より小さいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたか否かを判断する。ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしていれば、判断結果はNOになり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。これに対し、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンすると、上記ステップSN16の判断結果がYESになり、ステップSN17に進む。ステップSN17では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフラグiFlagに-1をセットすると共に、メンバ識別ポインタidで指定されるメンバデータMembers[id]中の演奏評価LastCommentに、ユーザに対して下から目線で述べる参加コメントlCom[]をセットする。そして、ステップSN18に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]を参加希望リスト後述するに追加する。この後、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。以上説明したように、本実施の形態では、ユーザが弾きたい課題曲を選択し、ユーザと共演するメンバに課題曲の伴奏パートを割り当てると、曲進行に応じて各メンバの伴奏パートが再生されると同時に、曲進行に応じて読み出される課題曲の演奏パートの音符データと、その演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価するための評価値正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差絶対値lKeyOnABSDifを取得する演奏練習が行われる。そして、演奏パートを弾き終えて演奏練習が完了すると、課題曲の演奏パートの難易度に相当するフレーズスキルPhraseLvに、演奏練習したユーザの正答率player.iOKCount/player.iNoteCountを乗じて演奏評価スコアiScoreを算出し、算出した演奏評価スコアiScoreよりユーザのフレーズ演奏技量フレーズスキルPhraseLvが高ければ、ユーザのフレーズ演奏技量をレベルアップさせ、一方、演奏評価スコアiScoreよりユーザのフレーズ演奏技量が低ければ、ユーザのフレーズ演奏技量をレベルダウンさせる。また、正しく弾けた一音符当たりの平均押鍵時間差再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDifを判定許容時間で除した値を1から減算して適正押鍵タイミング率iScoreを算出し、この適正押鍵タイミング率iScoreが0.5より小さく、かつユーザのリズム演奏技量リズムスキルRhythmLvが演奏パートのリズムスキルRhythmLvより高ければ、ユーザのリズム演奏技量をレベルアップさせ、一方、適正押鍵タイミング率iScoreが0.5より大きいか、あるいはユーザのリズム演奏技量が演奏パートのリズムスキルRhythmLvより低いと、ユーザのリズム演奏技量をレベルダウンさせる。ユーザのフレーズ演奏技量フレーズスキルPhraseLv又はリズム演奏技量リズムスキルRhythmLvの何れかがレベルアップしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを上げ、ユーザよりもスキルの高いメンバから褒められる評価を与え、一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを下げ、ユーザよりもスキルの高いメンバから叱られる評価を与える。これにより、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。そして、ユーザのバンドに参加しているメンバユーザデータuserに登録されたメンバMemberの中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバがいると、そのメンバを脱退希望リストに登録する。脱退希望リストに登録されると、図27に図示する一例の演奏評価画面PEDの表示エリアDE1に、脱退希望メンバからの評価コメント例えばリズム感が悪いな。もう少し練習した方がいいんじゃないかが表示される。こうしてユーザに更なる練習の必要性を問うことによって、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。さらに、ユーザデータuserに未登録バンド不参加のメンバの内、メンバの演奏技量とユーザの演奏技量の差が入替レベル差CNG_LVを超えるメンバを入替候補として探し出し、この入替候補の中からフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたユーザよりも優れた演奏技量を持つメンバや、フレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたユーザよりも劣る演奏技量を持つメンバを参加希望リストに登録する。参加希望リストに登録されると、図27に図示する一例の演奏評価画面PEDの表示エリアDE2に、参加希望メンバからの評価コメント例えば一緒に練習しながらやりませんかが表示される。こうしてユーザを練習に誘う為、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。以上、本発明の実施の一形態について説明したが、本発明はそれに限定されるものではなく、本願出願の特許請求の範囲に記載された発明とその均等の範囲に含まれる。以下では、本願出願当初の特許請求の範囲に記載された各発明について付記する。付記[請求項1]演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段と、を具備することを特徴とする演奏練習装置。[請求項2]前記メンバ評価手段は、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量と、前記演奏技量記憶手段に記憶される各メンバの演奏技量とを比較し、更新によりユーザの演奏技量がレベルアップした場合にはユーザよりも演奏技量の高いメンバから褒められる評価を与え、一方、更新によりユーザの演奏技量がレベルダウンした場合にはユーザよりも演奏技量の高いメンバから叱られる評価を与えることを特徴とする請求項1記載の演奏練習装置。[請求項3]前記演奏評価値取得手段は、少なくとも正答率、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値を、評価値として取得することを特徴とする請求項1記載の演奏練習装置。[請求項4]前記ユーザ演奏技量更新手段は、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度に、前記演奏評価値取得手段により取得された正答率を乗じて演奏得点を算出し、算出した演奏得点よりもユーザの演奏技量が高ければ、当該ユーザの演奏技量をレベルアップさせ、一方、算出した演奏得点よりもユーザの演奏技量が低ければ、当該ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。[請求項5]前記ユーザ演奏技量更新手段は、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値に基づき適正押鍵タイミング率を算出し、この適正押鍵タイミング率が所定値より小さく、かつユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より高ければ、ユーザの演奏技量をレベルアップさせ、一方、適正押鍵タイミング率が所定値より大きいか、あるいはユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より低ければ、ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。[請求項6]前記演奏技量記憶手段は、ユーザに対する各メンバの忠誠度を記憶し、前記メンバ評価手段は、更新によりユーザの演奏技量がレベルアップした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を上げ、一方、更新によりユーザの演奏技量がレベルダウンした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を下げる忠誠度更新手段を備えることを特徴とする請求項1記載の演奏練習装置。[請求項7]前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、所定値より小さい忠誠度のメンバを、ユーザとの共演から脱退を希望する脱退希望メンバとして検出する脱退希望メンバ検出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。[請求項8]前記演奏技量記憶手段にユーザと共演する各メンバの他に、ユーザと共演しない他のメンバの演奏技量を記憶しておき、これら他のメンバの内、ユーザの演奏技量とのレベル差が所定以上のメンバを入替候補メンバとして抽出する入替候補メンバ抽出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。[請求項9]演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段とを備えた装置のコンピュータで実行されるプログラムであって、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏ステップと、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得ステップと、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得ステップにより取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新ステップと、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段ステップとを実行させることを特徴とするプログラム。"