説明

楽曲難易度算出装置および楽曲難易度算出プログラム

【課題】 楽曲を構成する種々の要素を考慮して、適切に楽曲の難易度を算出する。
【解決手段】 CPU11は、楽音データ中の音高情報、運指情報、および、時間情報の何れかに基づいて、楽曲の演奏に必要な複数の要素(運指、リズム、調性)のそれぞれについて個別難易度を算出し、算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出する。また、CPU11は、個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与された、専門家による同一の楽曲の難易度評価値との相関が最大となるように、重み係数を最適化する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、楽曲の難易度を評価する楽曲難易度算出装置および楽曲難易度算出プログラムに関する。
【背景技術】
【0002】
従来、楽曲の難易度を評価するときに、音楽教育の専門家や演奏家が、その楽曲における種々の要素、たとえば、音符の連なりなどに基づいて、主観的な評価を行なっていた。従来の主観的な評価では、たとえば、楽曲の構成要素についての客観的な難易度は存在せず、楽曲全体としての評価(たとえば、10段階評価など)がなされているに過ぎない場合が多かった。
【0003】
これに対して、楽曲を鍵盤楽器にて演奏する際の運指情報に基づいて、当該運指の難易度を算出する装置が提案されている。特許文献1には、ある音程の2音を2つの指にて押さえるような全ての場合を想定し、当該全ての場合のコストを定義し、運指情報が示す運指を行なう上での難易度を算出する難易度算出方法が提案されている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2006−78656号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、従来の難易度を算出する装置では、2音を2つの指にて押さえるような全ての場合の全てについてコスト値を定義するのが容易ではないという問題点があった。また、楽曲の難易度は運指のみではなく、他にも種々の要素が存在する。したがって、他の要素も考慮したうえで難易度を算出することが望ましい。
【0006】
また、種々の要素を考慮して算出された難易度が、上記音楽教育の専門家や演奏家が同じ楽曲に対して出した評価と逸脱していることは望ましくなく、算出された難易度も、専門家の評価とほぼ同様であることが望ましい。
【0007】
本発明は、楽曲を構成する種々の要素を考慮して、適切に楽曲の難易度を算出する楽曲難易度算出装置および楽曲難易度算出プログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
本発明の目的は、楽曲を構成する音符ごとの音高情報、当該音符を押鍵する際の運指情報、および、当該音符についての時間情報を含む楽音データを格納した記憶手段と、
前記音高情報、運指情報、および、時間情報の何れかに基づいて、楽曲の演奏に必要な複数の要素のそれぞれについて個別難易度を算出する個別難易度算出手段と、
算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出し、算出された難易度を記憶手段に格納する全体難易度算出手段と、
前記複数の個別難易度に乗じる重み係数を最適化する重み係数最適化手段と、を備え、
前記重み係数最適化手段が、予め算出され記憶手段に格納された個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与され、記憶手段に格納されていた専門家による同一の楽曲の難易度評価値との相関が最大となるように、前記重み係数を算出するように構成されたことを特徴とする楽曲難易度算出装置により達成される。
【0009】
好ましい実施態様においては、前記重み係数最適化手段が、前記要素ごとに、前記重み係数の基礎値の周辺値である、重み係数候補値を求め、前記全ての要素についての重み係数の候補値の組を用いて、前記難易度演算値を算出する。
【0010】
より好ましい実施態様においては、前記重み係数最適化手段が、前記重み係数候補値を、基礎値に、所定範囲で変化する係数を乗じることにより算出する。
【0011】
別の好ましい実施態様においては、前記難易度算出手段が、
前記音高情報および運指情報に基づいて、隣接する音符を押鍵する運指に関する運指難易度を算出する運指難易度算出手段と、
前記音符についての時間情報に基づいて、当該音符長および音符のタイミングに関するリズム難易度を算出するリズム難易度算出手段と、
前記音符の音高情報に基づいて、当該楽曲の調性に関する調性難易度を算出する調性難易度算出手段と、を有する。
【0012】
また、本発明の目的は、楽曲を構成する音符ごとの音高情報、当該音符を押鍵する際の運指情報、および、当該音符についての時間情報を含む楽音データを格納した記憶手段を備えたコンピュータに、
前記音高情報、運指情報、および、時間情報の何れかに基づいて、楽曲の演奏に必要な複数の要素のそれぞれについて個別難易度を算出する個別難易度算出ステップと、
算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出し、算出された難易度を記憶手段に格納する全体難易度算出ステップと、
前記複数の個別難易度に乗じる重み係数を最適化する重み係数最適化ステップと、を実行させ、
前記重み係数最適化ステップが、予め算出され記憶手段に格納された個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与され、記憶手段に格納されていた専門家による同一の楽曲の難易度評価値との相関が最大となるように、前記重み係数を算出するステップを含むことを特徴とする楽曲難易度算出プログラムにより達成される。
【発明の効果】
【0013】
本発明によれば、楽曲を構成する種々の要素を考慮して、適切に楽曲の難易度を算出する楽曲難易度算出装置および楽曲難易度算出プログラムを提供することが可能となる。
【図面の簡単な説明】
【0014】
【図1】図1は、本発明の実施の形態にかかる楽曲難易度算出装置の構成を示すブロックダイヤグラムである。
【図2】図2は、本実施の形態にかかる楽曲難易度算出装置10において実行される処理の概略を示すフローチャートである。
【図3】図3は、本実施の形態にかかる楽曲データのデータ構成例を示す図である。
【図4】図4は、本実施の形態にかかる難易度評価処理の例を概略的に示すフローチャートである。
【図5】図5は、本実施の形態にかかる運指難易度評価処理の例を示すフローチャートである。
【図6】図6は、本実施の形態にかかる運指難易度評価処理の例を示すフローチャートである。
【図7】図7は、本実施の形態にかかるテクニック分類処理の例を示すフローチャートである。
【図8】図8は、本実施の形態にかかるテクニック分類処理の例を示すフローチャートである。
【図9】図9は、本実施の形態にかかる指開き特定処理の例を詳細に示すフローチャートである。
【図10】図10は、本実施の形態にかかるリズム難易度評価処理の例を示すフローチャートである。
【図11】図11は、本実施の形態にかかるリズム難易度評価処理の例を示すフローチャートである。
【図12】図12は、本実施の形態にかかるリズムコスト算出処理の例を示すフローチャートである。
【図13】図13は、本実施の形態にかかるリズムコスト算出処理の例を示すフローチャートである。
【図14】図14は、本実施の形態にかかる調性難易度評価処理の例を示すフローチャートである。
【図15】図15は、本実施の形態にかかる調性難易度評価処理の例を示すフローチャートである。
【図16】図16は、本実施の形態において鍵位置情報を説明するための図である。
【図17】図17(a)は、本実施の形態にかかるベーススケール配列iBaseScale[]の例を示す図、図17(b)は、本実施の形態にかかる非ベーススケール配列iATonal[]の例を示す図である。
【図18】図18は、本実施の形態にかかる長音階との一致度iSumの算出を説明するための図である。
【図19】図19は、本実施の形態にかかる長音階との不一致度iATonalityの算出を説明するための図である。
【図20】図20は、本実施の形態にかかる係数最適化処理の例を示すフローチャートである。
【図21】図21は、本実施の形態にかかる最適値算出処理の例を示すフローチャートである。
【図22】図22は、本実施の形態にかかる最適値算出処理の例を示すフローチャートである。
【図23】図23は、本実施の形態にかかる難易度算出処理の例を示すフローチャートである。
【発明を実施するための形態】
【0015】
以下、添付図面を参照して、本発明の実施の形態について説明する。図1は、本発明の実施の形態にかかる楽曲難易度算出装置の構成を示すブロックダイヤグラムである。図1に示すように、本実施の形態にかかる楽曲難易度算出装置10は、CPU11、ROM12、RAM13、大規模記憶装置14、入力装置15、表示装置16、サウンドシステム17および鍵盤18を有している。
【0016】
CPU11は、後述する楽曲の難易度を評価するための種々の処理(運指難易度評価処理、リズム難易度評価処理、調性難易度評価処理、全体難易度の算出処理)を実行する。ROM12は、楽音難易度を評価するための種々の処理(運指難易度評価処理、リズム難易度評価処理、調性難易度評価処理、全体難易度の算出処理)のプログラムや、処理に使用するパラメータなどを格納する。RAM13は、プログラムの実行の過程で生じたパラメータ、入力データ、出力データなどを一時的に記憶する。大規模記憶装置14は、ハードディスク装置やメモリカードなどであり、楽曲データなどを格納する。
【0017】
入力装置15は、スイッチ類、キーボード、マウスなどを含み、操作者のスイッチ操作、キー操作、マウスの操作に基づく種々の指示などをCPU11に与える。表示装置12の画面上には、楽曲データに基づく楽譜、楽曲難易度の評価結果などを含む画像データが表示される。サウンドシステム40は、楽音生成回路、増幅器、スピーカなどを含み、楽曲データにしたがって、或いは、操作者による鍵盤18の押鍵操作にしたがって所定の楽音を生成して、楽音に基づく音響信号を出力する。なお、上記実施の形態において、鍵盤18は必須ではない。
【0018】
また、本実施の形態にかかる楽曲難易度評価装置10は、鍵盤楽器の形態であっても良いし、或いは、パーソナルコンピュータのような形態であっても良い。鍵盤楽器の形態であれば、操作者は、表示装置16の画面上に表示された楽譜を参照して、鍵盤18の鍵を押鍵し、サウンドシステム17が、操作者の押鍵に応答して、押鍵された鍵の音高に対応する楽音データを生成することで、サウンドシステム17から楽音を出力することができる。
【0019】
図2は、本実施の形態にかかる楽曲難易度評価装置10において実行される処理の概略を示すフローチャートである。図2に示すように、本実施の形態にかかる楽曲難易度評価装置10のCPU11は、RAM13に格納されたパラメータ等のクリア、表示装置16の画面上に表示された画像のクリアなどを含むイニシャライズを実行する(ステップ201)。次いで、CPU11は、操作者が入力装置15を操作して楽曲指定の入力があったかを判断する(ステップ202)。たとえば、楽曲指定の入力は、楽曲データの番号を入力することにより実現される。
【0020】
ステップ202でYesと判断された場合には、CPU11は、大規模記憶装置14に格納された楽曲データ群から、指定された楽曲の楽曲データを読み出して、RAM13に一時的に記憶する(ステップ203)。次いで、CPU11は、難易度評価処理を実行して、データを読み出された楽曲の難易度を示す値iCostを算出する(ステップ204)。ステップ202でNoと判断されると、CPU11は、操作者が入力装置15を操作して、係数最適化の指示を入力しているかを判断する(ステップ205)。ステップ205でYesと判断された場合には、CPU11は、係数最適化処理を実行する(ステップ206)。難易度評価処理および係数最適化処理については、以下に詳述する。
【0021】
図3は、本実施の形態にかかる楽曲データのデータ構成例を示す図である。図3に示すように、ある楽曲の楽曲データは、音符(ノート)ごとに、発音すべき楽音を示す楽音データのレコード(符号301、302参照)を有する。楽音データのレコード(たとえば、先頭のノートのレコードNote[0]:符号301)は、音高情報「Pit」、鍵盤位置情報「Pos」、運指情報「Fig」、発音時刻「Time」、発音時間「Gate」、次のノートのレコードへのポインタ「*Next」および前のノートのレコードへのポインタ「*prev」という項目を含む。
【0022】
音高情報「Pit」は、たとえば、音名「C−1」を「0」として、音高が1つ高くなるごとに「1」を増分させた値である。鍵盤位置情報「Pos」は、当該音高に対応する鍵の横方向の中心位置を示す座標値である。たとえば、図16に示すように、ある位置のC(たとえば、C4:Pit=60)の鍵盤位置情報Pos=Xとすると、C#4〜C5までの鍵盤位置情報は、それぞれ、X〜X12で示すような値となる。図16から理解できるように、隣接する白鍵と黒鍵、黒鍵と白鍵との間の座標値の差は「1」である。その一方、連続する白鍵(EとF、BとC)との間の座標値の差は「2」となる。
【0023】
図4は、本実施の形態にかかる難易度評価処理の例を概略的に示すフローチャートである。図4に示すように、CPU11は、運指難易度評価処理(ステップ401)、リズム難易度評価処理(ステップ402)、調性難易度評価(ステップ403)、全体難易度の算出処理(ステップ404)を実行する。運指難易度評価処理において、CPU11は、楽音データ中の運指情報などに基づいて、運指難易度iFCostを算出する。リズム難易度評価処理において、CPU11は、楽音データ中の発音時刻、発音時間などに基づいて、リズム難易度RCostを算出する。また、調性難易度評価処理において、CPU11は、楽音データの音高情報などに基づいて、調性難易度iTCostを算出する。ステップ401〜403において算出された運指難易度、リズム難易度および調性難易度が、それぞれ個別難易度に相当する。
【0024】
CPU11は、算出した運指難易度iFCost、リズム難易度iRCost、調性難易度iTCostおよび楽曲データ中のノート数(iCnt)に基づいて、それぞれに、重み係数RF、RR、RTおよびRCを乗じて加算することで楽曲の難易度iCostを算出する(ステップ404)。すなわち、難易度iCostは以下の数式のようになる。
【0025】
iCost=iFCost×RF+iRCost×RR
+iTCost×RT+iCnt×RC
以下、運指難易度評価処理、リズム難易度評価処理および調性難易度評価処理について詳細に説明する。図5および図6は、本実施の形態にかかる運指難易度評価処理の例を示すフローチャートである。なお、本実施の形態においては、楽曲データは、右手で演奏する楽曲(メロディ)の音符についての楽音データから構成される。したがって、運指難易度においては、右手で演奏する場合の運指難易度が算出され。楽曲データ中、楽音データのレコードの運指情報は、右手のどの指で押鍵するかを示している。また、指番号「1」〜「5」は、それぞれ、親指〜小指で押鍵すべきことを示している。
【0026】
図5に示すように、CPU11は、楽音データに示す楽曲のノート(音符)数を示すパラメータiCntを「0」に初期化するとともに(ステップ501)、RAM13の楽曲データ中、最初の楽音データのレコードNote[0]を、配列me[]に格納する(ステップ502)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ503でYes)、ステップ504〜515を繰り返す。
【0027】
まず、CPU11は、配列me[]に格納された楽音データのレコードの、一つ前の楽音でデータのレコードを特定し、それを配列prev[]に格納する(ステップ504)。次いで、CPU11は、配列me[]および配列prev[]に格納された値に基づいて、テクニック分類処理を実行する(ステップ505)。テクニック分類処理においては、楽曲の隣接する音符間の運指について、ポジションタイプ(PosType)、指開きタイプ(iSpreadType)、リバースタイプ(RevType)、および、指使いテクニック(Tech)という4つの分類項目のそれぞれの何れに該当するかを判断する。
【0028】
ここで、ポジションタイプ(PosType)という分類項目は、どのような指のポジションで運指が行なわれるかを示す。また、指開きタイプ(iSpreadType)は、隣接する音符を押鍵する指の開き具合を示す。また、リバースタイプ(RevType)は、後述する指くぐり、或いは、指返し(乗り越え)の存在を示す。さらに、指使いテクニック(Tech)は、隣接する音符を押鍵するときにどのような指使い(指換え)がなされているかを示す。
【0029】
テクニック分類処理では、それぞれの分類項目について、当該分類項目における具体的提要を示す分類値が算出される。図7および図8は、本実施の形態にかかるテクニック分類処理の例を示すフローチャートである。CPU11は、配列me[]中の運指情報「Fig」、音高情報「Pit」および鍵盤位置情報「Pos」について、f1=Fig、p1=Pit、ps1=Posとする。また、音高情報「Pit」に基づき、鍵が白鍵か黒鍵かを判断し、白鍵、黒鍵の何れかを示す情報をb1とする。値b1は、鍵が黒鍵であることを示す値「1」或いは鍵が白鍵であることを示す値「0」の何れかをとる。これら値f1、p1、ps1、b1は、RAM13に格納される。
【0030】
また、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)。
【0031】
音高差を示す指標iDistは、楽曲において音符の進行が上行であったときに、指番号が増大あるいは減少しているか、また、進行が下行であったときに、指番号が減少或いは増大しているかを示す指標である。本実施の形態においては、iDistは以下のように求められる。
【0032】
iDist=(p1−p2)*(f1−f2)
したがって、iDist>0である場合には、音符の進行が上行かつ指番号が増大するような指使いである場合、或いは、音符の進行が下行かつ指番号が減少するような指使いである場合を意味している。すなわち、iDist>0である場合には、指が開く形態で運指が行なわれる(指くぐりや指返しが行なわれない)ことを示している。
【0033】
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)。
【0034】
次いで、CPU11は、f2=f1かつp2≠p1であるかを判断する(ステップ708)。ステップ708でYesとなる場合とは、隣接する音符間で異なる音高の鍵が同じ指で押鍵されることを示す。ステップ708でYesと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、「Tech=4」という値を与える(ステップ709)。ステップ708でNoと判断された場合には、CPU11は、指使いテクニック(Tech)という分類項目について、「Tech=1」という値を与える(ステップ710)。
【0035】
次に、CPU11は、iDist>0であるかを判断する(ステップ801)。上述したように、iDist>0であることは、指が開く形態で運指が行なわれる(指くぐりや指返しが行なわれない)ことを示している。ステップ801でYesと判断された場合には、CPU11は、b2、b1、f2およびf1に基づいて、所定のテーブルiPType[][][][]に基づいて、分類値PosTypeとして、PosType=iPType[b2][b1][f2][f1]を取得する(ステップ802)。テーブルiPType[][][][]は、隣接する音符について、指番号および白鍵/黒鍵の種別に基づく値を含み、RAM13に格納される。
【0036】
テーブルiPType[][][][]における値について以下に簡単に説明する。テーブルiPtype[][][][]は、隣接する音符に配置すべき指の指番号およびその位置(白鍵或いは黒鍵)の関係に基づいて、その指のポジションタイプを格納したテーブルである。たとえば、現在の音符および一つ前の音符の双方が白鍵であれば、iPType[0][0][f2][f1]=1となる。また、一つ前の音符が親指でかつ白鍵が押鍵されていれば、現在の音符が黒鍵であった場合に、iPType[0][1][1][f1]=2となる。また、一つ前の音符が親指でかつ黒鍵が押鍵されていれば、現在の音符が黒鍵であった場合に、iPType[1][1][1][f1]=3となる。
【0037】
このように、テーブルiPtypeにおいては、隣接する音符を押鍵するときの手のむきや指の位置の難易度が高まるのに応じて、値が大きくなるようになっている。
【0038】
ステップ802が実行された後、CPU11は、指開き特定処理を実行する(ステップ803)。図9は、本実施の形態にかかる指開き特定処理の例を詳細に示すフローチャートである。
【0039】
図9に示すように、CPU11は、指開きの度合いを示すパラメータであるiMin、iL1およびiL2(iMin<iL1<iL2)をRAM13から取得する(ステップ901)。たとえば、iMinは、白鍵での長2度の幅に相当する「2」、iL1は、白鍵での長3度に相当する「4」、iL1は、白鍵での完全8度に相当する「14」である。指開き特定処理においては、iDistと、iMin、iL1およびiL2とを比較して、指開きタイプ(iSpreadType)の分類値を決定していく。
【0040】
CPU11は、鍵盤位置に基づく距離iKDist=|ps2−ps1|を算出する(ステップ902)。
【0041】
ステップ703において算出されたiDist<0である場合には(ステップ903でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、分類値iSpreadTypeとして、「iSpreadType=0」という値を与える(ステップ904)。なお、図9が実行されるときには、iDist>0であることが前提である(図8のステップ801参照)。したがって、これは実際には起こりえないことであるため、ステップ904はエラー処理となる。
【0042】
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)。
【0043】
iKDist<iL2である場合(ステップ911でYes)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=4」という値を与える(ステップ912)。その一方、iKDist≧iL2である場合(ステップ911でNo)、CPU11は、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=5」という値を与える(ステップ913)。
【0044】
指開き特定処理によって、iKDistの値にしたがって、以下のようなiSpreadTypeの値が付与される。
【0045】
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)。
【0046】
ステップ801でNoと判断された場合には、所定のテーブルiRType[][][][]に基づいて、RevType=iRType[p2][p1][f2][f1]を取得する(ステップ806)。テーブルiRType[][][][]は、隣接する音符について、指番号および音高に基づく値を含み、RAM13に格納される。
【0047】
テーブルiRType[][][][]における値について以下に簡単に説明する。テーブルiRtype[][][][]は、隣接する音符に配置すべき指の指番号および音高の関係に基づいて、運指における指くぐりや指返し(乗り越え)を示す情報を格納したテーブルである。本実施の形態において、iDist≦0のときには、上行音形において、「1」より大きな指番号の指から指番号「1」の指に移行すること(いわゆる「指くぐり」)、或いは、下行音形において、指番号「1」の指から「1」より大きな指番号の指に移行すること(いわゆる「指返し」ないし「指の乗り越え」)が行なわれ得ることを意味している。
【0048】
本実施の形態においては、指くぐりのとき、つまり、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となるようにしている。
【0049】
ステップ806の後、CPU11は、ポジションタイプ(PosType)という分類項目について、「PosType=1」という分類値、指開きタイプ(iSpreadType)という分類項目について、「iSpreadType=1」という分類値を与える(ステップ807)。その後、CPU11は、配列me[]に格納された楽音データについて算出されたPosType、iSpreadType、RevTypeおよびTechという分類値を、当該楽音データと関連付けて記憶装置(RAM13)に格納する(ステップ805)。
【0050】
次に、2次元マップiFMap[i][j](iは分類項目、jは分類項目において付与された値)において、テクニック分類処理により得られた分類項目に対応する値をインクリメントする処理を実行する(図5のステップ506〜512)。本実施の形態においては、ポジションタイプ(PosType)、指開きタイプ(iSpreadType)、リバースタイプ(RevType)、および、指使いテクニック(Tech)という4つの分類項目が存在する。したがって、2次元のマップMap[i][j]のそれぞれの要素は以下の分類項目に対応する。
【0051】
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のみについて値を有する。
【0052】
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)。
【0053】
次いで、CPU11は、ノート数(音符数)を示すパラメータiCntをインクリメントして(ステップ514)、配列me[]に、次の楽音データのレコードを格納し(ステップ515)、その後、ステップ503に戻る。
【0054】
ステップ503でYesと判断された場合には、CPU11は、パラメータiおよびiFCostを「0」に初期化する(ステップ601)。CPU11は、パラメータiが「4」以上であるかを判断する(ステップ602)。上記パラメータiは、iFMap[i][j]の「i」を特定するためのものである。ステップ602でNoと判断された場合には、パラメータjを「0」に初期化して(ステップ603)、jが所定数より大きくなるまで(ステップ604)、ステップ605〜607の処理を繰り返す。
【0055】
CPU11は、マップの値iFMap[i][j]が「0」より大きいかを判断する(ステップ605)。ステップ605でYesと判断された場合には、CPU11は、マップの値iFMap[i][j]に対応付けられたコスト値iFCost[i][j]を、運指難易度の値iFCostに加算する(ステップ606)。
【0056】
以下、コスト値iFCost[i][j]を格納したコストテーブル(iFCost[][][])について説明する。コストテーブルは、コスト値iFCost[i][j]のそれぞれに対応する、「i×j」個のコスト値iFCost[i][j]を格納している。たとえば、iFCost[0][j]は、テクニック分類処理(図8)のステップ802で取得された「PosType」の値のそれぞれに対応するコスト値であり、ポジションタイプのそれぞれの値に固有の値となっている。i=1以上の他のコスト値も同様である。
【0057】
本実施の形態においては、ポジションタイプ「PosType」、指開きタイプ「iSpreadType」、リバースタイプ「RevType」および指使いテクニック「Tech」のそれぞれにおいて、値が大きくなるのにしたがって、それぞれの分類項目において運指の困難度が高まるようになっている。したがって、コスト値iFCost[i][j]も、jが増大するのにしたがって、コスト値が増大するようになっている。
【0058】
また、本実施の形態においては,マップの値iFMap[i][j]が幾つであるかは考慮せず、「0」より大きければ(すなわち「1」以上であれば)、コスト値iFCost[i][j]を、運指難易度の値iFCostに加算している。すなわち、マップの値の多寡にかかわらず、加算される値はコスト値iFCost[i][j]である。これは、分類項目「i」(例えば、ポジションタイプや指開きタイプ)において、iFMap[i][j]において1より大きい値を有する音符が1つあれば、その場合には、当該iFMap[i][j]に対応する難易度を含むため、そのノートの数は、難易度を示すコスト値にそれほど大きく影響しないであろうという知見に基づく。
【0059】
無論、マップの値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として対数関数を使用しても良い。
【0060】
ステップ605でNoと判断された場合、或いは、ステップ606が実行された後、CPU11は、jをインクリメントして(ステップ607)、ステップ604に戻る。また、ステップ604でYesと判断された場合には、CPU11は、iをインクリメントして(ステップ608)、ステップ602に戻る。
【0061】
このように本実施の形態においては、楽曲に含まれるあるノートが、運指に関する分類項目の具体的態様についてのマップ値iMap[i][j]が「0」でない場合には、当該分類項目の具体的態様に対応するコスト値iFCost[i][j]が、運指難易度iFCostに加算される。
【0062】
次に、リズム難易度評価処理について説明する。図10および図11は、本実施の形態にかかるリズム難易度評価処理の例を示すフローチャートである。図10に示すように、CPU11は、RAM13の楽曲データ中、最初の楽音データのレコードNote[0]を、配列me[]に格納する(ステップ1001)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ1002でYes)、ステップ1003〜1007を繰り返す。
【0063】
CPU11は、RAM13に格納された、リズム評価処理用のパラメータ(リズムパラメータ)を取得する(ステップ1003)。リズムパラメータには、1小節の長さを示すiMeasLen、リズムの分解能を示すResolutionなどが含まれ、これらは、次のリズムコスト算出処理において利用される。CPU11は、リズムコスト算出処理を実行する(ステップ1004)。図12および図13は、本実施の形態にかかるリズムコスト算出処理の例を示すフローチャートである。リズムコスト算出処理においては、音符の音符長(次の音符までの間隔に基づく音符長)に相当する分類項目であるステップタイム(iStepTime)についての分類値と、音符の小節中の位置に相当する分類項目であるポジション(iPos)についての分類値とが得られる。
【0064】
図12に示すように、CPU11は、配列me[]に示す楽音データのレコードの、次のレコードを参照して、その発音時刻Timeを取得する(ステップ1201)。次いで、CPU11は、配列me[]中の発音時刻Timeと、ステップ1201で取得した次の発音データのレコードにおける発音時刻Timeとに基づいて、次の音符までの間隔iTを算出する(ステップ1202)。CPU11は、時間間隔iTと、1小節の長さiMeasLenとに基づいて、上記時間間隔の小節内での音符長iStepTimeを算出する(ステップ1203)。得られたiStepTimeが、音符長という分類項目についての分類値となる。
【0065】
本実施の形態において、音符長iStepTimeは以下のように求められる。
【0066】
iStepTime=32×iT/iMeasLen
本実施の形態においては、楽曲は4/4拍子としており、iStepTimeは、iTが32分音符いくつ分に相当するかを示している。
【0067】
次いで、CPU11は、配列me[]中の発音時刻Timeに基づき、小節内の音符位置iTickInMeas、拍内での音符位置iTickInBeatおよび当該音符の属する拍iBeatを算出する(ステップ1304)。iTickInMeasは、1小節を32分割したときの音符の位置、つまり、小節の先頭から32分音符でいくつ目に位置しているかを示す。また、iTickInBeatは、拍の先頭から32分音符でいくつ目に位置しているかを示す。
【0068】
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)。
【0069】
ステップ1206でNoと判断された場合、或いは、ステップ1210の処理が終了した後、図13のステップ1301に進む。なお、本実施の形態においては、ステップ1204においてiTickInBeatの算出の際に、32分音符の分解能にクォンタイズされる。したがって、ステップ1210においてNoと判断されることは本来ありえない。したがって、この場合は、演算において何らかのエラーが生じたことになる。
【0070】
このようにして得られた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)。
【0071】
リズムコスト算出処理によって得られる分類項目の1つであるポジション(iPos)の分類値は、音符の小節中の位置によって以下のような値をとる。
【0072】
音符の位置が、小節の先頭:iPos=32
音符の位置が、3拍目の先頭:iPos=16
音符の位置が、他の拍(2拍目、4拍目)の先頭:iPos=8
音符の位置が他の場合:iPos=拍を8等分した場合の位置を示す値
上記iPosは、楽曲が4/4拍子の場合の例であり、他の拍子(たとえば、3/4)の場合には、iPosは異なる。楽曲が3/4拍子であれば、分類値「iPos」は以下の値をとり得る。
【0073】
音符の位置が、小節の先頭:iPos=32
音符の位置が、他の拍(2拍目、3拍目)の先頭:iPos=8
音符の位置が他の場合:iPos=拍を8等分した場合の位置を示す値
リズムコスト算出処理が終了すると、CPU11は、2次元マップの値であるiRMa[0][iStepTime]をインクリメントする(ステップ1005)とともに、iRMap[1][iPos]をインクリメントする(ステップ1006)。その後、CPU11は、配列me[]に、次の楽音データのレコードを格納し(ステップ1007)、その後、ステップ1002に戻る。
【0074】
ステップ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の処理を繰り返す。
【0075】
CPU11は、マップ値iRMap[i][j]が「0」より大きいかを判断する(ステップ1105)。ステップ1105でYesと判断された場合には、CPU11は、マップの値iRMap[i][j]に対応付けられたコスト値iRCost[i][j]を、運指難易度の値iRCostに加算する(ステップ1106)。
【0076】
以下、コスト値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のそれぞれに対応するコスト値であり、音符位置のそれぞれに固有の値となっている。
【0077】
たとえば、iRCost[0][iStepTime]においては、iStepTime=32、16、8、4、および、それら以外の値、について、コスト値iRCost[0][iStepTime]が増大するようになっている。つまり、音符長が、全音符であるとき、そのコスト値iRCost[0][32]がもっとも小さく、2分音符、4分音符、8分音符、その他の音符となるのにしたがって、コスト値は大きくなる。
【0078】
また、iRCost[1][iPod]においても、iPos=32、16、8、それら以外の値、について、コスト値iRCost[1][iPos]が増大するようになっている。つまり、音符が小節の先頭に位置するとき、そのコスト値iRCost[1][32]がもっとも小さく、3拍目の先頭、2拍目或いは4拍目の先頭、その他の位置となるのにしたがって、コスト値は大きくなる。
【0079】
運指難易度コストの算出と同様に、マップの値iRMap[i][j]が幾つであるかは考慮せず、0より大きければ(すなわち1以上であれば)、コスト値iRCost[i][j]を、リズム難易度の値iRCostに加算している。すなわち、マップの値の多寡にかかわらず、加算される値はコスト値iRCost[i][j]である。
【0080】
ステップ1105でNoと判断された場合、或いは、ステップ1106が実行された後、CPU11は、jをインクリメントして(ステップ1107)、ステップ1104に戻る。また、ステップ1104でYesと判断された場合には、CPU11は、iをインクリメントして(ステップ1108)、ステップ1102に戻る。
【0081】
このように本実施の形態においては、音符についてのリズム、特に、音符長および音符位置のそれぞれについて、対応するコスト値iRCost[i][j]が、リズム難易度iRCostに加算される。
【0082】
次に、本実施の形態にかかる調性難易度評価処理について説明する。図14および図15は、本実施の形態にかかる調性難易度評価処理の例を示すフローチャートである。図15に示すように、CPU11は、配列me[]に先頭の楽音データのレコードを格納する(ステップ1401)。CPU11は、楽曲データにおいて全ての楽音データのレコードについて処理が終了するまで(ステップ1402でYes)、ステップ1403、1404を繰り返す。
【0083】
CPU11は、配列me[]中の音高情報「Pit」に基づいて、カウント値iPC[Pit mod 12]をインクリメントする(ステップ1403)。ステップ1403においては、音符の、CからBまでの何れかの音名に対応するカウント値iPCがインクリメントされる。次いで、CPU11は、配列me[]に次の楽音データのレコードを格納して(ステップ1404)、ステップ1402に戻る。ステップ1402〜1404の処理によって、楽曲に含まれるノート(音符)の音名のそれぞれについて、累算値を格納した配列iPC[]が取得される。
【0084】
ステップ1402でYesと判断された場合には、CPU11は、パラメータiTonality、iMax,iATMaxおよびiを「0」に初期化する(ステップ1405〜1407)。CPU11は、パラメータiが12以上になるまで(ステップ1408でNo)、図15のステップ1501〜1512を実行する。
【0085】
図15に示すように、CPU11は、パラメータiSumおよびiATonalityを「0」に初期化する。ここに、iSumは、楽曲が含んでいたノート(音符)の音名の累算値と、各調の長音階との一致度を示すパラメータであり、iATonalityは、上記音名の累算値と、各調の長音階との不一致度を示すパラメータである。なお、本実施の形態においては、長音階の楽曲について、各調の長音階との一致度、不一致度を見出しているが、これに限定されるものではない。短音階の楽曲については、各調の短音階との一致度や不一致度を見出せば良い。
【0086】
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に戻る。
【0087】
図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」となっている。
【0088】
以下、ステップ1504における、iSumに加算される値iPC[(j+i) mod 12]×iBaseScale[j]について説明する。たとえば、図18において、符号1801は、ステップ1402〜1404で得られた配列iPC[]の例を示す図、符号1802は、ベーススケール配列iBaseScale[]の例を示す図である。
【0089】
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となる。
【0090】
i=1のときには、j=4、5、9、11において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=1+3+5+8=17となる。
【0091】
また、i=5のときには、j=0、2、4、5、7、9、22において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=10+4+5+8+7+2+3=39となる。
【0092】
さらに、i=7のときには、j=0、2、5、7、9において、0以外の値をとり、全てのjについて処理が実行された場合のiSumの最終値は、
iSum=4+5+7+2+3=22となる。
【0093】
iATonalityにiPC(j+i mod 12)×iATonal[j]を加算する演算も、iSumの演算と同様に実行され得る。
【0094】
図19において、符号1901は、ステップ1402〜1404で得られた配列iPC[]の例を示す図、符号1902は、非ベーススケール配列iATonlity[]の例を示す図である。配列iPC[]は、図18の符号1801と同様である。
【0095】
i=0のときには、iATonalityの最終値
iATonality=Σ(iPC[j mod 12]×iATonal[j]
=1+5+8=14となる。
【0096】
また、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参照)となる。
【0097】
ステップ1503でNoと判断された場合、つまり、特定のiについて、j=0〜11のiSumおよびiATonalityが算出された場合には、CPU11は、一致度iSumと不一致度iATonalityの差分値a(=iSum−iATonality)を算出する(ステップ1507)。
【0098】
CPU11は、ステップ1507において得られた差分値aが、RAM13に記憶された差分値aの最大値iMaxより大きいかを判断する(ステップ1508)。ステップ1508でYesと判断された場合には、CPU11は、差分値aを最大値iMaxとしてセットし(ステップ1509)、かつ、最大値iMaxを得たときの調性を示すパラメータiTonalityにiをセットする(ステップ1510)。また、CPU11は、得られた不一致度iATonalityを、iSumの最大値が得られたときの対応する不一致度iATMaxとしてセットする(ステップ1511)。
【0099】
ステップ1508でNoと判断された場合、または、ステップ1511が実行された後に、CPU11は、iをインクリメントして、ステップ1408に戻る。ステップ1408でNoと判断された場合には、CPU11は、調性難易度を示すiTCostを以下のように算出する(ステップ1409)。
【0100】
iTCost=(iATMax×A)/iMax
ここに、Aは所定の定数である。したがって、iTCostは、調性の一致度が最大となったときの、音符の音階との一致度iSumとそのときの不一致度iATonalityとの差分値に対する、そのときの不一致度の比に、定数Aを乗じたものとなる。
【0101】
先に説明したように、運指難易度iFCost、リズム難易度iRCostおよび調性難易度iTCostが算出されると、これら難易度および楽曲のノート数iCntに基づいて、以下のように楽曲の難易度iCostが算出される。
【0102】
iCost=iFCost×RF+iRCost×RR
+iTCost×RT+iCnt×RC
【0103】
次に、本実施の形態にかかる係数最適化処理(図2のステップ206)についてより詳細に説明する。係数最適化処理において、楽曲の難易度iCostを算出する際に、運指難易度、リズム難易度および調性難易度の各要素に乗算される重み係数RF、RRおよびRTを最適化する。概略的には、楽曲における各要素の難易度を、人が評価する場合と同様の結果となるように重み係数を算出している。図20は、本実施の形態にかかる係数最適化処理の例を示すフローチャート出る。図20に示すように、CPU11は、処理の繰り返し回数を示すパラメータoptを「0」に初期化し(ステップ2001)、パラメータoptが定められた所定数より大きくなるまで(ステップ2002でYes)、ステップ2003〜2010を繰り返す。
【0104】
CPU11は、楽曲の難易度の要素を特定するためのパラメータiを「0」に初期化する(ステップ2003)。ここで、i=0は、運指難易度を示し、i=1はリズム難易度を示し、また、i=2は調性難易度を示す。CPU11は、パラメータiが要素数Emax(この場合には「3」)未満である限り(ステップ2004)、ステップ2005〜2008を繰り返す。
【0105】
次いで、CPU11は、繰り返し回数を示すパラメータoptが「0」、つまり、1回目の処理であるかを判断する(ステップ2005)。ステップ2005でYesと判断された場合には、重み係数の基礎値a[i]を、予め定められた初期値ini[i]とする(ステップ2006)。初期値ini[i]は任意の値(たとえば、ini[i]=1)で良い。ステップ2005でNoと判断された場合には、上記基礎値a[i]を、先の処理で得られた重み係数の候補値の最大値bmax[i]とする(ステップ2007)。なお、最終的に得られたbmax[0]が運指難易度についての重み係数RF、bmax[1]がリズム難易度についての重み係数RR、bmax[2]が調性難易度についての重み係数RTとなる。ステップ2006、2007が実行されると、CPU11は、パラメータiをインクリメントして(ステップ2008)、ステップ2004に戻る。
【0106】
ステップ2004でNoと判断された場合には、CPU11は、最適値算出処理を実行する(ステップ2009)。その後、CPU11は、繰り返し回数を示すパラメータoptをインクリメントして(ステップ2010)、ステップ2002に戻る。
【0107】
図21、22は、本実施の形態にかかる最適値算出処理の例を示すフローチャートである。基礎値a[i]は、求める重み係数の中心値と考える。最適値算出処理においては、パラメータi、jおよびkを用いた三重ループによって、基礎値a[]の周辺の値iVarの全ての組み合わせについて、候補値b[]が求められる。また、候補値b[]を用いた難易度(難易度算出値)が求められ、当該難易度と、専門家による難易度評価値との相関が算出され、求められた相関値の最大値rmaxが得られる。以下、最適値算出処理をより詳細に説明する。
【0108】
図21に示すように、CPU11は、相関値の最大値rmaxを初期化するとともに(ステップ2101)、パラメータiを初期化する(ステップ2102)。次いで、CPU11は、パラメータiが所定の周辺値数を示すパラメータiVarより小さい限り(ステップ2103でYes)、ステップ2104以下の処理を実行する。なお、i≧iVarとなった場合に(ステップ2103でNo)には処理を終了する。
【0109】
ステップ2103でYesと判断された場合には、CPU11は、パラメータjを初期化して(ステップ2104)、パラメータjが所定のパラメータiVarより小さい限り(ステップ2105でYes)、ステップ2106以下の処理を実行する。なお、j≧iVarとなった場合に(ステップ2105でNo)には、CPU11は、パラメータiをインクリメントして(ステップ2112)、ステップ2103に戻る。
【0110】
ステップ2105でYesと判断された場合には、CPU11は、パラメータkを初期化して(ステップ2106)、パラメータkが所定のパラメータiVarより小さい限り(ステップ2107でYes)、ステップ2108以下の処理を実行する。なお、k≧iVarとなった場合に(ステップ2107でNo)には、CPU11は、パラメータjをインクリメントして(ステップ2111)、ステップ2105に戻る。
【0111】
ステップ2107でYesと判断された場合には、CPU11は、候補値b[0]からb[2]のそれぞれに値をセットする(ステップ2108〜2110)。ステップ2108〜2110においては、以下のように候補値b[]が算出される。
【0112】
b[0]=a[0]×d[i]
b[1]=a[1]×d[j]
b[2]=a[2]×d[k]
d[i]、d[j]、d[k]は、それぞれ、候補値b[]を算出するために、基礎値a[]に乗じるための定められた係数であり、本実施の形態においては、0.0〜9.9の値をとるようになっている。たとえば、d[0]=0.0、d[1]=0.2、d[2]=0.6・・・d[6]=9.9というように、パラメータi、j、kが増大するのにしたがって係数が増大するようになっている。
【0113】
ステップ2110の後、CPU11は、難易度算出処理を実行する(ステップ2201)。難易度算出処理においては、予め難易度が算出されている所定数(SongN)の楽曲の難易度に基づいて、相関値算出のための難易度算出値out[]を算出する。図23は、本実施の形態にかかる難易度算出処理の例を示すフローチャートである。図23に示すように、難易度算出処理において、CPU11は、楽曲を特定するためのパラメータpを「0」に初期化して(ステップ2301)、パラメータpが楽曲総数SongN未満である限り(ステップ2302でYes)、ステップ2303〜2308の処理を繰り返す。
【0114】
CPU11は、難易度算出値out[p]を「0」に初期化して(ステップ2303)、難易度の要素(運指難易度、リズム難易度、調性難易度)を特定するためのパラメータjを「0」に初期化する(ステップ2304)。CPU11は、パラメータqが要素数Emax未満である限り(ステップ2305でYes)、ステップ2306〜2307を実行する。CPU11は、難易度算出値out[p]=out[p]+data[q][p]×b[q]を算出する(ステップ2306)。ここに、data[q][p]は、パラメータpで特定される楽曲について、パラメータqで特定される要素(q=0であれば運指、q=1であればリズム、q=2であれば調性)について算出された難易度である。data[q][p]は予め算出されRAM13に格納されている。その後、CPU11は、パラメータqをインクリメントして(ステップ2307)、ステップ2305に戻る。
【0115】
また、ステップ2305でNoと判断された場合には、CPU11は、パラメータpをインクリメントして(ステップ2308)、ステップ2302に戻る。
【0116】
難易度算出処理が終了すると、CPU11は、難易度算出処理において求めた難易度算出値out[k]と、予めRAM13に格納していた専門家による難易度評価値dat[k]との相関値rを求める(ステップ2202)。たとえば、相関値は以下のような一般的な相関係数を利用することができる。
【0117】
【数1】

