説明

演奏練習装置およびプログラム

【課題】仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲を向上させる演奏練習装置を実現する。
【解決手段】CPU11は、課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの評価値を取得する。課題曲の演奏パートの難易度と演評価値とで得られる演奏得点に応じてユーザの演奏技量を更新する。更新されたユーザの演奏技量と各メンバ(伴奏パートを擬人化した呼称)の演奏技量とを比較し、更新によりユーザの演奏技量がレベルアップした場合にはユーザよりも演奏技量の高いメンバから「褒められる」評価を与え、一方、更新によりユーザの演奏技量がレベルダウンした場合にはユーザよりも演奏技量の高いメンバから「叱られる」評価を与える。これにより、あたかもバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、電子楽器などに用いて好適な演奏練習装置およびプログラムに関する。
【背景技術】
【0002】
曲進行に同期して読み出される練習曲の曲データと、その練習曲の演奏操作に応じて発生する演奏データとを比較し、曲データと演奏データとが相違する演奏ミスを検出した場合に演奏練習態様を変化させる演奏練習装置が知られている。この種の装置として、例えば特許文献1には曲データと演奏データとを比較して演奏操作の誤りを検出した場合に、間違った箇所の演奏操作を繰り返し練習させる技術が開示され、また特許文献2には、練習する曲の自然な流れに対応したフレーズ中、最も間違った演奏をしたフレーズの先頭から演奏練習させる技術が開示されている。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開平7−219535号公報
【特許文献2】特開2004−205906号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
ところで、上記特許文献1,2に開示の技術は、間違えた箇所の演奏を繰り返したり、間違えたフレーズを先頭からやり直したりする独習に終始する為、単調で面白味に欠け、練習意欲の低下を招致する。言い換えれば、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来ない、という問題がある。
【0005】
本発明は、このような事情に鑑みてなされたもので、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることができる演奏練習装置およびプログラムを提供することを目的としている。
【課題を解決するための手段】
【0006】
上記目的を達成するため、本発明による演奏練習装置は、演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段とを具備することを特徴とする。
【発明の効果】
【0007】
本発明では、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。
【図面の簡単な説明】
【0008】
【図1】実施の一形態による演奏練習装置100の全体構成を示すブロック図である。
【図2】RAM13のメモリ構成を示すメモリマップである。
【図3】ユーザデータベースUDBのデータ構成を示す図である。
【図4】メンバデータベースMDBのデータ構成を示す図である。
【図5】曲データエリアSDEのデータ構成を示す図である。
【図6】トラックデータエリアPDEのデータ構成を示す図である。
【図7】音符データエリアMDEのデータ構成を示す図である。
【図8】再生制御データエリアRCDのデータ構成を示す図である。
【図9】発音中バッファNOBのデータ構成を示す図である。
【図10】メインルーチンの動作を示すフローチャートである。
【図11】演奏モード処理の動作を示すフローチャートである。
【図12】伴奏パート選択処理の動作を示すフローチャートである。
【図13】再生処理スレッドの動作を示すフローチャートである。
【図14】Tick時刻計算処理の動作を示すフローチャートである。
【図15】発音処理の動作を示すフローチャートである。
【図16】発音処理の動作を示すフローチャートである。
【図17】消音処理の動作を示すフローチャートである。
【図18】MIDI入力スレッドの動作を示すフローチャートである。
【図19】発音中バッファ検索処理の動作を示すフローチャートである。
【図20】パートデータ検索処理の動作を示すフローチャートである。
【図21】評価結果計算処理の動作を示すフローチャートである。
【図22】評価結果計算処理の動作を示すフローチャートである。
【図23】メンバによる評価処理の動作を示すフローチャートである。
【図24】メンバによる評価処理の動作を示すフローチャートである。
【図25】メンバ入替候補処理の動作を示すフローチャートである。
【図26】メンバ入替候補処理の動作を示すフローチャートである。
【図27】演奏評価画面PEDの一例を示す図である。
【発明を実施するための形態】
【0009】
以下、図面を参照して本発明の実施形態について説明する。
A.全体構成
図1は、本発明の実施の一形態による演奏練習装置100の全体構成を示すブロック図である。この図において、操作部10は、装置動作を終了させる終了スイッチ、演奏モード処理(後述する)の実行を指示する演奏スイッチおよび訓練モード処理(後述する)の実行を指示する訓練スイッチなどを備え、これらスイッチの各操作に応じた操作イベントを発生してCPU11に供給する。CPU11は、ROM12に格納される各種プログラムを実行して装置各部を制御する。本発明の要旨に係わるCPU11の特徴的名処理動作については追って述べる。
【0010】
ROM12は、CPU11にロードされる各種制御プログラムを記憶する。各種制御プログラムとは、後述するメインルーチンおよび当該メインルーチンからコールされる演奏モード処理を含む。演奏モード処理は、伴奏パート選択処理、再生処理スレッド、MIDI入力スレッド、評価結果計算処理、メンバによる評価処理およびメンバ入替候補処理から構成される。なお、再生処理スレッドはTick時刻計算処理、発音処理および消音処理を含む。MIDI入力処理スレッドは、発音中バッファ検索処理およびパートデータ検索処理を含む。
【0011】
RAM13は、図2に図示するように、CPU11の処理に用いられる各種レジスタ・フラグデータを一時記憶するワークエリアWEの他、ユーザデータベースUDB、メンバデータベースMDB、曲データエリアSDE、トラックデータエリアPDE、音符データエリアMDE、再生制御データRCDおよび発音中バッファNOBを備える。ワークエリアWEを除く上記各エリアに格納される主要なデータ構成については追って述べる。
【0012】
表示部14は、CPU11の制御の下に、例えば演奏練習する曲データを楽譜表示したり、図27〜図28に図示する一例の演奏評価画面PDE1、PED2を画面表示する。MIDIインタフェース部15は、課題となる曲を演奏練習するユーザの演奏操作に応じて、外部のMIDI楽器から出力される演奏データ(MIDIイベント)を、CPU11の制御の下に取り込む。音源16は、公知の波形メモリ読み出し方式で構成され、CPU11の制御の下に、MIDIインタフェース部15を介して取り込まれた演奏データ(MIDIイベント)に応じた楽音データを発生する。サウンドシステム17は、音源16が生成した楽音データをアナログ形式の楽音信号に変換すると共に、その楽音信号に対してノイズ除去やレベル制御を施した後、スピーカから楽音として発音させる。
【0013】
B.RAM13のデータ構成
次に、図3〜図9を参照してRAM13のユーザデータベースUDB、メンバデータベースMDB、曲データエリアSDE、トラックデータエリアPDE、音符データエリアMDE、再生制御データplayerおよび発音中バッファエリアOBEにそれぞれ格納される各種データの構成について説明する。
【0014】
(1)ユーザデータベースUDBの構成
図3は、RAM13のユーザデータベースUDBの構成を示す図である。ユーザデータベースUDBは、本装置100を使用する各ユーザの属性を表すユーザデータuser[0]〜user[N]から構成される。1つのユーザデータuser[ ]は、識別データID、ユーザ名Name、フレーズ演奏技量(熟練度)を表すフレーズスキルPhraseLv、リズム演奏技量(熟練度)を表すリズムスキルRhythmLv、練習回数PracticeCnt、練習ポイントPracticePt、メンバMember(後述する)、前ユーザデータを指定するポインタprevおよび次ユーザデータを指定するポインタnextから構成される。
【0015】
メンバMemberとは、伴奏パートを擬人化した呼称であり、ユーザが演奏パートを演奏練習する際に、あたかもバンドで共演するかのように複数のメンバ(伴奏パート)が登録される。1つのメンバMembers[ ]は、メンバ忠誠度Loyaltyおよびメンバ状態Statusを備える。メンバ忠誠度Loyaltyは、「−」の場合に低い忠誠度(メンバから脱退したい)を表し、「0」の場合に中立の忠誠度を表し、「+」の場合に高い忠誠度(メンバを続けたい)を表す。メンバ状態Statusは、「−1」の場合にメンバからの脱退希望の状態を表し、「0」の場合に特に無しの状態を表し、「1」の場合にメンバ参加に前向きの状態を表す。
【0016】
(2)メンバデータベースMDBの構成
図4は、メンバデータベースMDBの構成を示す図である。メンバデータベースMDBは、擬人化した伴奏パートの属性を表すメンバデータMembers[0]〜Members[N]から構成される。1つのメンバデータMembers[ ]は、識別データID、メンバ名Name、楽器番号InstrID、パートデータ配列番号iTrackID、フレーズスキルPhraseLv、リズムスキルRhythmLv、フラグiFlag、演奏評価LastCommentおよび性格Characterを備える。
【0017】
(3)曲データエリアSDEの構成
図5は、曲データエリアSDEの構成を示す図である。曲データエリアSDEは、演奏練習の課題となる曲の内容を表す曲データSongs[0]〜Songs[N]から構成される。1つの曲データSongs[ ]は、識別データID、曲名Name、フレーズスキルPhraseLv、リズムスキルRhythmLv、演奏パートトラックポインタPlayTrack、伴奏パートトラックポインタAccompTrack、マスタートラックポインタMasterTrack、次の曲データを指定するポインタprevおよび次の曲データを指定するポインタnextから構成される。
【0018】
(4)トラックデータエリアPDEの構成
図6は、トラックデータエリアPDEの構成を示す図である。トラックデータエリアPDEは、曲データSongs中の演奏パートトラックポインタPlayTrackおよび伴奏パートトラックポインタAccompTrackで指定されるパートトラックと、曲データSongs中のマスタートラックポインタMasterTrackで指定されるマスタートラックとから構成される。
【0019】
パートトラックは、パートトラックデータTrack[0]〜Track[N]から構成される。1つのパートトラックデータTrack[ ]は、配列番号TrackID、トラック種類iTrackType(1:演奏パート、2:伴奏パート)、トラック選択状況iPlayType(0:選択なし、1:演奏パート、2:伴奏パート)、トラック先頭の音符データを指定する音符ポインタpFirstMe、楽器番号InstrID、フレーズスキルPhraseLvおよびリズムスキルRhythmLvから構成される。
【0020】
マスタートラックは、テンポデータTempo[0]〜Tempo[N]から構成される。1つのテンポデータTempo[ ]は、テンポ変更Tick時間lTime、テンポ値iTempo、前のテンポデータを指定するポインタprevおよび次のテンポデータを指定するポインタnextから構成される。
【0021】
(5)音符データエリアMDEの構成
図7は、音符データエリアMDEの構成を示す図である。音符データエリアMDEは、音符データMidiEvent[0]〜MidiEvent[N]から構成される。1つの音符データMidiEvent[ ]は、発音開始ティックlTime、ゲートタイムlGate、ピッチPitch、ベロシティVel、前音符データを指定するポインタprevおよび次音符データを指定するポインタnextから構成される。
【0022】
(6)再生制御データplayerの構成
図8は、再生制御データplayerの構成を示す図である。再生制御データplayerは、現在Tick時刻lNowTick、各トラックの次の音符データMidiEvents[ ]、テンポ値iNoeTempo、最後にTick時刻を更新したシステム時刻lTickUpdate、再生中断用フラグinterruption、再生中に発音した伴奏パートの音符数iNoteCount、再生中に正しく弾けた音符数iOKCount、再生中に正しく弾けた音符における押鍵時間差lKeyOnDif、再生中に正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDif、発音中バッファエリアOBEの音符データmePlaying[ ]および状態フラグiStatus(0:再生停止、1:再生中)から構成される。
【0023】
(7)発音中バッファエリアOBEの構成
図9は、発音中バッファエリアOBEの構成を示す図である。発音中バッファエリアOBEには、発音中の音符データmePlaying[0]〜mePlaying[N]が格納される。1つの音符データmePlaying[ ]は、音符データエリアMDE中で該当する音符データMidiEventを指定する音符ポインタpMeおよび押鍵フラグiStatus(0:押鍵なし、1:押鍵有り)から構成される。
【0024】
B.動作
次に、図10〜図28を参照して上記構成による演奏練習装置100の動作について説明する。以下では、演奏練習装置100のCPU11が実行するメインルーチンおよび当該メインルーチンからコールされる演奏モード処理の各動作を説明する。なお、演奏モード処理は、伴奏パート選択処理、再生処理スレッド、MIDI入力処理スレッド、評価結果計算処理、メンバによる評価処理およびメンバ入替候補処理から構成される。また、再生処理スレッドはTick時刻計算処理、発音処理および消音処理を含み、MIDI入力処理スレッドは発音中バッファ検索処理およびパートデータ検索処理を含む。
【0025】
(1)メインルーチンの動作
上記構成による演奏練習装置100がパワーオンされると、CPU11は図10に図示するメインルーチンを実行してステップSA1に進み、RAM13のワークエリアWEに格納される各種レジスタやフラグデータをゼロリセットしたり初期値セットしたりするイニシャライズを行う。イニシャライズが完了すると、ステップSA2に進み、RAM13のユーザデータベースUDBに登録されるユーザデータuser[0]〜user[N]の内、演奏練習するユーザ自身のユーザデータuser[ ]を選択する。
【0026】
続いて、ステップSA3〜SA4では、操作部10に配設される終了スイッチ、演奏スイッチおよび訓練スイッチの操作の有無を判別する。ユーザが終了スイッチをオン操作した場合には、ステップSA3の判断結果が「YES」になり、本処理を終える。ユーザが演奏スイッチをオン操作した場合には、ステップSA4の判断結果が「YES」になり、ステップSA6に進み、脱退希望メンバの存在の有無を判断する。メンバとは、伴奏パートを擬人化した呼称である。メンバの脱退希望とは、演奏練習の評価結果で得られるユーザの演奏技量(フレーズスキルPhraseLv、リズムスキルRhythmLv)がメンバより低い状態が継続し、メンバから「がっかり」される評価を一定量以上与えられた場合に、ユーザに対して更なる演奏練習の必要性を促す為にメンバがバンドからの脱退を言い渡すものである。
【0027】
そして、脱退希望メンバが存在すると、上記ステップSA6の判断結果が「YES」になり、ステップSA7に進み、ユーザの演奏技量を向上させる訓練モード処理を実行した後、上述のステップSA3に処理を戻す。一方、脱退希望メンバが存在しない場合には、上記ステップSA6の判断結果は「NO」になり、ステップSA8を介して演奏モード処理(後述する)を実行した後、上述のステップSA3に処理を戻す。
【0028】
(2)演奏モード処理の動作
次に、図11を参照して演奏モード処理の動作を説明する。上述したメインルーチンのステップSA8(図10参照)を介して本処理が実行されると、CPU11は図11に図示するステップSB1に進み、RAM13の曲データエリアSDEに記憶される曲データSongs[0]〜Songs[N]の中からユーザが指定するレベルの演奏技量(フレーズスキルPhraseLv、リズムスキルRhythmLv)を備える曲データSongs[ ]を選択する。
【0029】
次いで、ステップSB2では、選択した曲データSongs[ ]の内容、すなわち図5に図示する識別データID、曲名Name、フレーズスキルPhraseLv、リズムスキルRhythmLv、演奏パートトラックポインタPlayTrack、伴奏パートトラックポインタAccompTrack、マスタートラックポインタMasterTrack、次の曲データを指定するポインタprevおよび次の曲データを指定するポインタnextを読み込みRAM13のワークエリアWEに一時記憶する。
【0030】
続いて、ステップSB3に進むと、ユーザに登録された全てのメンバに伴奏パートをアサインする伴奏パート選択処理を実行する。この後、ステップSB4に進み、再生処理スレッドを起動させる。再生処理スレッドでは、後述するように、課題曲の演奏パートおよび伴奏パートの進行を管理すると共に、伴奏パートトラックの各音を再生する。
【0031】
次いで、ステップSB5では、MIDI入力処理スレッドを起動させる。MIDI入力処理スレッドでは、後述するように、演奏練習するユーザの演奏操作に従って外部MIDI楽器が出力する演奏情報(ノートオンメッセージ)を受信し、当該演奏情報に応じた楽音を発音させる一方、受信した演奏情報(ノートオンメッセージ)が演奏パートの音符データと一致するかどうかを発音中バッファおよびパートトラックの双方から検索し、その検索結果に基づきユーザの演奏を評価するための評価値(正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDif)を算出する。
【0032】
続いて、ステップSB6では、課題終端(曲の終わり)まで演奏したか否かを判断する。課題終端に達していなければ、判断結果は「NO」になり、ステップSB7に進み、ユーザによる中断指示の有無を判断する。中断指示が無ければ、判断結果は「NO」になり、上記ステップSB6に処理を戻す。以後、課題終端に達するか、あるいは中断指示が発生するまでステップSB6〜SB7を繰り返す。そして、課題終端に達するか、あるいは中断指示が発生すると、上記ステップSB6、SB7の何れかの判断結果が「YES」になり、ステップSB8に進む。
【0033】
ステップSB8では、評価結果計算処理を実行する。評価結果計算処理では、後述するように、課題曲の演奏パートの難易度に相当するフレーズスキルPhraseLvに、演奏練習したユーザの正答率(player.iOKCount/player.iNoteCount)を乗じて算出した演奏評価スコアiScoreよりユーザのフレーズスキルPhraseLvが高ければ、ユーザのフレーズスキルPhraseLvをレベルアップ(+1)させ、一方、演奏評価スコアiScoreよりユーザのフレーズスキルPhraseLvが低いと、ユーザのフレーズスキルPhraseLvをレベルダウン(−1)させる。
【0034】
また、正しく弾けた一音符当たりの平均押鍵時間差(再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDif)を判定許容時間で除した値を「1」から減算して適正押鍵タイミング率iScoreを算出し、この適正押鍵タイミング率iScoreが「0.5」より小さく、かつユーザのリズムスキルRhythmLvが演奏パートのリズムスキルRhythmLvより高ければ、ユーザのリズムスキルRhythmLvをレベルアップ(+1)させ、一方、適正押鍵タイミング率iScoreが「0.5」より大きいか、あるいはユーザのリズムスキルRhythmLvが演奏パートのリズムスキルRhythmLvより低いと、ユーザのリズムスキルRhythmLvをレベルダウン(−1)させる。
【0035】
次いで、ステップSB9では、上記ステップSB8の評価結果計算処理によってユーザのフレーズ演奏技量(フレーズスキルPhraseLv)又はリズム演奏技量(リズムスキルRhythmLv)の何れかがレベルアップしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを上げ、ユーザよりもスキルの高いメンバから「褒められる」評価を与え、一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを下げ、ユーザよりもスキルの高いメンバから「叱られる」評価を与えるメンバによる評価処理を実行する。
【0036】
続いて、ステップSB10では、メンバ入替候補処理を実行する。メンバ入替候補処理では、後述するように、ユーザのバンドに参加しているメンバ(ユーザデータuserに登録されたメンバMember)の中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバを探し出して脱退希望リストに登録する一方、ユーザデータuserに未登録(バンド不参加)のメンバの内、メンバの演奏技量とユーザの演奏技量の差が入替レベル差CNG_LVを超えるメンバを入替候補として探し出し、この入替候補の中からフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたユーザよりも優れた演奏技量を持つメンバや、フレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたユーザよりも劣る演奏技量を持つメンバを参加希望リストに登録する。
【0037】
そして、ステップSB11に進むと、上記ステップSB10において脱退希望リストあるいは参加希望リストに登録されたメンバが生じた場合に、メンバの脱退あるいは新規参加させるメンバ変更指示する操作イベントの有無を判断する。メンバ変更指示する操作イベントが発生しなければ、判断結果は「NO」となり、本処理を終えるが、メンバ変更指示する操作イベントが発生すると、ステップSB12に進み、ユーザデータuserに登録されたメンバMemberの脱退や新たなメンバMemberを登録するプロファイル更新を行った後、本処理を終える。
【0038】
(3)伴奏パート選択処理の動作
次に、図12を参照して伴奏パート選択処理の動作を説明する。上述した演奏モード処理のステップSB3を介して本処理が実行されると、CPU11は図12に図示するステップSC1に進み、ユーザ自身のユーザデータuser中のメンバデータMembers(図3参照)を指定するポインタuser.Membersを、メンバ検索ポインタmemにセットする。続いて、ステップSC2では、メンバ検索ポインタmemが「NULL」、つまりユーザに登録されたメンバの全てを検索し終えたか否かを判断する。
【0039】
ユーザに登録されたメンバの全てを検索し終えていなければ、判断結果は「NO」になり、ステップSC3に進む。ステップSC3では、メンバ検索ポインタmemで指定されるメンバデータMembers中のパートデータ配列番号iTrackIDで表されるパートトラックデータTrack[mem.iTrackID]をポインタtrにセットする。そして、ステップSC4では、このポインタtrで指定されるパートトラックデータTrack中のトラック選択状況iPlayType(tr.iPlayType)に伴奏パートを示す「2」をストアする。
【0040】
次いで、ステップSC5に進むと、次のメンバを検索すべくメンバ検索ポインタmemを更新(mem.next)した後、上述のステップSC2に処理を戻す。以後、ユーザに登録されたメンバの全てを検索し終える迄、上記ステップSC2〜SC5を繰り返すことによって、ユーザに登録された全てのメンバのに伴奏パートをアサインする。そして、更新されたメンバ検索ポインタmem.nextで指定されるデータが「NULL」となり、ユーザに登録されたメンバの全てを検索し終えると、上記ステップSC2の判断結果が「YES」となり、本処理を終える。
【0041】
(4)再生処理スレッドの動作
次に、図13を参照して再生処理スレッドの動作を説明する。前述した演奏モード処理のステップSB4(図11参照)を介して本処理が起動されると、CPU11は図13に図示するステップSD1に進み、再生用変数を初期化し、続くステップSD2では、再生開始Tick時刻を、再生制御データplayer中の現在Tick時刻lNowTick(図8参照)にストアする。次いで、ステップSD3では、トラック検索ポインタiTrに初期値「0」をセットする。
【0042】
そして、ステップSD4に進むと、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。トラック検索中ならば、判断結果は「YES」になり、ステップSD5に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中の音符ポインタpFirstMe(Track[iTr].pFirstMe)、つまりトラック検索ポインタiTrで指定されるパートトラック先頭の音符データを指定するポインタをポインタmeにストアする。
【0043】
続いて、ステップSD6では、ポインタmeで指定される音符データMidiEvent中の発音開始ティックlTime(me.lTime)が、再生制御データplayer中の現在Tick時刻lNowTick(player.lNowTick)より小さいか否か、つまりポインタmeで指定される音符データMidiEventが未発音であるかどうかを判断する。
【0044】
ポインタmeで指定される音符データMidiEventが発音タイミングを過ぎて発音済みならば、上記ステップSD6の判断結果は「NO」になり、ステップSD7に進み、次の音符データMidiEventを指定させるべくポインタmeを更新(me.next)させた後、上記ステップSD6に処理を戻す。
【0045】
そして、ポインタmeで指定される音符データMidiEventが発音タイミングに達しておらず未発音であると、上記ステップSD6の判断結果が「YES」になり、ステップSD8に進む。ステップSD8では、ポインタmeを、再生制御データplayer中の、トラック検索ポインタiTrで指定されるトラックの次の音符データMidiEvents[iTr]としてストアする。
【0046】
この後、ステップSD9に進み、次のパートトラックについて検索する為、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSD4に処理を戻す。以後、歩進されたトラック検索ポインタiTrが最大トラック数MAX_TRACKを超える迄、上述のステップSD5〜SD6の処理を繰り返すことによって、各パートトラックにおける次の音符データMidiEventを指定するポインタmeが再生制御データplayer.MidiEvents[iTr]としてセットされる。
【0047】
そして、トラック検索ポインタiTrが最大トラック数MAX_TRACKを超えてトラック検索が完了すると、上記ステップSD4の判断結果が「NO」になり、ステップSD10に進む。ステップSD10では、再生制御データplayer中の現在Tick時刻lNowTick(player.lNowTick)が、曲データ末尾以前であるか否かを判断する。曲データ末尾を超えて演奏練習の終了になると、判断結果は「NO」になり、ステップSD15に進み、オールノートオフを音源16に指示して発音中の全ての楽音を消音させて本処理を終える。
【0048】
一方、再生制御データplayer中の現在Tick時刻lNowTick(player.lNowTick)が、曲データ末尾以前の場合、すなわち演奏練習中であると、上記ステップSD10の判断結果は「YES」になり、ステップSD11に進む。ステップSD11では、曲の進行を管理するTick時刻を生成するTick時刻計算処理(後述する)を実行する。続いて、ステップSD12では、発音タイミングとなった伴奏パートトラックの各音を発音させながら、発音した伴奏パートの音符数iNoteCountを計数する発音処理(後述する)を実行する。次いで、ステップSD13では、消音タイミングとなった伴奏パートトラックの各音を消音させる消音処理(後述する)を実行する。
【0049】
そして、ステップSD14に進むと、再生制御データplayer中の再生中断用フラグinterruption(図8参照)が「FALSE」であるか否か、すなわちユーザにより再生中断操作が為されていないかどうかを判断する。再生中断操作が為されていない場合には、判断結果が「YES」になり、上述のステップSD10に処理を戻すが、再生中断操作が為された場合には、判断結果が「NO」になり、ステップSD15に進み、音源16にオールノートオフを指示して本処理を終える。
【0050】
(5)Tick時刻計算処理の動作
次に、図14を参照してTick時刻計算処理の動作を説明する。上述した再生処理スレッドのステップSD11(図13参照)を介して本処理が実行されると、CPU11は図14に図示するステップSE1に進み、再生制御データplayerにおける発音中の音符データmePlaying[ ]にて指定される発音中バッファの押鍵フラグiStatusが「1」、つまり発音すべき音が押鍵されているかどうかを判断する。押鍵されていなければ、判断結果は「NO」になり、本処理を終えるが、押鍵されていると、判断結果は「YES」になり、ステップSE2に進む。
【0051】
ステップSE2では、CPU11が計時するシステム時刻から再生制御データplayer中のシステム時刻iTickUpdate(player.lTickUpdate:最後にTick時刻を更新したシステム時刻)を差し引いた時刻差lSysGateを算出する。続いて、ステップSE3では、次式(1)に基づき上記ステップSE2で算出した時刻差lSysGateを、テンポ値Tempoに応じたTick値(lTickTmp)に変換する。
lTickTmp=(60000/Tempo/Resolution/lSysGate)…(1)
なお、上記(1)式において、Resolutionは分解能を表す。
【0052】
次いで、ステップSE4では、上記ステップSE3において算出されたlTickTmpが「0」より大きいか否かを判断する。算出されたlTickTmpが「0」より小さければ、判断結果は「NO」になり、本処理を終えるが、「0」より大きいと、判断結果は「YES」になり、ステップSE5に進み、再生制御データplayer中のシステム時刻iTickUpdate(player.lTickUpdate)をシステム時刻に更新する。そして、ステップSE6に進み、再生制御データplayer中の現在Tick時刻lNowTickに、上記ステップSE3で算出したlTickTmpを加算し、当該現在Tick時刻lNowTickを更新して本処理を終える。これにより、演奏開始時点からの経過時間を表す現在Tick時刻lNowTickが生成される。
【0053】
(6)発音処理の動作
次に、図15〜図16を参照して発音処理の動作を説明する。前述した再生処理スレッドのステップSD12(図13参照)を介して本処理が実行されると、CPU11は図15に図示するステップSF1に進み、トラック検索ポインタiTrをゼロリセットし、続くステップSF2では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果が「NO」となり、本処理を終えるが、トラック検索中であれば、判断結果は「YES」になり、ステップSF3に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「2」、つまり選択された曲の伴奏パートであるかどうかを判断する。
【0054】
トラック検索ポインタiTrで指定されるパートが選択された曲の伴奏パートでなければ、判断結果は「NO」となり、ステップSF4に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSF2に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「2」、つまり選択された曲の伴奏パートであると、上記ステップSF3の判断結果は「YES」になり、ステップSF5に進む。
【0055】
ステップSF5では、再生制御データplayer中の音符データMidiEvents[iTr]をポインタmeにセットする。このポインタmeは、トラック検索ポインタiTrで指定されるパートトラックにおける次の音符データを指し示す。この後、図16に図示するステップSF6に進み、ポインタmeで指定される音符データMidiEvent中の発音開始ティックlTimeが、再生制御データplayer中の現在Tick時刻lNowTickより小さいか否か、つまり発音タイミング前であるかどうかを判断する。発音タイミング後であれば、上記ステップSF6の判断結果は「NO」になり、前述のステップSF4(図15参照)に処理を戻してトラック検索ポインタiTrを歩進させ、次のトラック検索を進める。
【0056】
一方、発音タイミング前ならば、上記ステップSF6の判断結果は「YES」になり、ステップSF7に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSF8では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlaying[ ]の配列数(発音数)より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果は「NO」になり、後述のステップSF12に進むが、バッファ検索ポインタiの値が発音数より小さければ、判断結果は「YES」になり、ステップSF9に進む。
【0057】
ステップSF9では、再生制御データplayer中の音符データmePlaying[i]をポインタmep1にストアする。次いで、ステップSF10では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlaying[mep1]の音符ポインタpMeが「NULL」であるか否か、つまり音符ポインタpMeで指定される音符の音が消音されているかどうかを判断する。音符ポインタpMeで指定される音符の音が消音されていると、判断結果は「YES」になり、ステップSF11に進み、ポインタiをインクリメントして歩進させた後、上述のステップSF8に処理を戻す。
【0058】
これに対し、音符ポインタpMeで指定される音符の音が消音されていなければ、上記ステップSF10の判断結果は「NO」になり、ステップSF12に進み、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlaying[mep1]の押鍵フラグiStatusを「1」(押鍵有り)にセットする。次いで、ステップSF13では、ポインタmeで指定される音符データMidiEvent中のベロシティVelを、レジスタmep1.iVelosityにストアする。
【0059】
そして、ステップSF14に進むと、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「2」、つまり伴奏パートであるかどうかを判断する。伴奏パートでなければ、判断結果は「NO」になり、ステップSF17に進み、ポインタmeを、次音符を指定するポインタme.nextに更新させた後、前述のステップSF6に処理を戻す。
【0060】
一方、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]が伴奏パートであると、上記ステップSF14の判断結果が「YES」となり、ステップSF15に進み、ポインタmep1で指定される音符データMidiEventの発音を音源16に指示する。これにより、伴奏パートが再生される。そして、ステップSF16に進むと、再生制御データplayerに含まれ、再生中に発音した伴奏パートの音符数iNoteCountをインクリメントして歩進させる。この後、ステップSF17に進み、ポインタmeを、次音符を指定するポインタme.nextに更新させた後、前述のステップSF6に処理を戻す。
【0061】
(7)消音処理の動作
次に、図17を参照して消音処理の動作を説明する。前述した再生処理スレッドのステップSD13(図13参照)を介して本処理が実行されると、CPU11は図17に図示するステップSG1に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSG2では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlaying[ ]の配列数(発音数)より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果は「NO」になり、本処理を終えるが、バッファ検索ポインタiの値が発音数より小さければ、判断結果は「YES」になり、ステップSG3に進む。
【0062】
ステップSG3では、再生制御データplayer中の音符データmePlaying[i]をポインタmep1にストアし、続くステップSG4では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlaying[mep1]の音符ポインタpMeが「NULL」であるか否か、つまり音符ポインタpMeで指定される音符が消音されているかどうかを判断する。音符ポインタpMeで指定される音符が消音されていると、判断結果は「YES」になり、ステップSG5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSG2に処理を戻す。
【0063】
一方、音符ポインタpMeで指定される音符が消音されていなければ、上記ステップSG4の判断結果は「NO」になり、ステップSG6に進む。ステップSG6では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlaying[mep1]における音符ポインタpMeを介して指定される音符データMidiEventの発音開始ティックlTimeとゲートタイムlGateとを加算した時刻が、再生制御データplayer中の現在Tick時刻lNowTickを過ぎているか否か、つまり消音タイミングに達したかどうかを判断する。消音タイミングに達していなければ、判断結果は「NO」になり、ステップSG5に進み、ポインタiをインクリメントして歩進させた後、前述のステップSG2に処理を戻す。
【0064】
これに対し、発音開始ティックlTimeとゲートタイムlGateとを加算した時刻が現在Tick時刻lNowTickを過ぎ、消音タイミングに達していると、上記ステップSG6の判断結果が「YES」となり、ステップSG7に進み、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlaying[mep1]における音符ポインタpMeを介して指定される音符データMidiEventの消音を音源16に指示し、続くステップSG8では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlaying[mep1]の音符ポインタpMeを「NULL」にして消音を表した後、ステップSG5に進み、ポインタiをインクリメントして歩進させた後、前述のステップSG2に処理を戻す。
【0065】
(8)MIDI入力処理スレッドの動作
次に、図18を参照してMIDI入力処理スレッドの動作を説明する。前述した演奏モード処理のステップSB5(図11参照)を介して本処理が実行されると、CPU11は図18に図示するステップSH1に進み、外部MIDI楽器からノートオンメッセージを受信したか否かを判断する。ノートオンメッセージを受信しない場合には、判断結果が「NO」になり、後述のステップSH7に処理を進めるが、演奏練習するユーザの演奏操作に応じて外部MIDI楽器からノートオンメッセージを受信した場合には、判断結果が「YES」となり、ステップSH2に進む。
【0066】
ステップSH2では、受信したノートオンメッセージから音高pitchおよびベロシティvelを取得する。次いで、ステップSH3では、取得した音高pitchおよびベロシティvelをレジスタmePlayにストアする。そして、ステップSH4では、受信した演奏情報(ノートオンメッセージ)が演奏パートの音符データと一致するかどうかを発音中バッファから検索し、その検索結果に基づきユーザの演奏を評価するための評価値(正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDif)を算出する発音中バッファ検索処理(後述する)を実行する。
【0067】
続いて、ステップSH5では、受信した演奏情報(ノートオンメッセージ)が演奏パートの音符データと一致するかどうかをパートトラックから検索し、その検索結果に基づきユーザの演奏を評価するための評価値(正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDif)を算出するパートデータ検索処理(後述する)を実行する。
【0068】
そして、ステップSH6に進み、上記ステップSH2において取得したピッチおよびベロシティの楽音を発音するよう音源16に指示する。続いて、ステップSH7では、再生制御データplayer中の再生中断用フラグinterruption(図8参照)が「FALSE」であるか否か、すなわちユーザにより再生中断操作が為されていないかどうかを判断する。
【0069】
再生中断操作が為されると、判断結果は「NO」になり、本処理を終えるが、再生中断操作が為されていなければ、判断結果が「YES」になり、ステップSH8に進む。ステップSH8では、再生制御データplayer中の状態フラグiStatus(図8参照)が「0」でないか、つまり再生中であるかどうかを判断する。再生中であると、判断結果は「YES」になり、上述のステップSH1に処理を戻すが、再生停止ならば、判断結果が「NO」になり、本処理を終える。
【0070】
(9)発音中バッファ検索処理の動作
次に、図19を参照して発音中バッファ検索処理の動作を説明する。上述したMIDI入力処理スレッドのステップSH4(図18参照)を介して本処理が実行されると、CPU11は図19に図示するステップSJ1に進み、バッファ検索ポインタiをゼロリセットする。続いて、ステップSJ2では、バッファ検索ポインタiの値が、再生制御データplayer中の音符データmePlaying[ ]の配列数(発音数)より小さいか否かを判断する。バッファ検索ポインタiの値が発音数を超えると、判断結果は「NO」になり、本処理を終えるが、バッファ検索ポインタiの値が発音数より小さければ、判断結果は「YES」になり、ステップSJ3に進む。
【0071】
ステップSJ3では、再生制御データplayer中の音符データmePlaying[i]をポインタmep1にストアし、続くステップSJ4では、発音中バッファエリアOBEにおいてポインタmep1で指定される音符データmePlaying[mep1]の押鍵フラグiStatusが「0」、つまり押鍵無しであるかどうかを判断する。押鍵されていなければ、判断結果は「YES」になり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻す。
【0072】
一方、押鍵されていると、上記ステップSJ4の判断結果は「YES」になり、ステップSJ6に進む。ステップSJ6では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlaying[mep1]における音符ポインタpMeを介して指定される音符データMidiEventの発音開始ティックlTimeと、再生制御データplayer中の現在Tick時刻lNowTickとの差が許容時間内であるか否かを判断する。許容時間を超えていると、判断結果は「NO」になり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻す。
【0073】
これに対し、発音タイミング(発音開始ティックlTime)と押鍵タイミング(現在Tick時刻lNowTick)との差が許容時間内ならば、上記ステップSJ6の判断結果は「YES」になり、ステップSJ7に進み、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlaying[mep1]における音符ポインタpMeを介して指定される音符データMidiEventの音高pitchと、レジスタmePlayにストアした音高pitchとが一致するか否かを判断する。
【0074】
不一致ならば、判断結果は「NO」になり、ステップSJ5に進み、バッファ検索ポインタiをインクリメントして歩進させた後、上述のステップSJ2に処理を戻すが、一致すると、判断結果が「YES」になり、ステップSJ8に進む。ステップSJ8では、ポインタmep1で指定される発音中バッファエリアOBE中の音符データmePlaying[mep1]における音符ポインタpMeを介して指定される音符データMidiEventを、レジスタmeplayにストアする。
【0075】
次いで、ステップSJ9に進むと、許容時間内に音高ミス無く行われた適正な押鍵に対応して、再生制御データplayer中の、正しく弾けた音符数iOKCountをインクリメントして歩進させる。続いて、ステップSJ10では、上記ステップSJ6で取得した発音タイミング(発音開始ティックlTime)と押鍵タイミング(現在Tick時刻lNowTick)との時間差を再生制御データplayer中のlKeyOnDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差lKeyOnDifを更新すると共に、発音タイミング(発音開始ティックlTime)と押鍵タイミング(現在Tick時刻lNowTick)との時間差(絶対値)を再生制御データplayer中のlKeyOnABSDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差(絶対値)lKeyOnDifを更新して本処理を終える。
【0076】
(10)パートデータ検索処理の動作
次に、図20を参照してパートデータ検索処理の動作を説明する。前述したMIDI入力処理スレッドのステップSH5(図18参照)を介して本処理が実行されると、CPU11は図20に図示するステップSK1に進み、レジスタmeplayの内容が「NULL」、つまり演奏情報(ノートオンメッセージ)から取得した音高pitchおよびベロシティvelがストアされていない状態であるかどうかを判断する。押鍵に応じた演奏情報がレジスタmeplayにストアされていなければ、判断結果は「YES」になり、本処理を終えるが、押鍵に応じた演奏情報がレジスタmeplayにストアされていると、判断結果が「NO」になり、ステップSK2に進む。
【0077】
ステップSK2では、トラック検索ポインタiTrをゼロリセットし、続くステップSK3では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果が「NO」となり、本処理を終えるが、トラック検索中ならば、判断結果は「YES」になり、ステップSK4に進み、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「1」、つまり選択された曲の演奏パートであるかどうかを判断する。
【0078】
トラック検索ポインタiTrで指定されるパートが選択された曲の演奏パートでなければ、判断結果は「NO」となり、ステップSK5に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSK3に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「1」、つまり選択された曲の演奏パートならば、上記ステップSK4の判断結果が「YES」になり、ステップSK6に進む。
【0079】
ステップSK6では、再生制御データplayer中の音符データMidiEvents[iTr]をポインタmepにセットする。このポインタmepは、トラック検索ポインタiTrで指定されるパートトラックにおける次の音符データMidiEventを指し示す。そして、ステップSK7に進むと、ポインタmepで指定される音符データMidiEventが「NULL」、すなわち曲終端であるかどうかを判断する。曲終端でなければ、判断結果が「NO」になり、ステップSK8に進む。
【0080】
ステップSK8では、再生制御データplayer中の現在Tick時刻lNowTickと、ポインタmepで指定される音符データMidiEventの発音開始ティックlTimeとの差が許容時間内であるか否かを判断する。許容時間を超えていると、判断結果は「NO」になり、本処理を終えるが、許容時間内ならば、判断結果は「YES」になり、ステップSK9に進む。ステップSK9では、ポインタmepで指定される音符データMidiEventの音高pitchと、レジスタmeplayにストアした音高pitchとが一致するか否かを判断する。
【0081】
不一致ならば、判断結果は「NO」になり、ステップSK13に進み、ポインタmepを歩進(mep.next)させた後、上述のステップSK7に処理を戻すが、一致すると、上記ステップSK9の判断結果が「YES」になり、ステップSK10に進み、演奏パートのトラックTrack[iTr]においてポインタmepにより指定される音符データMidiEventを、レジスタmeplayにストアする。
【0082】
次いで、ステップSK11に進むと、許容時間内に音高ミス無く行われた適正な押鍵に対応して、再生制御データplayer中の、正しく弾けた音符数iOKCountをインクリメントして歩進させる。続いて、ステップSK12では、上記ステップSK8で取得した発音開始ティックlTimeと現在Tick時刻lNowTickとの時間差を再生制御データplayer中のlKeyOnDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差lKeyOnDifを更新すると共に、その時間差(絶対値)を再生制御データplayer中のlKeyOnABSDifに加算し、これにより再生中に正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDifを更新する。この後、ステップSK13に進み、ポインタmepを歩進(mep.next)させた後、上述のステップSK7に処理を戻す。そして、歩進されたポインタmepが曲終端に達すると、ステップSK7の判断結果が「YES」となり、本処理を終える。
【0083】
(11)評価結果計算処理の動作
次に、図21〜図22を参照して評価結果計算処理の動作を説明する。前述した演奏モード処理のステップSB8を介して本処理が実行されると、CPU11は図21に図示するステップSL1に進み、トラック検索ポインタiTrをゼロリセットし、続くステップSL2では、トラック検索ポインタiTrが最大トラック数MAX_TRACKより小さいか否か、すなわちトラック検索中であるかどうかを判断する。全てのパートトラックについて検索し終えると、判断結果が「NO」となり、本処理を終えるが、トラック検索中ならば、判断結果は「YES」になり、ステップSL3に進む。
【0084】
ステップSL3では、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「1」、つまり選択された曲の演奏パートであるかどうかを判断する。トラック検索ポインタiTrで指定されるパートが選択された曲の演奏パートでなければ、判断結果は「NO」となり、ステップSL4に進み、トラック検索ポインタiTrをインクリメントして歩進させた後、上述のステップSL2に処理を戻す。そして、例えば歩進されたトラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のトラック選択状況iPlayTypeが「1」、つまり選択された曲の演奏パートであれば、上記ステップSL3の判断結果は「YES」になり、ステップSL5に進む。
【0085】
ステップSL5では、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のフレーズスキルPhraseLvに、正答率(player.iOKCount/player.iNoteCount)を乗じて演奏評価スコアiScoreを算出する。次いで、ステップSL6では、自己(演奏練習するユーザ自身)のユーザデータuser中のフレーズスキルPhraseLvが、算出した演奏評価スコアiScoreより低いか否かを判断する。
【0086】
フレーズスキルPhraseLvが演奏評価スコアiScoreより高ければ、判断結果は「NO」になり、ステップSL7に進み、自己のユーザデータuser中のフレーズスキルPhraseLvをインクリメントしてレベルアップさせる。そして、ステップSL8に進み、フレーズ変更フラグiPLvCngを「1」にセットした後、図22に図示するステップSL11に進む。
【0087】
一方、フレーズスキルPhraseLvが演奏評価スコアiScoreより低いと、上記ステップSL6の判断結果は「YES」になり、ステップSL9に進み、自己のユーザデータuser中のフレーズスキルPhraseLvをデクリメントしてレベルダウンさせる。そして、ステップSL10に進み、フレーズ変更フラグiPLvCngを「−1」にセットした後、図22に図示するステップSL11に進む。
【0088】
ステップSL11では、正しく弾けた一音符当たりの平均押鍵時間差(再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDif)を判定許容時間で除した値を「1」から減算して適正押鍵タイミング率iScoreを算出する。次いで、ステップSL12では、自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のリズムスキルRhythmLvより高く、かつ上記ステップSL11で算出した適正押鍵タイミング率iScoreが「0.5」より小さいか否かを判断する。
【0089】
自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のリズムスキルRhythmLvより高く、かつ適正押鍵タイミング率iScoreが「0.5」より小さければ、判断結果は「YES」になり、ステップSL13に進み、自己のユーザデータuser中のリズムスキルRhythmLvをインクリメントしてレベルアップさせる。そして、ステップSL14に進み、リズム変更フラグiRLvCngを「1」にセットして本処理を終える。
【0090】
これに対し、自己のユーザデータuser中のリズムスキルRhythmLvが、トラック検索ポインタiTrで指定されるパートトラックデータTrack[iTr]中のリズムスキルRhythmLvより低いか、あるいは適正押鍵タイミング率iScoreが「0.5」より大きいと、上記ステップSL12の判断結果が「NO」になり、ステップSL15に進み、自己のユーザデータuser中のリズムスキルRhythmLvをデクリメントしてレベルダウンさせる。そして、ステップSL16に進み、リズム変更フラグiRLvCngを「−1」にセットして本処理を終える。
【0091】
(12)メンバによる評価処理の動作
次に、図23〜図24を参照してメンバによる評価処理の動作を説明する。前述した演奏モード処理のステップSB9(図11参照)を介して本処理が実行されると、CPU11は図23に図示するステップSM1に進み、自己のユーザデータuser中のメンバMemberを指定するポインタをメンバ検索ポインタmemにセットする。次いで、ステップSM2では、メンバ検索ポインタmemで指定されるメンバMemberが「NULL」でないか否か、すなわち自己のユーザデータUserに登録された全てのメンバMemberについて検索し終えたかどうかを判断する。
【0092】
登録された全てのメンバMemberについて検索し終えていなければ、上記ステップSM2の判断結果は「YES」になり、ステップSM3に進む。ステップSM3では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが「0」より大きいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたか否かを判断する。
【0093】
ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップした場合には、上記ステップSM3の判断結果が「YES」になり、ステップSM4に進む。ステップSM4では、下記条件1,2の何れかを満足するか否かを判断する。
条件1:メンバ検索ポインタmemで指定されるメンバデータMembers中のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか?
条件2:メンバ検索ポインタmemで指定されるメンバデータMembers中のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか?
【0094】
上記の条件1,2の何れも満足しなければ、上記ステップSM4の判断結果は「NO」になり、ステップSM5に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをインクリメントしてレベルアップさせた後、後述のステップSM7に進む。
【0095】
一方、上記の条件1,2の何れかを満足すると、上記ステップSM4の判断結果が「YES」になり、ステップSM6に進む。ステップSM6では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastComment(前回評価)が褒める内容の成果コメントgCom[]であるか否かを判断する。演奏評価LastComment(前回評価)が褒める内容の成果コメントgCom[]であると、判断結果は「YES」になり、ステップSM5に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをインクリメントしてレベルアップさせた後、後述のステップSM7に進む。
【0096】
これに対し、演奏評価LastComment(前回評価)が褒める内容の成果コメントgCom[]でなければ、上記ステップSM6の判断結果が「NO」になり、ステップSM7に進む。ステップSM7では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastCommentを、今回の評価結果として褒める内容の成果コメントgCom[]に更新する。この後、図24に図示するステップSM12に進み、メンバ検索ポインタmemを歩進(mem.next)させた後、前述のステップSM2に処理を戻す。
【0097】
さて一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンした場合には、上述したステップSM3の判断結果が「NO」になり、図24に図示するステップSM8に進み、下記条件1,2の何れかを満足するか否かを判断する。
条件1:メンバ検索ポインタmemで指定されるメンバデータMembers中のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか?
条件2:メンバ検索ポインタmemで指定されるメンバデータMembers中のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか?
【0098】
上記の条件1,2の何れも満足しなければ、上記ステップSM8の判断結果は「NO」になり、ステップSM9に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをデクリメントしてレベルダウンさせた後、後述のステップSM11に進む。
【0099】
一方、上記の条件1,2の何れかを満足すると、上記ステップSM8の判断結果が「YES」になり、ステップSM10に進む。ステップSM10では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastComment(前回評価)が叱る内容の成果コメントbCom[]であるか否かを判断する。演奏評価LastComment(前回評価)が叱る内容の成果コメントbCom[]であると、判断結果は「YES」になり、ステップSM9に進み、メンバ検索ポインタmemで指定されるメンバMemberのメンバ忠誠度Loyaltyをデクリメントしてレベルダウンさせた後、後述のステップSM11に進む。
【0100】
これに対し、演奏評価LastComment(前回評価)が叱る内容の成果コメントbCom[]でなければ、上記ステップSM10の判断結果が「NO」になり、ステップSM11に進む。ステップSM11では、メンバ検索ポインタmemで指定されるメンバデータMembers中の演奏評価LastCommentを、今回の評価結果として叱る内容の成果コメントbCom[]に更新する。この後、ステップSM12に進み、メンバ検索ポインタmemを歩進(mem.next)させた後、前述のステップSM2に処理を戻す。そして、登録された全てのメンバMemberについて検索し終えると、このステップSM2の判断結果が「NO」になり、本処理を終える。
【0101】
(13)メンバ入替候補処理の動作
次に、図25〜図26を参照してメンバ入替候補処理の動作を説明する。前述した演奏モード処理のステップSB10(図11参照)を介して本処理が実行されると、CPU11は図25に図示するステップSN1に進み、自己(演奏練習するユーザ自身)のユーザデータuser中のメンバMemberを指定するポインタをメンバ検索ポインタmemにセットする。次いで、ステップSM2では、メンバ検索ポインタmemで指定されるメンバMemberが「NULL」でないか否か、すなわち自己のユーザデータUserに登録された全てのメンバMemberについて検索し終えたかどうかを判断する。
【0102】
登録された全てのメンバMemberについて検索し終えていなければ、上記ステップSN2の判断結果は「YES」になり、ステップSN3に進む。ステップSN3では、メンバ検索ポインタmemで指定されるメンバデータMembers中のメンバ忠誠度Loyaltyが閾値DRAWALより小さいか否かを判断する。メンバ忠誠度Loyaltyが閾値DRAWALより大きければ、判断結果は「NO」になり、後述のステップSN6に処理を進める。
【0103】
一方、メンバ忠誠度Loyaltyが閾値DRAWALより小さいと、上記ステップSN3の判断結果は「YES」になり、ステップSN4に進み、低い忠誠度(メンバから脱退したい)を表す値「−1」を、メンバ検索ポインタmemで指定されるメンバデータMembers中のメンバ忠誠度Loyaltyにストアする。続いて、ステップSN5では、メンバ忠誠度Loyaltyが「−1」となったメンバデータMembersを脱退希望リスト(後述する)に登録する。
【0104】
そして、ステップSN6に進むと、メンバ検索ポインタmemを歩進(mem.next)させた後、前述のステップSN2に処理を戻す。以後、自己のユーザデータuserに登録された全てのメンバMemberの中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバを探し出して脱退希望リストに登録する処理を進め、全てのメンバMemberについて検索し終えると、上記ステップSN2の判断結果が「NO」になり、ステップSN7に進み、メンバ識別ポインタidをゼロリセットする。
【0105】
次いで、図26に図示するステップSN8に進み、メンバ識別ポインタidがメンバデータベースMDB(図4参照)の末端まで達していなかどうかを判断する。末端まで達していなければ、判断結果は「YES」になり、ステップSN9に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]が、自己(演奏練習するユーザ自身)のユーザデータuser中のメンバMemberとして登録済みであるか否かを判断する。既にメンバ登録済みならば、判断結果は「YES」になり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。
【0106】
一方、メンバ識別ポインタidで指定されるメンバデータMembers[id]が、自己のユーザデータuser中のメンバMemberとして登録されていなければ、上記ステップSN9の判断結果は「NO」になり、ステップSN10に進む。ステップSN10では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフレーズスキルPhraseLvをレジスタPLvに、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のリズムスキルRhythmLvをレジスタRLvにそれぞれストアする。
【0107】
次いで、ステップSN11では、レジスタPLvに格納したメンバデータMembers[id]のフレーズスキルPhraseLvと自己のユーザデータuser中のフレーズスキルPhraseLvとの差分絶対値abs(PLv−user.PhraseLv)と、レジスタRLvに格納したメンバデータMembers[id]のリズムスキルRhythmLvと自己のユーザデータuser中のフレーリズムスキルRhythmLvとの差分絶対値abs(RLv−user.RhythmLv)との加算値が、入替レベル差CNG_LVより大きいか否かを判断する。
【0108】
メンバの演奏技量とユーザの演奏技量の差が小さく、入替レベル差CNG_LVを超えなければ、メンバ入替の対象とならない為、判断結果は「NO」になり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、前述のステップSN8に処理を戻す。
【0109】
これに対し、メンバの演奏技量とユーザの演奏技量の差が大きく、入替レベル差CNG_LVを超えると、メンバ入替の対象となる為、上記ステップSN11の判断結果が「YES」になり、ステップSN12に進む。
【0110】
そして、ステップSN12では、下記条件1,2の何れかを満足するか否かを判断する。
条件1:レジスタPLvに格納したメンバデータMembers[id]のフレーズスキルPhraseLvが自己のユーザデータuser中のフレーズスキルPhraseLvより高いか?
条件2:レジスタRLvに格納したメンバデータMembers[id]のリズムスキルRhythmLvが自己のユーザデータuser中のリズムスキルRhythmLvより高いか?
【0111】
上記の条件1,2の何れかを満足する場合、すなわちユーザよりメンバのフレーズ演奏技量又はリズム演奏技量が優れている場合には、上記ステップSN12の判断結果が「YES」になり、ステップSN13に進む。ステップSN13では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが「0」より大きいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたか否かを判断する。ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしていれば、判断結果は「NO」になり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。
【0112】
これに対し、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップすると、上記ステップSN13の判断結果が「YES」になり、ステップSN14に進む。ステップSN14では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフラグiFlagに「1」をセットすると共に、メンバ識別ポインタidで指定されるメンバデータMembers[id]中の演奏評価LastCommentに、ユーザに対して上から目線で述べる参加コメントuCom[]をセットする。そして、ステップSN15に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]を参加希望リスト(後述する)に追加する。この後、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。
【0113】
さて一方、上記条件1,2の何れも満足しない場合、すなわちメンバよりユーザのフレーズ演奏技量又はリズム演奏技量が優れている場合には、上記ステップSN12の判断結果は「NO」になり、ステップSN16に進む。ステップSN16では、フレーズ変更フラグiPLvCng又はリズム変更フラグiRLvCngの何れかが「0」より小さいか、つまりユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたか否かを判断する。ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしていれば、判断結果は「NO」になり、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。
【0114】
これに対し、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンすると、上記ステップSN16の判断結果が「YES」になり、ステップSN17に進む。ステップSN17では、メンバ識別ポインタidで指定されるメンバデータMembers[id]中のフラグiFlagに「−1」をセットすると共に、メンバ識別ポインタidで指定されるメンバデータMembers[id]中の演奏評価LastCommentに、ユーザに対して下から目線で述べる参加コメントlCom[]をセットする。そして、ステップSN18に進み、メンバ識別ポインタidで指定されるメンバデータMembers[id]を参加希望リスト(後述する)に追加する。この後、ステップSN19に進み、メンバ識別ポインタidを歩進させた後、上述のステップSN8に処理を戻す。
【0115】
以上説明したように、本実施の形態では、ユーザが弾きたい課題曲を選択し、ユーザと共演するメンバに課題曲の伴奏パートを割り当てると、曲進行に応じて各メンバの伴奏パートが再生されると同時に、曲進行に応じて読み出される課題曲の演奏パートの音符データと、その演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価するための評価値(正しく弾けた音符数iOKCount、正しく弾けた音符における押鍵時間差lKeyOnDifおよび正しく弾けた音符における押鍵時間差(絶対値)lKeyOnABSDif)を取得する演奏練習が行われる。
【0116】
そして、演奏パートを弾き終えて演奏練習が完了すると、課題曲の演奏パートの難易度に相当するフレーズスキルPhraseLvに、演奏練習したユーザの正答率(player.iOKCount/player.iNoteCount)を乗じて演奏評価スコアiScoreを算出し、算出した演奏評価スコアiScoreよりユーザのフレーズ演奏技量(フレーズスキルPhraseLv)が高ければ、ユーザのフレーズ演奏技量をレベルアップさせ、一方、演奏評価スコアiScoreよりユーザのフレーズ演奏技量が低ければ、ユーザのフレーズ演奏技量をレベルダウンさせる。
【0117】
また、正しく弾けた一音符当たりの平均押鍵時間差(再生制御データplayer中のiOKCount/再生制御データplayer中のlKeyOnABSDif)を判定許容時間で除した値を「1」から減算して適正押鍵タイミング率iScoreを算出し、この適正押鍵タイミング率iScoreが「0.5」より小さく、かつユーザのリズム演奏技量(リズムスキルRhythmLv)が演奏パートのリズムスキルRhythmLvより高ければ、ユーザのリズム演奏技量をレベルアップさせ、一方、適正押鍵タイミング率iScoreが「0.5」より大きいか、あるいはユーザのリズム演奏技量が演奏パートのリズムスキルRhythmLvより低いと、ユーザのリズム演奏技量をレベルダウンさせる。
【0118】
ユーザのフレーズ演奏技量(フレーズスキルPhraseLv)又はリズム演奏技量(リズムスキルRhythmLv)の何れかがレベルアップしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを上げ、ユーザよりもスキルの高いメンバから「褒められる」評価を与え、一方、ユーザのフレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたと評価された場合には、ユーザよりもスキルの低いメンバの忠誠度Loyaltyを下げ、ユーザよりもスキルの高いメンバから「叱られる」評価を与える。これにより、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。
【0119】
そして、ユーザのバンドに参加しているメンバ(ユーザデータuserに登録されたメンバMember)の中からメンバ忠誠度Loyaltyが閾値DRAWALより小さい脱退希望メンバがいると、そのメンバを脱退希望リストに登録する。脱退希望リストに登録されると、図27に図示する一例の演奏評価画面PEDの表示エリアDE1に、脱退希望メンバからの評価コメント(例えば『リズム感が悪いな。もう少し練習した方がいいんじゃないか?』)が表示される。こうしてユーザに更なる練習の必要性を問うことによって、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。
【0120】
さらに、ユーザデータuserに未登録(バンド不参加)のメンバの内、メンバの演奏技量とユーザの演奏技量の差が入替レベル差CNG_LVを超えるメンバを入替候補として探し出し、この入替候補の中からフレーズ演奏技量又はリズム演奏技量の何れかがレベルアップしたユーザよりも優れた演奏技量を持つメンバや、フレーズ演奏技量又はリズム演奏技量の何れかがレベルダウンしたユーザよりも劣る演奏技量を持つメンバを参加希望リストに登録する。参加希望リストに登録されると、図27に図示する一例の演奏評価画面PEDの表示エリアDE2に、参加希望メンバからの評価コメント(例えば『一緒に練習しながらやりませんか?』)が表示される。こうしてユーザを練習に誘う為、仲間を募ってバンドで共演するような演奏の楽しさや面白味を持たせて練習意欲の向上を図ることが出来る。
【0121】
以上、本発明の実施の一形態について説明したが、本発明はそれに限定されるものではなく、本願出願の特許請求の範囲に記載された発明とその均等の範囲に含まれる。以下では、本願出願当初の特許請求の範囲に記載された各発明について付記する。
【0122】
(付記)
[請求項1]
演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、
課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、
前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、
前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段と、
を具備することを特徴とする演奏練習装置。
【0123】
[請求項2]
前記メンバ評価手段は、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量と、前記演奏技量記憶手段に記憶される各メンバの演奏技量とを比較し、更新によりユーザの演奏技量がレベルアップした場合にはユーザよりも演奏技量の高いメンバから「褒められる」評価を与え、一方、更新によりユーザの演奏技量がレベルダウンした場合にはユーザよりも演奏技量の高いメンバから「叱られる」評価を与えることを特徴とする請求項1記載の演奏練習装置。
【0124】
[請求項3]
前記演奏評価値取得手段は、少なくとも正答率、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値を、評価値として取得することを特徴とする請求項1記載の演奏練習装置。
【0125】
[請求項4]
前記ユーザ演奏技量更新手段は、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度に、前記演奏評価値取得手段により取得された正答率を乗じて演奏得点を算出し、算出した演奏得点よりもユーザの演奏技量が高ければ、当該ユーザの演奏技量をレベルアップさせ、一方、算出した演奏得点よりもユーザの演奏技量が低ければ、当該ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。
【0126】
[請求項5]
前記ユーザ演奏技量更新手段は、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値に基づき適正押鍵タイミング率を算出し、この適正押鍵タイミング率が所定値より小さく、かつユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より高ければ、ユーザの演奏技量をレベルアップさせ、一方、適正押鍵タイミング率が所定値より大きいか、あるいはユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より低ければ、ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。
【0127】
[請求項6]
前記演奏技量記憶手段は、ユーザに対する各メンバの忠誠度を記憶し、
前記メンバ評価手段は、更新によりユーザの演奏技量がレベルアップした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を上げ、一方、更新によりユーザの演奏技量がレベルダウンした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を下げる忠誠度更新手段を備えることを特徴とする請求項1記載の演奏練習装置。
【0128】
[請求項7]
前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、所定値より小さい忠誠度のメンバを、ユーザとの共演から脱退を希望する脱退希望メンバとして検出する脱退希望メンバ検出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。
【0129】
[請求項8]
前記演奏技量記憶手段にユーザと共演する各メンバの他に、ユーザと共演しない他のメンバの演奏技量を記憶しておき、これら他のメンバの内、ユーザの演奏技量とのレベル差が所定以上のメンバを入替候補メンバとして抽出する入替候補メンバ抽出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。
【0130】
[請求項9]
演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、
課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段とを備えた装置のコンピュータで実行されるプログラムであって、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏ステップと、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得ステップと、
前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得ステップにより取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新ステップと、
前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段ステップと
を実行させることを特徴とするプログラム。
【符号の説明】
【0131】
10 操作部
11 CPU
12 ROM
13 RAM
14 表示部
15 MIDIインタフェース部
16 音源
17 サウンドシステム
100 演奏練習装置

