以下、添付図面を参照して、本発明の実施の形態について説明する。図1は、本発明の第1の実施の形態にかかる楽曲難易度算出装置の構成を示すブロックダイヤグラムである。図1に示すように、本実施の形態にかかる楽曲難易度算出装置10は、CPU11、ROM12、RAM13、大規模記憶装置14、入力装置15、表示装置16、サウンドシステム17および鍵盤18を有している。
CPU11は、後述する楽曲の難易度を評価するための種々の処理(運指難易度評価処理、リズム難易度評価処理、調性難易度評価処理、全体難易度の算出処理)や、操作者(演奏者)が習得した楽曲についての所定の情報を取得する処理(習得楽曲対応処理)を実行する。ROM12は、楽音難易度を評価するための種々の処理(運指難易度評価処理、リズム難易度評価処理、調性難易度評価処理、全体難易度の算出処理)、および、操作者(演奏者)が習得した楽曲についての所定の情報を取得する処理(習得楽曲対応処理)のプログラムや、処理に使用するパラメータなどを格納する。RAM13は、プログラムの実行の過程で生じたパラメータ、入力データ、出力データなどを一時的に記憶する。大規模記憶装置14は、ハードディスク装置やメモリカードなどであり、楽曲データなどを格納する。なお、以下、本実施の形態においては、入力装置の操作者が演奏者でもあり、したがって、操作者は、自己の習得した楽曲を指定する情報を入力している。しかしながら、これに限定されるものではなく、操作者が、他の演奏者が習得した楽曲を指定する情報を入力し、楽曲難易度算出装置10が、当該他の演奏者に対する楽曲難易度を算出できることは言うまでもない。
入力装置15は、スイッチ類、キーボード、マウスなどを含み、操作者のスイッチ操作、キー操作、マウスの操作に基づく種々の指示などをCPU11に与える。表示装置12の画面上には、楽曲データに基づく楽譜、楽曲難易度の評価結果などを含む画像データが表示される。サウンドシステム40は、楽音生成回路、増幅器、スピーカなどを含み、楽曲データにしたがって、或いは、操作者による鍵盤18の押鍵操作にしたがって所定の楽音を生成して、楽音に基づく音響信号を出力する。なお、上記実施の形態において、鍵盤18は必須ではない。
また、本実施の形態にかかる楽曲難易度算出装置10は、鍵盤楽器の形態であっても良いし、或いは、パーソナルコンピュータのような形態であっても良い。鍵盤楽器の形態であれば、操作者は、表示装置16の画面上に表示された楽譜を参照して、鍵盤18の鍵を押鍵し、サウンドシステム17が、操作者の押鍵に応答して、押鍵された鍵の音高に対応する楽音データを生成することで、サウンドシステム17から楽音を出力することができる。
図2は、本実施の形態にかかる楽曲難易度算出装置10において実行される処理の概略を示すフローチャートである。図2に示すように、本実施の形態にかかる楽曲難易度算出装置10のCPU11は、RAM13に格納されたパラメータ等のクリア、表示装置16の画面上に表示された画像のクリアなどを含むイニシャライズを実行する(ステップ201)。次いで、CPU11は、楽曲難易度算出装置10における動作モードを判断する(ステップ202)。本実施の形態において、楽曲難易度算出装置10は、指定された楽曲についての難易度を評価する難易度評価モード、および、操作者(演奏者)が習得した楽曲を登録して当該楽曲について所定の情報を取得する習得楽曲登録モードを備え、動作モードを示す情報がRAM13に格納される。したがって、ステップ202においては、楽曲難易度算出装置10が、難易度評価モード或いは習得楽曲登録モードの、何れの動作モードの下にあるかが判断される。
ステップ202において、難易度評価モードであると判断された場合には、CPU11は、操作者が入力装置15を操作することにより楽曲指定の入力があったかを判断する(ステップ203)。たとえば、楽曲指定の入力は、楽曲データの番号を入力することにより実現される。
ステップ203でYesと判断された場合には、CPU11は、大規模記憶装置14に格納された楽曲データ群から、指定された楽曲の楽曲データを読み出して、RAM13に一時的に記憶する(ステップ204)。次いで、CPU11は、難易度評価処理を実行して、データを読み出された楽曲の難易度を示す値iCostを算出する(ステップ205)。ステップ203でNoと判断されると、CPU11は、難易度算出が行なわれた楽曲のそれぞれについて、算出された難易度と楽曲中の音符との関連を示す画像を生成して表示装置16の画面上に表示する難易度表示処理を実行する(ステップ206)。難易度評価処理および難易度表示処理については、以下に詳述する。
ステップ202において、習得楽曲登録モードであると判断された場合には、CPU11は、操作者が入力装置15を操作することにより楽曲指定の入力があったかを判断する(ステップ207)。ステップ203と同様に、楽曲指定の入力は、楽曲データの番号を入力することにより実現される。ステップ207においてYesと判断された場合には、CPU11は、習得楽曲対応処理を実行する(ステップ208)。ステップ207でNoと判断されると、CPU11は処理を終了する。習得楽曲対応処理についても後に詳述する。
図3は、本実施の形態にかかる楽曲データのデータ構成例を示す図である。図3に示すように、ある楽曲の楽曲データは、音符(ノート)ごとに、発音すべき楽音を示す楽音データのレコード(符号301、302参照)を有する。楽音データのレコード(たとえば、先頭のノートのレコードNote[0]:符号301)は、音高情報「Pit」、鍵盤位置情報「Pos」、運指情報「Fig」、発音時刻「Time」、発音時間「Gate」、次のノートのレコードへのポインタ「*Next」および前のノートのレコードへのポインタ「*prev」という項目を含む。
音高情報「Pit」は、たとえば、音名「C−1」を「0」として、音高が1つ高くなるごとに「1」を増分させた値である。鍵盤位置情報「Pos」は、当該音高に対応する鍵の横方向の中心位置を示す座標値である。たとえば、図16に示すように、ある位置のC(たとえば、C4:Pit=60)の鍵盤位置情報Pos=X0とすると、C#4〜C5までの鍵盤位置情報は、それぞれ、X1〜X12で示すような値となる。図16から理解できるように、隣接する白鍵と黒鍵、黒鍵と白鍵との間の座標値の差は「1」である。その一方、連続する白鍵(EとF、BとC)との間の座標値の差は「2」となる。
図4は、本実施の形態にかかる難易度評価処理の例を概略的に示すフローチャートである。図4に示すように、CPU11は、運指難易度評価処理(ステップ401)、リズム難易度評価処理(ステップ402)、調性難易度評価(ステップ403)、全体難易度の算出処理(ステップ404)を実行する。運指難易度評価処理において、CPU11は、楽音データ中の運指情報などに基づいて、運指難易度iFCostを算出する。リズム難易度評価処理において、CPU11は、楽音データ中の発音時刻、発音時間などに基づいて、リズム難易度RCostを算出する。また、調性難易度評価処理において、CPU11は、楽音データの音高情報などに基づいて、調性難易度iTCostを算出する。
CPU11は、算出した運指難易度iFCost、リズム難易度iRCost、調性難易度iTCostおよび楽曲データ中のノート数(iCnt)に基づいて、それぞれに、重み係数RF、RR、RTおよびRCを乗じて加算することで楽曲の難易度iCostを算出する(ステップ404)。すなわち、難易度iCostは以下の数式のようになる。
iCost=iFCost×RF+iRCost×RR
+iTCost×RT+iCnt×RC
以下、運指難易度評価処理、リズム難易度評価処理および調性難易度評価処理について詳細に説明する。図5および図6は、本実施の形態にかかる運指難易度評価処理の例を示すフローチャートである。なお、本実施の形態においては、楽曲データは、右手で演奏する楽曲(メロディ)の音符についての楽音データから構成される。したがって、運指難易度においては、右手で演奏する場合の運指難易度が算出され。楽曲データ中、楽音データのレコードの運指情報は、右手のどの指で押鍵するかを示している。また、指番号「1」〜「5」は、それぞれ、親指〜小指で押鍵すべきことを示している。
図5に示すように、CPU11は、楽音データに示す楽曲のノート(音符)数を示すパラメータiCntを「0」に初期化するとともに(ステップ501)、RAM13の楽曲データ中、最初の楽音データのレコードNote[0]を、配列me[]に格納する(ステップ502)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ503でYes)、ステップ504〜515を繰り返す。
まず、CPU11は、配列me[]に格納された楽音データのレコードの、一つ前の楽音でデータのレコードを特定し、それを配列prev[]に格納する(ステップ504)。次いで、CPU11は、配列me[]および配列prev[]に格納された値に基づいて、テクニック分類処理を実行する(ステップ505)。テクニック分類処理においては、楽曲の隣接する音符間の運指について、ポジションタイプ(PosType)、指開きタイプ(iSpreadType)、リバースタイプ(RevType)、および、指使いテクニック(Tech)という4つの分類項目のそれぞれの何れに該当するかを判断する。
ここで、ポジションタイプ(PosType)という分類項目は、どのような指のポジションで運指が行なわれるかを示す。また、指開きタイプ(iSpreadType)は、隣接する音符を押鍵する指の開き具合を示す。また、リバースタイプ(RevType)は、後述する指くぐり、或いは、指返し(乗り越え)の存在を示す。さらに、指使いテクニック(Tech)は、隣接する音符を押鍵するときにどのような指使い(指換え)がなされているかを示す。
テクニック分類処理では、それぞれの分類項目について、当該分類項目における具体的提要を示す分類値が算出される。図7および図8は、本実施の形態にかかるテクニック分類処理の例を示すフローチャートである。CPU11は、配列me[]中の運指情報「Fig」、音高情報「Pit」および鍵盤位置情報「Pos」について、f1=Fig、p1=Pit、ps1=Posとする。また、音高情報「Pit」に基づき、鍵が白鍵か黒鍵かを判断し、白鍵、黒鍵の何れかを示す情報をb1とする。値b1は、鍵が黒鍵であることを示す値「1」或いは鍵が白鍵であることを示す値「0」の何れかをとる。これら値f1、p1、ps1、b1は、RAM13に格納される。
また、CPU11は、配列prev[]中の運指情報「Fig」、音高情報「Pit」および鍵盤位置情報「Pos」について、f2=Fig、p2=Pit、ps2=Posとする。また、音高情報「Pit」に基づき、鍵が白鍵か黒鍵かを判断し、白鍵、黒鍵の何れかを示す情報をb2とする。これら値f2、p2、ps2、b2は、RAM13に格納される。CPU11は、p1、p2、f1およびf2に基づき、音高差を示す指標iDistを算出する(ステップ703)。
音高差を示す指標iDistは、楽曲において音符の進行が上行であったときに、指番号が増大あるいは減少しているか、また、進行が下行であったときに、指番号が減少或いは増大しているかを示す指標である。本実施の形態においては、iDistは以下のように求められる。
iDist=(p1−p2)*(f1−f2)
したがって、iDist>0である場合には、音符の進行が上行かつ指番号が増大するような指使いである場合、或いは、音符の進行が下行かつ指番号が減少するような指使いである場合を意味している。すなわち、iDist>0である場合には、指が開く形態で運指が行なわれる(指くぐりや指返しが行なわれない)ことを示している。
CPU11は、f2=f1かつp2=p1であるかを判断する(ステップ704)。ステップ704でYesとなる場合とは、隣接する音符間で、同じ音高の鍵が同じ指で押鍵されることを示す。ステップ704でYesと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、分類値Techとして、「Tech=3」という値を与える(ステップ705)。与えられた値は、RAM13に格納される。次いで、CPU11は、f2≠f1かつp2=p1であるかを判断する(ステップ706)。ステップ706でYesとなる場合とは、隣接する音符間で、同じ音高の鍵が異なる指で押鍵されることを示す。ステップ706でYesと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、「Tech=2」という値を与える(ステップ707)。
次いで、CPU11は、f2=f1かつp2≠p1であるかを判断する(ステップ708)。ステップ708でYesとなる場合とは、隣接する音符間で異なる音高の鍵が同じ指で押鍵されることを示す。ステップ708でYesと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、「Tech=4」という値を与える(ステップ709)。ステップ708でNoと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、「Tech=1」という値を与える(ステップ710)。
次に、CPU11は、iDist>0であるかを判断する(ステップ801)。上述したように、iDist>0であることは、指が開く形態で運指が行なわれる(指くぐりや指返しが行なわれない)ことを示している。ステップ801でYesと判断された場合には、CPU11は、b2、b1、f2およびf1に基づいて、所定のテーブルiPType[][][][]に基づいて、分類値PosTypeとして、PosType=iPType[b2][b1][f2][f1]を取得する(ステップ802)。テーブルiPType[][][][]は、隣接する音符について、指番号および白鍵/黒鍵の種別に基づく値を含み、RAM13に格納される。
テーブルiPType[][][][]における値について以下に簡単に説明する。テーブルiPtype[][][][]は、隣接する音符に配置すべき指の指番号およびその位置(白鍵或いは黒鍵)の関係に基づいて、その指のポジションタイプを格納したテーブルである。たとえば、現在の音符および一つ前の音符の双方が白鍵であれば、iPType[0][0][f2][f1]=1となる。また、一つ前の音符が親指でかつ白鍵が押鍵されていれば、現在の音符が黒鍵であった場合に、iPType[0][1][1][f1]=2となる。また、一つ前の音符が親指でかつ黒鍵が押鍵されていれば、現在の音符が黒鍵であった場合に、iPType[1][1][1][f1]=3となる。
このように、テーブルiPtypeにおいては、隣接する音符を押鍵するときの手のむきや指の位置の難易度が高まるのに応じて、値が大きくなるようになっている。
ステップ802が実行された後、CPU11は、指開き特定処理を実行する(ステップ803)。図9は、本実施の形態にかかる指開き特定処理の例を詳細に示すフローチャートである。
図9に示すように、CPU11は、指開きの度合いを示すパラメータであるiMin、iL1およびiL2(iMin<iL1<iL2)をRAM13から取得する(ステップ901)。たとえば、iMinは、白鍵での長2度の幅に相当する「2」、iL1は、白鍵での長3度に相当する「4」、iL1は、白鍵での完全8度に相当する「14」である。指開き特定処理においては、iDistと、iMin、iL1およびiL2とを比較して、指開きタイプ(iSpreadType)の分類値を決定していく。
CPU11は、鍵盤位置に基づく距離iKDist=|ps2−ps1|を算出する(ステップ902)。
ステップ703において算出されたiDist<0である場合には(ステップ903でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、分類値iSpreadTypeとして、「iSpreadType=0」という値を与える(ステップ904)。なお、図9が実行されるときには、iDist>0であることが前提である(図8のステップ801参照)。したがって、これは実際には起こりえないことであるため、ステップ904はエラー処理となる。
iKDist=iMinである場合(ステップ905でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、分類値iSpreadTypeとして、「iSpreadType=1」という値を与える(ステップ906)。iMin<iKDist≦iL1である場合(ステップ907でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=2」という値を与える(ステップ908)。iKDist<iMinである場合(ステップ909でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=3」という値を与える(ステップ910)。
iKDist<iL2である場合(ステップ911でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=4」という値を与える(ステップ912)。その一方、iKDist≧iL2である場合(ステップ911でNo)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=5」という値を与える(ステップ913)。
指開き特定処理によって、iKDistの値にしたがって、以下のようなiSpreadTypeの値が付与される。
0≦iKDist<Min iSpreadType=3
iKDist=iMin iSpreadType=1
iMin<iKDist≦iL1 iSpreadType=2
iL1<iKDist<iL2 iSpreadType=4
iL2≦iKDist iSpreadType=5
指開き特定処理が終了すると、CPU11は、リバースタイプ(RevType)という分類項目について、分類値RevTypeとして、「RevType=1」という分類値を与える(ステップ804)。その後、CPU11は、配列me[]に格納された楽音データについて算出されたPosType、iSpreadType、RevTypeおよびTechという分類値を、当該楽音データと関連付けて記憶装置(RAM13)に格納する(ステップ805)。
ステップ801でNoと判断された場合には、所定のテーブルiRType[][][][]に基づいて、RevType=iRType[p2][p1][f2][f1]を取得する(ステップ806)。テーブルiRType[][][][]は、隣接する音符について、指番号および音高に基づく値を含み、RAM13に格納される。
テーブルiRType[][][][]における値について以下に簡単に説明する。テーブルiRtype[][][][]は、隣接する音符に配置すべき指の指番号および音高の関係に基づいて、運指における指くぐりや指返し(乗り越え)を示す情報を格納したテーブルである。本実施の形態において、iDist≦0のときには、上行音形において、「1」より大きな指番号の指から指番号「1」の指に移行すること(いわゆる「指くぐり」)、或いは、下行音形において、指番号「1」の指から「1」より大きな指番号の指に移行すること(いわゆる「指返し」ないし「指の乗り越え」)が行なわれ得ることを意味している。
本実施の形態においては、指くぐりのとき、つまり、p2<p1,f2>1、f1=1のときには、iRType[p2][p1][f2][f1]=3となる。また、指返しのとき、つまり、p2>p1、f2=1、f1>1のときには、iRType[p2][p1][f2][f1]=2となる。一般的に、運指において、指返しより指くぐりの方が難しいといわれているため、指くぐりについて、RevType=3、指返しについてRevType=2となるようにしている。
ステップ806の後、CPU11は、ポジションタイプ(PosType)という分類項目について、「PosType=1」という分類値、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=1」という分類値を与える(ステップ807)。その後、CPU11は、配列me[]に格納された楽音データについて算出されたPosType、iSpreadType、RevTypeおよびTechという分類値を、当該楽音データと関連付けて記憶装置(RAM13)に格納する(ステップ805)。
次に、2次元の運指難易度評価マップiFMap[i][j](iは分類項目、jは分類項目において付与された値)において、テクニック分類処理により得られた分類項目に対応する値をインクリメントする処理を実行する(図5のステップ506〜512)。本実施の形態においては、ポジションタイプ(PosType)、指開きタイプ(iSpreadType)、リバースタイプ(RevType)、および、指使いテクニック(Tech)という4つの分類項目が存在する。したがって、2次元の運指難易度評価マップiFMap[i][j]のそれぞれの要素は以下の分類項目に対応する。
iFMap[0][j]:jが「PosType」の値
iFMap[1][j]:jが「iSpreadType」の値
iFMap[2][j]:jが「RevType」の値
iFMap[3][j]:jが「Tech」の値
なお、以下のステップ506、508、510、512から理解できるように、j=0、2のときの値は存在せず、j>1のみについて値を有する。
CPU11は、PosType>1である場合には(ステップ506でYes)、対応する運指難易度評価マップの値であるiFMap[0][PosType]をインクリメントする(ステップ507)。また、CPU11は、iSpreadType>1である場合には(ステップ508でYes)、対応する運指難易度評価マップの値であるiFMap[1][iSpreadType]をインクリメントする(ステップ509)。CPU11は、RevType>1である場合には(ステップ510でYes)、対応する運指難易度評価マップの値であるiFMap[2][RevType]をインクリメントする(ステップ511)。さらに、CPU11は、Tech>1である場合には(ステップ512でYes)、対応する運指難易度評価マップの値であるiFMap[3][Tech]をインクリメントする(ステップ513)。
次いで、CPU11は、ノート数(音符数)を示すパラメータiCntをインクリメントして(ステップ514)、配列me[]に、次の楽音データのレコードを格納し(ステップ515)、その後、ステップ503に戻る。
ステップ503でYesと判断された場合には、CPU11は、ステップ507、509、511および513でマップ値がインクリメントされた運指難易度評価マップiFMap[][]を、楽曲を特定する情報と関連付けて、記憶装置(たとえばRAM13)に格納する(ステップ516)。この楽曲を特定する情報と関連付けられた運指難易度評価マップiFMap[][]は、後述する習得楽曲対応処理(図2のステップ208)において参照される。
次いで、CPU11は、パラメータiおよびiFCostを「0」に初期化する(ステップ601)。CPU11は、パラメータiが「4」以上であるかを判断する(ステップ602)。上記パラメータiは、iFMap[i][j]の「i」を特定するためのものである。ステップ602でNoと判断された場合には、CPU11は、パラメータjを「0」に初期化して(ステップ603)、jが所定数より大きくなるまで(ステップ604)、ステップ605〜608の処理を繰り返す。
CPU11は、運指難易度評価マップの値iFMap[i][j]が「0」より大きいかを判断する(ステップ605)。ステップ605でYesと判断された場合には、CPU11は、操作者(演奏者)の楽曲習得度マップのマップ値iFMapAbl[i][j]が「0」であるかを判断する(ステップ606)。この楽曲習得度マップiFMapAbl[][]は、分類項目の具体的態様ごとに、操作者(演奏者)が、当該分類項目の具体的態様にかかる技術の習得が行なわれているか否かを示すマップである。
楽曲習得度マップiMapAbl[][]は、操作者(演奏者)ごとに設けられ、マップ値がRAM13に格納される。楽曲習得度マップiFMapAbl[][]の生成については後に詳説する。
楽曲習得度マップiFMapAbl[i][j]=1であることは、分類項目「i」における分類値[j]で特定される具体的態様については、操作者(演奏者)が習得済みであることを示す。たとえば、iFMapAbl[0][2]=1であれば、ポジションタイプ(PosType)という分類項目について、分類値が「2」(PosType=2)であるような具体的態様については操作者(演奏者)が習得済みであることを示す。
後に詳述するが、本実施の形態においては、操作者(演奏者)が、ある分類項目の具体的態様について既に習得している場合には、当該分類項目の具体的態様についてのコスト値iFCost[i][j]を加算しない。すなわち、操作者(演奏者)は、当該具体的態様について習得済みであるため、当該具体的態様は、その操作者(演奏者)にとっての楽曲難易度には影響を与えないからである。
ステップ606でYesと判断された場合には、CPU11は、運指難易度評価マップの値iFMap[i][j]に対応付けられたコスト値iFCost[i][j]を、運指難易度の値iFCostに加算する(ステップ607)。
以下、コスト値iFCost[i][j]を格納したコストテーブル(iFCost[][][])について説明する。コストテーブルは、コスト値iFCost[i][j]のそれぞれに対応する、「i×j」個のコスト値iFCost[i][j]を格納している。たとえば、iFCost[0][j]は、テクニック分類処理(図8)のステップ802で取得された「PosType」の値のそれぞれに対応するコスト値であり、ポジションタイプのそれぞれの値に固有の値となっている。i=1以上の他のコスト値も同様である。
本実施の形態においては、ポジションタイプ「PosType」、指開きタイプ「iSpreadType」、リバースタイプ「RevType」および指使いテクニック「Tech」のそれぞれにおいて、値が大きくなるのにしたがって、それぞれの分類項目において運指の困難度が高まるようになっている。したがって、コスト値iFCost[i][j]も、jが増大するのにしたがって、コスト値が増大するようになっている。
また、本実施の形態においては,運指難易度評価マップの値iFMap[i][j]が幾つであるかは考慮せず、0より大きければ(すなわち1以上であれば)、コスト値iFCost[i][j]を、運指難易度の値iFCostに加算している。すなわち、運指難易度評価マップの値の多寡にかかわらず、加算される値はコスト値iFCost[i][j]である。これは、分類項目「i」(例えば、ポジションタイプや指開きタイプ)において、iFMap[i][j]において1より大きい値を有する音符が1つあれば、その場合には、当該iFMap[i][j]に対応する難易度を含むため、そのノートの数は、難易度を示すコスト値にそれほど大きく影響しないであろうという知見に基づく。
無論、運指難易度評価マップの値iFMap[i][j]に応じて、加算されるiFCost[i][j]に重みを与えても良い。つまりこの場合には、
iCost=iCost+
f(iFCost[i][j])×iFCost[i][j]
となる。ここで、f(iFCost[i][j])は、変数iFCost[i][j]が増大するのにしたがって増大するが、変数iFCost[i][j]が増大するのにしたがって、関数値fの増分は小さくなっていく関数である。たとえば、fとして対数関数を使用しても良い。
ステップ605でNoと判断された場合、ステップ606でNoと判断された場合、或いは、ステップ607が実行された後、CPU11は、jをインクリメントして(ステップ608)、ステップ604に戻る。また、ステップ604でYesと判断された場合には、CPU11は、iをインクリメントして(ステップ609)、ステップ602に戻る。
このように本実施の形態においては、楽曲に含まれるあるノートが、運指に関する分類項目の具体的態様についてのマップ値iFMap[i][j]が「0」でない場合には、当該分類項目の具体的態様に対応するコスト値iFCost[i][j]が、運指難易度iFCostに加算される。
次に、リズム難易度評価処理について説明する。図10および図11は、本実施の形態にかかるリズム難易度評価処理の例を示すフローチャートである。図10に示すように、CPU11は、RAM13の楽曲データ中、最初の楽音データのレコードNote[0]を、配列me[]に格納する(ステップ1001)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ1002でYes)、ステップ1003〜1007を繰り返す。
CPU11は、RAM13に格納された、リズム評価処理用のパラメータ(リズムパラメータ)を取得する(ステップ1003)。リズムパラメータには、1小節の長さを示すiMeasLen、リズムの分解能を示すResolutionなどが含まれ、これらは、次のリズムコスト算出処理において利用される。CPU11は、リズムコスト算出処理を実行する(ステップ1004)。図12および図13は、本実施の形態にかかるリズムコスト算出処理の例を示すフローチャートである。リズムコスト算出処理においては、音符の音符長(次の音符までの間隔に基づく音符長)に相当する分類項目であるステップタイム(iStepTime)についての分類値と、音符の小節中の位置に相当する分類項目であるポジション(iPos)についての分類値とが得られる。
図12に示すように、CPU11は、配列me[]に示す楽音データのレコードの、次のレコードを参照して、その発音時刻Timeを取得する(ステップ1201)。次いで、CPU11は、配列me[]中の発音時刻Timeと、ステップ1201で取得した次の発音データのレコードにおける発音時刻Timeとに基づいて、次の音符までの間隔iTを算出する(ステップ1202)。CPU11は、時間間隔iTと、1小節の長さiMeasLenとに基づいて、上記時間間隔の小節内での音符長iStepTimeを算出する(ステップ1203)。得られたiStepTimeが、音符長という分類項目についての分類値となる。
本実施の形態において、音符長iStepTimeは以下のように求められる。
iStepTime=32×iT/iMeasLen
本実施の形態においては、楽曲は4/4拍子としており、iStepTimeは、iTが32分音符いくつ分に相当するかを示している。
次いで、CPU11は、配列me[]中の発音時刻Timeに基づき、小節内の音符位置iTickInMeas、拍内での音符位置iTickInBeatおよび当該音符の属する拍iBeatを算出する(ステップ1304)。iTickInMeasは、1小節を32分割したときの音符の位置、つまり、小節の先頭から32分音符でいくつ目に位置しているかを示す。また、iTickInBeatは、拍の先頭から32分音符でいくつ目に位置しているかを示す。
CPU11は、パラメータiおよびiPosを「0」に初期化して(ステップ1205)、iが8未満である限り(ステップ1206でYes)、ステップ1207から1210の処理を実行する。CPU11は、iTickInBeatの位置を特定するために、a=iTickInBeat−iResolution×i/8を算出する(ステップ1207)。ここで、iTickInBeatは、「0」〜「7」の何れかの値をとる。したがって、いずれかのiについて、a=0となり、次のステップ1208でYesと判断される。ステップ1208でNoと判断された場合には、CPU11は、パラメータiをインクリメントして(ステップ1209)、ステップ1206に戻る。ステップ1208でYesと判断された場合には、CPU11は、パラメータiPos=iとする(ステップ1210)。
ステップ1206でNoと判断された場合、或いは、ステップ1210の処理が終了した後、図13のステップ1301に進む。なお、本実施の形態においては、ステップ1204においてiTickInBeatの算出の際に、32分音符の分解能にクォンタイズされる。したがって、ステップ1210においてNoと判断されることは本来ありえない。したがって、この場合は、演算において何らかのエラーが生じたことになる。
このようにして得られたiPosは、音符が、拍の頭から32分音符で何番目の位置にあるかを示すものである。これをそのまま使って良いが、本実施の形態においては、小節の先頭、小節の中央および拍の先頭として、iPosとして異なる値を与える。iTickInMeas=0の場合、すなわち、音符が拍の先頭に位置している場合には(ステップ1301でYes)、CPU11は、iPos=32とする(ステップ1302)。また、iTickInBeat=0かつiBeat=2、つまり、音符が3拍目の先頭(小節の中央)に位置している場合には(ステップ1303でYes)、CPU11は、iPos=16とする(ステップ1304)。さらに、iTickInBeat=0、つまり、音符が2拍目或いは4拍目の先頭に位置している場合には(ステップ1305でYes)、CPU11は、iPos=8とする(ステップ1306)。
リズムコスト算出処理によって得られる分類項目の1つであるポジション(iPos)の分類値は、音符の小節中の位置によって以下のような値をとる。
音符の位置が、小節の先頭:iPos=32
音符の位置が、3拍目の先頭:iPos=16
音符の位置が、他の拍(2拍目、4拍目)の先頭:iPos=8
音符の位置が他の場合:iPos=拍を8等分した場合の位置を示す値
上記iPosは、楽曲が4/4拍子の場合の例であり、他の拍子(たとえば、3/4)の場合には、iPosは異なる。楽曲が3/4拍子であれば、分類値「iPos」は以下の値をとり得る。
音符の位置が、小節の先頭:iPos=32
音符の位置が、他の拍(2拍目、3拍目)の先頭:iPos=8
音符の位置が他の場合:iPos=拍を8等分した場合の位置を示す値
リズムコスト算出処理が終了すると、CPU11は、2次元のリズム難易度評価マップの値であるiRMap[0][iStepTime]をインクリメントする(ステップ1005)とともに、iRMap[1][iPos]をインクリメントする(ステップ1006)。その後、CPU11は、配列me[]に、次の楽音データのレコードを格納し(ステップ1007)、その後、ステップ1002に戻る。
ステップ1002でYesと判断された場合には、CPU11は、パラメータiおよびiRCostを「0」に初期化する(ステップ1101)。CPU11は、パラメータiが「2」以上であるかを判断する(ステップ1102)。上記パラメータiは、iRMap[i][j]の「i」を特定するためのものである。ステップ1102でNoと判断された場合には、パラメータjを「0」に初期化して(ステップ1103)、jが所定数より大きくなるまで(ステップ1104)、ステップ1105〜1107の処理を繰り返す。
CPU11は、リズム難易度評価マップの値iRMap[i][j]が「0」より大きいかを判断する(ステップ1105)。ステップ1105でYesと判断された場合には、CPU11は、リズム難易度評価マップの値iRMap[i][j]に対応付けられたコスト値iRCost[i][j]を、運指難易度の値iRCostに加算する(ステップ1106)。
以下、コスト値iRCost[i][j]を格納したコストテーブルiRCost[][]について説明する。運指難易度についてのコスト値iR[i][j]を格納したコストテーブルと同様に、コストテーブルiRCost[][]は、コスト値iRCost[i][j]のそれぞれに対応する、「i×j」個のコスト値iRCost[i][j]を格納している。たとえば、iRCost[0][j]は、リズムコスト算出処理(図12)のステップ1203で取得された音符長iStepTimeのそれぞれに対応するコスト値であり、音符長のそれぞれに固有の値となっている。また、iRCost[1][j]は、ステップ1210、ステップ1302、1304、1306で得られた拍内の音符位置iPosのそれぞれに対応するコスト値であり、音符位置のそれぞれに固有の値となっている。
たとえば、iRCost[0][iStepTime]においては、iStepTime=32、16、8、4、および、それら以外の値、について、コスト値iRCost[0][iStepTime]が増大するようになっている。つまり、音符長が、全音符であるとき、そのコスト値iRCost[0][32]がもっとも小さく、2分音符、4分音符、8分音符、その他の音符となるのにしたがって、コスト値は大きくなる。
また、iRCost[1][iPod]においても、iPos=32、16、8、それら以外の値、について、コスト値iRCost[1][iPos]が増大するようになっている。つまり、音符が小節の先頭に位置するとき、そのコスト値iRCost[1][32]がもっとも小さく、3拍目の先頭、2拍目或いは4拍目の先頭、その他の位置となるのにしたがって、コスト値は大きくなる。
運指難易度コストの算出と同様に、リズム難易度評価マップの値iRMap[i][j]が幾つであるかは考慮せず、0より大きければ(すなわち1以上であれば)、コスト値iRCost[i][j]を、リズム難易度の値iRCostに加算している。すなわち、リズム難易度評価マップの値の多寡にかかわらず、加算される値はコスト値iRCost[i][j]である。
ステップ1105でNoと判断された場合、或いは、ステップ1106が実行された後、CPU11は、jをインクリメントして(ステップ1107)、ステップ1104に戻る。また、ステップ1104でYesと判断された場合には、CPU11は、iをインクリメントして(ステップ1108)、ステップ1102に戻る。
このように本実施の形態においては、音符についてのリズム、特に、音符長および音符位置のそれぞれについて、対応するコスト値iRCost[i][j]が、リズム難易度iRCostに加算される。
次に、本実施の形態にかかる調性難易度評価処理について説明する。図14および図15は、本実施の形態にかかる調性難易度評価処理の例を示すフローチャートである。図15に示すように、CPU11は、配列me[]に先頭の楽音データのレコードを格納する(ステップ1401)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ1402でYes)、ステップ1403、1404を繰り返す。
CPU11は、配列me[]中の音高情報「Pit」に基づいて、カウント値iPC[Pit mod 12]をインクリメントする(ステップ1403)。ステップ1403においては、音符の、CからBまでの何れかの音名に対応するカウント値iPCがインクリメントされる。次いで、CPU11は、配列me[]に次の楽音データのレコードを格納して(ステップ1404)、ステップ1402に戻る。ステップ1402〜1404の処理によって、楽曲に含まれるノート(音符)の音名のそれぞれについて、累算値を格納した配列iPC[]が取得される。
ステップ1402でYesと判断された場合には、CPU11は、パラメータiTonality、iMax,iATMaxおよびiを「0」に初期化する(ステップ1405〜1407)。CPU11は、パラメータiが12以上になるまで(ステップ1408でNo)、図15のステップ1501〜1512を実行する。
図15に示すように、CPU11は、パラメータiSumおよびiATonalityを「0」に初期化する。ここに、iSumは、楽曲が含んでいたノート(音符)の音名の累算値と、各調の長音階との一致度を示すパラメータであり、iATonalityは、上記音名の累算値と、各調の長音階との不一致度を示すパラメータである。なお、本実施の形態においては、長音階の楽曲について、各調の長音階との一致度、不一致度を見出しているが、これに限定されるものではない。短音階の楽曲については、各調の短音階との一致度や不一致度を見出せば良い。
CPU11は、パラメータjを「0」に初期化して(ステップ1504)、iSumに、iPC[(j+i) mod 12]×iBaseScale[j]を加算する。また、CPU11は、iATonalityに、iPC[(j+i) mod 12]×iATonal[j]を加算する(ステップ1505)。その後、CPU11はjをインクリメントしてステップ1503に戻る。
図17(a)は、本実施の形態にかかるベーススケール配列iBaseScale[]の例を示す図である。図17(a)に示すように、iBaseScale[](符号1701)は、11個の要素(j=0〜11)を有し、長音階の音名に相当する要素(j=0、2、4、5、7、9、11)が「1」となり、それ以外が「0」となっている。なお、図17(a)において、配列の要素の上に配置された数字、♭(フラット)、#(シャープ)は、最も左のj=0の要素(根音)に対する間隔(度)を示している。また、図17(b)は、本実施の形態にかかる非ベーススケール配列iATonal[]の例を示す図である。iATonal[](符号1702参照)は、iBaseScale[]1701と同様に、11個の要素(j=0〜11)を有し、その値は、iBaseScaleと逆となっている。すなわち、長音階の音名に該当しない要素(j=1、3、6、8、10)が「1」となり、それ以外が「0」となっている。
以下、ステップ1504における、iSumに加算される値iPC[(j+i) mod 12]×iBaseScale[j]について説明する。たとえば、図18において、符号1801は、ステップ1402〜1404で得られた配列iPC[]の例を示す図、符号1802は、ベーススケール配列iBaseScale[]の例を示す図である。
iPC[j+i mod 12]×iBaseScale[j]において、i=0のときには、j=0、2、4、5、7、9において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=Σ(iPC[j mod 12]×iBaseScale[j])
=7+2+3+10+4+5=31となる。
i=1のときには、j=4、5、9、11において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=1+3+5+8=17となる。
また、i=5のときには、j=0、2、4、5、7、9、22において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=10+4+5+8+7+2+3=39となる。
さらに、i=7のときには、j=0、2、5、7、9において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=4+5+7+2+3=22となる。
iATonalityにiPC(j+i mod 12)×iATonal[j]を加算する演算も、iSumの演算と同様に実行され得る。
図19において、符号1901は、ステップ1402〜1404で得られた配列iPC[]の例を示す図、符号1902は、非ベーススケール配列iATonlity[]の例を示す図である。配列iPC[]は、図18の符号1801と同様である。
i=0のときには、iATonalityの最終値
iATonality=Σ(iPC[j mod 12]×iATonal[j]
=1+5+8=14となる。
また、i=1のときのiATonalityの最終値は、
iATonality=7+2+10+4+5=28(符号1903参照)
i=5のときのiATonalityの最終値は、
iATonality=5+1=6(符号1904参照)
i=7のときのiATonalityの最終値は、
iATonality=5+8+1+10=24(符号1905参照)となる。
ステップ1503でNoと判断された場合、つまり、特定のiについて、j=0〜11のiSumおよびiATonalityが算出された場合には、CPU11は、一致度iSumと不一致度iATonalityの差分値a(=iSum−iATonality)を算出する(ステップ1507)。
CPU11は、ステップ1507において得られた差分値aが、RAM13に記憶された差分値aの最大値iMaxより大きいかを判断する(ステップ1508)。ステップ1508でYesと判断された場合には、CPU11は、差分値aを最大値iMaxとしてセットし(ステップ1509)、かつ、最大値iMaxを得たときの調性を示すパラメータiTonalityにiをセットする(ステップ1510)。また、CPU11は、得られた不一致度iATonalityを、iSumの最大値が得られたときの対応する不一致度iATMaxとしてセットする(ステップ1511)。
ステップ1508でNoと判断された場合、または、ステップ1511が実行された後に、CPU11は、iをインクリメントして、ステップ1408に戻る。ステップ1408でNoと判断された場合には、CPU11は、調性難易度を示すiTCostを以下のように算出する(ステップ1409)。
iTCost=(iATMax×A)/iMax
ここに、Aは所定の定数である。したがって、iTCostは、調性の一致度が最大となったときの、音符の音階との一致度iSumとそのときの不一致度iATonalityとの差分値に対する、そのときの不一致度の比に、定数Aを乗じたものとなる。
先に説明したように、運指難易度iFCost、リズム難易度iRCostおよび調性難易度iTCostが算出されると、これら難易度および楽曲のノート数iCntに基づいて、以下のように楽曲の難易度iCostが算出される。
iCost=iFCost×RF+iRCost×RR
+iTCost×RT+iCnt×RC
次に、本実施の形態にかかる難易度表示処理について説明する。難易度評価処理(ステップ205)が終了し、新たな楽曲指定の入力が無かった場合(ステップ203でNo)、CPU11は、難易度表示処理を実行する(ステップ206)。難易度表示処理では、難易度iCostが算出された楽曲について、音符ごとに対応する難易度を示す印を付した楽譜を生成して、表示装置16の画面上に表示する。本実施の形態においては、音符ごとの運指難易度を楽譜上に示している。
図20は、本実施の形態にかかる難易度表示処理の例を示すフローチャートである。図20に示すように、CPU11は、配列me[]に先頭の楽音データのレコードを格納する(ステップ2001)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ2002でYes)、ステップ2003〜2009を繰り返す。
CPU11は、配列me[]中の音高情報「Pit」、発音時刻「Time」および発音時間「Gate」に基づいて、画像において、五線譜中の所定の位置に所定の音長の音符を配置する(ステップ2003)。また、CPU11は、配列me[]中の運指情報「Fig」に基づいて、画像において、音符の上部に指番号を配置する(ステップ2004)。次いで、CPU11は、me[]で特定される楽音データに関連付けられて、RAM13に記憶されたポジションタイプ(PosType)、指開きタイプ(iSpreadType)、リバースタイプ(RevType)、指使いテクニック(Tech)のそれぞれの分類項目についての分類値を取得する(ステップ2005)。
次いで、CPU11は、それぞれの値の何れかが「1」より大きいかを判断する(ステップ2006)。ステップ2006でYesと判断された場合には、CPU11は、該当する分類項目を示す印を、音符の上部に配置する(ステップ2007)。たとえば、PosType>1であれば「P」、iSpreadType>1であれば「S」、RevType>1であれば「R」、Tech>1であれば「T」という印が、画像において音符の上部に配置される。
さらに、CPU11は、音符に印が付された分類項目に対応する色彩を付与する(ステップ2008)。たとえば、PosType>1であれば赤、iSpreadType>1であれば水色、RevType>1であれば黄緑、Tech>1であれば桃色という色彩が音符に付与される。なお、PosTypeおよびiSpreaTypeの双方とも、1より大きい値を持っていた場合には、PosTypeについてのコスト値iFCost[0][PosType]と、iSpreadTypeについてのコスト値iFcost[1][iSpreadType]とを比較して、コスト値の大きい方の分類項目に対応する色彩が選択される。
その後、CPU11は、配列me[]に次の楽音データのレコードを格納して(ステップ2009)、ステップ2002に戻る。
図21は、本実施の形態にかかる難易度表示処理により生成された楽譜の画像の例を示す図である。図21に示すように、楽曲を構成する音符の上部には、1〜5の指番号が表示されるとともに、特定の音符においては、分類項目に対応する印(「P」、「S」、「R」、「T」)が音符の上部に付加されている。また、図21では表われていないが、印「T」が付された音符(たとえば、第2小節第3拍の「G4」)には、対応する色彩である桃色が付されている。同様に、印「S」が付された音符(たとえば、第3小節第1拍の「E5」)には、対応する色彩である水色が付され、印「R」が付された楽譜(たとえば、第7小節第1拍の「F#4」、第2拍の「G4」)には、対応する色彩である黄緑色が付される。
さらに、印「S」および「P」の双方が付されている音符(たとえば、第3小節の第3.5拍の「F#5」、第4小節の第1拍の「G5」)においては、コスト値の大きい方の分類項目(この場合には、PosType)の色彩(この場合には、赤色)が付される。
次に、本実施の形態にかかる習得楽曲対応処理(図2のステップ208)についてより詳細に説明する。図22は、本実施の形態にかかる習得楽曲対応処理の例を示すフローチャートである。図22に示すように、CPU11は、ステップ207で指定された楽曲に関連付けられた運指難易度評価マップiFMap[][]を、RAM13から読み出す(ステップ2201)。次いで、CPU11は、操作者(演奏者)固有の楽曲習得度マップiFMapAbl[][]が、RAM13に格納されているかを判断する(ステップ2202)。たとえば、操作者(演奏者)の情報は、上記ステップ207の楽曲指定において、楽曲を指定する情報と共に入力されれば良い。
ステップ2202でYesと判断された場合には、CPU11は、RAM13に格納された、当該操作者(演奏者)に固有の楽曲習得度マップiFMapAbl[][]を読み出す(ステップ2203)。ステップ2202でNoと判断された場合には、RAM13に新規の楽曲習得度マップiFMapAbl[][]を生成する。なお、新規の楽曲習得度マップのマップ値iFMapAbl[i][j]は、全て「0」である。
次いで、CPU11は、パラメータiを初期化して(ステップ2205)。パラメータiが「4」以上であるかを判断する(ステップ2206)。ステップ2206でYesと判断された場合には処理を終了する。その一方、ステップ2206でNoと判断された場合には、CPU11は、パラメータjを「0」に初期化して(ステップ2207)、jが所定数より大きくなるまで(ステップ2208)、ステップ2209〜2211を繰り返す。
CPU11は、楽曲に関連付けられた運指難易度評価マップiFMap[][]のマップ値iFMap[i][j]が「0」より大きいかを判断する(ステップ2209)。ステップ2209でYesと判断された場合には、CPU11は、楽曲習得度マップiFMapAbl[][]において、パラメータi、jにて特定されるマップ値iFMapAbl[i][j]に「1」をセットする(ステップ2210)。ステップ2209でNoと判断された場合、或いは、ステップ2210の後、CPU11は、パラメータjをインクリメントして(ステップ2211)、ステップ2208に戻る。
このように、習得楽曲登録モードにおいて操作者により習得済みの楽曲が指定されると、運指難易度評価マップiFMap[][]のマップ値iFMap[i][j]が「1」以上となっているような、当該楽曲について分類項目の具体的態様について、楽曲習得度マップiFMapAbl[][]のマップ値iFMapAbl[i][j]も「1」となる。したがって、図6のステップ606で、マップ値iFMapAbl[i][j]=0であるかが判断され、上記マップ値が「0」ではない場合には、iFCost[i][j]を、コストiFCostに反映させない。これにより、操作者(演奏者)が習得済みの事項(分類項目の具体的態様)を除外した楽曲の難易度の算出が可能となる。
本実施の形態においては、CPU11により、楽曲を構成する音符に関する楽音データの前記音高情報、運指情報および時間情報のいずれかに基づいて、前記楽曲の難易度を算出する難易度算出処理が実行される。難易度算出処理において、CPU11は、楽曲ごとに、楽曲の構成要素(たとえば、運指やリズム)に関する分類項目のそれぞれにおいて、その具体的態様の存在を示す難易度評価マップを生成して、RAM13などの記憶装置段に格納するとともに、難易度評価マップを参照して、分類項目の具体的態様のそれぞれに対するコスト値を格納した、RAM13など記憶手段に格納されたコストテーブルから、分類項目における具体的態様に対するコスト値を取得するとともに、当該コスト値を累算し、累算されたコスト値を前記運指に関する難易度として取得する。また、CPU11は、習得楽曲対応処理において、分類項目のそれぞれにおいて、その具体的態様の各々について、演奏者による習得の有無を示す習得度マップを生成して、RAM13など記憶装置に格納する。さらに、本実施の形態においては、CPU11はコスト累算の際に、習得度マップを参照して、分類項目の具体的態様における習得の有無を考慮して、コスト値を取得する。
したがって、本実施の形態によれば、演奏者が習得した楽曲において、分類項目の具体的態様が含まれる場合には、その分類項目の具体的態様が習得されたことを考慮したコスト値の算出を行なうことができる。したがって、演奏者の楽曲の習得にしたがった、当該演奏者の技量を考慮した楽曲の難易度を得ることが可能となる。
また、本実施の形態においては、CPU11は、習得度マップを参照して、分類項目の具体的態様において習得があった場合に、分類項目の具体的態様について対応するコスト値を、コスト値の累算から除外する。したがって、複雑な演算を経ることなく、演奏者の楽曲の習得にしたがった、当該演奏者の技量を考慮した楽曲の難易度を得ることが可能となる。
また、本実施の形態において、CPU11は、楽曲ごとに、難易度評価マップを参照して、分類項目の具体的態様が存在することを示している場合に、習得度マップにおいて、分類項目の具体的態様について所定値(たとえば「1」)をセットする。この場合には、習得度マップはフラグを格納するマップとなる。また、ある分類項目の具体的態様において、一度習得すれば、上記フラグが「1」とセットされ、当該分類項目の具体的態様については完全に習得したことを意味する。
本実施の形態においては、難易度算出処理には、音高情報および運指情報に基づいて、隣接する音符を押鍵する運指に関する運指難易度を算出する処理が含まれる。演奏者による運指の技量を考慮した楽曲の難易度を得ることが可能となる。
次に、本発明の第2の実施の形態について説明する。第1の実施の形態においては、楽曲習得度マップiFMapAbl[][]のマップ値iFMapAbl[i][j]は、「0」または「1」の値をとり、コストiFCost算出の際に、マップ値iFMapAbl[i][j]=0であるかが判断され、上記マップ値が「0」ではない場合には、iFCost[i][j]を、コスト値iFCostに反映させない。第2の実施の形態においては、マップ値iFMapAbl[i][j]は、0〜Max(Max:所定の正の値)の何れかをとり、コスト値iFCost算出の際に、特定の分類項目の具体的態様についてのコスト値iFCost[i][j]に、マップ値iFMapAbl[i][j]を考慮した重みを与えて、コスト値iFCostに加算している。
図23は、第2の実施の形態にかかる運指難易度評価処理の後半部分の例を示すフローチャートである。図23において、ステップ2301〜2305は、図6のステップ601〜605と同様である。また、ステップ2307、2308は、図6のステップ608、609と同様である。第2の実施の形態においては、ステップ2305でYesと判断された場合には、CPU11は、運指難易度評価マップの値iFMap[i][j]に対応付けられたコスト値iFCost[i][j]に、重み(1−(iFMapAbl[i][j]/Max))を乗じて、重みが乗じられたコスト値を、運指難易度の値iFCostに加算する(ステップ2306)。
次に、第2の実施の形態にかかる習得楽曲対応処理についてより詳細に説明する。図24は、第2の実施の形態にかかる習得楽曲対応処理の例を示すフローチャートである。図24において、ステップ2401〜2409は、図22のステップ2201〜2209と同様である。また、図24のステップ2412、2413は、図22のステップ2211、2212と同様である。第2の実施の形態においては、楽曲習得度マップiFMapAbl[][]のマップ値iFMapAbl[i][j]は、0〜Maxの何れかの値をとり得る。
図24において、ステップ2409でYesと判断された場合には、CPU11は、マップ値iFMapAbl[i][j]が、取り得る値の最大値Maxより小さいかを判断する(ステップ2410)。ステップ2410でYesと判断された場合には、CPU11は、マップ値iFMapAbl[i][j]をインクリメントする(ステップ2411)。ステップ2409または2410でNoと判断された場合、或いは、ステップ2411の後、CPU11は、パラメータjをインクリメントして(ステップ2412)、ステップ2408に戻る。なお、Maxは、たとえば、大規模記憶装置14に格納された楽曲データの楽曲総数としても良い。これによれば、全ての楽曲の習得が終了することで、iFMapAbl[i][j]/Maxは「1」となり得る。したがって、iFCostに加算すべきiFCost[i][j]×(1−(iFMapAbl[i][j]/Max)の値が「0」となり得る。
第2の実施の形態においては、CPU11は、習得度マップの生成において、楽曲ごとに、難易度評価マップを参照して、分類項目の具体的態様が存在することを示している場合に、習得度マップにおいて、分類項目の具体的態様について、マップ値を累算する。また、CPU11は、コスト累算において、習得度マップを参照して、分類項目の具体的態様において累算された値が格納されている場合に、分類項目の具体的態様について対応するコスト値に、累算された値に基づく重みを付与する。したがって、第2の実施の形態によれば、分類項目の具体的態様における習得の度合いを、累算値として知ることができ、この習得の度合いを考慮した難易度算出が実現できる。
また、第2の実施の形態においては、重みが、累算された値の所定数に対する比に相当する。これにより、ある所定数の楽曲について分類項目の具体的態様における習得がなされたことをもって、当該分類項目の具体的態様を完全に習得したとすることができる。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
たとえば、前記第1の実施の形態および第2の実施の形態においては、運指難易度について、楽曲習得度マップを生成し、運指難易度にかかるコストiFCostの算出の際に、楽曲習得度マップを参照して、既に習得済みの、運指に関する分類項目の具体的態様について、コスト値iFCost[i][j]の加算を行なわず、或いは、一定の重みを加えてコスト値iFCost[i][j]の加算を行なっている。
しかしながら、運指難易度に限定されず、リズム難易度についても、同様に、楽曲習得度マップを生成して、楽曲習得度マップを参照して、コスト値の加算の是非を判断し、或いは、コスト値に重みを付与しても良い。
図25および図26は、本発明の第3の実施の形態にかかるリズム難易度評価処理の例を示すフローチャートである。図25において、ステップ2501〜2507は、図10のステップ1001〜1007と同様である。また、図26において、ステップ2601〜2605、2607〜2609は、図11のステップ1101〜1105、1106〜1108と同様である。
図25において、ステップ2502でYesと判断された場合には、CPU11は、ステップ2505および2506でマップ値がインクリメントされたリズム難易度評価マップiRMap[][]を、楽曲を特定する情報と関連付けて、記憶装置(たとえばRAM13)に格納する(ステップ2508)。この楽曲を特定する情報と関連付けられたリズム難易度評価マップiRMap[][]は、後述する第3の実施の形態にかかる習得楽曲対応処理において参照される。
また、図26において、ステップ2605でYesと判断された場合には、CPU11は、操作者(演奏者)の楽曲習得度マップのマップ値iRMapAbl[i][j]が「0」であるかを判断する(ステップ2606)。ステップ206でYesと判断された場合には、CPU11は、リズム難易度評価マップの値iRMap[i][j]に対応付けられたコスト値iRCost[i][j]を、運指難易度の値iRCostに加算する(ステップ1106)。
図27は、第3の実施の形態にかかる習得楽曲対応処理の例を示すフローチャートである。図27に示すように、CPU11は、楽曲に関連付けられたリズム難易度評価マップiRMap[][]を、RAM13から読み出す(ステップ2701)。次いで、CPU11は、操作者(演奏者)固有の楽曲習得度マップが、RAM13に格納されているかを判断する(ステップ2702)。
ステップ2702でYesと判断された場合には、CPU11は、RAM13に格納された、当該操作者(演奏者)に固有の楽曲習得度マップiRMapAbl[][]を読み出す(ステップ2703)。ステップ2702でNoと判断された場合には、RAM13に新規の楽曲習得度マップiRMapAbl[][]を生成する。なお、新規の楽曲習得度マップのマップ値iRMapAble[i][j]は、全て「0」である。
次いで、CPU11は、パラメータiを初期化して(ステップ2705)。パラメータiが「2」以上であるかを判断する(ステップ2706)。ステップ2706でYesと判断された場合には処理を終了する。その一方、ステップ2706でNoと判断された場合には、CPU11は、パラメータjを「0」に初期化して(ステップ2707)、jが所定数より大きくなるまで(ステップ2708)、ステップ2709〜2711を繰り返す。ステップ2708でYesと判断された場合には、CPU11は、パラメータiをインクリメントして(ステップ2712)、ステップ2706に戻る。
CPU11は、楽曲に関連付けられたリズム難易度評価マップiRMap[][]のマップ値iRMap[i][j]が「0」より大きいかを判断する(ステップ2709)。ステップ2709でYesと判断された場合には、CPU11は、楽曲習得度マップiRMapAbl[][]において、パラメータi、jにて特定されるマップ値iRMapAbl[i][j]に「1」をセットする(ステップ2710)。ステップ2709でNoと判断された場合、或いは、ステップ2710の後、CPU11は、パラメータjをインクリメントして(ステップ2711)、ステップ2708に戻る。
上述したように、第3の実施の形態においては、操作者により習得済みの楽曲が指定されると、リズム難易度評価マップiRMap[][]のマップ値iRFMap[i][j]が「1」以上となっているような、当該楽曲について分類項目の具体的態様について、楽曲習得度マップiRMapAbl[][]のマップ値iRMapAbl[i][j]も「1」となる。したがって、図26のステップ2606で、マップ値iRMapAbl[i][j]=0であるかが判断され、上記マップ値が「0」ではない場合には、iRCost[i][j]を、コストiRFCostに反映させない。これにより、操作者(演奏者)が習得済みの事項(分類項目の具体的態様)を除外した楽曲の難易度の算出が可能となる。すなわち、演奏者によるリズムに関する技量を考慮した楽曲の難易度を得ることが可能となる。
さらに、リズムコストiRCostの算出においても、第2の実施の形態と同様に、コスト値iRCost[i][j]に、iRMapAbl[i][j]に基づく重みを乗じて、重みが乗じられたコスト値を、iRCostに加算しても良い。この場合に図27に示す習得楽曲対応処理のステップ2710の代わりに、図24のステップ2410,2411と同様に、CPU11は、リズム難易度評価マップの値iRMap[i][j]が最大値Maxより小さい限り、リズム難易度評価マップの値iRMap[i][j]をインクリメントする。
また、図26において、習得度マップiRMapAbl[i][j]が「0」であるか否かの判断(ステップ2406)を行なうことなく、CPU11は、ステップ2607において、リズム難易度評価マップの値iRMap[i][j]に対応付けられたコスト値RCost[i][j]に、重み(1−(iRMapAbl[i][j]/Max))を乗じて、重みが乗じられたコスト値を、運指難易度の値iRCostに加算すれば良い。