上記式において、xi=out[i]、yi=dat[i]、n=SongNである。CPU11は、ステップ2202で算出された相関値rが、以前の処理にて得られていた相関値の最大値rmaxより大きいかを判断する(ステップ2203)。ステップ2203でNoと判断された場合には、CPU11は、パラメータkをインクリメントして(ステップ2209)、ステップ2107に戻る。
【0118】
その一方、ステップ2203でYesと判断された場合には、CPU11は、パラメータnを「0」に初期化して、nが要素数Emax未満である限り(ステップ2205でYes)、ステップ2206〜2208を実行する。CPU11は、現在の候補値b[n]を最大値bmax[n]としてRAM13に一時的に記憶するとともに(ステップ2206)、現在の相関値rを相関値の最大値rmaxとしてRAM13に一時的に記憶する(ステップ2207)。その後、CPU11は、パラメータnをインクリメントして(ステップ2208)、ステップ2205に戻る。ステップ2205でNoと判断された場合には、CPU11は、パラメータkをインクリメントして(ステップ2209)、ステップ2109に戻る。ステップ2205〜2208によって、難易度の要素のそれぞれについての係数の候補値b[0]〜b[2]および相関値rの最大値rmaxが取得される。
【0119】
前述したように、最適値算出処理(ステップ2209)は所定回数だけ実行されて、処理が繰り返されることにより、bmax[0]〜bmax[2]が、専門家の判断による値に徐々に近づいていく。得られたbmax[0]、bmax[1]およびbmax[2]は、RAM13などの記憶装置に格納され、難易度評価処理(図4)の全体難易度の算出(ステップ404)において、それぞれ、調性難易度iFCostに乗じる重み係数RF、リズム難易度iRCostに乗じる重み係数RR、および、調性難易度iTCostに乗じる重み係数RTとして用いられる。
【0120】
本実施の形態においては、楽曲の演奏に必要な、運指、リズム、調性という要素について、CPU11は、個別難易度を算出し、算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出する。また、CPU11は、予め算出され記憶手段に格納された個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与された専門家による同一の楽曲の難易度評価値との相関が最大となるように、個別難易度に乗じる重み係数を最適化する。
【0121】
したがって、客観的な要素ごとの個別難易度の加算を行ないつつ、その結果が、専門家の評価から逸脱しないような難易度の算出が可能となる。
【0122】
また、本実施の形態においては、運指、リズム、調性という要素ごとに、重み係数の基礎値a[i]の周辺値である、重み係数候補値b[i]を求め、全ての要素についての重み係数の候補値b[0]〜b[2]の組を用いて、前記難易度演算値を算出する。組み合わせを変更して、新たな重み係数の組を作って、難易度演算値を算出することにより、最も難易度評価値との相関が大きかったときの難易度演算値を算出した重み係数候補値を適切に取得することができる。
【0123】
また、本実施の形態においては、CPU11は、重み係数候補値b[i]を、基礎値a[i]に、所定範囲で変化する係数d[j]を乗じることにより算出する。すなわち、基礎値a[i]の周辺で変化する候補値b[i]の組み合わせから最大値bmax[i]を得ていく。
【0124】
さらに、本実施の形態においては、CPU11は、音高情報および運指情報に基づいて、隣接する音符を押鍵する運指に関する運指難易度と、音符についての時間情報に基づいて、音符長および音符のタイミングに関するリズム難易度と、音符の音高情報に基づいて、当該楽曲の調性に関する調性難易度と、を算出する。したがって、楽曲を構成する種々の要素を考慮して、適切に楽曲の難易度を算出することが可能となる。
【0125】
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
【符号の説明】
【0126】
10 楽曲難易度算出装置
11 CPU
12 ROM
13 RAM
14 大規模記憶装置
15 入力装置
16 表示装置
17 サウンドシステム
18 鍵盤