【特許請求の範囲】
【請求項1】
演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、
課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段と、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏手段と、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得手段と、
前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得手段により取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新手段と、
前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段と、
を具備することを特徴とする演奏練習装置。
【請求項2】
前記メンバ評価手段は、前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量と、前記演奏技量記憶手段に記憶される各メンバの演奏技量とを比較し、更新によりユーザの演奏技量がレベルアップした場合にはユーザよりも演奏技量の高いメンバから「褒められる」評価を与え、一方、更新によりユーザの演奏技量がレベルダウンした場合にはユーザよりも演奏技量の高いメンバから「叱られる」評価を与えることを特徴とする請求項1記載の演奏練習装置。
【請求項3】
前記演奏評価値取得手段は、少なくとも正答率、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値を、評価値として取得することを特徴とする請求項1記載の演奏練習装置。
【請求項4】
前記ユーザ演奏技量更新手段は、前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度に、前記演奏評価値取得手段により取得された正答率を乗じて演奏得点を算出し、算出した演奏得点よりもユーザの演奏技量が高ければ、当該ユーザの演奏技量をレベルアップさせ、一方、算出した演奏得点よりもユーザの演奏技量が低ければ、当該ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。
【請求項5】
前記ユーザ演奏技量更新手段は、正しく弾けた音符における押鍵時間差および正しく弾けた音符における押鍵時間差の絶対値に基づき適正押鍵タイミング率を算出し、この適正押鍵タイミング率が所定値より小さく、かつユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より高ければ、ユーザの演奏技量をレベルアップさせ、一方、適正押鍵タイミング率が所定値より大きいか、あるいはユーザの演奏技量が前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度より低ければ、ユーザの演奏技量をレベルダウンさせることを特徴とする請求項1記載の演奏練習装置。
【請求項6】
前記演奏技量記憶手段は、ユーザに対する各メンバの忠誠度を記憶し、
前記メンバ評価手段は、更新によりユーザの演奏技量がレベルアップした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を上げ、一方、更新によりユーザの演奏技量がレベルダウンした場合には、前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、ユーザよりも演奏技量の低いメンバの忠誠度を下げる忠誠度更新手段を備えることを特徴とする請求項1記載の演奏練習装置。
【請求項7】
前記演奏技量記憶手段に記憶される各メンバの忠誠度の内、所定値より小さい忠誠度のメンバを、ユーザとの共演から脱退を希望する脱退希望メンバとして検出する脱退希望メンバ検出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。
【請求項8】
前記演奏技量記憶手段にユーザと共演する各メンバの他に、ユーザと共演しない他のメンバの演奏技量を記憶しておき、これら他のメンバの内、ユーザの演奏技量とのレベル差が所定以上のメンバを入替候補メンバとして抽出する入替候補メンバ抽出手段を更に備えることを特徴とする請求項6記載の演奏練習装置。
【請求項9】
演奏パートおよび複数の伴奏パートから成る課題曲を構成する各音を表す曲データと、課題曲の演奏パートの難易度とを記憶する曲情報記憶手段と、
課題曲の演奏パートを演奏練習するユーザの演奏技量と、前記伴奏パート毎に割り当てられたメンバ夫々の演奏技量とを記憶する演奏技量記憶手段とを備えた装置のコンピュータで実行されるプログラムであって、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の各伴奏パートの曲データを再生するメンバ伴奏ステップと、
曲進行に応じて前記曲情報記憶手段から読み出される課題曲の演奏パートの曲データと、ユーザが当該演奏パートを演奏して発生する演奏データとの比較に基づきユーザの演奏を評価する評価値を取得する演奏評価値取得ステップと、
前記曲情報記憶手段に記憶される課題曲の演奏パートの難易度と、前記演奏評価値取得ステップにより取得された評価値とで得られる演奏得点に応じて、前記演奏技量記憶手段に記憶されるユーザの演奏技量を更新するユーザ演奏技量更新ステップと、
前記ユーザ演奏技量更新手段により更新されたユーザの演奏技量及び前記演奏技量記憶手段に記憶される各伴奏パートに割り当てられたメンバの演奏技量の相対関係に基づいた評価を与えるメンバ評価手段ステップと
を実行させることを特徴とするプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate