以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図1は、本発明によるコード抽出装置の実施形態のハードウェア構成の一例を示す図である。このコード抽出装置は、CPU(中央演算処理装置)101、ROM(リードオンリーメモリ)102、RAM(ランダムアクセスメモリ)103、入力部104、出力部105、音響出力部106、音響入力部107を備える。
音響入力部107は、音楽音響データを取り込み、必要に応じて、内部のRAM103やハードディスク記憶装置またはソリッドステートドライブ装置等の外部記憶装置108に記憶する。この音響入力部107は例えば、インターネット上の音楽配信サイトに接続して音楽音響データをダウンロードしてRAM103や外部記憶装置108に取り込むネットワーク接続装置を含む。また、音響入力部107は例えば、CD(コンパクトディスク)やDVD等のディスク記録媒体に録音された音楽音響データを読み出し、必要に応じてRAM103や外部記憶装置108に記憶させるディスク記録媒体駆動装置を含む。あるいは、音響入力部107は例えば、SDメモリカード等の可搬記録媒体に録音された音楽音響データを読み出し、必要に応じてRAM103や外部記憶装置108に記憶させる可変記録媒体駆動装置を含む。
音響出力部106は、音響入力部107が取り込んだ音楽音響データを直接再生出力し、あるいは、RAM103や外部記憶装置108に記憶されている音楽音響データを読み出して再生出力する復号装置を含む。また、音響出力部106は、復号装置から出力される復号された音楽音響データをアナログ音楽信号に変換するD/A(デジタル/アナログ)変換器を含む。さらに、音響出力部106は、D/A変換器から出力されるアナログ音楽信号を増幅して外部に出力する増幅装置を含む。加えて、音響出力部106は、増幅装置から出力される増幅されたアナログ音楽信号を、放音するスピーカ、または外部に出力する出力端子を含む。
CPU101は、ROM102に記憶された制御プログラムに従って、当該コード抽出装置全体の制御を行う。RAM103は、制御プログラムの実行に必要な、後述する図5に例示されるような各種制御データや、コード抽出の対象となる音楽音響データを、一時的に記憶する。
入力部104は、ユーザによるキーボード、マウス、各種スイッチ等による入力操作を検出し、その検出結果をCPU101に通知する。
出力部105は、CPU101の制御によって送られてくるデータを液晶ディスプレイやプリンタに出力する。例えば、出力部105は、音響入力部107が入力した音楽音響データに対するコード抽出結果を液晶ディスプレイに表示する。
外部記憶装置105は、音楽音響データやコード抽出結果のデータ等を保存する。
本実施形態によるコード抽出装置の動作は、図2、図4〜図10、および図12に示されるフローチャート等で実現される機能を搭載した制御プログラムを、CPU101がROM102から読み出して順次実行することで実現される。そのプログラムは、例えば外部記憶装置108に記録して配布してもよく、或いは特には図示しないネットワーク接続装置によりネットワークから取得できるようにしてもよい。
以下、本発明の動作について、フローチャートに沿って説明する。なお、各フローチャートの説明において、CPU101、ROM102、RAM103等は、図1に示されるものを指すものとする。
図2は、図1の構成例を有するコード抽出装置の全体動作の制御処理例を示すフローチャートである。このフローチャートは、CPU101が、ROM102に記憶されたコード抽出プログラムを実行する動作として実現される。
まず、CPU101は、RAM103に記憶される各種制御データ等の初期化を行う(ステップS201)。
その後、CPU101は、ユーザにより、図1の入力部104の特には図示しない終了ボタン、再生ボタン、またはコード抽出用の選曲ボタンのいずれかが押されれることにより終了、再生、またはコード抽出用の選曲のいずれかの指示がなされたか否かを判定する処理を繰り返し実行する(ステップS202、S203、またはS204の各判定がNOとなる処理ループ)。
ユーザが入力部104で終了ボタンを押すと、CPU101は、ステップS202の判定がYESになって、CPU101は、図2のフローチャートで示されるコード抽出プログラムの処理を終了する。
ユーザが入力部104で、特には図示しない曲指定ボタンで音楽音響データを選択した後に再生ボタンを押すと、ステップS203の判定がYESになって、CPU101は、再生処理を実行する(ステップS205)。ここでは、CPU101は、図1の音響入力部107から取り込まれるユーザが指定した音楽音響データ、あるいは、RAM103や外部記憶装置108からユーザが指定した音楽音響データを順次読み込んで、図1の音響出力部106に出力する。音響出力部106は、CPU101から入力される音楽音響データを復号装置で順次復号し、復号された音楽音響データをD/A変換器でアナログ音楽信号に変換し、さらにそのアナログ音楽信号を増幅装置で増幅し、増幅されたアナログ音楽信号を、スピーカまたは出力端子から出力する。再生終了後、CPU101は、ステップS202からS204の待機処理に戻る。
ユーザが入力部104で、コード抽出用の選曲ボタンを押して楽曲を選択すると、CPU101は、ユーザが選択した楽曲データ(音楽音響データ)を読み込み(ステップS206)、その音楽音響データに対して分析を実行し(ステップS207)、分析結果に対してコード抽出を実行し(ステップS208)、コード抽出結果を図1の出力部105の液晶ディスプレイ等に表示する(ステップS209)。再生終了後、CPU101は、ステップS202からS204の待機処理に戻る。
ステップS207の分析、ステップS208のコード抽出、およびステップS209の表示の各処理について、以下に詳細に説明する。
図3は、以下に説明する各処理で使用される変数データ(制御データ)の説明図である。これらの変数データは、RAM103に確保される。以下の説明では、変数名と変数値名を同じ記号で表記する。例えば「ulTimen」と記述したときは、RAM103に確保される変数データulTimenの変数名とその値の両方を示すものとする。また、[i]などが付いているものは、配列変数データを表す。例えば、doData[j]は、jが0からiFrame2−1までの間で変化するiFrame2 個の要素値を有するデータである。各変数データの詳細な説明については、フローチャートの説明とともに後述する。
図4は、周波数解析手段としての機能を実現する図2のステップS207の分析の制御処理例を示すフローチャートである。
ここでは、CPU101は、RAM103に確保される変数データi(図3には特には図示せず)の値を0に初期設定した後(ステップS401)、その変数iの値を+1ずつインクリメントしながら(ステップS408)、その変数iの値が、例えばRAM103に確保される選曲された音楽音響データの全フレーム数ulTimen(図3)に達したと判定するまで(ステップS402)、変数iで定まるフレーム毎に、以下のステップS403からS407までの一連の処理を繰り返し実行する。
ここで、音楽音響データは例えば44.1kHz(キロヘルツ)でサンプリングされたデジタルデータであり、1フレームは例えば4096または8192サンプルである。なお、実際には、音楽音響データはステレオデータであり、左右の各チャネルについて処理が実行されるが、以下の説明では、理解を容易にするために、1チャネルに対する処理として説明する。また、フレームデータは、周波数成分の連続性を確保するために、一定サンプル数ずつオーバーラップして(重ねて)切り出される。CPU101は予め、RAM103上の変数に設定したサンプリング周波数fs(図3)から1サンプルの時間間隔を算出し、この時間間隔に1フレームのサンプル数からフレーム両端のオーバーラップ分を除いたサンプル数を乗算することにより、1フレームの時間間隔を算出し、RAM103上の変数doTimeUnit(図3)にセットする。また、CPU101は、図2のステップS206で楽曲の音楽音響データを読み込むと、音楽音響データ全体の時間をオーバーラップ分を含まない1フレームの時間間隔doTimeUnitで除算することにより、その音楽音響データの全フレーム数を算出し、RAM103上の変数ulTimen(図3)にセットする。
まず、CPU101は、音響入力部107またはRAM103、外部記憶装置108等の音楽音響データから、i番目のフレームの一定サンプル数のデータを切り出す(ステップS403)。なお、このときのフレームデータのサンプル数は、前述したオーバーラップ分を含む数である。
次に、CPU101は、ステップS403で切り出したフレームデータに対して、窓関数をかける(ステップS404)。窓関数は、フレームデータ両端でデータがカットされることによるステップS405でのFFTにおける高周波成分への悪影響を除去するために、フレームデータ両端で振幅が徐々に0になるようにするための重みデータである。窓関数としては、例えば良く知られたハミング窓やハニング窓などが使用される。
続いて、CPU101は、ステップS404で得られたフレームデータに対して、FFT(Firt Fourier Transform:高速フーリエ変換)による時間−周波数変換演算処理を実行する(ステップS405)。
CPU101は、ステップS405でのFFTの結果得られる各周波数成分値毎に、各周波数成分値を2乗演算することにより、各周波数成分の強度を示すパワー値(強度値)を算出する(ステップS406)。ここで、CPU101は、ステップS403で切り出されたオーバーラップ分を含む1フレームのサンプル数を、予めRAM103上の変数iFrameSize(図3)に設定しておく。また、iFrameSizeの1/2の値を、RAM103上の変数iFrame2(図3)に予め設定しておく。ここで、FFTの性質から、FFTの結果得られるiFrame2番目からiFrameSize−1番目までの周波数成分値は、同じく0番目からiFrame2−1番目までの周波数成分値を対称に折り返して得られるデータとなる。このため、パワー値の算出は、0番目からiFrame2−1番目までの周波数成分値に対して行えばよい。
CPU101は、ステップS406で算出したパワー値を、例えばRAM103(図1の外部記憶装置108でもよい)に保存する(ステップS407)。
以上のようにして、CPU101は、ユーザが選択した1曲分の音楽音響データの全フレーム数ulTimenの各フレームに対してそれぞれ、0番目からiFrame2−1番目までの各周波数成分のパワー値の算出、保存が終了すると、図4のステップS402の判定がNOとなって、図2のステップS207の分析の処理を終了する。
次に、CPU101は、図2のステップS208のコード抽出の処理を実行する。この処理の詳細について説明する前に、本実施形態におけるコード抽出の処理の動作原理について、以下に説明する。図5は、コード抽出の処理の動作原理の説明図である。
本実施形態では、コード抽出は、例えば楽曲の小節のおおよそ1/2(半小節)の時間間隔で行われる。この処理単位を「コード区間」と呼び、CPU101が、例えば現在処理している楽曲のテンポ情報を取得することにより、このコード区間の時間間隔を算出し、変数doBarZoom(図3)として予めRAM103に設定する。また、CPU101は、コード区間時間間隔doBarZoomを1フレームの時間間隔doTimeUnitで除算した値として、1つのコード区間のフレーム数を算出し、それを図1のRAM103上の変数cvn(図3)にセットする。
CPU101は、入力している楽曲の音楽音響データにおいて、先頭の無音部分を除いた楽曲が開始する小節の音楽音響データの先頭からの時間を予め抽出し、RAM103上の変数doBarShiftにセットする。CPU101は、開始小節時間doBarShift以降、各フレームに対するコード抽出のための累算処理を進める毎に、開始小節時間doBarShiftから順次1フレームの時間間隔doTimeUnitを累算してゆくことにより、現在コード付け(コード抽出)を行おうとする処理対象のフレームの開始時間を算出し、RAM103上の変数doChordTime(図3)にセットする。
CPU101は、開始小節時間doBarShift以降、1つのコード区間時間間隔doBarZoomに対するコード抽出が開始する毎に、現在のコード区間の回数をコード区間カウンタとしてRAM103上の変数cvcnt(図3)にセットする。なお、変数cvcntの初期値は「1」である。CPU101は、コード区間時間間隔doBarZoomにコード区間カウンタcvcntを乗算し、楽曲開始小節時間doBarShiftに加算することにより、次のコード区間の開始時刻を算出し、RAM103上の変数a(図5参照)(図3には特には図示しない)にセットする。
CPU101は、開始小節時間doBarShiftからのコード抽出処理の開始後、または前回のコード区間の処理が終了後、コード付け処理対象フレーム時間doChordTimeが次コード区間開始時刻aに達するまで、現在のコード区間に対する各フレーム毎のコード抽出のための累算処理を実行する。
図4のフローチャートで示される図2のステップS207の分析の処理によって、図5(a)または(b)に示される時間軸方向に進行する1つのコード区間内のフレーム番号0,1,2,3,4,・・・,cvn−2,cvn−1で示されるフレーム時間毎に、周波数軸方向の各周波数成分0,1,・・・,p,・・・,q,・・・iFrame2−1に対応して、パワー軸方向の各パワー値doData[0],doData[1],・・・,doData[p],・・・,doData[q],・・・,doData[iFrame2−1]が算出される。一般的には、図2のステップS207の分析の処理によってRAM103等に得られている周波数成分j(0≦j≦iFrame2−1)毎のパワー値が、変数doData[j](図3)に記憶される。なお、ここでは、doData[0]からdoData[iFrame2−1]に向かって周波数が高くなる(音高が高くなる)ものとする。
図5(a)は、コード区間において楽曲中でコード(和音)が演奏されている場合の周波数スペクトラムとその時間変化の特性を模式的に示す図である。この場合、演奏されているコードの構成音の音階に対応する周波数成分p,q等のパワー値doData[p],doData[q]等の値が、それ以外の周波数成分のパワー値に比較してかなり大きな値となる傾向がある。
上述の傾向より、楽曲中でコード(和音)が演奏されているコード区間内の各フレームの周波数スペクトラムについてみたときに、1つのフレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いは、大きな値となる傾向がある。すなわち、ある1つのフレーム内の各周波数成分のパワー値の分散が大きくなる傾向がある。
さらに、コード演奏が継続すると、コード区間内の各フレームでは、上記周波数成分p,q等のパワー値が持続的に大きな値となる傾向がある。これはすなわち、動きが多く非和声音を含む場合も多いメロディーの音に比べて、コードの音はある程度持続される場合が多く、1つのコード区間内で変化無く持続されている音はコード構成音である可能性が高いと考えられるからである。
従って、上記周波数成分p,q等についてそれぞれ、コード区間内のフレーム0からcvn−1までの各フレームのパワー値doData[p],doData[q]を累算し、累算結果をそれぞれdoDataBuf[p],doDataBuf[q]とすれば、これらのパワー累算値(強度累算値)は、それ以外の周波数成分のパワー累算値と比較して大きな値となる傾向がある。また、コード構成音は、あるコード区間内で持続的に音が演奏される傾向が強いため、コード区間内のフレーム0からcvn−1までの各フレームのパワー値のばらつき度合いが小さな値となる傾向がある。すなわち、ある周波数のフレーム0からcvn−1までの各フレームにおけるパワー値の分散が小さくなる傾向がある。
一方、図5(b)は、コード区間において楽曲中でコード(和音)は演奏されておらず例えば打楽器が演奏されているような場合の周波数スペクトラムとその時間変化の特性を模式的に示す図である。この場合、0からiFrame2−1までの全ての周波数成分について、同じような値のパワー値doData[0]〜doData[iFrame2−1]が観測される傾向がある。これは、打楽器音が、1つのフレーム内でみればホワイトノイズ的な周波数特性を有することによる。
上述の傾向より、コードが演奏されていないコード区間内の各フレームの周波数スペクトラムについてみたときに、1つのフレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いは、小さな値となる傾向がある。このことは、仮にコードが演奏されていたとしても、それと合わせて打楽器音が鳴っていた場合には、コード音のみが演奏されているフレームと比較すれば、当該フレームにおける各周波数成分のパワー値のばらつき度合いが比較的小さくなるという同様の傾向を示す。
さらに、打楽器の演奏により観測される周波数成分毎のパワー値は、コード区間のような半小節程度の比較的短時間内で急速に減衰する傾向が強い。打楽器は、一般的に音のアタック後に、音の持続はせずに減衰していく傾向の楽器が多いからである。
そこで、本実施形態ではまず、強度値累算手段の機能として、CPU101が、コード区間内の各フレーム0〜cvn−1ごとに、周波数成分j毎のパワー値doData[j](0≦j≦iFrame2−1)をそれぞれ、そのコード区間の各周波数成分jに対応するRAM103上の変数doDataBuf[j](0≦j≦iFrame2−1)(図3)にパワー累算値として累算する。
次に、CPU101は、コード抽出手段の機能(その1)として、周波数成分毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)からオクターブ情報を取り除いた1オクターブ内の半音単位の音階毎のパワー累算値をピッチクラスパワー累算値として算出し、RAM103上の変数pcpower[i](0≦i≦12)(図3)に記憶させる。そして、CPU101は、1オクターブ内のルート音階とコード種別を変数rootと変数type(図3)に順次セットしながら、ルート音階rootとコード種別typeとで定まるコード毎に、そのコードを構成する音階に対応するピッチクラスパワー累算値pcpower[i]を加算する。CPU101は、その加算結果をそのコードを構成する音階の数で正規化して、そのコードに対応するコードパワー値(コード強度値)を算出し、RAM103上の変数chordpower[type][root]に格納する。
CPU101は、コード抽出手段の機能(その2)として、コードパワー値が大きい順に、そのコードパワー値に対応するコードを、現在のコード区間に対応するコードの候補として出力する。
上述の処理において、本実施形態では、前述したように、楽曲中の1つのコード区間でコード(和音)が演奏されている場合とそうでない場合とで、コード区間内の各フレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いが異なる傾向があることを利用して、強度値調整手段の機能として、以下の制御が実施される。CPU101は、フレームの処理毎に、そのフレーム内における周波数成分毎のパワー値の、周波数軸方向のばらつき度合い例えば分散値を計算する。CPU101は、その値に応じて、周波数成分毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)に累算される、現在のフレームの各パワー値doData[j](0≦j≦iFrame2−1)の割合を調整する。より具体的には、CPU101は、上述のばらつき度合い例えば分散値が所定の閾値(これを「第1の閾値」とする)に比較して小さいときには、そのフレームはコード演奏には寄与していないと判定する。そして、CPU101は、現在のフレームの各パワー値doData[j](0≦j≦iFrame2−1)に1より小さい所定値(これを「第1の所定値」とする)をそれぞれ乗算し、各乗算の結果値を各周波数成分毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)に累算する。このようにして、あるフレームがコード演奏に寄与していないと判定された場合には、そのフレームのパワー値に1より小さい比率を乗算して、すなわち重み付けを小さくして、累算するようにしている。
このようにして、本実施形態では、フレーム内における各周波数成分のパワー値の周波数軸方向のばらつき度合いに基づいて、例えば図5(b)のケースのような、コード演奏には寄与していないフレームを判定することができる。そして、この判定結果に基づいて、コード抽出の基礎となる各周波数成分のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)への、現在のフレームの各周波数成分のパワー値doData[j](0≦j≦iFrame2−1)の寄与割合を下げることができる。これらの制御により、コード演奏の構成音以外の演奏要素の影響を効果的に取り除くことが可能となり、コード抽出の精度を向上させることが可能となる。
さらに、本実施形態では、コード区間のような半小節程度の時間内でみたときに、コードの構成音の音階に対応する周波数成分のパワー値はあまり変化しない値を維持するのに対し、打楽器音等に対応する周波数成分毎のパワー値は急速に減衰する傾向が強いことに着目して、強度累算値調整手段の機能として、以下の制御が実施される。CPU101は、現在のコード区間における全てのフレームに対する累算処理が終了して、周波数成分毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)を算出すると、以下の演算を実行する。すなわち、CPU101は、周波数成分j(0≦j≦iFrame2−1)毎に、フレーム毎の調整されたパワー値doData[j]の、コード区間内における時間軸方向のばらつき度合い例えば分散値を算出する。CPU101は、その値に応じて、周波数成分jにおけるパワー累算値doDataBuf[j]を調整する。より具体的には、CPU101は、上述のばらつき度合い例えば分散値が所定の閾値(これを「第2の閾値」とする)に比較して大きいときには、その周波数成分jはそのコード区間において持続的に発音されていた音ではなく、例えば打楽器等や動きのあるメロディ等の影響を受けている音高の周波数である可能性が高いと考えられるので、コード演奏の構成音には寄与していないと判定する。そして、CPU101は、周波数成分jのパワー累算値doDataBuf[j]に1より小さい所定値(これを「第2の所定値」とする)を乗算し、その乗算の結果値を周波数成分jの現在のコード区間におけるパワー累算値doDataBuf[j](調整強度累算値)として出力する。このようにして、ある周波数成分jが持続的に発音されていた音ではなく、例えば打楽器等や動きのあるメロディ等の影響を受けている音高の周波数である可能性が高いと判定された場合には、その周波数成分jのパワー値に1より小さい比率を乗算して、すなわち重み付けを小さくして、出力するようにしている。
このようにして、本実施形態では、周波数成分毎に、コード区間内におけるその周波数成分のパワー値の時間軸方向のばらつき度合いに基づいて、コード演奏以外の演奏に対応する音階の周波数成分を判定することができる。そして、この判定結果に基づいて、そのような周波数成分のパワー累算値を下げることができる。これらの制御により、コード演奏以外の演奏要素の影響を効果的に取り除くことが可能となり、コード抽出の精度を向上させることが可能となる。
上述の制御において、ボーカルやメロディー演奏などの主旋律が演奏されている場合には、ある周波数成分におけるパワー値doData[j]が強くなって、コード区間の一部のフレーム内における各周波数成分のパワー値の周波数軸方向のばらつき度合い例えば分散値が大きくなる可能性がある。しかし、主旋律が同じ周波数で持続する場面は少ないため、その周波数成分について、コード区間内の時間軸方向でみたときに、パワー累算値を生成したフレーム毎のパワー値の時間軸方向の分散は大きくなる可能性が高い。従って、そのような場合には、主旋律の周波数成分に対応するパワー累算値を下げることにより、主旋律の演奏がコードの抽出精度に及ぼす影響も、効果的に取り除くことが可能となる。
ボーカルの主旋律演奏においては、ボーカルのピッチ周波数の倍音成分が存在する。しかし、本実施形態では、ピッチ抽出の基礎となるパワー累算値としては、周波数成分毎の強度累算値からオクターブ情報を取り除いた1オクターブ内の半音単位の音階毎のピッチクラスパワー累算値pcpower[i](0≦i≦12)が用いられるため、倍音の影響を取り除くことが可能である。
上述の動作原理に基づく図2のステップS208のコード抽出の処理について、以下に詳細に説明する。
図6は、図2のステップS208のコード抽出の制御処理例を示すフローチャートである。
まず、初期設定処理として、CPU101は、フレーム数を示す変数iに値「0」を、コード区間カウンタの変数cvcntに値「1」を、処理対象フレームの開始時間を示す変数doChordTimeに楽曲開始時間を示す変数doBarShiftの値を、それぞれセットする。また、CPU101は、パワー累算値計算用の変数doDataBuf[j]、doDataBuf2[j]、doDataBuf3[j](0≦j≦iFrame2−1)に、それぞれ初期値「0」をセットする(以上、ステップS601)。なお、実際には、jを0からiFrame2−1まで、順次インクリメント(+1)しながら、ループ処理を行って、各要素について処理を行う。以下の説明でも同様である。
次に、CPU101は、下記(1)式に示されるようにして、コード区間時間間隔doBarZoomにコード区間カウンタcvcntを乗算し、楽曲開始小節時間doBarShiftに加算することにより、次のコード区間の開始時刻を算出し、RAM103上の変数aにセットする(ステップS602)。
a=doBarShift+doBarZoom×cvcnt ・・・(1)
そして、CPU101は、ステップS611でフレーム数iを+1ずつインクリメントしながら、ステップS603で音楽音響データの全フレーム数ulTimenの分のフレーム処理が終了したと判定するまで、以下の処理を繰返し実行する。なお、本実施形態では、フレーム数i=0が最初のフレームに対応するものであるとし、全フレーム数ulTimenの処理が終わってフレーム数iをインクリメントした時点で、フレーム数i=全フレーム数ulTimenとなってステップS603の判定がNOとなり、コード抽出の処理が終了する。
まず、CPU101は、処理対象フレーム開始時間doChordTimeが、次コード区間開始時刻aに達したか否かを判定する(ステップS604)。
ステップS604の判定がNOならば、CPU101は、処理対象フレーム開始時間doChordTimeが次コード区間開始時刻aに達するまでのコード区間内の各フレーム毎に、以下のステップS605からS611の一連の処理を実行する。
まず、CPU101は、処理対象フレーム開始時間doChordTimeから始まるフレーム時間間隔doTimeUnitに対応する、周波数成分j毎のパワー値doData[j](0≦j≦iFrame2−1)をRAM103等から読み込む(ステップS605)。このパワー値は、図2のステップS207(詳細は図4)で算出され、RAM103等に保存されているものである。
次に、CPU101は、ステップS605で読み込んだ、現在処理中のフレーム(フレームi)における各周波数成分jのパワー値doData[j](0≦j≦iFrame2−1)の、周波数軸方向の分散値を計算する(ステップS606)。具体的には、0≦j≦iFrame2−1でのパワー値doData[j]の2乗の和の平均から、パワー値doData[j]の平均の2乗が減算されることにより、分散値が計算される。
次に、CPU101は、ステップS606で計算した分散値が、第1の閾値よりも小さいか否かを判定する(ステップS607)。
ステップS607の判定がYESならば、CPU101は、そのフレームはコード演奏には寄与していないとして、現在のフレームの各パワー値doData[j](0≦j≦iFrame2−1)に1より小さい値の第1の所定値をそれぞれ乗算し、その乗算結果を新たなパワー値doData[j](0≦j≦iFrame2−1)として出力する(ステップS608)。
上述のステップS607およびS608の処理が、前述した強度値調整手段の機能を実現する。
ステップS607の判定がNOならば、CPU101は、現在のフレームの各パワー値doData[j](0≦j≦iFrame2−1)をそのまま出力する。
CPU101は、強度値累算手段の機能として、下記(2)式に示されるように、ステップS607およびS608を介して出力された現在のフレームの各パワー値doData[j](0≦j≦iFrame2−1)を、各周波数ごとにそれぞれ、パワー累算値doDataBuf[j](0≦j≦iFrame2−1)に加算する。すなわち、ステップS611でフレーム数iを+1ずつインクリメントしながら、各周波数ごとのパワー累算値doDataBuf[j](0≦j≦iFrame2−1)に、現在処理中のフレーム(フレームi)での各周波数のパワー値doData[j](0≦j≦iFrame2−1)を加算してループさせることで、時間軸方向の累算値が求められることになる。また、同様に、各パワー値doData[j](0≦j≦iFrame2−1)を、各周波数ごとにそれぞれ、パワー累算値doDataBuf2[j](0≦j≦iFrame2−1)に累算する。さらに、各パワー値の2乗値doData[j]×doData[j](0≦j≦iFrame2−1)を、各周波数ごとにそれぞれ、パワー累算値doDataBuf3[j](0≦j≦iFrame2−1)に累算する(以上、ステップS609)。
doDataBuf[j]=doDataBuf[j]+doData[j]
doDataBuf2[j]=doDataBuf2[j]+doData[j]
doDataBuf3[j]=doDataBuf3[j]
+doData[j]×doData[j]
・・・(2)
パワー累算値doDataBuf[j]とdoDataBuf2[j]には、同じ値が代入されるが、パワー累算値doDataBuf2[j]はパワー2乗累算値doDataBuf3[j]とともに、時間軸方向の分散の計算用に用いられる。なお、doDataBuf[j]とdoDataBuf2[j]は、1つの変数で共用することとしても良い。
その後、CPU101は、処理対象フレーム開始時間doChordTimeにフレーム時間間隔doTimeUnitを加算して次の処理対象フレーム開始時間doChordTimeを算出する(ステップS610)。
さらに、CPU101は、フレーム数iをインクリメント(+1)する(ステップS611)。
CPU101は、ステップS603の判定処理に戻り、全フレーム数ulTimenの処理がまだ完了しておらずステップS603の判定がYESならば、さらにステップS604で、処理対象フレーム開始時間doChordTimeが次コード区間開始時刻aに達したか否かを判定する。
処理対象フレーム開始時間doChordTimeが次コード区間開始時刻aに達しておらずステップS604の判定がNOならば、現在のコード区間内の次のフレームに対して、上述したステップS605からS609で、前述した強度値累算手段および強度値調整手段に対応する処理が実行される。
以上の動作が、処理対象フレーム開始時間doChordTimeが次コード区間開始時刻aに達してステップS604の判定がYESになるまで順次インクリメントされるフレーム数iに対応するフレーム毎に実行される。これにより、1つのコード区間全般にわたるパワー累算値doDataBuf[j]とdoDataBuf2[j]、およびパワー2乗累算値doDataBuf3[j]が算出される。
ステップS604の判定がYESになると、CPU101は、図7のステップS701の処理に移行する。ステップS701で、CPU101はまず、RAM103に確保される周波数成分カウント用の変数j(図3には特には図示しない)の値を「0」に初期設定する。
次に、CPU101は、周波数成分カウンタjについて、ステップS707で+1ずつインクリメントしながら、ステップS702で周波数成分の数iFrame2に達したと判定するまで、各周波数成分j(0≦j≦iFrame2−1)毎に、コード区間内の時間軸方向のパワー値doData[j]の分散を算出して判定する。
まず、CPU101は、前述したように、コード区間時間間隔doBarZoomを1フレームの時間間隔doTimeUnitで除算した値として、1つのコード区間のフレーム数cvnを算出する(例えば図5(a)の時間軸を参照)。なお、このcvnは、ステップS605からステップS611の間のループで+1ずつインクリメントして、1つのコード区間における実際のフレーム数をカウントして用いるようにしても良い。次に、CPU101は、下記(3)式に示されるように、周波数成分jの時間軸方向計算用のパワー累算値doDataBuf2[j]をcvnで除算することにより、周波数成分jのパワー平均値aveを算出する(以上、ステップS703)。
ave=doDataBuf2[j]/cvn ・・・(3)
次に、CPU101は、下記(4)式に示されるように、周波数成分jの時間軸方向計算用のパワー2乗累算値doDataBuf3[j]をcvnで除算して得られる周波数成分jのパワー2乗平均値「doDataBuf3[j]/cvn」から、周波数成分jのパワー平均値の2乗値「ave×ave」を減算する。これにより、CPU101は、周波数成分jについて、コード区間内の時間軸方向のパワー値doData[j]の分散値を算出し、RAM103上の変数bunsanに記憶させる(以上、ステップS704)。
bunsan=doDataBuf3[j]/cvn−ave×ave ・・(4)
次に、CPU101は、ステップS704で計算した分散値bunsanが、第2の閾値よりも大きいか否かを判定する(ステップS705)。
ステップS705の判定がYESならば、CPU101は、その周波数成分jはコード演奏の構成音には寄与していないとして、周波数成分jのパワー累算値doDataBuf[j]に1より小さい値の第2の所定値を乗算し、その乗算の結果値を周波数成分jの現在のコード区間におけるパワー累算値doDataBuf[j]として出力する(ステップS706)。
ステップS705の判定がNOならば、CPU101は、周波数成分jのパワー累算値doDataBuf[j]をそのまま出力する。
上述のステップS703からS706の処理が、前述した強度累算値調整手段の機能を実現する。
その後、CPU101は、周波数成分カウンタjを+1インクリメントする(ステップS707)。
そして、CPU101は、ステップS702の判定処理に戻り、全周波数成分iFrame2の処理がまだ完了しておらずステップS702の判定がYESならば、次の周波数成分jに対して、上述したステップS703からS706で、前述した強度累算値調整手段に対応する処理が実行される。
以上の動作が、周波数成分jが全周波数成分iFrame2に達してステップS702の判定がNOになるまで順次インクリメントされる周波数成分j毎に実行される。現在のコード区間に対応して、周波数成分全般にわたるパワー累算値doDataBuf[j]が算出される。
ステップS702の判定がNOになると、CPU101は、現在のコード区間に対して出力された周波数成分j毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)を用いて、コード判定処理を実行する(ステップS708)。この結果、CPU101は、現在のコード区間に対応するコードを判定して出力する。この処理の詳細については、後述する。
コード判定処理の後、CPU101は、パワー累算値計算用の変数doDataBuf[j]、doDataBuf2[j]、doDataBuf3[j](0≦j≦iFrame2−1)に、それぞれ初期値「0」をセットする(以上、ステップS709)。
さらに、CPU101は、コード区間カウンタの変数cvcntを+1インクリメントして、コード区間を1つ進める(ステップS710)。
CPU101は、図6のステップS602の処理に戻り、コード区間時間間隔doBarZoomに新たなコード区間カウンタcvcntを乗算し、楽曲開始小節時間doBarShiftに加算することにより、1つ進んだコード区間の次のコード区間の開始時刻を算出し、RAM103上の変数aにセットする。
CPU101は、ステップS603以降の処理を再度実行することにより、次のコード区間に対して、上述した制御処理を繰り返し実行する。
図8および図9は、図7のステップS708のコード判定の制御処理例を示すフローチャートである。図8のフローチャートでは、このフローチャートの前までの処理で求められた、周波数軸方向の各周波数成分のパワー値に基づき、平均律における音階の各音ごとのパワーを決定する。そして、図9のフローチャートでは、図8で求められた音階の各音のパワーについて、オクターブを度外視した、12音(1オクターブ分)の各音のパワーを算出する。
CPU101はまず、処理する音階数を決定する。例えば、ピアノ楽曲を想定すれば、処理音階数=88鍵である。次に、CPU101は、処理音階数をさらに細かく分割した高分解能で、処理を実行することを設定する。このために、CPU101は、処理音階数を何倍の分解能にするかを、RAM103上の変数res100cent(図3)にセットする。例えば、88鍵に対してその5倍の分解能が設定される場合には、res100cent=5がセットされる。また、CPU101は、処理音階数の範囲で処理を開始する要素番号と、処理の終了を判定する要素番号を、RAM103上の変数ispとied(図3には特には図示しない)にセットする。このispおよびiedは、上述した、処理音階をさらに細かくした高分解能での処理を行う要素数に相当する数である。例えばisp=0である。また、ied=処理音階数×res100centであり、例えばied=88×5=440である。
なお、ここでは88音階を例として説明するが、電子楽器の演奏データの通信規格であるMIDI(Musical Instrument Digital Interface)との関連で、最大で128音階までを処理可能である。
CPU101は、RAM103上の変数jを音階(要素数)カウンタとして、まず、変数jに初期値isp(例えばisp=0)をセットする(ステップS801)。
その後、CPU101は、音階(要素数)カウンタjについて、ステップS809で+1ずつインクリメントさせながら、ステップS802で処理の終了を判定する要素番号ied(例えばied=440)に達したと判定するまで、以下のステップS803からS808までの一連の処理により、各音階要素jのパワー累算値(後述するパワー累算値doDataBuf[index])を半音単位の音階(後述するMIDIノート番号iPitch)のパワー累算値(後述するピッチパワー累算値pitchpower[iPitch])に変換する処理を実行する。
まず、CPU101は、ispからied−1までの要素番号の間で順次インクリメントされる音階要素jについて、その音階要素jの周波数を下記(5)式により計算し、RAM103の変数dfrにセットする(ステップS803)。なお、(5)式で、「^」は、べき乗の演算子を示す。
dfr=440×2^((j/res100cent−69+21)/12)
・・・(5)
上記(5)式は、例として、入力される音楽音響データの楽曲がピアノ楽曲で、音階要素j=0のときにピアノの最低音が指定される場合の計算式である。ピアノの最低音のMIDIノート番号は「21」である。また、440Hzの周波数のA4音(A3音の場合もある)のMIDIノート番号は「69」である。そして、例えばres100cent=5とすれば、上記(5)式により、音階要素j=0のときの周波数dfrは、
dfr=440×2^((0/5−69+21)/12)=27.5Hz
となって、MIDIノート番号=21の音階の周波数に等しくなる。また、音階要素j=240のときの周波数dfrは、
dfr=440×2^((240/5−69+21)/12)=440Hz
となって、MIDIノート番号=69の音階の周波数に等しくなる。
次に、CPU101は、上述のようにして算出した音階要素jに対応する周波数dfrと、図2のステップS207での分析の処理におけるオーバーラップを含む1フレームのサンプル数iFrameSizeと、入力する音楽音響データのサンプリング周波数fsとから、音階要素jに対応するFFTデータ上の周波数成分番号を下記(6)式により算出し、RAM103上の変数indexにセットする(ステップS804)。(6)式において、「int(・・・)」は、括弧内の値の整数値を算出する演算関数である。
index=int(iFrameSize×dfr/fs) ・・・(6)
この結果、CPU101は、上記FFT上の周波数成分番号indexに対応して前述した図7のステップS702からS707の処理によりRAM103に求まっているパワー累算値doDataBuf[index]を、現在の音階要素jに対応するパワー累算値としてRAM103上の変数d(図3には特には図示しない)に記憶させる(ステップS805)。
次に、CPU101は、以下のステップS806からS808の処理により、音階の分解能を「ied=処理音階数×res100cent(例えば88×5)」音階(要素数)から半音単位の処理音階数に縮退させながら、連続するres100cent(例えば5)音階要素毎に、それらのパワー値の中で最も大きなパワー値を、その連続する音階から縮退される半音単位の音階のパワーとして算出する。
まず、CPU101は、下記(7)式により、現在の音階要素jに対応する半音単位に縮退された音階のMIDI上でのノート番号を算出し、RAM103上の変数iPitchにセットする(ステップS806)。(7)式において、「int(・・・)」は、括弧内の値の整数値を算出する演算関数である。
iPitch=int(j/res100cent+21) ・・・(7)
上記(7)式は、前述の(5)式に対応して、例として、入力される音楽音響データの楽曲がピアノ楽曲で、音階要素j=0のときにピアノの最低音(MIDIノート番号iPitch=21)が指定される場合の計算式である。
上記(7)式により算出されるMIDIノート番号iPitchは、ステップS802からS809が連続してres100cent(例えば5)回実行される間は、同じ値をとる。
そこで、CPU101は、その連続する回数=res100cent回の間で繰り返し順次算出される音階要素jに対応するパワー累算値d(ステップS805)を、MIDIノート番号iPitchに対応するパワー累算値(以下、これを「ピッチパワー累算値」と呼ぶ)を格納するRAM103上の変数pitchpower[iPitch](図3)の値と順次比較する(ステップS807)。
そして、CPU101は、音階要素jに対応するパワー累算値dがその音階要素jから縮退されるMIDIノート番号iPitchのピッチパワー累算値pitchpower[iPitch]よりも大きければ、ピッチパワー累算値pitchpower[iPitch]の値を音階要素jに対応するパワー累算値dの値で置き換える(ステップS807の判定がYES→S808)。
CPU101は、音階要素jに対応するパワー累算値dがその音階要素jから縮退されるMIDIノート番号iPitchのピッチパワー累算値pitchpower[iPitch]よりも大きくなければ、ピッチパワー累算値pitchpower[iPitch]の値は置き換えない(ステップS807の判定がNO)。
その後、CPU101は、音階要素jの値を+1インクリメントし(ステップS809)、ステップS802の判定処理に戻る。
CPU101は、音階要素jが0からied−1までの間、ステップS802でYESと判定して、音階要素jをインクリメントしながら上述したステップS803からS808の一連の処理を繰り返し実行する。
以上のようにして、本実施形態では、ied=処理音階数×res100cent(例えば88×5)音階の高解像度の各音階要素jのパワー累算値doDataBuf[index]から、半音単位のMIDIノート番号iPitch毎のピッチパワー累算値pitchpower[iPitch]を算出し、RAM103に記憶させることができる。
CPU101は、音階要素jが処理の終了を判定する要素番号iedになってステップS8802の判定がNOになると、図9のステップS901の処理に進む。
CPU101は、RAM103上の変数jを半音単位のMIDIノート番号をカウントする変数として、まずMIDIノート番号jを最低音の値「0」にセットする(ステップS901)。
その後、CPU101は、MIDIノート番号jについて、ステップS904でその値を+1ずつインクリメントしながら、ステップS902でMIDIで指定可能な最高音の値「127」を超えた(「128」になった)と判定するまで、次の処理を実行する。
CPU101は、下記(8)式に示されるように、MIDIノート番号jに対応するピッチパワー累算値pitchpower[j]を、MIDIノート番号jを12で除算した剰余値「j mod 12」に対応するノート番号のパワー累算値(以下、これを「ピッチクラスパワー累算値」と呼ぶ)に足し込み、RAM103上の変数pcpower[j mod 12]に記憶させる。なお、ピッチパワー累算値pitchpower[j]は、図8のステップS801からS809によって算出され、RAM103に記憶されているものである。ただし、ied/res100cent<127の場合には、ピッチパワー累算値pitchpower[ied/res100cent+1]からpitchpower[127]までの値は「0」とする。同様に、0<isp/res100centの場合には、ピッチパワー累算値pitchpower[0]からpitchpower[isp/res100cent−1]までの値は「0」とする。
pcpower[j mod 12]=pcpower[j mod 12]
+pitchpower[j]
・・・(8)
ここで、i=j mod 12 とすれば、0≦i≦12となる。従って、ステップS902からS904の繰り返し処理によって、0から127までの各MIDIノート番号jのピッチパワー累算値pitchpower[j]から、オクターブ情報を取り除いた1オクターブ=12音階中の半音単位の各音階iのピッチクラスパワー累算値pcpower[i](0≦i≦12)を算出することができる。
CPU101は、MIDIノート番号jがMIDIで指定可能な最高音の値「127」を超えてステップS902の判定がNOとなると、ステップS905のコードパワーの算出の制御処理とステップS906のランキングの制御処理を実行する。
図10は、コードパワーの算出の制御処理例を示すフローチャートである。図10では、図9で求められた、1オクターブ分の音階(12音)の各音のパワーに基づき、ルート音とコード種別を変えながら、各ルート音の各コード種別について、その構成音となっている音のパワーがどのくらい強いかを算出する。
CPU101は、コードのルート音を指定するRAM103上の変数rootについて、ステップS1001で1オクターブの12音中の最低音階の値「0」を初期設定した後、ステップS1013で+1ずつインクリメントしながら、ステップS1002で値「12」より小さいと判定する間、以下のステップS1003からS1012までの一連の処理を、各ルート音階root毎に繰り返し実行する。
この一連の処理の中で、CPU101は、コード種別typeを指定するRAM103上の変数typeについて、ステップS1003で最初のコード種別を示す値「0」を初期設定した後、ステップS1012で+1ずつインクリメントしながら、ステップS1004でRAM103上の変数ctypenに格納されたコード種別の数より小さいと判定する間、以下のステップS1005からS1011までの一連の処理を、各コード種別type毎に繰り返し実行する。
この一連の処理の中で、CPU101は、ステップS1005でルート音階rootおよびコード種別typeに対応するコードパワー値を示すRAM103上の変数chordpower[type][root]の値を「0」に初期設定する(ステップS1005)。その後、CPU101は、1オクターブ中の音階を指定するRAM103上の変数iについて、ステップS1006で最低音の音階を示す値「0」を初期設定した後、ステップS1010で+1ずつインクリメントしながら、ステップS1007で1オクターブ中の最高音の値「12」より小さいと判定する間、以下のステップS1008とS1009の処理を、各音階i毎に繰り返し実行する。
以上の3重の繰返し処理により、各ルート音階rootと各コード種別typeとで決まるコードに対して、1オクターブ中の各音階毎に、以下のステップS1008とS1009の処理が繰り返し実行されることになる。
図11は、図10のフローチャートで参照される図1のROM102または外部記憶装置108等に記憶されるコード構成音テーブルのデータ構成例を示す図である。このテーブルは、ルート音階root=0である場合の、コード種別の値1101毎の、コード種別の名称1102と、コード構成音の音階番号1103を記憶したデータである。CPU101は、このテーブル内容を、コード構成音を格納するRAM103上の変数ctype[type][i](0≦i<12)(図3)にセットする。また、CPU101は、コード種別の値1101=type毎のコード構成音の数(図11のテーブル上の該当行上で値「1」が設定されている数)を、RAM103上の変数ctypenn[type](図3)にセットする。
例えば、コード種別の値1101=0(コード種別の名称1102=「maj」)に対応するコード構成音配列ctype[0][i](0≦i<12)としては、図11より、音階番号i=0,4,7がコード構成音である。このコード種別「maj」は、メジャーコードであり、例えば、ルート音rootがC(ド)を表す値となった場合は、Cメジャーコードを表す。従って、ctype[0][0]とctype[0][4]と1ctype[0][7]に、それぞれ値「1」がセットされる。また、ctype[0][1]とctype[0][2]とctype[0][3]とctype[0][5]とctype[0][6]とctype[0][8]とctype[0][9]とctype[0][10]とctype[0][11]には、それぞれ値「0」がセットされる。コード構成音数は、ctypenn[0]=3である。他のコード種別の値=typeについても、図11のコード構成音の設定内容に従って、同様にコード構成音配列ctype[type][i](0≦i<12)とコード構成音数ctypenn[type]への設定が行われる。
ルート音階rootが値「0」ではない値=rootである場合には、ctype[type][i]の代わりに、ctype[type][(i―root+12) mod 12]としてアクセスすれば、ルート音階rootおよびコード種別typeに対するコード構成音を得ることができる。ここで、「(i―root+12) mod 12」は、値(i―root+12)を12で除算した剰余値を表す。
図10のステップS1008において、CPU101は、現在選択している音階番号iが現在選択しているルート音階rootおよびコード種別typeで決まるコードのコード構成音であるか否か、すなわち、コード構成音ctype[type][(i―root+12) mod 12]=1であるか否かを判定する。
CPU101は、ステップS1008の判定がYESならば、現在選択しているルート音階rootおよびコード種別typeに対応するコードパワーchordpower[type][root]に、現在選択している音階iに対応するピッチクラスパワー累算値pcpower[i]を累算する(ステップS1009)。すなわち、現在選択している音階iが現在選択しているルート音階rootおよびコード種別typeに対応するコードの構成音である場合には、その音階iに対して現在のコード区間で抽出されたパワー累算値が、そのコードに対して累算されることになる。
CPU101は、ステップS1008の判定がNOならば、現在選択している音階iのピッチクラスパワー累算値pcpower[i]は無視する。
CPU101は、現在選択しているルート音階rootおよびコード種別typeに対応するコードに対して、1オクターブ内の全ての音階iのピッチクラスパワー累算値pcpower[i](0≦i<12)のアサインが終了しステップS1007の判定がNOになったら、ステップS1011で、現在選択しているルート音階rootおよびコード種別typeに対応するコードに対応するコードパワーchordpower[type][root]の値を、そのコードに対応するコード構成音数ctypenn[type]で除算して新たにコードパワーchordpower[type][root]の値とする。コード構成音数ctypenn[type]は、コードの種別により異なるから、この処理により、コードパワーchordpower[type][root]の値がコード構成音数で正規化される。
以上のようにして、全てのルート音階rootとコード種別typeの組合せで決まるコード毎に、コードパワーchordpower[type][root]が算出されると、ステップS1002の判定がNOとなって、CPU101は、図9のステップS905のコードパワーの算出の制御処理を終了する。
図12は、図9のステップS906のランキングの制御処理例を示すフローチャートである。この制御処理では、CPU101は、1位から5位までのコードパワー値の高い順にランキングを行って、現在のコード区間に対応するコードの候補を出力する。
CPU101はまず、コード種別typeおよびルート音階rootの全ての組合せ(0≦type<ctypen,0≦root<12)に対して、ランクが付けられているか否かを示すRAM103上の配列変数chordLikelihood[type][root]に、ランクがまだ付けられていないことを示す値「−1」をセットする(ステップS1201)。
その後、CPU101は、現在出力を行うランクを指定するRAM103上の変数iiについて、ステップS1202で第1位のランクの値「0」を初期設定した後、ステップS1214で+1ずつインクリメントしながら、ステップS1203で値「5」より小さいと判定する間、以下のステップS1204からS1013までの一連の処理を、各ランクii(0≦ii<5)毎に繰り返し実行する。
この一連の処理の中で、CPU101は、まず、ステップS1204で、最大パワーを示すRAM103上の変数maxに値「0.0」をセットし、最大パワーコード種別および最大パワールート音階をそれぞれ示すRAM103上の変数typemaxおよびrootmax(図3には特には図示しない)にともに無効値「−1」をセットする。その後、CPU101は、コードのルート音を指定するRAM103上の変数rootについて、ステップS1205で1オクターブの12音中の最低音階の値「0」を初期設定した後、ステップS1212で+1ずつインクリメントしながら、ステップS1206で値「12」より小さいと判定する間、以下のステップS1207からS1208までの一連の処理を、各ルート音階root毎に繰り返し実行する。
この一連の処理の中で、CPU101は、コード種別typeを指定するRAM103上の変数typeについて、ステップS1207で最初のコード種別を示す値「0」を初期設定した後、ステップS1211で+1ずつインクリメントしながら、ステップS1208でRAM103上の変数ctypenに格納されたコード種別の数(図10のステップS1004で設定されている)より小さいと判定する間、以下のステップS1209とS1210の処理を、各コード種別type毎に繰り返し実行する。
以上の3重の繰返し処理により、1位から5位のランク毎に、以下のステップS1209とS1210の処理により、各ルート音階root(0≦root<12)と各コード種別type(0≦type<ctypen)とで決まるコードの組合せの中で、ランク付けがまだされていないコードのうちコードパワーchordpower[type][root]が最も大きなコードが、そのランクのコードとして抽出される。
すなわちまず、CPU101は、現在選択しているルート音階rootおよびコード種別typeに対応して、図9のコードパワーの算出の制御処理によりRAM103に記憶してあるコードパワーchordpower[type][root]が最大パワーmax以上であって、かつランク付け有無指示配列chordLikelihood[type][root]の値が「−1」(ランク付けがまだされていない)か否かを判定する(ステップS1209)。
CPU101は、ステップS1209の判定がYESならば、最大パワーmaxに現在選択しているルート音階rootおよびコード種別typeに対応するコードパワーchordpower[type][root]をセットする。また、CPU101は、最大パワーコード種別typemaxに現在選択しているコード種別typeをセットし、最大パワールート音階rootmaxに現在選択しているルート音階rootをセットする(以上、ステップS1210)。
CPU101は、ステップS1209の判定がNOならば、ステップS1210の処理をスキップする。
CPU101は、ステップS1206の判定がNOとなった時点で、現在選択しているランクiiにおいて、ルート音階rootとコード種別typeの全ての組合せの中で、ランク付けがまだされていないコードのうちコードパワーchordpower[type][root]が最大となるルート音階rootとコード種別typeを、最大パワールート音階rootmaxおよび最大パワーコード種別typemaxとして算出することができる。
このとき、CPU101は、最大パワールート音階rootmaxおよび最大パワーコード種別typemaxに対応するランク付け有無指示配列chordLikelihood[typemax][rootmax]に現在のランクiiが付与されたことを示す値iiをセットする。また、CPU101は、コード区間カウンタcvcntが示す現在のコード区間に対応し、現在のランクiiに対応して、最大パワールート音階を格納するRAM103上の変数chord[cvcnt][ii][0](図3)に、最大パワールート音階rootmaxの値をセットする。さらに、CPU101は、コード区間カウンタcvcntが示す現在のコード区間に対応し、現在のランクiiに対応して、最大パワーコード種別を格納するRAM103上の変数chord[cvcnt][ii][1](図3)に、最大パワーコード種別typemaxの値をセットする(以上、ステップS1213)。
その後、CPU101は、現在のランクiiを+1インクリメントし、ステップS1203に戻って、次の新たなランクiiに対する最大パワールート音階rootmaxと最大パワーコード種別typemaxの検出を行う。
現在のコード区間に対して、すべてのランクii(0≦ii<5)に対するコード抽出処理が終了し、ステップS1203の判定がNOとなると、CPU101は、図12のフローチャートで示される図9のステップS906のランキングの算出の制御処理を終了し、図8のフローチャートで示される図7のステップS708のコード判定処理を終了する。
CPU101は、上述のコード判定処理を含む図6のコード抽出処理を、音楽音響データ中の例えば半小節単位の各コード区間カウンタcvcntが示すコード区間毎に実行することにより、各コード区間で演奏されている可能性の高いコード(ルート音階とコード種別)を、1位から5位までランク付けして、RAM103上の変数chord[cvcnt][ii][0]およびchord[cvcnt][ii][1](0≦ii<5)として得ることができる。
図13は、本実施形態によるコード抽出の動作事例を示す図である。図13(a)は、入力される音楽音響データに対して図2のステップS207で分析の処理を行った結果得られる、コード区間doBarZoom毎の誌面上方向に伸びる周波数軸上の周波数成分j毎のパワー値doData[j](0≦j≦iFrame2−1)を表示したものである。これに対して、図13(b)は、本実施形態によって得られるコード区間doBarZoom毎の誌面上方向に伸びる周波数軸上の周波数成分j毎のパワー累算値doDataBuf[j](0≦j≦iFrame2−1)と、それから抽出されるコードを1位から3位までランク付けして表示した例を示す図である。なお、図13(a)と(b)では、それぞれ上方が高音、下方が低音を表している。
実際には、CPU101は、図2のステップS209の表示の処理において、RAM103上の変数chord[cvcnt][ii][0]およびchord[cvcnt][ii][1]に記憶されているコード区間cvcnt毎のルート音階およびコード種別を、図1の表示部105に、例えば図13(b)の上部の表示例のようにランク付けして表示する。これにより、ユーザは、選択した楽曲のコード進行を知ることが可能となる。
以上説明したように、本実施形態では、音響信号から、コード演奏音以外の音の影響を効果的に取り除いて、精度の高いコード抽出を実現することが可能となる。
以上の実施形態において、周波数成分毎の強度値および強度累算値を示すデータとして、パワー値およびそのパワー累算値を用いたが、振幅値およびその振幅累積値などが用いられてもよい。
また、上記実施例中の図8におけるコード判定処理において、ステップS803、S804で、処理音階数をさらに細かく分割した高分解能で、処理を実行する一例を示しているが、他の方法により高分解能な処理を実現したり、高精度でのコード分析を可能とする処理を行っても良い。例えば、処理音階数=88鍵の各処理音階の音ごとに、いくつの周波数成分を割り当てるかを設定して、各音階ごとに、この設定された数の周波数成分の値を用いてコード分析処理を行うようにしても良い。例えば、各処理音階の音ごとに5個の周波数成分を用いることと設定された場合、88鍵の各音階について、それぞれ、その音階を代表する中心周波数に相当するdoDataの要素と、その隣接する上下の周波数2つずつ、計5つの周波数に相当するdoDataの要素のデータ値を、当該音階のパワーとして用いることとして、以下同様に、各音階の音のパワー値を計算し、その結果の値に基づいてコード判別を行うようにしても良い。
また、上記の説明では、音数について、MIDIの128音に基づいて説明しているが、これに限らず、さらに新しい規格に依拠してより多いもしくは少ない音数で実施する事も可能である。また、微分音や、平均律以外の調律やスケールに基づいた周波数でのパワーを分析することとしても良い。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
入力する音響信号に対して第1所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出する周波数解析手段と、
前記第1所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第1所定期間における前記周波数成分毎の強度値を調整する強度値調整手段と、
前記周波数成分毎に、前記第1所定期間よりも長い第2所定期間内で、前記強度値調整手段によって調整された前記強度値を累算して、前記周波数成分毎の強度累算値を算出する強度値累算手段と、
前記周波数成分毎に、前記第1所定期間毎の前記調整された強度値の、前記第2所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とする強度累算値調整手段と、
前記第2所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第2所定期間内で発音されたコードを抽出するコード抽出手段と、
を備えることを特徴とするコード抽出装置。
(付記2)
前記コード抽出手段は、
前記周波数成分毎の調整強度累算値から半音単位の音階毎の調整強度累算値を算出し、
ルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出し、
該コード強度値が大きい順に、該コード強度値に対応するコードを、前記第2所定期間に対応するコードの候補として出力する、
ことを特徴とする付記1に記載のコード抽出装置。
(付記3)
前記コード抽出手段は、前記周波数成分毎の調整強度累算値からオクターブ情報を取り除いた1オクターブ内の半音単位の音階毎の調整強度累算値を算出し、1オクターブ内のルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出する、
ことを特徴とする付記1または2に記載のコード抽出装置。
(付記4)
前記強度値調整手段は、ある前記第1所定期間における前記周波数軸方向のばらつき度合いが第1の閾値に比較して小さい場合に、当該第1所定期間における前記周波数成分毎の強度値に1よりも小さい第1の所定値をそれぞれ乗算して調整する、
ことを特徴とする付記1ないし3のいずれかに記載のコード抽出装置。
(付記5)
前記強度累算値調整手段は、ある前記周波数成分に対する、前記時間軸方向のばらつき度合いが第2の閾値に比較して大きい場合に、該周波数成分の強度累算値に1よりも小さい第2の所定値を乗算し、該乗算の結果値を該周波数成分の前記第2所定期間における調整強度累算値として出力する、
ことを特徴とする付記1ないし4のいずれかに記載のコード抽出装置。
(付記6)
前記第2所定期間は前記音響信号に対応する楽曲の半小節に対応する期間である、
ことを特徴とする付記1ないし5のいずれかに記載のコード抽出装置。
(付記7)
入力する音響信号に対して第1所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出し、
前記第1所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第1所定期間における前記周波数成分毎の強度値を調整し、
前記周波数成分毎に、前記第1所定期間よりも長い第2所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出し、
前記周波数成分毎に、前記第1所定期間毎の前記調整された強度値の、前記第2所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とし、
前記第2所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第2所定期間内で発音されたコードを抽出する、
ことを特徴とするコード抽出方法。
(付記8)
入力する音響信号に対して第1所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出するステップと、
前記第1所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第1所定期間における前記周波数成分毎の強度値を調整するステップと、
前記周波数成分毎に、前記第1所定期間よりも長い第2所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出するステップと、
前記周波数成分毎に、前記第1所定期間毎の前記調整された強度値の、前記第2所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とするステップと、
前記第2所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第2所定期間内で発音されたコードを抽出するステップと、
をコンピュータに実行させることを特徴とするコード抽出プログラム。