【特許請求の範囲】
【請求項1】
楽曲を構成する音符ごとの音高情報、当該音符を押鍵する際の運指情報、および、当該音符についての時間情報を含む楽音データを格納した記憶手段と、
前記音高情報、運指情報、および、時間情報の何れかに基づいて、楽曲の演奏に必要な複数の要素のそれぞれについて個別難易度を算出する個別難易度算出手段と、
算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出し、算出された難易度を記憶手段に格納する全体難易度算出手段と、
前記複数の個別難易度に乗じる重み係数を最適化する重み係数最適化手段と、を備え、
前記重み係数最適化手段が、予め算出され記憶手段に格納された個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与され、記憶手段に格納されていた専門家による同一の楽曲の難易度評価値との相関が最大となるように、前記重み係数を算出するように構成されたことを特徴とする楽曲難易度算出装置。
【請求項2】
前記重み係数最適化手段が、前記要素ごとに、前記重み係数の基礎値の周辺値である、重み係数候補値を求め、前記全ての要素についての重み係数の候補値の組を用いて、前記難易度演算値を算出することを特徴とする請求項1に記載の楽曲難易度算出装置。
【請求項3】
前記重み係数最適化手段が、前記重み係数候補値を、基礎値に、所定範囲で変化する係数を乗じることにより算出することを特徴とする請求項2に記載の楽曲難易度算出装置。
【請求項4】
前記難易度算出手段が、
前記音高情報および運指情報に基づいて、隣接する音符を押鍵する運指に関する運指難易度を算出する運指難易度算出手段と、
前記音符についての時間情報に基づいて、当該音符長および音符のタイミングに関するリズム難易度を算出するリズム難易度算出手段と、
前記音符の音高情報に基づいて、当該楽曲の調性に関する調性難易度を算出する調性難易度算出手段と、を有することを特徴とする請求項1ないし3の何れか一項に記載の楽曲難易度算出装置。
【請求項5】
楽曲を構成する音符ごとの音高情報、当該音符を押鍵する際の運指情報、および、当該音符についての時間情報を含む楽音データを格納した記憶手段を備えたコンピュータに、
前記音高情報、運指情報、および、時間情報の何れかに基づいて、楽曲の演奏に必要な複数の要素のそれぞれについて個別難易度を算出する個別難易度算出ステップと、
算出された複数の個別難易度のそれぞれに重み係数を乗じて、重みが付与された個別難易度を累算することにより楽曲全体の難易度を算出し、算出された難易度を記憶手段に格納する全体難易度算出ステップと、
前記複数の個別難易度に乗じる重み係数を最適化する重み係数最適化ステップと、を実行させ、
前記重み係数最適化ステップが、予め算出され記憶手段に格納された個別難易度に基づいて算出される楽曲の難易度演算値と、予め楽曲に対して付与され、記憶手段に格納されていた専門家による同一の楽曲の難易度評価値との相関が最大となるように、前記重み係数を算出するステップを含むことを特徴とする楽曲難易度算出プログラム。

【図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


【公開番号】特開2010−281882(P2010−281882A)
【公開日】平成22年12月16日(2010.12.16)
【国際特許分類】
【出願番号】特願2009−133018(P2009−133018)
【出願日】平成21年6月2日(2009.6.2)
【出願人】(000001443)カシオ計算機株式会社 (8,748)
【Fターム(参考)】