以下、図面を参照して本発明の実施の形態について説明する。
[第1実施形態]
A.構成
(1)全体構成
図1は、本発明の第1実施形態による楽曲構造分析装置の全体構成を示すブロック図である。楽曲構造分析装置は、CPU1、ROM2、RAM3、入力部4、表示部5およびMIDIインタフェース6を備える。CPU1は、入力部4が発生する操作イベントに応じて、ROM2に格納される各種プログラムを実行して装置各部を制御する。CPU1では、本発明の要旨に係わる処理として、外部の電子楽器7からMIDIインタフェース6を介して曲を構成する各音を表す曲データを取込み、取込んだ曲データの内からメロディが重複したり類似する範囲を検出する楽曲構造分析を実行する。
ROM2は、CPU1にロードされる各種制御プログラムやテーブル等を記憶する。ここで言う各種制御プログラムとは、後述するメインルーチン、マトリクス処理およびグループラベルング処理を含む。RAM3は、CPU1の演算に用いられる各種レジスタ・フラグデータを一時記憶するワークエリアと、MIDIインタフェース6を介して外部の電子楽器7より取込むSMF形式の曲データMidiEventが格納される曲データエリアと、この曲データエリアに格納された曲データMidiEventから派生させた小節データMeasureを記憶する小節データエリアとを備える。これらRAM3に格納される主要なデータ構成については追って説明する。入力部4は、ユーザ操作に対応した操作イベントを発生してCPU1に供給する。表示部5は、CPU1の制御の下に、例えば曲データMidiEventを楽譜表示したり、表示された楽譜上に楽曲構造分析結果を表示する。
(2)データ構成
次に、図2〜図3を参照してRAM3に格納される曲データMidiEventおよび小節データMeasureの構成を説明する。先ず図2は、RAM3の曲データエリアに格納される曲データMidiEventの構成を示す図である。曲データMidiEvent[0]〜[N]は楽曲を構成する各音(メロディ)を表し、その終端には曲の終わりを表すENDデータを備える。
1つの曲データMidiEventは、曲開始時点からの経過時間で表現される発音開始時間ITime、発音期間を表す音長lGate、音高Pitch、音量Vel、ポインタprevおよびポインタnextから構成される。なお、ポインタprevは、1つ前の演奏データMidiEventのアドレスを指定する。ポインタnextは、次の演奏データMidiEventのアドレスを指定する。
図3は、RAM3の小節データエリアに格納される小節データMeasureの構成を示す図である。小節データMeasure[0]〜[N]は、各小節毎の属性を表す。1つの小節データMeasureは、曲開始時点からの経過時間で表現される開始時刻lTime、小節長lGate、小節に付与されるラベル番号iLavel、ラベルオプションiLvOption、ラベル内状態iLvStatus、ポインタprevおよびポインタnextから構成される。
なお、ラベル番号iLavel、ラベルオプションiLvOptionおよびラベル内状態iLvStatusの内容については追って述べる。また、ポインタprevは、1つ前の小節データMeasureのアドレスを指定する。ポインタnextは、次の小節データMeasureのアドレスを指定する。
B.動作
次に、図4〜図14を参照して第1実施形態の動作について説明する。以下では、CPU1が実行するメインルーチン、マトリクス処理およびグループラベリング処理の各動作について述べる。なお、マトリクス処理は小節間一致率算出処理を含み、小節間一致率算出処理は一致判定処理を含む。グループラベリング処理は、ラベリング処理およびラベリング検証処理から構成される。
(1)メインルーチンの動作
入力部4からCPU1にメイルーチンの実行を指示するイベントが供給されると、CPU1は図4に図示するメインルーチンを実行してステップSA1に進み、曲データの読み込みを実行する。すなわち、ステップ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は、後述するグループラベリング処理にて生成される。
また、本実施の形態では、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]から小節データMeasure[0]〜[N]を派生するようにしたが、これに限らず、電子楽器7が備える小節データMeasure[0]〜[N]をMIDIインタフェース6を介して取込む態様であっても構わない。
次いで、ステップSA2では、マトリクス処理を実行する。マトリクス処理では、後述するように、RAM3の小節データエリアに格納された小節データMeasure[0]〜[N]を参照して、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]を、ポインタReで指定される比較元小節とポインタLuで指定される比較元小節とに区別し、ポインタReで指定される比較元小節を行要素、ポインタLuで指定される比較先小節を列要素としたマトリクス要素Mat1[Re][Lu]を生成する。マトリクス要素Mat1[Re][Lu]は、ポインタReで指定される比較元小節を構成する各比較元音の音高・発音期間と、ポインタLuで指定される比較先小節を構成する各比較先音の音高・発音期間との一致率を表す。
続いて、ステップSA3では、グループラベリング処理を実行する。グループラベリング処理は、後述するように、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録するラベリングを行った後、ラベリングされた小節区間が長過ぎる場合には、ラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上あれば、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分ける。この後、ステップSA4に進み、上記ステップSA3にて行われたグループラベリング処理の結果を表示部5に表示出力する。
(2)マトリクス処理の動作
次に、図5を参照してマトリクス処理の動作を説明する。前述したメインルーチンのステップSA2(図4参照)を介して本処理が実行されると、CPU1は図5に図示するステップSB1に進み、比較元となる小節を指定するポインタReに、曲先頭の小節を指定する値をセットする。次いで、ステップSB2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。ポインタReで指定される比較元小節が曲終端を超えていなければ、判断結果は「NO」になり、ステップSB3に進み、比較先となる小節を指定するポインタLuに、曲先頭の小節を指定する値をセットする。
続いて、ステップSB4では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」になり、ステップSB5を介して小節間一致率算出処理を実行する。小節間一致率算出処理では、後述するように、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum1/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat1[Re][Lu]にストアする。
次いで、ステップSB6では、ポインタLuを歩進させ、比較先小節を次の小節に設定した後、上述のステップSB4に処理を戻す。以後、曲終端を超えるまでポインタLuで指定される比較先小節を歩進させる毎に、ステップSB5の小節間一致率算出処理を繰り返し実行する。そして、ポインタLuで指定される比較先小節が曲終端を超えると、上記ステップSB4の判断結果が「YES」になり、ステップSB7に進み、ポインタReを歩進させ、比較元小節を次の小節に設定した後、上述のステップSB2に処理を戻す。以後、ポインタReが曲終端を超える迄、上述したステップSB3〜SB7を繰り返す。そして、ポインタRe(比較元小節)が曲終端を超えると、前述したステップSB2の判断結果が「YES」となり、本処理を終える。
ここで、図8を参照してマトリクス処理の具体的な動作の一例を説明する。例えば、図8の上部に図示するように、ポインタReで指定される比較元小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=16〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「G4音(#67)」の各比較元音から構成され、一方、ポインタLuで指定される比較先小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=20〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「A4音(#69)」の各比較先音から構成されるする。
そうした場合に、これら各比較元音の音高・発音期間に対する各比較先音の音高・発音期間の一致・不一致を小節内時間t毎に判別すると、図8に図示する通り、小節内時間t=0〜31の内、フラグs1が「0」となる不一致期間は、t=16〜19およびt=23〜30となる。これら不一致期間以外はフラグs1が「1」の一致期間になる。したがって、フラグs1が「1」となる一致期間の積算時間は「20」となり、これを小節分の総時間「32(t=0〜31)」で除算することによって、比較元小節Reと比較先小節Luとの一致率「62%」が得られ、得られた一致率をマトリクス要素Mat1[Re][Lu]にストアする。
以上のように、マトリクス処理では、RAM3の小節データエリアに格納された小節データMeasure[0]〜[N]を参照して、RAM3の曲データエリアに格納した曲データMidiEvent[0]〜[N]を、ポインタReで指定される比較元小節とポインタLuで指定される比較元小節とに区別し、ポインタReで指定される比較元小節を行要素、ポインタLuで指定される比較先小節を列要素として、ポインタReで指定される比較元小節を構成する各比較元音の音高・発音期間と、ポインタLuで指定される比較先小節を構成する各比較先音の音高・発音期間との一致率を算出してマトリクス要素Mat1[Re][Lu]にストアする。なお、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とが同一の場合、マトリクス要素Mat1[Re][Lu]は100%(一致率)となる。
(3)小節間一致率算出処理の動作
次に、図6を参照して小節間一致率算出処理の動作を説明する。上述したマトリクス処理のステップSB5(図5参照)を介して本処理が実行されると、図6に図示するステップSC1に処理を進め、小節内時間tを初期化する。すなわち、ポインタLuで指定される比較先小節の小節データMeasure中の開始時刻lTimeを小節内時間tにセットする。続いて、ステップSC2では、小節内時間tが小節を超えたか否か、つまりポインタLuで指定される比較先小節の小節データMeasure中の小節長lGateを超えたかどうかを判断する。小節内時間tが小節を超えていなければ、判断結果は「NO」いなり、ステップSC3に進む。
ステップSC3では、一致判定処理を実行する。後述するように、一致判定処理では、ポインタReで指定される比較元小節の小節内時間tで発音している比較元音と、ポインタLuで指定される比較先小節の小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1を「1」にセットする。次いで、ステップSC4では、上記ステップSC3の一致判定処理により設定されるフラグs1の値を、レジスタsum1に加算する。そして、ステップSC5では、小節内時間tを歩進させた後、上述したステップSC2に処理を戻す。
以後、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えるまで上述したステップSC2〜SC5を繰り返す。これにより、レジスタsum1には、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との一致期間を累算した積算時間が格納される。そして、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えると、上記ステップSC2の判断結果が「YES」となり、ステップSC6に進む。
ステップSC6では、レジスタsum1に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum1/t)を、マトリクス要素Mat1[Re][Lu]にストアして本処理を終える。なお、ここで言うマトリクス要素Mat1[Re][Lu]とは、ポインタReとポインタLuとで配列要素を指定する2次元レジスタである。
このように、小節間一致率算出処理では、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の各比較先音との一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum1/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat1[Re][Lu]にストアする。
(4)一致判定処理の動作
次に、図7を参照して一致判定処理の動作を説明する。上述した小節間一致率算出処理のステップSC3(図6参照)を介して本処理が実行されると、図7に図示するステップSD1に進み、フラグs1をゼロリセットする。フラグs1は、比較元小節において小節内時間tで発音している音(比較元音)の音高と、比較先小節において小節内時間tで発音している音(比較先音)の音高とが一致している場合や、小節内時間tで発音する比較元音および比較先音が共に存在しない場合に「1」となる。一方、小節内時間tで発音している比較元音の音高と比較先音の音高とが一致しない場合や、小節内時間tで発音する比較元音あるいは比較先音のいずれかが存在しない場合には「0」となる。
次いで、ステップSD2では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタReで指定される比較元小節の小節内時間tで発音している比較元音(曲データMidiEvent)が存在する場合には、その音高PitchをレジスタmeReにストアし、比較元音が存在しない場合には該当音無しを表す値をレジスタmeReにストアする。
続いて、ステップSD3では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタLuで指定される比較先小節の小節内時間tで発音している比較先音が存在する場合には、その音高PitchをレジスタmeLuにストアし、比較先音が存在しない場合には、該当音無しを表す値をレジスタmeLuにストアする。
そして、ステップSD4では、レジスタmeReの内容に基づき比較元音の有無を判断する。レジスタmeReに比較元音の音高Pitchが格納されていると、判断結果は「YES」となり、ステップSD5に進む。ステップSD5では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音無しを表す値がストアされていると、判断結果は「NO」となり、本処理を終える。
一方、レジスタmeLuに比較先音の音高Pitchが格納されていれば、判断結果が「YES」となり、ステップSD6に進む。ステップSD6では、レジスタmeReに格納される比較元音の音高Pitchと、レジスタmeLuに格納される比較先音の音高Pitchとが同一であるか否かを判断する。比較元音と比較先音とが同一音高でなければ、判断結果は「NO」となり、本処理を終える。これに対し、比較元音と比較先音とが同一音高であると、上記ステップSD6の判断結果が「YES」になり、ステップSD7に進み、フラグs1に「1」をセットして本処理を終える。
さて一方、レジスタmeReに比較元音無しを表す値がストアされていると、上記ステップSD4の判断結果が「NO」となり、ステップSD8に進む。ステップSD8では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音無しを表す値がストアされていると、判断結果は「NO」となり、ステップSD9に進み、フラグs1に「1」をセットして本処理を終える。これに対し、レジスタmeLuに比較先音の音高Pitchが格納されていれば、判断結果が「YES」となり、本処理を終える。
このように、一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1を「1」にセットするようになっている。
(5)グループラベリング処理の動作
次に、図9を参照してグループラベリング処理の動作を説明する。前述したメインルーチンのステップSA3(図4参照)を介して本処理が実行されると、CPU1は図9に図示するステップSE1を介してラベリング処理を実行する。後述するように、ラベリング処理では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
続いて、ステップSE2を介してラベリング検証処理を実行した後、本処理を終える。後述するように、ラベリング検証処理では、上記ラベリング処理によりラベリングされた小節区間が長過ぎると、ラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上の場合、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分割する。
(6)ラベリング処理の動作
上述したグループラベリング処理のステップSE1(図9参照)を介して本処理が実行されると、図10に図示するステップSF1に進み、先頭小節を指定する値をポインタReにセットする。続いて、ステップSF2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSF3に進む。
ステップSF3では、ポインタReで指定される比較元小節にラベル付与されているか否かを判断する。ラベル付与とは、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中で、閾値以上の一致率を有するマトリクス要素が連続する範囲(小節区間)を一致性の高いグループとし、そのグループにラベル番号(後述する)を付与することを意味する。そして、ポインタReで指定される比較元小節にラベル付与済みならば、上記ステップSF3の判断結果は「NO」になり、ステップSF13に進み、ポインタReを歩進させた後、上述のステップSF2に処理を戻す。
一方、ポインタReで指定される比較元小節にラベル付与がなされていなければ、上記ステップSF3の判断結果が「YES」になり、ステップSF4に進み、先頭小節を指定する値をポインタReにセットする。次いで、ステップSF5では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSF6に進む。
ステップSF6では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の一致率が閾値以上であるかどうかを判断する。マトリクス要素Mat1[Re][Lu]の一致率が閾値未満ならば、判断結果は「NO」になり、ステップSF10に進み、ポインタLuを歩進させ、比較先小節を次の小節に設定した後、上述のステップSF5に処理を戻す。
一方、マトリクス要素Mat1[Re][Lu]の一致率が閾値以上ならば、上記ステップSF6の判断結果は「YES」になり、ステップSF7に進む。ステップSF7では、閾値以上の一致率を有するマトリクス要素Mat1[Re][Lu]の範囲i(小節数)、すなわちMat1[Re+i][Lu+i]を検出する。次いで、ステップSF8では、閾値以上の一致率が連続した小節数iを保存する。そして、ステップSF9では、現在のポインタLuに、閾値以上の一致率が連続した小節数iを加算してポインタLuを更新させた後、上述のステップSF5に処理を戻す。
以後、更新されたポインタLuが曲終端を超える迄、一致率が連続して閾値を超える小節数iを検出する。そして、更新されたポインタLuが曲終端を超えると、上記ステップSF5の判断結果が「YES」になり、ステップSF11に進む。ステップSF11では、規定数以上の小節が閾値以上であるか否かを判断する。検出した小節数iが規定数未満であると、判断結果は「NO」になり、ステップSF13に進み、ポインタReを歩進させた後、前述したステップSF2に処理を戻す。
これに対し、検出した小節数iが規定数以上ならば、上記ステップSF11の判断結果が「YES」になり、ステップSF12に進み、採番およびラベリングを行う。すなわち、ステップSF12では、RAM3の小節データエリアに格納される小節データMeasure[0]〜[N]の内、閾値以上の一致率が連続した小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、ラベルオプションiLvOptionとして、完全一致を表す値「0」をセットする。
この後、ステップSF13に進み、ポインタReを歩進させた後、前述したステップSF2に処理を戻す。以後、歩進されたポインタReで指定される比較元小節が曲終端を超える迄、上述したステップSF3以降の動作を繰り返す。そして、歩進されたポインタReで指定される比較元小節が曲終端を超えると、ステップSF2の判断結果が「YES」となり、本処理を終える。
このように、ラベリング処理では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。なお、マトリクス要素Mat1[Re][Lu]中で閾値以上の一致率が規定数以上連続する範囲(小節区間)を検索し、該当する区間の各小節データMeasureにラベル番号iLavelを付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionに登録する処理操作全体をラベリングと称す。
(7)ラベリング検証処理の動作
前述したグループラベリング処理のステップSE2(図9参照)を介して本処理が実行されると、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にセットした後、前述のステップSG3(図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を歩進させた後、上記ステップSG17に処理を戻す。以後、エラー状態が連続すれば、ステップ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を参照して第1実施形態の具体的な動作の一例について説明する。先ず、図14(a)に図示される楽譜として表される楽曲の曲データMidiEvent[0]〜[N]および小節データMeasure[0]〜[N]がRAM3に格納されている場合に、前述したマトリクス処理を実行すると、図14(b)に図示するマトリクス要素Mat1[Re][Lu]が生成される。
次に、グループラベリング処理を実行すると、図14(b)に図示するマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録するラベリングを行う。また、グループラベリング処理では、ラベリングされた小節区間が長過ぎる場合にはその小節区間を分割するが、この動作例では分割の条件を満たさない為、図14(b)において長円マークで囲われた部分がラベリングされた範囲(小節区間)となる。
そして、結果出力として、例えば図14(c)に図示するように、RAM3に格納された曲データMidiEvent[0]〜[N]および小節データMeasure[0]〜[N]に基づき楽譜表示する際に、ラベリングされた範囲(小節区間)、すなわち小節M03〜M06と小節M11〜M14との一致および小節M07〜M08と小節M09〜M10との一致を楽譜上でマーク表示する。この結果、楽曲内でメロディが重複する範囲を検出し得るようになる。また、こうして楽曲内でメロディが重複する範囲を検出可能にすることによって、例えば曲データに基づき演奏練習する場合に、メロディが連続する繰り返し部分の削除や、重複部分のスキップなどの機能を実現させるための有用な判断材料を自動的に生成し得るようにすることも可能になる。
[第2実施形態]
次に、図15〜図19を参照して第2実施形態について説明する。第2実施形態の構成は、前述した第1実施形態と同一なので、その説明については省略する。上述した第1実施形態では、楽曲内でメロディが重複する範囲を検出するようにしたが、第2実施形態では、これに加えて更に転調区間を検出する。以下では、こうした第2実施形態による「小節間一致率算出処理」、「一致判定処理」、「グループラベリング処理」、「類似部分ラベリング補正処理」および「ラベル付け替え処理」の各動作を説明する。
(1)小節間一致率算出処理の動作
図15は、第2実施形態による小節間一致率算出処理の動作を示すフローチャートである。前述した第1実施形態と同様に、マトリクス処理のステップSB5(図5参照)を介して本処理が実行されると、CPU1は図15に図示するステップSJ1に処理を進め、小節内時間tを初期化する。すなわち、ポインタLuで指定される比較先小節の小節データMeasure中の開始時刻lTimeを小節内時間tにセットする。
続いて、ステップSJ2では、小節内時間tが小節を超えたか否か、つまりポインタLuで指定される比較先小節の小節データMeasure中の小節長lGateを超えたかどうかを判断する。小節内時間tが小節を超えなければ、判断結果は「NO」となり、ステップSJ3に進む。ステップSJ3では、第2実施形態による一致判定処理を実行する。
後述するように、一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音の音高と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1、s2を共に「1」にセットする。
また、比較元音と比較先音とが転調関係にある相対一致の場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(比較元小節の先頭音の音高)との音高差と、比較先音と基準音(比較先小節の先頭音の音高)との音高差とが一致する場合にフラグs1を「0」、フラグs2に「1」をセットする。
次いで、ステップSJ4では、上記ステップSJ3の一致判定処理により設定されるフラグs1の値をレジスタsum1に、フラグs2の値をレジスタsum2にそれぞれ加算する。そして、ステップSJ5では、小節内時間tを歩進させた後、上述のステップSJ2に処理を戻す。
以後、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超える迄、上述したステップSJ2〜SJ5を繰り返す。これにより、レジスタsum1にはフラグs1が「1」となる完全一致期間を累算した積算時間が格納され、レジスタsum2にはフラグs2が「1」となる相対一致期間を累算した積算時間が格納される。
そして、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えると、上記ステップSJ2の判断結果が「YES」となり、ステップSJ6に進む。ステップSJ6では、レジスタsum1に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum1/t)を、マトリクス要素Mat1[Re][Lu]にストアする。
また、ステップSJ6では、レジスタsum2に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum2/t)を、マトリクス要素Mat2[Re][Lu]にストアして本処理を終える。なお、ここで言うマトリクス要素Mat1[Re][Lu]、Mat2[Re][Lu]とは、それぞれポインタReとポインタLuとで配列要素を指定する2次元レジスタである。
このように、小節間一致率算出処理では、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との完全一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum1/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat1[Re][Lu]にストアする。また、ポインタReで指定される比較元小節中の各比較元音と、ポインタLuで指定される比較先小節中の比較先音との相対一致期間を累算して得た積算時間を、比較先小節分の時間tで除算して一致率(sum2/t)を算出し、算出した一致率をポインタReとポインタLuとで指定されるマトリクス要素Mat2[Re][Lu]にストアする。
(2)一致判定処理の動作
図16は、第2実施形態による一致判定処理の動作を示すフローチャートである。上述した小節間一致率算出処理のステップSJ3(図15参照)を介して本処理が実行されると、図16に図示するステップSK1に進み、フラグs1、s2をそれぞれゼロリセットする。
なお、フラグs1は、比較元小節において小節内時間tで発音している比較元音の音高と、比較先小節において小節内時間tで発音している比較先音の音高とが一致している場合や、小節内時間tで発音する比較元音および比較先音が共に存在しない場合に「1」となり、一方、小節内時間tで発音している比較元音の音高と比較先音の音高とが一致しない場合や、小節内時間tで発音する比較元音あるいは比較先音のいずれかが存在しない場合に「0」となるフラグである。
また、フラグs2は、相対一致する場合に「1」、それ以外は「0」となるフラグである。相対一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(例えば小節先頭の音の音高)との音高差と、比較先音と基準音との音高差とが一致する場合、つまり比較元音と比較先音とが転調関係にあることを表す。
次いで、ステップSK2では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタReで指定される比較元小節の小節内時間tで発音している比較元音(曲データMidiEvent)が存在する場合には、その音高PitchをレジスタmeReにストアし、比較元音が存在しない場合には該当音無しを表す値をレジスタmeReにストアする。
続いて、ステップSK3では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタLuで指定される比較先小節の小節内時間tで発音している比較先音が存在する場合には、その音高PitchをレジスタmeLuにストアし、比較先音が存在しない場合には、該当音無しを表す値をレジスタmeLuにストアする。
そして、ステップSK4では、レジスタmeReの内容に基づき比較元音の有無を判断する。レジスタmeReに比較元音無しを表す値がストアされていると、判断結果は「NO」となり、ステップSK5に進み、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音の音高Pitchが格納されていれば、判断結果は「YES」となり、本処理を終える。これに対し、レジスタmeLuに比較先音無しを表す値がストアされていると、上記ステップSK5の判断結果は「NO」となり、ステップSK6に進み、フラグs1、s2に共に「1」をセットして本処理を終える。
さて一方、レジスタmeReに比較元音の音高Pitchが格納されていると、上記ステップSK4の判断結果が「YES」になり、ステップSK7に進む。ステップSK7では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音無しを表す値がストアされていると、判断結果は「NO」となり、本処理を終えるが、レジスタmeLuに比較先音の音高Pitchが格納されていると、上記ステップSK7の判断結果が「YES」となり、ステップSK8に進む。
ステップSK8では、レジスタmeReに格納される比較元音の音高Pitchと、レジスタmeLuに格納される比較先音の音高Pitchとが同一であるか否かを判断する。比較元音と比較先音とが同一音高ならば、上記ステップSK8の判断結果が「YES」になり、ステップSK9に進み、フラグs1、s2に共に「1」をセットして本処理を終える。
これに対し、比較元音と比較先音とが同一音高でない場合には、上記ステップSK8の判断結果が「NO」となり、ステップSK10に進む。ステップSK10では、基準音(比較元小節の先頭音の音高)とレジスタmeReに格納される比較元音の音高Pitchとの音高差と、基準音(比較先小節の先頭音の音高)とレジスタmeLuに格納される比較先音の音高Pitchとの音高差とが同一か否か、つまり比較元音と比較先音とが転調関係にある相対一致であるかどうかを判断する。相対一致でなければ、判断結果は「NO」になり、本処理を終える。一方、相対一致ならば、上記ステップSK10の判断結果は「YES」となり、ステップSK11に進み、フラグs1に「0」、フラグs2に「1」をセットして本処理を終える。
このように、一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音の音高と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1、s2を共に「1」にセットする。
また、比較元音と比較先音とが転調関係にある相対一致の場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(比較元小節の先頭音の音高)との音高差と、比較先音と基準音(比較先小節の先頭音の音高)との音高差とが一致する場合にフラグs1を「0」、フラグs2に「1」をセットする。
ここで、図8を参照して第2実施形態による一致判定処理の具体的な動作を説明する。例えば、ポインタReで指定される比較元小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=16〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「G4音(#67)」の各比較元音から構成され、ポインタLuで指定される比較先小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=20〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「A4音(#69)」の各比較先音から構成されているとする。
そうして各比較元音と各比較先音との一致を小節内時間t毎に判別すると、図8に図示する通り、小節内時間t=0〜31の内、フラグs1が「0」となる不一致期間は、t=16〜19およびt=23〜30となる。これら不一致期間以外はフラグs1が「1」の一致期間になる。したがって、フラグs1が「1」となる完全一致期間の積算時間は「20」となり、これを小節分の総時間「32(t=0〜31)」で除算して得られる一致率「62%」がマトリクス要素Mat1[Re][Lu]にストアされる。
また、フラグs2が「0」となる期間は、t=16〜19およびt=24〜30となり、これら以外はフラグs2が「1」となる相対一致期間になる。したがって、フラグs2が「1」となる相対一致期間の積算時間は「21」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「65%」がマトリクス要素Mat2[Re][Lu]にストアされる。
(3)グループラベリング処理の動作
次に、図17を参照して第2実施形態によるグループラベリング処理の動作を説明する。第1実施形態と同様に、メインルーチンのステップSA3(図4参照)を介して本処理が実行されると、CPU1は図17に図示するステップSL1を介してラベリング処理を実行する。
このラベリング処理では、前述した第1実施形態と同様、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
次いで、ステップSL2に進み、類似部分ラベリング補正処理を実行する。後述するように、類似部分ラベリング補正処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、すなわち比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、それに該当する小節区間を「類似性のある範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
そして、ステップSL3を介してラベリング検証処理を実行する。このラベリング検証処理では、前述した第1実施形態と同様に、上記ラベリング処理によりラベリングされた小節区間が長過ぎると、ラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上の場合、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分けるようになっている。
(4)類似部分ラベリング補正処理の動作
図18は、類似部分ラベリング補正処理の動作を示すフローチャートである。上述したグループラベリング処理のステップSL2(図17参照)を介して本処理が実行されると、図18に図示するステップSM1に進み、比較元の先頭小節を指定する値をポインタReにセットする。続いて、ステップSM2では、ポインタReで指定される比較元小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSM3に進む。
ステップSM3では、比較先の先頭小節を指定する値をポインタLuにセットする。次いで、ステップSM4では、ポインタLuで指定される比較先小節が曲終端を超えたか否かを判断する。曲終端を超えていなければ、判断結果は「NO」となり、ステップSM5に進む。ステップSM5では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されていないかどうかを判断する。同じラベル番号iLavelが付与されていれば、判断結果は「NO」になり、ステップSM12に進み、ポインタLuを歩進させた後、上述のステップSM4に処理を戻す。
一方、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されていない場合には、上記ステップSM5の判断結果が「YES」になり、ステップSM6に進む。ステップSM6では、ポインタReおよびポインタLuで指定されるマトリクス要素Mat2[Re][Lu]の相対一致率が閾値以上であるかどうかを判断する。マトリクス要素Mat2[Re][Lu]の相対一致率が閾値未満ならば、判断結果は「NO」になり、ステップSM12に進み、ポインタLuを歩進させた後、上述のステップSM4に処理を戻す。
これに対し、マトリクス要素Mat2[Re][Lu]の相対一致率が閾値以上ならば、上記ステップSM6の判断結果が「YES」になり、ステップSM7に進む。ステップSM7では、閾値以上の相対一致率を有するマトリクス要素Mat2[Re][Lu]の範囲i(小節数)、すなわちMat2[Re+i][Lu+i]を検出する。次いで、ステップSM8では、閾値以上の相対一致率が連続した小節数iを保存する。そして、ステップSM9では、上記ステップSM7にて検出した小節数iが規定小節以上であるか否かを判断する。
検出した小節数iが規定小節未満ならば、判断結果は「NO」になり、ステップSM12に進み、ポインタLuを歩進させた後、上述のステップSM4に処理を戻す。一方、検出した小節数iが規定小節以上であると、上記ステップSM9の判断結果が「YES」になり、ステップSM10に進み、ラベル付け替え処理を実行する。
ラベル付け替え処理では、後述するように、
(イ)比較元小節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」を設定する。
そして、こうしたラベル付け替えが行われると、ステップSM11に進み、現在のポインタLuに、閾値以上の相対一致率が連続した小節数iを加算してポインタLuを更新させた後、上述のステップSM4に処理を戻す。以後、更新されたポインタLuで指定される比較先小節が曲終端を超える迄、相対一致率が規定小節以上連続して閾値を超える小節数iを探し出し、該当する小節区間についてラベル付け替えする処理を繰り返す。
そして、更新されたポインタLuで指定される比較先小節が曲終端を超えると、上記ステップSM4の判断結果が「YES」になり、ステップSM13に進み、ポインタReを歩進させた後、上述のステップSM2に処理を戻す。以後、歩進されたポインタReで指定される比較元小節が曲終端を超える迄、上述したステップSM3以降の処理を繰り返す。そして、歩進されたポインタReで指定される比較元小節が曲終端を超えると、ステップSM2の判断結果が「YES」となり、本処理を終える。
このように、類似部分ラベリング補正処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、すなわち比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、該当する小節区間を「類似性のある範囲」と表すように対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
(5)ラベル付け替え処理
図19は、ラベル付け替え処理の動作を示すフローチャートである。上述した類似部分ラベリング補正処理のステップSM10(図18参照)を介して本処理が実行されると、図19に図示するステップSN1に進み、ポインタReで指定される比較元小節の小節データMeasureにラベル番号iLavelが付与されているか否かを判断する。ラベル番号iLavelが付与されていれば、判断結果は「YES」になり、ステップSN2に進む。
ステップSN2では、ポインタLuで指定される比較先小節の小節データMeasureにラベル番号iLavelが付与されているか否かを判断する。ラベル番号iLavelが付与されていれば、判断結果は「YES」になり、ステップSN3に進む。ステップSN3では、ポインタLuで指定される比較先小節の小節データMeasureのラベル番号iLavelを、ポインタReで指定される比較元小節の小節データMeasureのラベル番号iLavelに書き換える一方、ポインタLuで指定される比較先小節の小節データMeasureのラベルオプションiLvOptionに、類似(相対一致)を表す値「1」を設定して本処理を終える。
一方、ポインタLuで指定される比較先小節の小節データMeasureにラベル番号iLavelが付与されていない場合には、上記ステップSN2の判断結果が「NO」になり、ステップSN4に進む。ステップSN4では、ポインタReで指定される比較元小節の小節データMeasureのラベル番号iLavelを、ポインタLuで指定される比較先小節の小節データMeasureのラベル番号iLavelに設定すると共に、この比較先小節の小節データMeasureのラベルオプションiLvOptionに、類似(相対一致)を表す値「1」を設定して本処理を終える。
さて一方、ポインタReで指定される比較元小節の小節データMeasureにラベル番号iLavelが付与されていない場合には、上記ステップSN1の判断結果が「NO」になり、ステップSN5に処理を進める。ステップSN5では、ポインタLuで指定される比較先小節の小節データMeasureにラベル番号iLavelが付与されているか否かを判断する。ラベル番号iLavelが付与されていれば、判断結果は「YES」になり、ステップSN6に進む。
ステップSN6では、ポインタLuで指定される比較元小節の小節データMeasureのラベル番号iLavelを、ポインタReで指定される比較先小節の小節データMeasureのラベル番号iLavelに設定すると共に、この比較先小節の小節データMeasureのラベルオプションiLvOptionに、類似(相対一致)を表す値「1」を設定して本処理を終える。
これに対し、ポインタLuで指定される比較先小節の小節データMeasureにラベル番号iLavelが付与されていない場合には、上記ステップSN5の判断結果が「NO」になり、ステップSN7に進む。ステップSN7では、新たに採番したラベル番号を、比較元小節Reおよび比較先小節Luのラベル番号iLaveに設定すると共に、ポインタReで指定される比較先小節の小節データMeasureのラベルオプションiLvOptionには完全一致を表す値「0」を設定し、ポインタLuで指定される比較元小節の小節データMeasureのラベルオプションiLvOptionには類似(相対一致)を表す値「1」を設定して本処理を終える。
このように、ラベル付け替え処理では、(イ)比較元小節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」を設定する。
以上のように、第2実施形態では、比較元小節Reと比較先小節Luとに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、すなわち比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、その区間を「類似性のある範囲」と表すように対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定するので、楽曲内の転調区間の検出が可能になる。
また、楽曲中から転調区間を検出することにより、例えば曲データに基づき演奏練習する場合に、楽曲内の転調区間を繰り返し練習させたり、転調区間をスキップさせるなどの機能を実現させるための有用な判断材料を自動的に生成し得るようになる。
[第3実施形態]
次に、図20〜図22を参照して第3実施形態について説明する。上述した第2実施形態では、楽曲内でメロディが重複したり転調する区間を検出するようにしたが、第3実施形態では、これに加えて更に楽曲内の類似区間を検出する。以下、こうした第3実施形態による「小節間一致率算出処理」、「一致判定処理」および「グループラベリング処理」の各動作を説明する。
(1)小節間一致率算出処理の動作
図20は、第3実施形態による小節間一致率算出処理の動作を示すフローチャートである。前述した第1実施形態と同様に、マトリクス処理のステップSB5(図5参照)を介して本処理が実行されると、CPU1は図20に図示するステップSP1に処理を進め、小節内時間tを初期化する。すなわち、ポインタLuで指定される比較先小節の小節データMeasure中の開始時刻lTimeを小節内時間tにセットする。
続いて、ステップSP2では、小節内時間tが小節を超えたか否か、つまりポインタLuで指定される比較先小節の小節データMeasure中の小節長lGateを超えたかどうかを判断する。小節内時間tが小節を超えなければ、判断結果は「NO」となり、ステップSP3に進む。ステップSP3では、第3実施形態による一致判定処理を実行する。
後述するように、一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音の音高と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1、s2、s3をそれぞれ「1」をセットする。
また、一致判定処理では、比較元音と比較先音とが転調関係にある相対一致の場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(比較元小節の先頭音の音高)との音高差と、比較先音と基準音(比較先小節の先頭音の音高)との音高差とが一致する場合にフラグs1を「0」、フラグs2を「1」、フラグs3を「1」にセットする。
さらに、一致判定処理では、比較元音と比較先音とが相対方向的に一致する場合、すなわち基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差との方向に一致する場合にフラグs1を「0」、フラグs2を「0」、フラグs3を「1」にセットする。
次いで、ステップSP4では、上記ステップSP3の一致判定処理により設定されるフラグs1の値をレジスタsum1に、フラグs2の値をレジスタsum2に、フラグs3の値をレジスタsum3にそれぞれ加算する。そして、ステップSP5では、小節内時間tを歩進させた後、上述のステップSP2に処理を戻す。
以後、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超える迄、上述したステップSP2〜SP5を繰り返す。これにより、レジスタsum1にはフラグs1が「1」となる完全一致期間を累算した積算時間が格納され、レジスタsum2にはフラグs2が「1」となる相対一致期間を累算した積算時間が格納され、さらにレジスタsum3にはフラグs3が「1」となる相対方向的一致期間を累算した積算時間が格納される。
そして、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えると、上記ステップSP2の判断結果が「YES」となり、ステップSP6に進む。ステップSP6では、レジスタsum1に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum1/t)を、マトリクス要素Mat1[Re][Lu]にストアする。
また、ステップSP6では、レジスタsum2に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum2/t)を、マトリクス要素Mat2[Re][Lu]にストアして本処理を終える。さらに、ステップSP6では、レジスタsum3に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum3/t)を、マトリクス要素Mat3[Re][Lu]にストアして本処理を終える。
なお、ここで言うマトリクス要素Mat1[Re][Lu]、Mat2[Re][Lu]およびMat3[Re][Lu]とは、それぞれポインタReとポインタLuとで配列要素を指定する2次元レジスタである。
このように、小節間一致率算出処理では、ポインタ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]にストアする。
(2)一致判定処理の動作
図21は、第3実施形態による一致判定処理の動作を示すフローチャートである。上述した小節間一致率算出処理のステップSP3(図20参照)を介して本処理が実行されると、CPU1は図21に図示するステップSQ1に進み、フラグs1、s2、s3をそれぞれゼロリセットする。
なお、フラグs1は、比較元小節において小節内時間tで発音している比較元音の音高と、比較先小節において小節内時間tで発音している比較先音の音高とが一致している場合や、小節内時間tで発音する比較元音および比較先音が共に存在しない場合に「1」となり、一方、小節内時間tで発音している比較元音の音高と比較先音の音高とが一致しない場合や、小節内時間tで発音する比較元音あるいは比較先音のいずれかが存在しない場合に「0」となるフラグである。
また、フラグs2は、相対一致する場合に「1」、それ以外は「0」となるフラグである。相対一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(例えば小節先頭の音の音高)との音高差と、比較先音と基準音との音高差とが一致する場合、つまり比較元音と比較先音とが転調関係にあることを表す。
さらに、フラグs3は、相対方向的に一致する場合に「1」、それ以外は「0」となるフラグである。相対方向的に一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差の方向に一致する場合を指す。
次いで、ステップSQ2では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタReで指定される比較元小節の小節内時間tで発音している比較元音(曲データMidiEvent)が存在する場合には、その音高PitchをレジスタmeReにストアし、比較元音が存在しない場合には該当音無しを表す値をレジスタmeReにストアする。
続いて、ステップSQ3では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタLuで指定される比較先小節の小節内時間tで発音している比較先音が存在する場合には、その音高PitchをレジスタmeLuにストアし、比較先音が存在しない場合には、該当音無しを表す値をレジスタmeLuにストアする。
そして、ステップSQ4では、レジスタmeReの内容に基づき比較元音の有無を判断する。レジスタmeReに比較元音無しを表す値がストアされていると、判断結果は「NO」となり、ステップSQ5に進み、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音の音高Pitchが格納されていれば、判断結果は「YES」となり、本処理を終える。これに対し、レジスタmeLuに比較先音無しを表す値がストアされていると、上記ステップSQ5の判断結果は「NO」となり、ステップSQ6に進み、フラグs1、s2、s3をそれぞれ「1」にセットして本処理を終える。
さて一方、レジスタmeReに比較元音の音高Pitchが格納されていると、上記ステップSQ4の判断結果が「YES」になり、ステップSQ7に進む。ステップSQ7では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音無しを表す値がストアされていると、判断結果は「NO」となり、本処理を終えるが、レジスタmeLuに比較先音の音高Pitchが格納されていると、上記ステップSQ7の判断結果が「YES」となり、ステップSQ8に進む。
ステップSQ8では、レジスタmeReに格納される比較元音の音高Pitchと、レジスタmeLuに格納される比較先音の音高Pitchとが同一であるか否かを判断する。比較元音と比較先音とが同一音高ならば、上記ステップSQ8の判断結果が「YES」になり、ステップSQ9に進み、フラグs1、s2、s3にそれぞれ「1」をセットして本処理を終える。
これに対し、比較元音と比較先音とが同一音高でない場合には、上記ステップSQ8の判断結果が「NO」となり、ステップSQ10に進む。ステップSQ10では、基準音(比較元小節の先頭音の音高)とレジスタmeReに格納される比較元音の音高Pitchとの音高差と、基準音(比較先小節の先頭音の音高)とレジスタmeLuに格納される比較先音の音高Pitchとの音高差とが同一か否か、つまり比較元音と比較先音とが転調関係にある相対一致であるかどうかを判断する。相対一致ならば、判断結果が「YES」となり、ステップSK11に進み、フラグs1を「0」、フラグs2を「1」、フラグs3を「1」にセットして本処理を終える。
一方、相対一致でなければ、上記ステップSQ10の判断結果は「NO」になり、ステップSQ12に進む。ステップSQ12では、基準音(比較元小節の先頭音の音高)とレジスタmeReに格納される比較元音の音高Pitchとの音高差の方向が、基準音(比較先小節の先頭音の音高)とレジスタmeLuに格納される比較先音の音高Pitchとの音高差との方向に一致するか否か、つまり相対方向的に一致するかどうかを判断する。相対方向的に一致していなければ、判断結果は「NO」となり、本処理を終えるが、相対方向的に一致していると、判断結果が「YES」になり、ステップSQ13に進み、フラグs1を「0」、フラグs2を「0」、フラグs3を「1」にセットして本処理を終える。
このように、一致判定処理では、ポインタReで指定される比較元小節において小節内時間tで発音している比較元音の音高と、ポインタLuで指定される比較先小節において小節内時間tで発音している比較先音との有無を判断し、同一音高の比較元音と比較先音とが存在する場合や、比較元音と比較先音とが共に存在しない場合にフラグs1、s2、s3をそれぞれ「1」をセットする。
また、比較元音と比較先音とが転調関係にある相対一致の場合、すなわち小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(比較元小節の先頭音の音高)との音高差と、比較先音と基準音(比較先小節の先頭音の音高)との音高差とが一致する場合にフラグs1を「0」、フラグs2を「1」、フラグs3を「1」にセットする。
さらに、比較元音と比較先音とが相対方向的に一致する場合、すなわち基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差との方向に一致する場合にフラグs1を「0」、フラグs2を「0」、フラグs3を「1」にセットする。
ここで、図8を参照して第3実施形態による一致判定処理の具体的な動作を説明する。例えば、ポインタReで指定される比較元小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=16〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「G4音(#67)」の各比較元音から構成され、ポインタLuで指定される比較先小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=20〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「A4音(#69)」の各比較先音から構成されているとする。
そうして各比較元音と各比較先音との一致を小節内時間t毎に判別すると、図8に図示する通り、小節内時間t=0〜31の内、フラグs1が「0」となる不一致期間は、t=16〜19およびt=23〜30となる。これら不一致期間以外はフラグs1が「1」の一致期間になる。したがって、フラグs1が「1」となる完全一致期間の積算時間は「20」となり、これを小節分の総時間「32(t=0〜31)」で除算して得られる一致率「62%」がマトリクス要素Mat1[Re][Lu]にストアされる。
また、フラグs2が「0」となる期間は、t=16〜19およびt=24〜30となり、これら以外はフラグs2が「1」となる相対一致期間になる。したがって、フラグs2が「1」となる相対一致期間の積算時間は「21」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「65%」がマトリクス要素Mat2[Re][Lu]にストアされる。
さらに、フラグs3が「0」となる期間は、t=16〜19およびt=24〜30となり、これら以外はフラグs3が「1」となる相対方向的一致期間になる。したがって、フラグs2が「1」となる相対方向的一致期間の積算時間は「21」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「65%」がマトリクス要素Mat3[Re][Lu]にストアされる。
(3)グループラベリング処理の動作
次に、図22を参照して第3実施形態によるグループラベリング処理の動作を説明する。第1実施形態と同様に、メインルーチンのステップSA3(図4参照)を介して本処理が実行されると、CPU1は図22に図示するステップSR1を介してラベリング処理を実行する。
このラベリング処理では、前述した第1実施形態と同様、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
次いで、ステップSR2に進み、類似部分ラベリング補正1処理を実行する。類似部分ラベリング補正1処理は、前述した第2実施形態による類似部分ラベリング補正処理(図18参照)と同一である。すなわち、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、つまり比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、それに該当する小節区間を「類似性のある範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
続いて、ステップSR3を介して類似部分ラベリング補正2処理を実行する。類似部分ラベリング補正2処理は、上記ステップSR2の類似部分ラベリング補正1処理とほぼ同一であるであるので、その詳細な動作フローの説明については省略する。類似部分ラベリング補正2処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat3[Re][Lu]の中から閾値以上の相対方向的な一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「音高差が類似する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
そして、ステップSR4を介してラベリング検証処理を実行する。このラベリング検証処理では、前述した第1実施形態と同様に、上記ラベリング処理によりラベリングされた小節区間が長過ぎると、ラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上の場合、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分けるようになっている。
以上のように、第3実施形態では、比較元小節Reと比較先小節Luとに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat3[Re][Lu]の中から閾値以上の相対方向的な一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「音高差が類似する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定するので、楽曲内の類似区間の検出が可能になる。
[第4実施形態]
次に、図23〜図27を参照して第4実施形態について説明する。上述した第3実施形態では、楽曲内でメロディが重複したり転調する区間の他、類似する区間を検出するようにしたが、第4実施形態ではこれに加えて更に楽曲内でリズムが一致する区間を検出する。以下、こうした第4実施形態による「小節間一致率算出処理」、「一致判定処理」および「グループラベリング処理」の各動作を説明する。
(1)小節間一致率算出処理の動作
図23は、第4実施形態による小節間一致率算出処理の動作を示すフローチャートである。前述した第1実施形態と同様に、マトリクス処理のステップSB5(図5参照)を介して本処理が実行されると、CPU1は図23に図示するステップSS1に処理を進め、小節内時間tを初期化する。すなわち、ポインタLuで指定される比較先小節の小節データMeasure中の開始時刻lTimeを小節内時間tにセットする。
続いて、ステップSS2では、小節内時間tが小節を超えたか否か、つまりポインタLuで指定される比較先小節の小節データMeasure中の小節長lGateを超えたかどうかを判断する。小節内時間tが小節を超えなければ、判断結果は「NO」となり、ステップSS3に進む。ステップSS3では、第4実施形態による一致判定処理を実行する。
後述するように、一致判定処理では、ポインタ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」にセットする。
次いで、ステップSS4では、上記ステップSS3の一致判定処理により設定されるフラグs1の値をレジスタsum1に、フラグs2の値をレジスタsum2に、フラグs3の値をレジスタsum3に、フラグs4の値をレジスタsum4にそれぞれ加算する。そして、ステップSS5では、小節内時間tを歩進させた後、上述のステップSS2に処理を戻す。
以後、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超える迄、上述したステップSS2〜SS5を繰り返す。これにより、レジスタsum1にはフラグs1が「1」となる完全一致期間を累算した積算時間が格納され、レジスタsum2にはフラグs2が「1」となる相対一致期間を累算した積算時間が格納され、レジスタsum3にはフラグs3が「1」となる相対方向的一致期間を累算した積算時間が格納され、さらにレジスタsum4にはフラグs4が「1」となるリズム一致期間を累算した積算時間が格納される。
そして、歩進される小節内時間tが、ポインタLuで指定される比較先小節を超えると、上記ステップSS2の判断結果が「YES」となり、ステップSS6に進む。ステップSS6では、レジスタsum1に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum1/t)を、マトリクス要素Mat1[Re][Lu]にストアする。また、ステップSS6では、レジスタsum2に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum2/t)を、マトリクス要素Mat2[Re][Lu]にストアする。
さらに、ステップSS6では、レジスタsum3に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum3/t)を、マトリクス要素Mat3[Re][Lu]にストアする。加えて、ステップSS6では、レジスタsum4に格納される積算時間を比較先小節分の時間tで除算して得られる一致率(sum4/t)を、マトリクス要素Mat4[Re][Lu]にストアして本処理を終える。なお、ここで言うマトリクス要素Mat1[Re][Lu]、Mat2[Re][Lu]、Mat3[Re][Lu]およびMat4[Re][Lu]とは、それぞれポインタReとポインタLuとで配列要素を指定する2次元レジスタである。
このように、小節間一致率算出処理では、ポインタ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]にストアする。
(2)一致判定処理の動作
図24は、第4実施形態による一致判定処理の動作を示すフローチャートである。上述した小節間一致率算出処理のステップSS3(図23参照)を介して本処理が実行されると、図24に図示するステップST1に進み、フラグs1〜s4をそれぞれゼロリセットする。
なお、フラグs1は、比較元小節において小節内時間tで発音している比較元音の音高と、比較先小節において小節内時間tで発音している比較先音の音高とが一致している場合や、小節内時間tで発音する比較元音および比較先音が共に存在しない場合に「1」となり、一方、小節内時間tで発音している比較元音の音高と比較先音の音高とが一致しない場合や、小節内時間tで発音する比較元音あるいは比較先音のいずれかが存在しない場合に「0」となるフラグである。
フラグs2は、相対一致する場合に「1」、それ以外は「0」となるフラグである。相対一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ比較元音と基準音(例えば小節先頭の音の音高)との音高差と、比較先音と基準音との音高差とが一致する場合、つまり比較元音と比較先音とが転調関係にあることを表す。
フラグs3は、相対方向的に一致する場合に「1」、それ以外は「0」となるフラグである。相対方向的に一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ基準音(比較元小節の先頭音の音高)と比較元音との音高差の方向が、基準音(比較先小節の先頭音の音高)と比較先音との音高差の方向に一致する場合を指す。
フラグs4は、リズム一致する場合に「1」、それ以外は「0」となるフラグである。リズム一致とは、小節内時間tで発音している比較元音と比較先音とが有り、かつ両音間の発音開始時間および消音時間の差が許容範囲内である場合もしくは小節内時間tで発音する比較元音および比較先音が共に存在せず、かつ現在一致判定の対象とされている比較元音および比較先音のそれぞれについて前音の消音時間と次音の発音開始時間とが許容範囲内にある場合を指す。
次いで、ステップST2では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタReで指定される比較元小節の小節内時間tで発音している比較元音(曲データMidiEvent)が存在する場合には、その音高PitchをレジスタmeReにストアし、比較元音が存在しない場合には該当音無しを表す値をレジスタmeReにストアする。
続いて、ステップST3では、RAM3の曲データエリアに格納される曲データMidiEvent[0]〜[N]の内に、ポインタLuで指定される比較先小節の小節内時間tで発音している比較先音が存在する場合には、その音高PitchをレジスタmeLuにストアし、比較先音が存在しない場合には、該当音無しを表す値をレジスタmeLuにストアする。
そして、ステップST4では、レジスタmeReの内容に基づき比較元音の有無を判断する。レジスタmeReに比較元音の音高Pitchが格納されていると、判断結果は「YES」になり、次のステップST5に進む。ステップST5では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音無しを表す値がストアされていると、判断結果が「NO」となり、本処理を終える。一方、レジスタmeLuに比較先音の音高Pitchが格納されていると、上記ステップST5の判断結果が「YES」となり、ステップST6に進む。
ステップST6では、レジスタmeReに格納される比較元音の音高Pitchと、レジスタmeLuに格納される比較先音の音高Pitchとが同じであるか否かを判断する。比較元音と比較先音とが同一音高ならば、判断結果は「YES」になり、ステップST7に進み、フラグs1、s2、s3にそれぞれ「1」をセットする。次いで、ステップST8では、レジスタmeReに格納される比較元音とレジスタmeLuに格納される比較先音との発音開始時間差および消音時間差が許容範囲内である否かを破断する。許容範囲内ならば、判断結果は「YES」になり、ステップST9に進み、フラグs4に「1」をセットして本処理を終える。これに対し、許容範囲を超える場合には、上記ステップST8の判断結果が「NO」になり、ステップST10に進み、フラグs4をゼロリセットして本処理を終える。
一方、比較元音と比較先音とが同一音高でない場合には、上記ステップST6の判断結果が「NO」となり、図25に図示するステップST11に進む。ステップST11では、基準音(比較元小節の先頭音の音高)とレジスタmeReに格納される比較元音の音高Pitchとの音高差と、基準音(比較先小節の先頭音の音高)とレジスタmeLuに格納される比較先音の音高Pitchとの音高差とが同一か否か、つまり比較元音と比較先音とが転調関係にある相対一致であるかどうかを判断する。相対一致ならば、判断結果が「YES」となり、ステップST12に進み、フラグs1を「0」、フラグs2を「1」、フラグs3を「1」にセットした後、上述のステップST8(図24参照)に進む。
これに対し、相対一致でない場合には、上記ステップST11の判断結果は「NO」になり、ステップST13に進む。ステップST13では、基準音(比較元小節の先頭音の音高)とレジスタmeReに格納される比較元音の音高Pitchとの音高差の方向が、基準音(比較先小節の先頭音の音高)とレジスタmeLuに格納される比較先音の音高Pitchとの音高差との方向に一致するか否か、つまり相対方向的に一致するかどうかを判断する。相対方向的に一致していると、判断結果が「YES」になり、ステップST14に進み、フラグs1を「0」、フラグs2を「0」、フラグs3を「1」にセットした後、上述のステップST8(図24参照)に進む。相対方向的に一致していなければ、上記ステップST13の判断結果は「NO」となり、上述のステップST8(図24参照)に進む。
さて一方、レジスタmeReに比較元音無しを表す値がストアされていると、上記ステップST4(図24参照)の判断結果が「NO」となり、図26に図示するステップST15に進む。ステップST15では、レジスタmeLuの内容に基づき比較先音の有無を判断する。レジスタmeLuに比較先音の音高Pitchが格納されていれば、判断結果は「YES」となり、本処理を終える。
これに対し、レジスタmeLuに比較先音無しを表す値がストアされていると、上記ステップST15の判断結果は「NO」となり、ステップST16に進む。ステップST16では、フラグs1、s2、s3をそれぞれ「1」にセットする。次いで、ステップST17では、レジスタmeReに格納される比較元音とレジスタmeLuに格納される比較先音とのそれぞれについて、前音の消音時間と次音の発音開始時間とが許容範囲内であるか否かを判断する。許容範囲内ならば、判断結果が「YES」になり、ステップST18に進み、フラグs4を「1」にセットして本処理を終える。一方、許容範囲を超える場合には、上記ステップST17の判断結果は「NO」になり、ステップST19に進み、フラグs4をゼロリセットして本処理を終える。
このように、一致判定処理では、ポインタ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」をセットする。
ここで、図8を参照して第3実施形態による一致判定処理の具体的な動作を説明する。例えば、ポインタReで指定される比較元小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=16〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「G4音(#67)」の各比較元音から構成され、ポインタLuで指定される比較先小節が小節内時間t=0〜6に発音される「C4音(ノートナンバ#60)」、小節内時間t=8〜14に発音される「C4音(#60)」、小節内時間t=20〜22に発音される「G4音(#67)」および小節内時間t=24〜30に発音される「A4音(#69)」の各比較先音から構成されているとする。
そして、各比較元音と各比較先音との一致を小節内時間t毎に判別すると、図8に図示する通り、小節内時間t=0〜31の内、フラグs1が「0」となる不一致期間は、t=16〜19およびt=23〜30となる。これら不一致期間以外はフラグs1が「1」の一致期間になる。したがって、フラグs1が「1」となる完全一致期間の積算時間は「20」となり、これを小節分の総時間「32(t=0〜31)」で除算して得られる一致率「62%」がマトリクス要素Mat1[Re][Lu]にストアされる。
また、フラグs2が「0」となる期間は、t=16〜19およびt=24〜30となり、これら以外はフラグs2が「1」となる相対一致期間になる。したがって、フラグs2が「1」となる相対一致期間の積算時間は「21」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「65%」がマトリクス要素Mat2[Re][Lu]にストアされる。
さらに、フラグs3が「0」となる期間は、t=16〜19およびt=24〜30となり、これら以外はフラグs3が「1」となる相対方向的一致期間になる。したがって、フラグs3が「1」となる相対方向的一致期間の積算時間は「21」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「65%」がマトリクス要素Mat3[Re][Lu]にストアされる。
加えて、フラグs4が「0」となる期間は、t=16〜22となり、これら以外はフラグs4が「1」となるリズム一致期間になる。したがって、フラグs4が「1」となるリズム一致期間の積算時間は「25」となり、これを小節分の総時間「32」で除算することによって比較元小節に対する比較先小節の一致率「78%」がマトリクス要素Mat4[Re][Lu]にストアされる。
(3)グループラベリング処理の動作
次に、図27を参照して第4実施形態によるグループラベリング処理の動作を説明する。第1実施形態と同様に、メインルーチンのステップSA3(図4参照)を介して本処理が実行されると、CPU1は図27に図示するステップSU1を介してラベリング処理を実行する。
このラベリング処理では、前述した第1実施形態と同様、ポインタReおよびポインタLuで指定されるマトリクス要素Mat1[Re][Lu]の中から閾値以上の一致率が規定数以上連続する範囲(小節区間)を探し出し、その範囲に対応する小節データMeasure中のラベル番号iLavelに同じ番号を付与すると共に、完全一致を表す値「0」をラベルオプションiLvOptionとして登録する。
次いで、ステップSU2に進み、類似部分ラベリング補正1処理を実行する。この類似部分ラベリング補正1処理は、前述した第2実施形態による類似部分ラベリング補正処理(図18参照)と同一である。すなわち、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat2[Re][Lu]の中から閾値以上の相対一致率が規定数以上連続する範囲、つまり比較元小節と比較先小節とが転調関係にあると見られる小節区間を探し出し、それに該当する小節区間を「類似性のある範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
続いて、ステップSU3を介して類似部分ラベリング補正2処理を実行する。類似部分ラベリング補正2処理は、上記ステップSU2の類似部分ラベリング補正1処理とほぼ同一であるであるので、その詳細な動作フローの説明については省略する。類似部分ラベリング補正2処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat3[Re][Lu]の中から閾値以上の相対方向的な一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「音高差が類似する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
次に、ステップSU4を介して類似部分ラベリング補正3処理を実行する。類似部分ラベリング補正3処理は、上記ステップSU2の類似部分ラベリング補正1処理とほぼ同一であるであるので、その詳細な動作フローの説明については省略する。類似部分ラベリング補正3処理では、ポインタReで指定される比較元小節とポインタLuで指定される比較先小節とに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat4[Re][Lu]の中から閾値以上のリズム一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「リズムが一致する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定する。
そして、ステップSU5を介してラベリング検証処理を実行する。このラベリング検証処理では、前述した第1実施形態と同様に、上記ラベリング処理によりラベリングされた小節区間が長過ぎると、ラベリング先頭小節(ポインタRe)と、そこから規定数以上連続した小節(ポインタRetmp)とで指定されるマトリクス要素Mat1[Re][Retmp]の一致率が閾値以上の場合、そのポインタRetmpで指定される小節の1つ前の小節を区間終端とするようにラベリングされた小節区間を分けるようになっている。
以上のように、第4実施形態では、比較元小節Reと比較先小節Luとに同じラベル番号iLavelが付与されておらず、しかもマトリクス要素Mat4[Re][Lu]の中から閾値以上のリズム一致率が規定数以上連続する範囲(小節区間)を探し出し、それに該当する小節区間を「リズムが一致する範囲」と表すように、対応する小節データMeasureのラベル番号iLavelおよびラベルオプションiLvOptionを設定するので、楽曲内でリズムが一致する区間の検出が可能になる。