以下、図面を参照して本発明の実施の形態について説明する。
[第1実施形態]
A.構成
(1)全体構成
図1は、本発明の第1実施形態による楽譜表示装置の全体構成を示すブロック図である。楽譜表示装置は、CPU1、ROM2、RAM3、入力部4、表示部5およびMIDIインタフェース6を備える。CPU1は、後述する入力部4の指示に従い、例えばMIDIインタフェース6を介して外部の電子楽器7から取込んだSMF形式の曲データMidiEventから曲の各小節を表す小節データMeasureを派生させ、曲データMidiEventおよび小節データMeasureを参照して曲構造を分析し、その分析結果に基づいて楽曲の構造に即した楽譜を表示部5に画面表示させる。本発明の要旨に係わる、こうしたCPU1の処理動作については追って詳述する。
ROM2は、CPU1にロードされる各種プログラムやテーブル等を記憶する。ここで言う各種制御プログラムとは、後述するメインルーチン、構造分析処理演、奏難易度計算処理および表示条件設定処理を含む。
RAM3は、CPU1の演算に用いられる各種レジスタ・フラグデータを一時記憶するワークエリアと、MIDIインタフェース6を介して外部の電子楽器7より取込むSMF形式の曲データMidiEventが格納される曲データエリアと、この曲データエリアに格納された曲データMidiEventから派生させた小節データMeasureを記憶する小節データエリアとを備える。曲データMidiEventおよび小節データMeasureの各構成については追って説明する。入力部4は、ユーザ操作に対応した操作イベントを発生してCPU1に供給する。表示部5は、CPU1の制御の下に、上記曲データMidiEventおよび小節データMeasureを参照して、楽曲の構造に即した楽譜を画面表示する。
(2)データ構成
次に、図2〜図4を参照してRAM3に格納される曲データMidiEventおよび小節データMeasureの各構成を説明する。図2は、RAM3の曲データエリアに格納される曲データMidiEventの構成を示す図である。曲データMidiEvent[0]〜[N]は楽曲を構成する各音(メロディ)を表し、その終端には曲の終わりを表すENDデータを備える。
1つのメロディ音を表す曲データMidiEventは、曲開始時点からの経過時間で表現される発音開始時間ITime、発音期間を表す音長lGate、音高Pitch、音量Vel、本音を押鍵する指を指定する運指情報cfig、本音の弾き難さ(難易度)を表す運指コストiCost、ポインタprevおよびポインタnextから構成される。
運指情報cfigは、「0」の場合に親指、「1」の場合に人差し指、「2」の場合に中指、「3」の場合に薬指、「4」の場合に小指を指定する。運指コストiCostは、「0」〜「16」で難易度を表し、「0〜2:とても易しい」、「3〜5:易しい」、「6〜8:標準」、「9〜11:難しい」、「12〜14:とても難しい」および「15〜:不可能」を表す。ポインタprevは、1つ前の演奏データMidiEventのアドレスを指定する。ポインタnextは、次の演奏データMidiEventのアドレスを指定する。
図3は、RAM3の小節データエリアに格納される小節データMeasureの構成を示す図である。小節データMeasure[0]〜[N]は、各小節毎の属性を表す。1つの小節データMeasureは、曲開始時点からの経過時間で表現される開始時刻lTime、小節長lGate、小節に付与されるラベル番号iLavel、ラベルオプションiLvOption、ラベル内状態iLvStatus、段番号iRow、ページ番号iPage、段送りフラグiRPass、ページ送りフラグiPPass、演奏コストiCost、ポインタprevおよびポインタnextから構成される。
ラベル番号iLavel、ラベルオプションiLvOption、ラベル内状態iLvStatusは、後述する構造分析処理によって付与されるデータであり、これらが意図する内容については追って述べる。ポインタprevは、1つ前の小節データMeasureのアドレスを指定する。演奏コストiCostは、演奏難易度を表す。ポインタnextは、次の小節データMeasureのアドレスを指定する。
段番号iRow、ページ番号iPage、段送りフラグiRPassおよびページ送りフラグiPPassは、後述する表示条件設定処理にて付与されるデータである。ここで、図4を参照してこれらデータ(段番号iRow、ページ番号iPage、段送りフラグiRPassおよびページ送りフラグiPPass)の関係について説明する。図4(a)は、ラベル番号iLavelで指定される小節に付与される段番号iRow、ページ番号iPage、段送りフラグiRPassおよびページ送りフラグiPPassの一例である。段番号iRowは、1ページ内に表示される楽譜段の番号を表す。
段送りフラグiRPassは、「0」の場合に段送り無しを表し、「1」の場合に段送り有りを表す。ページ番号iPageは、楽譜の表示ページを表す。ページ送りフラグiPPassは、「0」の場合にページ送り無しを表し、「1」の場合にページ送り有りを表す。したがって、図4(a)に図示した一例の段番号iRow、ページ番号iPage、段送りフラグiRPassおよびページ送りフラグiPPassに従うと、同図(b)に図示する書式で楽譜表示が行われる。
すなわち、図4(b)に図示する通り、段番号iRow「0」の段では、ラベル番号iLavel「0」で指定される小節M[0]と、ラベル番号iLavel「1」で指定される小節M[1]とが表示される。そして、小節M[1]で段送りされた後の段番号iRow「1」の段では、ラベル番号iLavel「2」で指定される小節M[2]と、ラベル番号iLavel「3」で指定される小節M[3]が表示される。以後、同様にラベル番号iLavel「4」〜「7」でそれぞれ指定される小節M[4]〜小節M[7]がページ番号iPage「0」のページに楽譜表示される。そして、小節M[7]の後にページ送りが行われ、ページ番号iPage「1」の先頭にラベル番号iLavel「8」で指定される小節M[8]が表示されるようになっている。
B.動作
次に、図5〜図17を参照して第1実施形態の動作について説明する。以下では、CPU1が実行するメインルーチン、構造分析処理、演奏難易度計算処理および表示条件設定処理の各動作について述べる。なお、構造分析処理は、マトリクス処理およびグループラベリング処理から構成される。グループラベリング処理は、ラベリング処理、類似部分ラベリング補正1処理、類似部分ラベリング補正2処理、類似部分ラベリング補正3処理およびラベリング検証処理から構成される。表示条件設定処理は、段送り判定処理を含む。
(1)メインルーチンの動作
入力部4からCPU1にメインルーチンの実行を指示するイベントが供給されると、CPU1は図4に図示するメインルーチンを実行してステップSA1に進み、曲データの読み込みを実行する。すなわち、MIDIインタフェース6を介して外部の電子楽器7からSMF形式の曲データMidiEvent[0]〜[N]を取込んでRAM3の曲データエリアに格納する。また、ステップSA1では、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]に基づき、小節データMeasure[0]〜[N]を派生させてRAM3の小節データエリアに格納する。
なお、ここで派生される小節データMeasure[0]〜[N]は、ラベルオプションiLvOptionおよびラベル状態iLvStatusを含まない。ラベルオプションiLvOptionおよびラベル状態iLvStatusは、後述するグループラベリング処理(図9参照)にて生成される。
また、本実施の形態では、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]から小節データMeasure[0]〜[N]を派生する態様としたが、これに限らず、電子楽器7側で生成された小節データMeasure[0]〜[N]を、MIDIインタフェース6を介して取込む態様としても構わない。
次いで、ステップSA2では、曲データMidiEventおよび小節情報Measureを参照して曲構造を分析する構造分析処理を実行する。そして、ステップSA3では、曲構造の分析により得られた曲の各区間毎の演奏難易度を算出し、その区間に対応する小節データMeasureの演奏コストiCostとして付与する演奏難易度計算処理を実行する。続いて、ステップSA4では、曲構造の分析により得られた曲の各区間の終わりで段送りを行うように設定する表示条件設定処理を実行する。この後、ステップSA5に進み、上記ステップSA4にて設定された表示条件に従って楽曲の構造に即した楽譜を表示部5に表示出力する。
(2)構造分析処理の動作
次に、図6を参照して構造分析処理の動作を説明する。上述したメインルーチンのステップSA3(図5参照)を介して本処理が実行されると、CPU1は図6に図示するステップSB1に進み、マトリクス処理(後述する)を実行した後、ステップSB2に進み、グループラベリング処理(後述する)を実行する。
(3)マトリクス処理の動作
次に、図7を参照してマトリクス処理の動作を説明する。上述した構造分析処理のステップSB1(図6参照)を介して本処理が実行されると、CPU1は図7に図示するステップSC1に進み、比較元となる小節を指定するポインタReに、曲先頭の小節を指定する値をセットする。次いで、ステップSC2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。ポインタReで指定される比較元小節が曲終端を超えていなければ、判断結果は「NO」になり、ステップSC3に進み、比較先となる小節を指定するポインタLuに、曲先頭の小節を指定する値をセットする。
続いて、ステップSC4では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSC5に進み、小節内時間tを初期化する。すなわち、ポインタLuで指定される比較先小節の小節データMeasure中の開始時刻lTimeを小節内時間tにセットする。次いで、ステップSC6では、小節内時間tが小節を超えたか否か、つまりポインタLuで指定される比較先小節の小節データMeasure中の小節長lGateを超えたかどうかを判断する。小節内時間tが小節を超えなければ、判断結果は「NO」となり、ステップSC7に進み、一致判定処理を実行する。
一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音の音高と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1、s2、s3をそれぞれ「1」をセットする。
また、一致判定処理では、比較元音と比較先音とが転調関係にある相対一致の場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(比較元小節の先頭音の音高)との音高差と、比較先音と基準音(比較先小節の先頭音の音高)との音高差とが一致する場合にフラグs1を「0」、フラグs2を「1」、フラグs3を「1」にセットする。
さらに、一致判定処理では、比較元音と比較先音とが相対方向的に一致する場合、すなわち基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差との方向に一致する場合にフラグs1を「0」、フラグs2を「0」、フラグs3を「1」にセットする。
加えて、一致判定処理では、比較元音と比較先音とがリズム一致する場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ両音間の発音開始時間および消音時間の差が許容範囲内である場合や、小節内時間tで発音する比較元音および比較先音が共に存在せず、かつ現在一致判定の対象とされている比較元音および比較先音のそれぞれについて前音の消音時間と次音の発音開始時間とが許容範囲内にある場合にフラグs4を「1」にセットする。
そして、ステップSC8では、上記ステップSC7の一致判定処理により設定されるフラグs1の値をレジスタsum1に、フラグs2の値をレジスタsum2に、フラグs3の値をレジスタsum3に、フラグs4の値をレジスタsum4にそれぞれ加算する。この後、ステップSC9に進み、小節内時間tを歩進させた後、上述のステップSC6に処理を戻す。
以後、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超える迄、上述したステップSC6〜SC9を繰り返す。これにより、レジスタsum1にはフラグs1が「1」となる完全一致期間を累算した積算時間が格納され、レジスタsum2にはフラグs2が「1」となる相対一致期間を累算した積算時間が格納され、レジスタsum3にはフラグs3が「1」となる相対方向的一致期間を累算した積算時間が格納され、さらにレジスタsum4にはフラグs4が「1」となるリズム一致期間を累算した積算時間が格納される。
そして、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えると、上記ステップSC6の判断結果が「YES」となり、ステップSC10に進む。ステップSC10では、レジスタsum1に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum1/t)を、マトリクス要素Mat1[Re][Lu]にストアする。また、ステップSC10では、レジスタsum2に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum2/t)を、マトリクス要素Mat2[Re][Lu]にストアする。
さらに、ステップSC10では、レジスタsum3に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum3/t)を、マトリクス要素Mat3[Re][Lu]にストアする。加えて、ステップSC10では、レジスタsum4に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum4/t)を、マトリクス要素Mat4[Re][Lu]にストアして本処理を終える。
なお、ここで言うマトリクス要素Mat1[Re][Lu]、Mat2[Re][Lu]、Mat3[Re][Lu]およびMat4[Re][Lu]とは、それぞれポインタReとポインタLuとで配列要素を指定する2次元レジスタである。
次いで、ステップSC11では、ポインタLuを歩進させ、比較先小節を次の小節に設定した後、上述のステップSC4に処理を戻す。以後、曲終端を超えるまでポインタLuで指定される比較先小節を歩進させる毎に、上述したステップSC5〜SC11を繰り返し実行する。そして、ポインタLuで指定される比較先小節が曲終端を超えると、上記ステップSC4の判断結果が「YES」になり、ステップSC12に進み、ポインタReを歩進させ、比較元小節を次の小節に設定した後、上述のステップSC2に処理を戻す。以後、ポインタReが曲終端を超える迄、ステップSC2以降を繰り返す。そして、ポインタRe(比較元小節)が曲終端を超えると、ステップSC2の判断結果が「YES」となり、本処理を終える。
以上のように、マトリクス処理では、RAM3の小節データエリアに格納された小節データMeasure[0]〜[N]を参照して、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]を、ポインタReで指定される比較元小節とポインタLuで指定される比較元小節とに区別しておき、比較元小節Reの比較元音と比較先小節Luの比較先音との関係を小節内時間t毎に判定する。
すなわち、比較元小節Reにおいて小節内時間tで発音している比較元音の音高と、比較先小節Luにおいて小節内時間tで発音している比較先音の音高とが一致している場合もしくは小節内時間tで発音する比較元音および比較先音が共に存在しない場合に「完全一致」と判定する。また、小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(例えば小節先頭の音の音高)との音高差と、比較先音と基準音との音高差とが一致する場合、つまり比較元音と比較先音とが転調関係にある場合に「相対一致」と判定する。
さらに、小節内時間tで発音している比較元音と比較先音とが有り、かつ基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差の方向に一致する場合に「相対方向的一致」と判定する。加えて、小節内時間tで発音している比較元音と比較先音とが有り、かつ両音間の発音開始時間および消音時間の差が許容範囲内である場合もしくは小節内時間tで発音する比較元音および比較先音が共に存在せず、かつ現在一致判定の対象とされている比較元音および比較先音のそれぞれについて前音の消音時間と次音の発音開始時間とが許容範囲内にある場合に「リズム一致」と判定する。
こうして一致判定し終えると、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との完全一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum1/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat1[Re][Lu]にストアする。
また、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との相対一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum2/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat2[Re][Lu]にストアする。
さらに、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との相対方向的一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum3/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat3[Re][Lu]にストアする。
加えて、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音とのリズム一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum4/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat4[Re][Lu]にストアする。
(4)グループラベリング処理の動作
次に、図8を参照してグループラベリング処理の動作を説明する。前述した構造分析処理のステップSB2(図6参照)を介して本処理が実行されると、CPU1は図8に図示するステップSD1を介してラベリング処理を実行する。ラベリング処理では、後述するように、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
続いて、ステップSD2では、類似部分ラベリング補正1処理を実行する。類似部分ラベリング補正1処理では、後述するように、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、つまり比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、それに該当する小節区間を「類似性のある範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
次いで、ステップSD3では、類似部分ラベリング補正2処理を実行する。類似部分ラベリング補正2処理は、上記ステップSD2の類似部分ラベリング補正1処理とほぼ同一であるであるので、その詳細な動作フローの説明については省略する。類似部分ラベリング補正2処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat3[Re][Lu]の中から閾値以上の相対方向的な一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「音高差が類似する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
次に、ステップSD4を介して類似部分ラベリング補正3処理を実行する。類似部分ラベリング補正3処理は、上記ステップSD2の類似部分ラベリング補正1処理とほぼ同一であるであるので、その詳細な動作フローの説明については省略する。類似部分ラベリング補正3処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat4[Re][Lu]の中から閾値以上のリズム一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「リズムが一致する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
そして、ステップSD5を介してラベリング検証処理を実行する。このラベリング検証処理では、後述するように、上記ステップSD1のラベリング処理によりラベリングされた小節区間が長過ぎる場合、すなわちラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上の場合、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分割するようになっている。
(5)ラベリング処理の動作
次に、図9を参照してラベリング処理の動作を説明する。上述したグループラベリング処理のステップSD1(図8参照)を介して本処理が実行されると、図9に図示するステップSE1に進み、先頭小節を指定する値をポインタReにセットする。続いて、ステップSE2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSE3に進む。
ステップSE3では、ポインタReで指定される比較元小節にラベル付与されているか否かを判断する。ラベル付与とは、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中で、閾値以上の一致率を有するマトリクス要素が連続する範囲(小節区間)を一致性の高いグループとし、そのグループにラベル番号(後述する)を付与することを意味する。そして、ポインタReで指定される比較元小節にラベル付与済みならば、上記ステップSE3の判断結果は「NO」になり、ステップSE13に進み、ポインタReを歩進させた後、上述のステップSE2に処理を戻す。
一方、ポインタReで指定される比較元小節にラベル付与がなされていなければ、上記ステップSE3の判断結果は「YES」になり、ステップSE4に進み、先頭小節を指定する値をポインタLuにセットする。次いで、ステップSE5では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSE6に進む。
ステップSE6では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の一致率が閾値以上であるかどうかを判断する。マトリクス要素Mat1[Re][Lu]の一致率が閾値未満ならば、判断結果は「NO」になり、ステップSE10に進み、ポインタLuを歩進させ、比較先小節を次の小節に設定した後、上述のステップSE5に処理を戻す。
一方、マトリクス要素Mat1[Re][Lu]の一致率が閾値以上ならば、上記ステップSE6の判断結果は「NO」になり、ステップSE7に進む。ステップSE7では、閾値以上の一致率を有するマトリクス要素Mat1[Re][Lu]の範囲i(小節数)、すなわちMat1[Re+i][Lu+i]を検出する。次いで、ステップSE8では、閾値以上の一致率が連続した小節数iを保存する。そして、ステップSE9では、現在のポインタLuに、閾値以上の一致率が連続した小節数iを加算してポインタLuを更新させた後、上述のステップSE5に処理を戻す。
以後、更新されたポインタLuが曲終端を超える迄、一致率が連続して閾値を超える小節数iを検出する。そして、更新されたポインタLuが曲終端を超えると、上記ステップSE5の判断結果が「YES」になり、ステップSE11に進む。ステップSE11では、規定数以上の小節が閾値以上であるか否かを判断する。検出した小節数iが規定数未満であると、判断結果は「NO」になり、ステップSE13に進み、ポインタReを歩進させた後、前述したステップSE2に処理を戻す。
これに対し、検出した小節数iが規定数以上ならば、上記ステップSE11の判断結果が「YES」になり、ステップSE12に進み、採番およびラベリングを行う。すなわち、ステップSE12では、RAM3の小節データエリアに格納される小節データMeasure[0]〜[N]の内、閾値以上の一致率が連続した小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、ラベルオプションiLvOptionとして、完全一致を表す値「0」をセットする。
この後、ステップSE13に進み、ポインタReを歩進させた後、前述したステップSE2に処理を戻す。以後、歩進されたポインタReで指定される比較元小節が曲終端を超える迄、上述したステップSE3以降の動作を繰り返す。そして、歩進されたポインタReで指定される比較元小節が曲終端を超えると、ステップSE2の判断結果が「YES」となり、本処理を終える。
このように、ラベリング処理では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
なお、マトリクス要素Mat1[Re][Lu]中で閾値以上の一致率が規定数以上連続する範囲(小節区間)を検索し、該当する区間の各小節データMeasureにラベル番号iLavelを付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionに登録する処理操作全体をラベリングと称す。
(6)類似部分ラベリング補正1処理の動作
次に、図10を参照して類似部分ラベリング補正1処理の動作を説明する。上述したグループラベリング処理のステップSD2(図8参照)を介して本処理が実行されると、CPU1は図10に図示するステップSF1に進み、小節の先頭を指定する値をポインタReにセットする。続いて、ステップSF2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、次のステップSF3に進む。
ステップSF3では、小節の先頭を指定する値をポインタLuにセットする。次いで、ステップSF4では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSF5に進む。ステップSF5では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されていないかどうかを判断する。同じラベル番号iLavelが付与されていれば、判断結果は「NO」になり、ステップSF12に進み、ポインタLuを歩進させた後、上述のステップSF4に処理を戻す。
一方、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されていない場合には、上記ステップSF5の判断結果が「YES」になり、ステップSF6に進む。ステップSF6では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat2[Re][Lu]の相対一致率が閾値以上であるかどうかを判断する。マトリクス要素Mat2[Re][Lu]の相対一致率が閾値未満ならば、判断結果は「NO」になり、ステップSF12に進み、ポインタLuを歩進させた後、上述のステップSF4に処理を戻す。
これに対し、マトリクス要素Mat2[Re][Lu]の相対一致率が閾値以上ならば、上記ステップSF6の判断結果が「YES」になり、ステップSF7に進む。ステップSF7では、閾値以上の相対一致率を有するマトリクス要素Mat2[Re][Lu]の範囲i(小節数)、すなわちMat2[Re+i][Lu+i]を検出する。次いで、ステップSF8では、閾値以上の相対一致率が連続した小節数iを保存する。そして、ステップSF9では、上記ステップSF7にて検出した小節数iが規定小節以上であるか否かを判断する。
検出した小節数iが規定小節未満ならば、判断結果は「NO」になり、ステップSF12に進み、ポインタLuを歩進させた後、上述のステップSF4に処理を戻す。一方、検出した小節数iが規定小節以上であると、上記ステップSF9の判断結果が「YES」になり、ステップSF10に進み、ラベル付け替え処理を実行する。
ラベル付け替え処理では、
(イ)比較元小節Reおよび比較先小節Luの双方にラベル番号iLavelが付与されている場合には、比較先小節Luのラベル番号iLavelを比較元小節Reのラベル番号iLavelに書き換え、比較先小節LuのラベルオプションiLvOptionに類似(相対一致)を表す値「1」を設定する。
(ロ)比較元小節Reだけにラベル番号iLavelが付与されている場合には、そのラベル番号iLavelを比較先小節Luのラベル番号iLavelに設定すると共に、比較先小節LuのラベルオプションiLvOptionに値「1」を設定する。
(ハ)比較先小節Luだけにラベル番号iLavelが付与されている場合には、そのラベル番号iLavelを比較元小節Reのラベル番号iLavelに設定すると共に、比較元小節ReのラベルオプションiLvOptionに値「1」を設定する。
(ニ)比較元小節Reおよび比較先小節Luの双方にラベル番号iLavelが付与されていない場合には、新たに採番したラベル番号を、比較元小節Reおよび比較先小節Luのラベル番号iLavelに設定すると共に、比較元小節ReのラベルオプションiLvOptionに値「0」を、比較先小節LuのラベルオプションiLvOptionに値「1」を設定する。
こうしたラベル付け替え処理が完了すると、ステップSF11に進み、現在のポインタLuに、閾値以上の相対一致率が連続した小節数iを加算してポインタLuを更新させた後、上述のステップSF4に処理を戻す。以後、更新されたポインタLuで指定される比較先小節が曲終端を超える迄、相対一致率が規定小節以上連続して閾値を超える小節数iを探し出し、該当する小節区間についてラベル付け替えする処理を繰り返す。
そして、更新されたポインタLuで指定される比較先小節が曲終端を超えると、上記ステップSF4の判断結果が「YES」になり、ステップSF13に進み、ポインタReを歩進させた後、上述のステップSF2に処理を戻す。以後、歩進されたポインタReで指定される比較元小節が曲終端を超える迄、上述したステップSF3以降の処理を繰り返す。そして、歩進されたポインタReで指定される比較元小節が曲終端を超えると、ステップSF2の判断結果が「YES」となり、本処理を終える。
以上のように、類似部分ラベリング補正1処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、すなわち比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、該当する小節区間を「類似性のある範囲」と表すように対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定するようになっている。
(7)ラベリング検証処理の動作
次に、図11〜図13を参照してラベリング検証処理の動作を説明する。上述したグループラベリング処理のステップSD5(図8参照)を介して本処理が実行されると、CPU1は図11に図示するステップSG1に処理を進め、先頭小節を指定する値をポインタReにセットする。続いて、ステップSG2では、ポインタReで指定される小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSG3に進む。ステップSG3では、ポインタReで指定される小節が、ラベリングされた区間の先頭小節(以下、ラベリング先頭小節と称す)であるか否かを判断する。
ラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSG4に進み、ポインタReを歩進させた後、上記ステップSG2に処理を戻す。以後、上記ステップSG2〜SG4を繰り返すことによって、曲終端に達するまでの間、ポインタReを歩進させながらラベリング先頭小節を検索する。そして、その過程でラベリング先頭小節が見つかると、上記ステップSG3の判断結果が「YES」になり、ステップSG5に進み、現在のポインタReを、ラベリング先頭小節を指定するポインタRetmpにセットする。
次いで、ステップSG6では、ポインタRetmpがラベリングされた小節の後端(以下、ラベリング後端小節と称す)に達したか否かを判断し、続いて、図12に図示するステップSG7では、ポインタRetmpがラベリング先頭小節を指定するか否かを判断する。以下、ポインタRetmpがラベリング先頭小節を指定する場合と、ラベリング先頭後端を指定する場合とに分けて動作を説明する。
<ポインタRetmpがラベリング先頭小節を指定する場合>
上記ステップSG5(図11参照)を介して最初にステップSG6へ進むパスでは、ポインタRetmpがラベリング先頭小節を指定するので、上記ステップSG6の判断結果は「NO」になり、図12に図示するステップSG7に進み、ここでの判断結果が「YES」になり、ステップSG8に進む。
ステップSG8では、ポインタReからポインタRetmpまでの小節数が規定数以上であるかどうかを判断する。初めてステップSG8に進むパスでは、ポインタReとポインタRetmpとが同一なので、判断結果は「NO」になり、ステップSG9に進む。ステップSG9では、ポインタRetmpで指定されるラベリング先頭小節の小節データMeasureに含まれるラベル内状態iLvStatusを「0」にセットして先頭の状態を解除する。
なお、小節データMeasure中のラベル内状態iLvStatus(図3参照)は、ラベリングされた小節の先頭であることを表す場合に「1」、ラベリングされた小節の後端であることを表す場合に「2」、状態解除を表す場合に「0」となるフラグである。
さて、こうして先頭の状態を解除し終えると、ステップSG10に進み、ポインタRetmpを歩進させた後、再び図11に図示するステップSG6に処理を戻す。以後、ポインタRetmpがラベリング先頭小節を指定し、かつポインタReからポインタRetmpまでの小節数が規定数以上存在するようになるまで、上述したステップSG6〜SG10を繰り返す。そして、ポインタRetmpの歩進に応じて、上記条件を満たすと、ステップSG8の判断結果が「YES」になり、ステップSG11に進む。
ステップSG11では、ポインタReとポインタRetmpとで指定されるマトリクス要素Mat1[Re][Lu]の一致率が閾値以上であるか否かを判断する。閾値未満ならば、判断結果が「NO」になり、上述したステップSG9に進む。
一方、マトリクス要素Mat1[Re][Retmp]の一致率が閾値以上であると、上記ステップSG11の判断結果が「YES」になり、ステップSG12に進む。ステップSG12では、ポインタRetmpで指定される小節の1つ前の小節データMeasureに含まれるラベル内状態iLvStatusを「2」にセットしてラベリング後端小節に設定する。これによりラベリングされた小節区間が切断される。
<ポインタRetmpがラベリングされた小節の後端に達した場合>
以上のようにして、ラベリングされた小節区間が切断された後に、ステップSG10を介してポインタRetmpを歩進させた後、再び図11に図示するステップSG6に処理を戻す。そして、歩進されたポインタRetmpがラベリング後端小節に達すると、このステップSG6の判断結果が「YES」になり、図12に図示するステップSG13に進む。
ステップSG13では、エラー状態の有無を判断する。エラー状態とは、ポインタRetmpで指定される小節のラベル番号iLavelと、次小節のラベル番号iLavelとが同じで、ポインタRetmpの次の小節の小節データMeasure中のラベル内状態iLvStatusが「1(先頭)」でない状態を指す。そして、エラー状態でなければ、判断結果は「NO」になり、ステップSG14に進み、ポインタRetmpをポインタReにセットした後、前述のステップSG4(図11参照)に処理を戻す。
以後、上述した過程を実行し、ラベリング先頭小節から規定数以上存在し、かつポインタReとポインタRetmpとで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上であれば、ポインタRetmpで指定される小節の1つ前の小節データMeasureに含まれるラベル内状態iLvStatusを「2」にセットしてラベリングされた小節区間を切断する。
一方、上記ステップSG13にてエラー状態が検出されると、当該ステップSG13の判断結果が「YES」になり、ステップSG15に進み、ポインタRetmpを歩進させる。次いで、ステップSG16では、ポインタReとポインタRetmpとで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上であるか否かを判断する。
マトリクス要素Mat1[Re][Retmp]の一致率が閾値以上ならば、判断結果は「YES」になり、ステップSG17に進み、ポインタRetmpで指定される小節の小節データMeasureに含まれるラベル内状態iLvStatusを「1」にセットしてラベリング先頭小節に設定した後、上述のステップSG10に処理を戻す。
これに対し、ポインタReとポインタRetmpとで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値未満であると、上記ステップSG16の判断結果が「NO」となり、ステップSG18に進み、ポインタRetmpで指定される小節の小節データMeasureに含まれるラベル番号iLavelおよびラベル内状態iLvStatusを初期化してラベル解除する。
そして、ステップSG19では、ポインタRetmpで指定される小節のラベル番号iLavelと、次小節のラベル番号iLavelとが同じになるか否か、つまりエラー状態が連続しているかどうかを判断する。エラー状態が連続していると、判断結果が「YES」になり、ステップSG20に進み、ポインタRetmpを歩進させた後、上記ステップSG18に処理を戻す。以後、エラー状態が連続すれば、ステップSG18〜SG20を繰り返す。そして、エラー状態でなくなると、上記ステップSG19の判断結果が「NO」になり、上述したステップSG14に処理を進める。
以上のように、ラベリング検証処理では、ラベリングされた小節区間が長過ぎる場合、つまりラベリング先頭小節から規定値以上の小節数が連続する場合には、ポインタReとポインタRetmpとで指定されるマトリクス要素Mat1[Re][Retmp]を参照し、その一致率が閾値以上であれば、ポインタRetmpで指定される小節の1つ前の小節データMeasureに含まれるラベル内状態iLvStatusを「2」にセットしてラベリングされた小節区間を切断する。
例えば、マトリクス要素Mat1[Re][Retmp]において、図13(a)に図示するように、ラベリングされた小節区間が長過ぎ、ラベリング先頭小節から規定数以上連続するような場合には、同図(b)に図示する通り、ポインタRetmpで指定される小節の1つ前の小節で分断するようになっている。
(8)演奏難易度計算処理の動作
次に、図14を参照して演奏難易度計算処理の動作を説明する。前述したメインルーチンのステップSA3(図5参照)を介して本処理が実行されると、CPU1は図14に図示するステップSH1に進み、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]に運指情報cfigが付与されているか否かを判断する。運指情報cfigが付与されていなければ、判断結果は「NO」になり、ステップSH2に進み、曲データMidiEvent[0]〜[N]に基づき運指情報cfigを生成して曲データMidiEvent[0]〜[N]に付与する運指情報生成処理を実行した後、ステップSH3に進む。
一方、運指情報cfigが既に曲データMidiEvent[0]〜[N]に付与されている場合には、上記ステップSH1の判断結果が「YES」になり、ステップSH3に進む。ステップSH3では、先頭小節を指定する値をポインタMsにセットする。続いて、ステップSH4では、ポインタMsで指定される小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、次のステップSH5に進む。
ステップSH5では、ポインタMsで指定される小節の小節データMeasure中にラベル番号iLavelが付与され、かつポインタMsで指定される小節がラベリング先頭小節であるか否かを判断する。ラベル番号iLavelが付与され、かつラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSH12に進み、ポインタMsを歩進させて次の小節を指定した後、上述したステップSH4に処理を戻す。
一方、ポインタMsで指定される小節の小節データMeasureにラベル番号iLavelが付与され、かつポインタMsで指定される小節がラベリング先頭小節ならば、上記ステップSH5の判断結果は「YES」になり、ステップSH6に進む。ステップSH6では、ポインタMsで指定される小節の次の小節を指定するポインタをポインタMstにストアする。次いで、ステップSH7〜SH8では、ポインタMstを歩進させながら、ラベル番号iLavelが付与され、かつラベリング後端の小節を探し出す。そして、該当する小節(ラベル番号iLavelが付与され、かつラベリング後端の小節)が見つかると、ステップSH7の判断結果が「YES」になり、ステップSH9に進む。
ステップSH9では、ポインタMsで指定される小節からポインタMstで指定される小節までの区間における演奏難易度を算出する区間難易度計算処理を実行する。区間難易度計算処理では、先ず対応する区間中の各音を表す曲データMidiEventに含まれる運指情報cfigを参照して隣の音(次音)を押鍵する際の弾き易さを数値化した演奏コストiCostを生成し、生成された区間中の各音の演奏コストiCostを加算平均して当該区間の演奏難易度を定義する。
次いで、ステップSH10では、ポインタMsで指定される小節の小節データMeasureの演奏コストiCost(Ms.iCost)として、上記ステップSH9で算出した演奏難易度をストアする。続いて、ステップSH11ではポインタMstの値をポインタMsにセットした後、ステップSH12に進み、ポインタMsを歩進させた後、上述のステップSH4に処理を戻す。以後、ポインタMsで指定される小節が曲終端を超えるまで、ステップSH4〜SH12を繰り返す。そして、ステップSH12にて歩進されたポインタMsが曲終端を超えると、ステップSH4の判断結果が「YES」となり、本処理を終える。
このように、演奏難易度計算処理では、ラベル番号iLavelを備えたラベリング先頭小節およびラベリング後端小節からなる区間を探し出し、該当する区間が見つかる毎に、その区間中の各音を表す曲データMidiEventに含まれる運指情報cfigを参照して隣の音(次音)を押鍵する際の弾き易さを数値化した演奏コストiCostを生成し、生成された区間中の各音の演奏コストiCostを加算平均して当該区間の演奏難易度を算出し、算出した演奏難易度をポインタMsで指定される小節の小節データMeasureの演奏コストiCost(Ms.iCost)として登録する。
(9)表示条件設定処理の動作
次に、図15を参照して表示条件設定処理の動作を説明する。前述したメインルーチンのステップSA4(図5参照)を介して本処理が実行されると、CPU1は図15に図示するステップSJ1に進む。ステップSJ1〜SJ2では、ページ番号iPageを保持するレジスタPage、段番号iRowを保持するレジスタRow、段数を計数するカウンタRwCntおよび1段内の小節数を計数するカウンタMsCntを初期化(ゼロリセット)する。続いて、ステップSJ3では、最初の小節を指定する値をポインタMsにセットする。
次いで、ステップSJ4では、ポインタMsで指定される小節が曲終端を超えているか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSJ5を介して段送り判定処理を実行する。段送り判定処理では、後述するように、ポインタMsで指定される小節の次がラベリング先頭小節になる場合や1段で表示可能な標準小節数を超える場合に、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する。
続いて、ステップSJ6では、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)が、段送り有りを表す値「1」であるか否かを判断する。段送りフラグiRPass(Ms.iRPass)が「0」(段送り無し)ならば、判断結果は「NO」になり、ステップSJ7に進む。ステップSJ7では、レジスタPageの値を、ポインタMsで指定される小節の小節データMeasureのページ番号iPage(Ms.iPage)として登録すると共に、ページ送り無しを表す値「0」のページ送りフラグiPPass(Ms.iPPass)を設定する。そして、ステップSJ11に進み、ポインタMsを次の小節を指定するよう歩進させた後、上述のステップSJ4に処理を戻す。
一方、段送りフラグiRPass(Ms.iRPass)が「1」(段送り有り)であると、上記ステップSK6の判断結果は「YES」になり、ステップSJ8に進む。ステップSJ8では、段数を計数するカウンタRwCntの値が1ページの標準段数以上であるか否かを判断する。カウンタRwCntの値が標準段数未満であると、判断結果は「NO」になり、上述したステップSJ7に進む。
これに対し、前述した段送り判定処理(ステップSJ5)で段送りが生じ、これにより歩進されたカウンタRwCntの値が、1ページの標準段数を超えると、上記ステップSJ8の判断結果は「YES」になり、ステップSJ9に進む。ステップSJ9では、レジスタPageの値を、ポインタMsで指定される小節の小節データMeasureのページ番号iPage(Ms.iPage)として登録すると共に、ページ送り有りを表す値「1」のページ送りフラグiPPass(Ms.iPPass)を設定する。
続いて、ステップSJ10では、ページ送り設定に応じて、レジスタPageの値をインクリメントして歩進させると共に、カウンタRwCntの値をゼロリセットする。そして、ステップSJ11に進み、ポインタMsを次の小節を指定するよう歩進させた後、上述のステップSJ4に処理を戻す。以後、ポインタMsで指定される小節が曲終端を超えるまで、上述したステップSJ4〜SJ11を繰り返す。そして、ポインタMsで指定される小節が曲終端を超えると、ステップSJ4の判断結果が「YES」になり、本処理を終える。
以上のように、表示条件設定処理では、ポインタMsで指定される小節データMeasure毎に、段番号iRow(Ms.iRow)およびページ番号iPage(Ms.iPage)を付与する過程で、ポインタMsで指定される現小節の次の小節がラベリング先頭小節の場合や、1段で表示可能な標準小節数を超える場合に、現小節の小節データMeasureの段送りフラグiRPass(Ms.iRPass)に「1」をセットして段送りを設定し、段送りに応じて歩進される段数が1ページの標準段数を超えると、現小節の小節データMeasureのページ送りフラグiPPass(Ms.iPPass)に「1」をセットしてページ送りを設定する。
(10)段送り判定処理の動作
図16は、段送り判定処理の動作を示すフローチャートである。上述した表示条件設定処理のステップSJ5(図15参照)を介して本処理が実行されると、CPU1は図16に図示するステップSK1に進み、カウンタMsCntをインクリメントして歩進させる。次いで、ステップSK2では、ポインタMsで指定される小節の次の小節を指定する値を、ポインタMsNにセットする。そして、ステップSK3では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。
ラベリング先頭小節であると、判断結果は「YES」になり、ステップSK4に進む。ステップSK4では、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。次いで、ステップSK5では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させる一方、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットして本処理を終える。
このように、ポインタMsで指定される小節の次がラベリング先頭小節の場合には、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する。
一方、ポインタMsで指定される小節の次がラベリング先頭小節でなければ、上記ステップSK3の判断結果は「NO」になり、ステップSK6に進む。ステップSK6では、1段内に含まれる小節数をカウントするカウンタMsCntの値が1段の標準小節数以上であるか否かを判断する。カウンタMsCntの値が1段の標準小節数未満であると、判断結果は「NO」になり、ステップSK12に進み、レジスタRowにストアされている値を、ポインタMsで指定される現小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPassを設定して本処理を終える。
これに対し、カウンタMsCntの値が1段の標準小節数以上ならば、上記ステップSK6の判断結果が「YES」になり、ステップSK7に進み、ポインタiMsに初期値「1」をセットする。次いで、ステップSK8では、ポインタiMsが所定の検索数を超えたかどうか、つまり1段で表示可能な小節数を超えたか否かを判断する。1段で表示可能な小節数を超えていなければ、判断結果は「YES」になり、ステップSK9に進む。
ステップSK9では、ポインタMsで指定される小節からポインタiMs個先(Ms+iMs)の小節を指定する値をポインタMsNにセットする。続いて、ステップSK10では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。ラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSK11に進み、ポインタiMsを歩進させた後、上述のステップSK8に処理を戻す。
以後、歩進されたポインタiMsが所定の検索数を超えるまで、すなわち1段で表示可能な小節数を超えるまでの間、上記ステップSK8〜SK11を繰り返すことによって、ポインタMsで指定される小節の次の小節から1段で表示可能な小節数に達するまでの間でラベリング先頭小節の有無を検索する。
ラベリング先頭小節が検索されず、歩進されたポインタiMsが所定の検索数を超えて1段で表示可能な小節数に達すると、上記ステップSK8の判断結果が「NO」となり、上述したステップSK4に進み、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。次いで、ステップSK5では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させる一方、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットして本処理を終える。
一方、ポインタMsで指定される小節の次の小節から検索数個先の小節までの間にラベリング先頭小節が見つかると、上記ステップSK10の判断結果が「YES」になり、ステップSK12に進み、レジスタRowにストアされている値を、ポインタMsで指定される現小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPass(Ms.iRPass)を設定した後、本処理を終える。
このように、段送り判定処理では、ポインタMsで指定される小節の次がラベリング先頭小節になる場合や1段で表示可能な標準小節数を超える場合に、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する段送り設定を行う。
以上説明したように、第1実施形態では、小節データMeasure[0]〜[N]および曲データMidiEvent[0]〜[N]に基づき曲構造を分析することによって、曲中でメロディが重複したり類似する区間などの複数の区間(ラベリングされた小節区間)に分割する。そして、図17に図示する一例のように、分割された各区間の終わりを、楽譜表示される各段末尾の小節となるように表示設定するので、楽曲の構造に即した見易い楽譜を表示することが可能になる。
また、本実施形態では、構造分析処理(図9参照)によって、比較元小節Reに対する比較先小節Luの一致度を判定し、判定された一致度の中から閾値以上の「完全一致度」、「相対一致度」、「相対方向的一致度」および「リズム一致度」が連続する比較先小節Luの範囲を、「完全一致区間」、「相対一致区間」、「相対方向的一致区間」および「リズム一致区間」に分割するので、曲構造に応じて楽曲を複数の区間、つまりメロディが重複する区間、メロディが類似する区間、音高変化が類似する区間およびリズムが一致する区間に分割することができる。
[第2実施形態]
次に、図18〜図20を参照して第2実施形態について説明する。第2実施形態の構成は、前述した第1実施形態と同一なので、その説明については省略する。上述した第1実施形態では、分割された各区間の終わりを、楽譜表示される各段末尾の小節となるように段送り設定したのに対し、第2実施形態では、分割された区間が複数の段にまたがる際に、前段から後段への継続音が生じないように楽譜表示される各段末尾の小節を選んで段送り設定する。以下では、こうした第2実施形態による「段送り判定処理」の動作を説明する。
(1)段送り判定処理の動作
図18は、第2実施形態による段送り判定処理の動作を示すフローチャートである。上述した第1実施形態と同様に、表示条件設定処理のステップSJ5(図15参照)を介して本処理が実行されると、CPU1は図18に図示するステップSL1に進み、1段内の小節数を計数するカウンタMsCntをインクリメントして歩進させる。次いで、ステップSL2では、ポインタMsで指定される小節の次の小節を指定する値を、ポインタMsNにセットする。そして、ステップSL3では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。
ラベリング先頭小節ならば、判断結果は「YES」になり、ステップSL4に進む。ステップSL4では、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。次いで、ステップSL5では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させる一方、カウンタMsCntをゼロリセットして本処理を終える。
このように、ポインタMsで指定される小節の次がラベリング先頭小節であると、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する。
一方、ポインタMsで指定される小節の次がラベリング先頭小節でなければ、上記ステップSL3の判断結果は「NO」になり、ステップSL6に進む。ステップSL6では、1段内に含まれる小節数をカウントするカウンタMsCntの値が1段の標準小節数以上であるか否かを判断する。カウンタMsCntの値が1段の標準小節数未満であると、判断結果は「NO」になり、ステップSL12に進み、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPassを設定して本処理を終える。
これに対し、カウンタMsCntの値が1段の標準小節数以上ならば、上記ステップSL6の判断結果が「YES」になり、ステップSL7に進み、ポインタiMsに初期値「1」をセットする。次いで、ステップSL8では、ポインタiMsが所定の検索数を超えたかどうか、つまり1段で表示可能な小節数を超えたか否かを判断する。1段で表示可能な小節数を超えていなければ、判断結果は「YES」になり、ステップSL9に進む。
ステップSL9では、ポインタMsで指定される小節からポインタiMs個先(Ms+iMs)の小節を指定する値をポインタMsNにセットする。続いて、ステップSL10では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。ラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSL11に進み、ポインタiMsを歩進させた後、上述のステップSL8に処理を戻す。
以後、歩進されたポインタiMsが所定の検索数を超えるまで、すなわち1段で表示可能な小節数を超えるまでの間、上記ステップSL8〜SL11を繰り返すことによって、ポインタMsで指定される小節の次の小節から1段で表示可能な小節数に達するまでの間でラベリング先頭小節の有無を検索する。
ラベリング先頭小節が検索されず、歩進されたポインタiMsが所定の検索数を超えて1段で表示可能な小節数に達すると、上記ステップSL8の判断結果が「NO」となり、ステップSL13に進み、継続音チェック処理を実行して本処理を終える。継続音チェック処理では、後述するように、1段で表示可能な小節数に達するまでの間に、小節をまたぐ継続音を有していない小節を探し出し、該当する小節で段送り設定する。
これに対し、1段で表示可能な小節数を超えるまでの間にラベリング先頭小節が見つかると、上記ステップSL10の判断結果が「YES」になり、ステップSL12に進む。ステップSL12では、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPass(Ms.iRPass)を設定した後、本処理を終える。
(2)継続音チェック処理の動作
次に、図19〜図20を参照して継続音チェック処理の動作を説明する。上述した段送り判定処理のステップSL13(図18参照)を介して本処理が実行されると、CPU1は図19に図示するステップSM1に進み、ポインタMsで指定される小節から次の小節をまたぐ継続音の有無を判断する。継続音が無ければ、判断結果は「YES」になり、ステップSM2に進む。
ステップSM2では、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。続いて、ステップSM3では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットして本処理を終える。
一方、ポインタMsで指定される小節から次の小節にまたぐ継続音が存在すると、上記ステップSM1の判断結果が「NO」になり、ステップSM4に進む。ステップSM4では、ポインタiMsに初期値「1」をセットする。そして、ステップSM5〜SM10では、1段で表示可能な小節数に達するまでポインタiMsを歩進させながら、段またぎをしない小節、つまり小節をまたぐ継続音を有していない小節を探し出す。
すなわち、ステップSM5では、ポインタiMsが所定の検索数を超えたかどうか、つまり1段で表示可能な小節数を超えたか否かを判断する。1段で表示可能な小節数を超えていなければ、判断結果は「YES」になり、ステップSM6に進む。ステップSM6では、ポインタMsで指定される小節からポインタiMs個前(Ms−iMs)の小節を指定する値をポインタMscにセットする。続いて、ステップSM7では、ポインタMscで指定される小節から次の小節にまたぐ継続音の有無を判断する。
継続音が有ると、ここでの判断結果は「NO」になり、ステップSM8に進む。ステップSM8では、ポインタMsで指定される小節からポインタiMs個後(Ms+iMs)の小節を指定する値をポインタMscにセットする。続いて、ステップSM9では、ポインタMscで指定される小節から次の小節にまたぐ継続音の有無を判断する。継続音が有ると、ここでの判断結果は「NO」になり、ステップSM10に進み、ポインタiMsを歩進させた後、上述のステップSM5に処理を戻す。
以後、歩進されたポインタiMsが所定の検索数を超えるまで、すなわち1段で表示可能な小節数に達するまでの間、上記ステップSM5〜SM10を繰り返すことによって、小節をまたぐ継続音を有していない小節を探し出す。そして、該当する小節が検索されなければ、上記ステップSM5の判断結果が「NO」となり、上述したステップSM3に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットして本処理を終える。
これに対し、ポインタMsで指定される小節からポインタiMs個前(Ms−iMs)の小節に継続音が存在しない場合には、上記ステップSM7の判断結果が「YES」となり、図20に図示するステップSM11に進む。また、ポインタMsで指定される小節からポインタiMs個後(Ms+iMs)の小節に継続音が存在しない場合には、上記ステップSM9の判断結果が「YES」になり、図20に図示するステップSM18に進む。以下、ポインタiMs個前(Ms−iMs)の小節に継続音が存在しない場合と、ポインタiMs個後(Ms+iMs)の小節に継続音が存在しない場合とに分けて動作説明を進める。
<ポインタiMs個前(Ms−iMs)の小節に継続音が存在しない場合>
この場合、図20に図示するステップSM11に進み、ポインタMscで指定される小節の小節データMeasureに、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)をセットする。次いで、ステップSM12では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットする。続いて、ステップSM13では、1つ後の小節を指定するようポインタMscを更新する。
この後、ステップSM14〜SM16では、ポインタMscで指定される小節がポインタMsで指定される小節に一致するまでポインタMscを歩進させる毎に、その歩進されるポインタMscで指定される小節の小節データMeasureの段番号iRow(Msc.iRow)としてレジスタRowにストアされている値を登録する一方、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り無しを表す値「0」をセットする。そして、ポインタMscで指定される小節がポインタMsで指定される小節に一致すると、ステップSM14の判断結果が「NO」になり、本処理を終える。
<ポインタiMs個後(Ms+iMs)の小節に継続音が存在しない場合>
この場合、図20に図示するステップSM18に進み、ポインタMscで指定される小節の小節データMeasureに、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)をセットする。次いで、ステップSM19〜SM21では、ポインタMsで指定される小節がポインタMscで指定される小節に一致するまでポインタMsを歩進させる毎に、その歩進されるポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)としてレジスタRowにストアされている値を登録する一方、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り無しを表す値「0」をセットする。
そして、ポインタMsで指定される小節がポインタMscで指定される小節に一致すると、ステップSM19の判断結果が「NO」になり、ステップSM17に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットして本処理を終える。このように、継続音チェック処理では、1段で表示可能な小節数に達するまでの間に、小節をまたぐ継続音を有していない小節を探し出し、該当する小節で段送り設定を行う。
以上のように、第2実施形態による段送り判定処理では、1段で表示可能な標準小節数を超えて段送りを行う際に、小節をまたぐ継続音を有していない小節を探し出し、該当する小節で段送り設定を行うので、見易い楽譜を表示することが可能になる。
[第3実施形態]
次に、図21〜図23を参照して第3実施形態について説明する。第3実施形態の構成は、前述した第1実施形態と同一なので、その説明については省略する。上述した第1実施形態では、分割された各区間の終わりを、楽譜表示される各段末尾の小節となるように段送り設定したのに対し、第3実施形態では、分割された区間が複数の段にまたがる際に、できる限り段の上下で類似性の高い小節が並ぶように段送り設定する。以下では、こうした第3実施形態による「段送り判定処理」の動作を説明する。
(1)段送り判定処理の動作
図21は、第3実施形態による段送り判定処理の動作を示すフローチャートである。上述した第1実施形態と同様に、表示条件設定処理のステップSJ5(図15参照)を介して本処理が実行されると、CPU1は図21に図示するステップSN1に進み、1段に含まれる小節数を計数するカウンタMsCntをインクリメントして歩進させる。次いで、ステップSN2では、ポインタMsで指定される小節の次の小節を指定する値を、ポインタMsNにセットする。そして、ステップSN3では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。
ラベリング先頭小節であると、判断結果は「YES」になり、ステップSN4に進む。ステップSN4では、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。次いで、ステップSL5では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させる一方、カウンタMsCntをゼロリセットして本処理を終える。
このように、ポインタMsで指定される小節の次がラベリング先頭小節であると、レジスタRowにストアされている値を、ポインタMsで指定される現小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する。
一方、ポインタMsで指定される小節の次がラベリング先頭小節でなければ、上記ステップSN3の判断結果は「NO」になり、ステップSN6に進む。ステップSN6では、1段内に含まれる小節数を計数するカウンタMsCntの値が1段の標準小節数以上であるか否かを判断する。カウンタMsCntの値が1段の標準小節数未満ならば、判断結果は「NO」になり、ステップSN12に進み、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPass(Ms.iRPass)を設定して本処理を終える。
これに対し、カウンタMsCntの値が1段の標準小節数以上ならば、上記ステップSN6の判断結果が「YES」になり、ステップSN7に進み、ポインタiMsに初期値「1」をセットする。次いで、ステップSN8では、ポインタiMsが所定の検索数を超えたかどうか、つまり1段で表示可能な小節数を超えたか否かを判断する。1段で表示可能な小節数を超えていなければ、判断結果は「YES」になり、ステップSN9に進む。
ステップSN9では、ポインタMsで指定される小節からポインタiMs個先(Ms+iMs)の小節を指定する値をポインタMsNにセットする。続いて、ステップSN10では、ポインタMsNで指定される小節がラベリング先頭小節であるか否かを判断する。ラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSN11に進み、ポインタiMsを歩進させた後、上述のステップSN8に処理を戻す。
以後、歩進されたポインタiMsが所定の検索数を超えるまで、すなわち1段で表示可能な小節数を超えるまでの間、上記ステップSN8〜SN11を繰り返すことによって、ポインタMsで指定される小節の次の小節から1段で表示可能な小節数に達するまでの間でラベリング先頭小節の有無を検索する。
ラベリング先頭小節が検索されず、歩進されたポインタiMsが所定の検索数を超えて1段で表示可能な小節数に達すると、上記ステップSN8の判断結果が「NO」となり、ステップSN13に進み、類似箇所チェック処理を実行して本処理を終える。類似箇所チェック処理では、後述するように、1段で表示可能な小節数に達するまでの間に、上段先頭小節に類似する小節を探し出し、該当する小節で段送り設定を行う。
これに対し、1段で表示可能な小節数を超えるまでの間にラベリング先頭小節が見つかると、上記ステップSN10の判断結果が「YES」になり、ステップSN12に進み、レジスタRowにストアされている値を、ポインタMsで指定される現小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録すると共に、段送り無しを表す値「0」の段送りフラグiRPass(Ms.iRPass)を設定して本処理を終える。
(2)類似箇所チェック処理の動作
次に、図22〜図23を参照して類似箇所チェック処理の動作を説明する。上述した段送り判定処理のステップSN13(図21参照)を介して本処理が実行されると、CPU1は図22に図示するステップSP1に進む。ステップSP1では、ポインタMsで指定される小節Aと、楽譜として表示した時に小節Aを含む段の上に位置する段の先頭小節Bとの一致率を前述したマトリクス要素Mat1[A][B]から読み出し、読み出した一致率が一致閾値の半数以上であるか、つまりポインタMsで指定される小節が上段先頭小節に類似しているかどうかを判断する。
ポインタMsで指定される小節が上段先頭小節に類似していれば、判断結果は「YES」になり、ステップSP2に進み、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasure中の段番号iRow(Ms.iRow)として登録する一方、当該小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り有りを表す値「1」をセットする。そして、ステップSP3に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットして本処理を終える。
一方、ポインタMsで指定される小節が上段先頭小節に類似していていなければ、上記ステップSP1の判断結果が「NO」になり、ステップSP4に進む。ステップSP4では、ポインタiMsに初期値「1」をセットする。そして、ステップSP5〜SP10では、1段で表示可能な小節数に達するまでポインタiMsを歩進させながら、上段先頭小節に類似する小節を探し出す。
すなわち、ステップSP5では、ポインタiMsが所定の検索数を超えたかどうか、つまり1段で表示可能な小節数を超えたか否かを判断する。1段で表示可能な小節数を超えていなければ、判断結果は「YES」になり、ステップSP6に進む。ステップSP6では、ポインタMsで指定される小節からポインタiMs個前(Ms−iMs)の小節を指定する値をポインタMscにセットする。続いて、ステップSP7では、ポインタMscで指定される小節が上段先頭小節に類似しているかどうかを判断する。
ポインタMscで指定される小節が上段先頭小節に類似していなければ、判断結果は「NO」になり、ステップSP8に進み、ポインタMsで指定される小節からポインタiMs個後(Ms+iMs)の小節を指定する値をポインタMscにセットする。続いて、ステップSP9では、ポインタMscで指定される小節が上段先頭小節に類似しているかどうかを判断する。ポインタMscで指定される小節が上段先頭小節に類似していなければ、判断結果は「NO」になり、ステップSP10に進み、ポインタiMsを歩進させた後、上述のステップSP5に処理を戻す。
以後、歩進されたポインタiMsが所定の検索数を超えるまで、すなわち1段で表示可能な小節数に達するまでの間、上記ステップSP5〜SP10を繰り返すことによって、上段先頭小節に類似する小節を探し出す。そして、該当する小節が検索されなければ、上記ステップSP5の判断結果が「NO」となり、上述したステップSP3に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットして本処理を終える。
これに対し、ポインタMsで指定される小節からポインタiMs個前(Ms−iMs)に上段先頭小節に類似する小節が存在すると、上記ステップSP7の判断結果が「YES」となり、図23に図示するステップSP11に進む。また、ポインタMsで指定される小節からポインタiMs個後(Ms+iMs)に上段先頭小節に類似する小節が存在すると、上記ステップSP9の判断結果が「YES」になり、図23に図示するステップSP18に進む。以下、上段先頭小節に類似する小節がポインタiMs個前に存在する場合と、上段先頭小節に類似する小節がポインタiMs個後に存在する場合とに分けて動作説明を進める。
<上段先頭小節に類似する小節がポインタiMs個前に存在する場合>
この場合、図23に図示するステップSP11に進み、ポインタMscで指定される小節の小節データMeasureに、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)をセットする。次いで、ステップSP12では、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットする。続いて、ステップSP13では、1つ後の小節を指定するようポインタMscを更新する。
この後、ステップSP14〜SP16では、ポインタMscで指定される小節がポインタMsで指定される小節に一致するまでポインタMscを歩進させる毎に、その歩進されるポインタMscで指定される小節の小節データMeasureの段番号iRow(Msc.iRow)としてレジスタRowにストアされている値を登録する一方、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り無しを表す値「0」をセットする。そして、ポインタMscで指定される小節がポインタMsで指定される小節に一致すると、ステップSP14の判断結果が「NO」になり、本処理を終える。
<上段先頭小節に類似する小節がポインタiMs個後に存在する場合>
この場合、図23に図示するステップSP18に進み、ポインタMscで指定される小節の小節データMeasureに、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)をセットする。次いで、ステップSP19〜SP21では、ポインタMsで指定される小節がポインタMscで指定される小節に一致するまでポインタMsを歩進させる毎に、その歩進されるポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)としてレジスタRowにストアされている値を登録する一方、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)として、段送り無しを表す値「0」をセットする。
そして、ポインタMsで指定される小節がポインタMscで指定される小節に一致すると、ステップSP19の判断結果が「NO」になり、ステップSP17に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、1段内に含まれる小節数をカウントするカウンタMsCntをゼロリセットして本処理を終える。このように、類似箇所チェック処理では、1段で表示可能な小節数に達するまでの間に、上段先頭小節に類似する小節を探し出し、該当する小節で段送り設定を行う。
以上のように、第3実施形態による段送り判定処理では、1段で表示可能な小節数に達するまでの間に、上段先頭小節に類似する小節を探し出し、該当する小節で段送り設定を行うので、段の上下で類似性の高い小節が並ぶようになり、見易い楽譜を表示することが可能になる。
[第4実施形態]
次に、図24〜図26を参照して第4実施形態について説明する。第4実施形態の構成は、前述した第1実施形態と同一なので、その説明については省略する。第4実施形態では、ページの最終小節にできるだけ演奏コストが低く演奏し易い小節を選定し、その小節でページ送り設定することによってユーザの譜めくり動作を容易にする。以下では、こうした第4実施形態による「表示条件設定処理」の動作を説明する。
(1)表示条件設定処理の動作
図24は、第4実施形態による表示条件設定処理の動作を示すフローチャートである。前述した第1実施形態と同様に、メインルーチンのステップSA4(図5参照)を介して本処理が実行されると、CPU1は図24に図示するステップSQ1に進む。ステップSQ1〜SQ2では、ページ番号iPageを保持するレジスタPage、段番号iRowを保持するレジスタRow、段数を計数するカウンタRwCntおよび1段内に含まれる小節数を計数するカウンタMsCntを初期化(ゼロリセット)する。続いて、ステップSQ3では、最初の小節を指定する値をポインタMsにセットする。
次いで、ステップSQ4では、ポインタMsで指定される小節が曲終端を超えているか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSQ5に進む。ステップSQ5では、ポインタMsで指定される小節がラベリング先頭小節であるか否かを判断する。ラベリング先頭小節でなければ、判断結果は「NO」になり、ステップSQ6に進み、次の小節を指定するようポインタMsを歩進させた後、上述のステップSQ4に処理を戻す。
一方、ポインタMsで指定される小節がラベリング先頭小節であると、上記ステップSQ5の判断結果が「YES」になり、ステップSQ7に進む。ステップSQ7では、前の小節の小節データMeasure中の段送りフラグiRPassに段送り有りを表す値「1」をセットする段送り設定を行うと共に、この段送りに応じてレジスタRowの値をインクリメントして歩進させる。次いで、ステップSQ8では、レジスタRowに格納される段数が、ページ送りを行う段数に達したか否かを判断する。
ページ送りを行う段数に達していると、判断結果は「YES」になり、ステップSQ9を介してページ送り位置検証処理を実行する。ページ送り位置検証処理では、後述するように、ページ送りを行う段数に達している状況において、段末尾の小節の最後4分音符相当以上の期間中に音符や休符が有る場合や、段末尾の小節の演奏コストが規定値以下である場合に、その段末尾の小節でページ送り設定する。
こうしたページ送り位置検証処理が完了すると、ステップSQ10に進む。また、ページ送りを行う段数に達していない場合も上記ステップSQ8の判断結果が「NO」となり、ステップSQ10に進む。ステップSQ10では、グループ内(ラベリングされた区間)の最後の小節を指定する値をポインタMsTermにセットする。次いで、ポインタMsTermで指定されるラベリングされた区間の最後の小節からポインタMsで指定される小節までの小節数(MsTerm−Ms)が、1段で表示可能な最大小節数を超えているか否かを判断する。
1段で表示可能な最大小節数を超えていなければ、判断結果は「NO」になり、前述したステップSQ4に処理を戻す。これに対し、1段で表示可能な最大小節数を超えると、上記ステップSQ11の判断結果が「YES」になり、ステップSQ12に進む。ステップSQ12では、ポインタMsで指定される小節の次がラベリング先頭小節になる場合や1段で表示可能な標準小節数を超える場合に、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する段送り判定処理を実行する。
次いで、ステップSQ13では、グループ内(ラベリングされた区間)の末尾の次の小節を指定する値をポインタMsにセットした後、前述のステップSQ4に処理を戻す。以後、ポインタMsで指定される小節が曲終端を超えるまで、上述したステップSQ4〜SQ13を繰り返す。そして、ポインタMsで指定される小節が曲終端を超えると、ステップSQ4の判断結果が「YES」になり、本処理を終える。
(2)ページ送り位置検証処理の動作
次に、図25〜図26を参照してページ送り位置検証処理の動作を説明する。上述した第4実施形態による表示条件設定処理のステップSQ9(図24参照)を介して本処理が実行されると、CPU1は図25に図示するステップSR1に進む。ステップSR1では、ポインタMsで指定される小節の最後4分音符相当以上の期間に音符(継続音)や休符が無いかどうかを判断する。
該当する音符や休符が無ければ、判断結果は「YES」になり、ステップSR2に進み、レジスタPageにストアされている値を、ポインタMsで指定される小節の小節データMeasure中のページ番号iPage(Ms.iPage)として登録する一方、当該小節データMeasure中のページ送りフラグiPPass(Ms.iPPass)として、ページ送り有りを表す値「1」をセットする。そして、ステップSR3に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットして本処理を終える。
一方、ポインタMsで指定される小節の最後4分音符相当以上の期間に音符や休符が有ると、上記ステップSR1の判断結果が「NO」になり、ステップSR4に進む。ステップSR4では、ポインタiRwに初期値「1」をセットする。次いで、ステップSR5では、ポインタiRwの値が所定の検索数を超えたかどうかを判断する。ポインタiRwが所定の検索数を超えていなければ、判断結果は「YES」になり、ステップSR6に進む。ステップSR6では、iRw段前の末尾の小節を指定する値をポインタMscにストアする。
次いで、ステップSR7では、ポインタMscで指定される小節の最後4分音符相当以上の期間に音符(継続音)や休符が無いかどうかを判断する。該当する音符(継続音)や休符が無ければ、判断結果は「YES」になり、ステップSR8に進み、ポインタiRwをインクリメントして歩進させた後、上述のステップSR5に処理を戻す。
以後、ポインタiRwの値が所定の検索数を超えるまでポインタiRwを歩進させに、これに応じて遡上するiRw段前の末尾の小節(ポインタMscが指定する小節)毎に、その小節の最後4分音符相当以上の期間に音符(継続音)や休符が有るかどうかを判断する。そして、該当する音符(継続音)や休符が見つかると、上記ステップSR7の判断結果が「NO」になり、ステップSR9に進み、ポインタMscで指定される小節の小節データMeasureに、ページ送り有りを表す値「1」のページ送りフラグiPPass(Ms.iPPass)をセットする。これにより、音符(継続音)や休符を有する小節でページ送り設定が行われる。
次いで、ステップSR10では、レジスタPageをインクリメントして歩進させると共に、ページ中の段数をカウントするカウンタRwCntをゼロリセットする。そして、ステップSR11〜SR15では、ポインタMscで指定される小節がポインタMsで指定される小節に一致するまでポインタMscを歩進させる毎に、この歩進されるポインタMscで指定される小節の小節データMeasure中のページ番号iPage(Ms.iPage)としてレジスタPageに格納される値を登録する。また、歩進されるポインタMscで指定される小節の小節データMeasure中の段送りフラグiRPassが「1」、すなわちポインタMscで指定される小節が段送り設定されていると、カウンタRwCntをインクリメントする。そして、ポインタMscで指定される小節がポインタMsで指定される小節に一致すると、ステップSR15の判断結果が「YES」になり、本処理を終える。
さて一方、ポインタiRwを所定の検索数を超えるまで歩進させても、末尾に音符(継続音)や休符を有する小節が見つからない場合には、上述したステップSR5の判断結果が「NO」になり、図26に図示するステップSR16に進む。ステップSR16では、ポインタMsで指定される小節の小節データMeasure中の演奏コストiCost(Ms.iCost)が規定値以下であるか否かを判断する。
演奏コストiCost(Ms.iCost)が規定値以下ならば、判断結果は「YES」になり、ステップSR17に進み、レジスタPageにストアされている値を、ポインタMsで指定される小節の小節データMeasure中のページ番号iPage(Ms.iPage)として登録する一方、当該小節データMeasure中のページ送りフラグiPPass(Ms.iPPass)として、ページ送り有りを表す値「1」をセットする。そして、ステップSR18に進み、レジスタRowおよびカウンタRwCntをインクリメントして歩進させると共に、カウンタMsCntをゼロリセットして本処理を終える。
一方、ポインタMsで指定される小節の演奏コストiCost(Ms.iCost)が規定値を超えていると、上記ステップSR16の判断結果は「NO」になり、ステップSR19に進む。ステップSR19では、ポインタiRwに初期値「1」をセットする。次いで、ステップSR20では、ポインタiRwの値が所定の検索数を超えたかどうかを判断する。ポインタiRwが所定の検索数を超えると、判断結果は「NO」になり、上述のステップSR17に進む。
これに対し、ポインタiRwが所定の検索数を超えていなければ、上記ステップSR20の判断結果は「YES」になり、ステップSR21に進み、iRw段前の末尾の小節を指定する値をポインタMscにストアする。続いて、ステップSR22では、ポインタMscで指定される小節の演奏コストiCost(Msc.iCost)が規定値以下であるか否かを判断する。小節の演奏コストiCost(Msc.iCost)が規定値を超えていれば、判断結果は「NO」になり、ステップSR23に進み、ポインタiRwをインクリメントして歩進させた後、上述のステップSR20に処理を戻す。
以後、所定の検索数を超えるまでポインタiRwを歩進させる毎に、これに応じて遡上するiRw段前の小節の演奏コストiCost(Msc.iCost)が規定値以下であるかどうかを判断する。規定値以下の演奏コストiCostが見つかると、上記ステップSR22の判断結果が「YES」になり、ステップSR24に進み、ポインタMscで指定される小節の小節データMeasureに、ページ送り有りを表す値「1」のページ送りフラグiPPass(Ms.iPPass)をセットする。
次いで、ステップSR25では、レジスタPageをインクリメントして歩進させると共に、ページ中の段数をカウントするカウンタRwCntをゼロリセットする。そして、ステップSR26〜SR30では、ポインタMscで指定される小節がポインタMsで指定される小節に一致するまでポインタMscを歩進させる毎に、歩進されるポインタMscで指定される小節の小節データMeasure中のページ番号iPage(Ms.iPage)としてレジスタPageに格納される値を登録する。また、歩進されるポインタMscで指定される小節の小節データMeasure中の段送りフラグiRPassが「1」、すなわちポインタMscで指定される小節が段送り設定されていると、カウンタRwCntをインクリメントする。そして、ポインタMscで指定される小節がポインタMsで指定される小節に一致すると、ステップSR15の判断結果が「YES」になり、本処理を終える。
以上のように、第4実施形態では、ページ送りを行う段数に達すると、段末尾の小節の最後4分音符相当以上の期間中に音符や休符が有る場合や、段末尾の小節の演奏コストが規定値以下である場合に、その段末尾の小節でページ送り設定するので、ユーザの譜めくり動作を容易にすることが可能になる。
[変形例]
次に、図27を参照して第4実施形態の変形例について説明する。図27は、変形例による表示条件設定処理の動作を示すフローチャートである。前述した第1実施形態と同様に、メインルーチンのステップSA4(図5参照)を介して本処理が実行されると、CPU1は図27に図示するステップSS1に進む。ステップSS1〜SS2では、ページ番号iPageを保持するレジスタPage、段番号iRowを保持するレジスタRow、段数を計数するカウンタRwCntおよび1段内の小節数を計数するカウンタMsCntを初期化(ゼロリセット)する。続いて、ステップSS3では、最初の小節を指定する値をポインタMsにセットする。
次いで、ステップSS4では、ポインタMsで指定される小節が曲終端を超えているか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSS5を介して段送り判定処理を実行する。段送り判定処理では、ポインタMsで指定される小節の次がラベリング先頭小節になる場合や1段で表示可能な標準小節数を超える場合に、レジスタRowにストアされている値を、ポインタMsで指定される小節の小節データMeasureの段番号iRow(Ms.iRow)として登録すると共に、段送り有りを表す値「1」の段送りフラグiRPass(Ms.iRPass)を設定する。
続いて、ステップSS6では、ポインタMsで指定される小節の小節データMeasure中の段送りフラグiRPass(Ms.iRPass)が、段送り有りを表す値「1」であるか否かを判断する。段送りフラグiRPass(Ms.iRPass)が「0」(段送り無し)ならば、判断結果は「NO」になり、ステップSS7に進む。ステップSS7では、レジスタPageの値を、ポインタMsで指定される小節の小節データMeasureのページ番号iPage(Ms.iPage)として登録すると共に、ページ送り無しを表す値「0」のページ送りフラグiPPass(Ms.iPPass)を設定する。そして、ステップSS10に進み、ポインタMsを次の小節を指定するよう歩進させた後、上述のステップSS4に処理を戻す。
一方、段送りフラグiRPass(Ms.iRPass)が「1」(段送り有り)であると、上記ステップSS6の判断結果は「YES」になり、ステップSS8に進む。ステップSS8では、1ページ中の段数をカウントするカウンタRwCntの値が1ページの標準段数以上であるか否かを判断する。カウンタRwCntの値が標準段数未満ならば、判断結果は「NO」になり、上述したステップSS7に進む。
これに対し、前述した段送り判定処理(ステップSS5)で段送りが生じ、これにより歩進されたカウンタRwCntの値が、1ページの標準段数を超えると、上記ステップSS8の判断結果は「YES」になり、ステップSS9に進む。ステップSS9では、段末尾の小節の最後4分音符相当以上の期間中に音符や休符が有る場合や、段末尾の小節の演奏コストが規定値以下である場合に、その段末尾の小節でページ送り設定するページ送り位置検証処理を実行する。この後、ステップSS10に進み、ポインタMsを次の小節を指定するよう歩進させた後、上述のステップSJ4に処理を戻す。以後、ポインタMsで指定される小節が曲終端を超えるまで、上述したステップSS4〜SS10を繰り返す。そして、ポインタMsで指定される小節が曲終端を超えると、ステップSS4の判断結果が「YES」になり、本処理を終える。
このように、変形例によれば、第4実施形態と同様、ページ送りを行う段数に達すると、段末尾の小節の最後4分音符相当以上の期間中に音符や休符が有る場合や、段末尾の小節の演奏コストが規定値以下である場合に、その段末尾の小節でページ送り設定するので、ユーザの譜めくり動作を容易にすることが可能になる。