(57)【要約】【課題】音響信号からコード（和音）を抽出する装置、方法、およびプログラムに関し、音響信号からの精度の高いコード抽出を実現する。【解決手段】入力する音響信号に対してフレーム毎にＦＦＴを行って周波数成分毎のパワー値を算出し、さらに周波数成分毎に、コード区間内で、パワー値を累算してパワー累算値を算出する。フレーム毎に、パワー値の周波数軸方向の分散を算出し、分散が小さいときには、周波数成分毎のパワー累算値に累算されるパワー値の割合を小さくする。周波数成分毎に、コード区間毎でのパワー累算値を生成したフレーム毎のパワー値の時間軸方向の分散を算出し、分散が大きいときには、その周波数成分のパワー累算値を減少させる。コード区間毎に、周波数成分毎のパワー累算値に基づいて、そのコード区間で発音されるコードを抽出する。【選択図】図５
2015040964.tif 000002
【特許請求の範囲】
【請求項１】
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出する周波数解析手段と、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整する強度値調整手段と、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記強度値調整手段によって調整された前記強度値を累算して、前記周波数成分毎の強度累算値を算出する強度値累算手段と、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とする強度累算値調整手段と、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出するコード抽出手段と、
を備えることを特徴とするコード抽出装置。
【請求項２】
前記コード抽出手段は、
前記周波数成分毎の調整強度累算値から半音単位の音階毎の調整強度累算値を算出し、
ルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出し、
該コード強度値が大きい順に、該コード強度値に対応するコードを、前記第２所定期間に対応するコードの候補として出力する、
ことを特徴とする請求項１に記載のコード抽出装置。
【請求項３】
前記コード抽出手段は、前記周波数成分毎の調整強度累算値からオクターブ情報を取り除いた１オクターブ内の半音単位の音階毎の調整強度累算値を算出し、１オクターブ内のルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出する、
ことを特徴とする請求項１または２に記載のコード抽出装置。
【請求項４】
前記強度値調整手段は、ある前記第１所定期間における前記周波数軸方向のばらつき度合いが第１の閾値に比較して小さい場合に、当該第１所定期間における前記周波数成分毎の強度値に１よりも小さい第１の所定値をそれぞれ乗算して調整する、
ことを特徴とする請求項１ないし３のいずれかに記載のコード抽出装置。
【請求項５】
前記強度累算値調整手段は、ある前記周波数成分に対する、前記時間軸方向のばらつき度合いが第２の閾値に比較して大きい場合に、該周波数成分の強度累算値に１よりも小さい第２の所定値を乗算し、該乗算の結果値を該周波数成分の前記第２所定期間における調整強度累算値として出力する、
ことを特徴とする請求項１ないし４のいずれかに記載のコード抽出装置。
【請求項６】
前記第２所定期間は前記音響信号に対応する楽曲の半小節に対応する期間である、
ことを特徴とする請求項１ないし５のいずれかに記載のコード抽出装置。
【請求項７】
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出し、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整し、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出し、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とし、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出する、
ことを特徴とするコード抽出方法。
【請求項８】
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出するステップと、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整するステップと、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出するステップと、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とするステップと、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出するステップと、
をコンピュータに実行させることを特徴とするコード抽出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、音響信号からコード（和音）を抽出する装置、方法、およびプログラムに関する。
【背景技術】
【０００２】
音響信号からコード（和音）の種別を抽出する技術は、電子楽器の自動伴奏装置や、パーソナルコンピュータ上で動作するソフトウェアなどとして実現される自動採譜装置等に応用されている。
【０００３】
例えば複数の楽器による音楽の演奏音を含む音響信号からコードを抽出する従来技術として、音響信号に対して、一定時間毎に周波数解析を行い、一定時間内での周波数方向のパワースペクトルを計算し、そのパワー・スペクトルより基本周波数の候補を抽出して音符情報に変換し、その組合せからコードを抽出する技術が知られている。
【０００４】
より具体的には、信号取り込み部、ＦＦＴ処理部、基本周波数候補抽出部、音符情報変換部で音楽を音符情報として採譜し、この音符情報より和音候補抽出で和音候補を抽出し、抽出された和音候補から調の決定部で曲の調を決定し、和音候補と曲の調からコード構築部でコードの構築を行い、出力部からコードを出力するように構成された自動採譜装置が知られている（例えば特許文献１）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平０５−１７３５５７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、音響信号に複数の楽器による音楽の演奏音やボーカル音が含まれる場合、一定時間毎の周波数解析による得られる周波数方向のパワースペクトルには、コード構成音に対応するパワースペクトルのほかに、多くの楽音に対応するパワースペクトルが含まれる。例えば、主旋律（メロディー）に対応する楽器音またはボーカル音には、刺繍音や経過音などの非和声音が多く含まれる場合があり、また、音響信号に打楽器音が含まれている場合は、ノイズ成分が多く含まれる場合がある。
【０００７】
そして、このような非和声音成分やノイズ成分が多く含まれていると、コードの種別を正確に抽出することが困難となってしまう。すなわち、このような場合においては、一定時間毎の周波数解析による得られる周波数方向のパワースペクトル毎に対する処理のみを行う技術では、主旋律（メロディー）に対応する楽器音またはボーカル音や、打楽器音による影響を効果的に取り除いてコードの種別を正確に抽出することが困難であるという問題点を有していた。
【０００８】
本発明は、音響信号からの精度の高いコード抽出を実現することを目的とする。
【課題を解決するための手段】
【０００９】
態様の一例では、入力する音響信号に対して第１の所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出する周波数解析手段と、第１所定期間毎に、周波数解析によって得られる周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、その周波数軸方向のばらつき度合いに応じて、第１所定期間における周波数成分毎の強度値を調整する強度値調整手段と、周波数成分毎に、第１所定期間よりも長い第２所定期間内で、強度値調整手段によって調整された強度値を累算して、周波数成分毎の強度累算値を算出する強度値累算手段と、周波数成分毎に、第１所定期間毎の調整された強度値の第２所定期間内における時間軸方向のばらつき度合いを算出し、強度累算値をその時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とする強度累算値調整手段と、第２所定期間毎に、周波数成分毎の調整強度累算値に基づいて、音響信号からその第２所定期間で発音されたコードを抽出するコード抽出手段とを備える。
【発明の効果】
【００１０】
本発明によれば、音響信号からの精度の高いコード抽出を実現することが可能となる。
【図面の簡単な説明】
【００１１】
【図１】本発明によるコード抽出装置の実施形態のハードウェア構成の一例を示す図である。
【図２】コード抽出装置の全体動作の制御処理例を示すフローチャートである。
【図３】変数データの説明図である。
【図４】分析の制御処理例を示すフローチャートである。
【図５】コード抽出の制御処理の動作原理の説明図である。
【図６】コード抽出の制御処理例を示すフローチャート（その１）である。
【図７】コード抽出の制御処理例を示すフローチャート（その２）である。
【図８】コード判定の制御処理例を示すフローチャート（その１）である。
【図９】コード判定の制御処理例を示すフローチャート（その２）である。
【図１０】コードパワーの算出の制御処理例を示すフローチャートである。
【図１１】コード構成音テーブルのデータ構成例を示す図である。
【図１２】ランキングの制御処理例を示すフローチャートである。
【図１３】コード抽出の動作事例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
【００１３】
図１は、本発明によるコード抽出装置の実施形態のハードウェア構成の一例を示す図である。このコード抽出装置は、ＣＰＵ（中央演算処理装置）１０１、ＲＯＭ（リードオンリーメモリ）１０２、ＲＡＭ（ランダムアクセスメモリ）１０３、入力部１０４、出力部１０５、音響出力部１０６、音響入力部１０７を備える。
【００１４】
音響入力部１０７は、音楽音響データを取り込み、必要に応じて、内部のＲＡＭ１０３やハードディスク記憶装置またはソリッドステートドライブ装置等の外部記憶装置１０８に記憶する。この音響入力部１０７は例えば、インターネット上の音楽配信サイトに接続して音楽音響データをダウンロードしてＲＡＭ１０３や外部記憶装置１０８に取り込むネットワーク接続装置を含む。また、音響入力部１０７は例えば、ＣＤ（コンパクトディスク）やＤＶＤ等のディスク記録媒体に録音された音楽音響データを読み出し、必要に応じてＲＡＭ１０３や外部記憶装置１０８に記憶させるディスク記録媒体駆動装置を含む。あるいは、音響入力部１０７は例えば、ＳＤメモリカード等の可搬記録媒体に録音された音楽音響データを読み出し、必要に応じてＲＡＭ１０３や外部記憶装置１０８に記憶させる可変記録媒体駆動装置を含む。
【００１５】
音響出力部１０６は、音響入力部１０７が取り込んだ音楽音響データを直接再生出力し、あるいは、ＲＡＭ１０３や外部記憶装置１０８に記憶されている音楽音響データを読み出して再生出力する復号装置を含む。また、音響出力部１０６は、復号装置から出力される復号された音楽音響データをアナログ音楽信号に変換するＤ／Ａ（デジタル／アナログ）変換器を含む。さらに、音響出力部１０６は、Ｄ／Ａ変換器から出力されるアナログ音楽信号を増幅して外部に出力する増幅装置を含む。加えて、音響出力部１０６は、増幅装置から出力される増幅されたアナログ音楽信号を、放音するスピーカ、または外部に出力する出力端子を含む。
【００１６】
ＣＰＵ１０１は、ＲＯＭ１０２に記憶された制御プログラムに従って、当該コード抽出装置全体の制御を行う。ＲＡＭ１０３は、制御プログラムの実行に必要な、後述する図５に例示されるような各種制御データや、コード抽出の対象となる音楽音響データを、一時的に記憶する。
【００１７】
入力部１０４は、ユーザによるキーボード、マウス、各種スイッチ等による入力操作を検出し、その検出結果をＣＰＵ１０１に通知する。
【００１８】
出力部１０５は、ＣＰＵ１０１の制御によって送られてくるデータを液晶ディスプレイやプリンタに出力する。例えば、出力部１０５は、音響入力部１０７が入力した音楽音響データに対するコード抽出結果を液晶ディスプレイに表示する。
【００１９】
外部記憶装置１０５は、音楽音響データやコード抽出結果のデータ等を保存する。
【００２０】
本実施形態によるコード抽出装置の動作は、図２、図４〜図１０、および図１２に示されるフローチャート等で実現される機能を搭載した制御プログラムを、ＣＰＵ１０１がＲＯＭ１０２から読み出して順次実行することで実現される。そのプログラムは、例えば外部記憶装置１０８に記録して配布してもよく、或いは特には図示しないネットワーク接続装置によりネットワークから取得できるようにしてもよい。
【００２１】
以下、本発明の動作について、フローチャートに沿って説明する。なお、各フローチャートの説明において、ＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３等は、図１に示されるものを指すものとする。
【００２２】
図２は、図１の構成例を有するコード抽出装置の全体動作の制御処理例を示すフローチャートである。このフローチャートは、ＣＰＵ１０１が、ＲＯＭ１０２に記憶されたコード抽出プログラムを実行する動作として実現される。
【００２３】
まず、ＣＰＵ１０１は、ＲＡＭ１０３に記憶される各種制御データ等の初期化を行う（ステップＳ２０１）。
【００２４】
その後、ＣＰＵ１０１は、ユーザにより、図１の入力部１０４の特には図示しない終了ボタン、再生ボタン、またはコード抽出用の選曲ボタンのいずれかが押されれることにより終了、再生、またはコード抽出用の選曲のいずれかの指示がなされたか否かを判定する処理を繰り返し実行する（ステップＳ２０２、Ｓ２０３、またはＳ２０４の各判定がＮＯとなる処理ループ）。
【００２５】
ユーザが入力部１０４で終了ボタンを押すと、ＣＰＵ１０１は、ステップＳ２０２の判定がＹＥＳになって、ＣＰＵ１０１は、図２のフローチャートで示されるコード抽出プログラムの処理を終了する。
【００２６】
ユーザが入力部１０４で、特には図示しない曲指定ボタンで音楽音響データを選択した後に再生ボタンを押すと、ステップＳ２０３の判定がＹＥＳになって、ＣＰＵ１０１は、再生処理を実行する（ステップＳ２０５）。ここでは、ＣＰＵ１０１は、図１の音響入力部１０７から取り込まれるユーザが指定した音楽音響データ、あるいは、ＲＡＭ１０３や外部記憶装置１０８からユーザが指定した音楽音響データを順次読み込んで、図１の音響出力部１０６に出力する。音響出力部１０６は、ＣＰＵ１０１から入力される音楽音響データを復号装置で順次復号し、復号された音楽音響データをＤ／Ａ変換器でアナログ音楽信号に変換し、さらにそのアナログ音楽信号を増幅装置で増幅し、増幅されたアナログ音楽信号を、スピーカまたは出力端子から出力する。再生終了後、ＣＰＵ１０１は、ステップＳ２０２からＳ２０４の待機処理に戻る。
【００２７】
ユーザが入力部１０４で、コード抽出用の選曲ボタンを押して楽曲を選択すると、ＣＰＵ１０１は、ユーザが選択した楽曲データ（音楽音響データ）を読み込み（ステップＳ２０６）、その音楽音響データに対して分析を実行し（ステップＳ２０７）、分析結果に対してコード抽出を実行し（ステップＳ２０８）、コード抽出結果を図１の出力部１０５の液晶ディスプレイ等に表示する（ステップＳ２０９）。再生終了後、ＣＰＵ１０１は、ステップＳ２０２からＳ２０４の待機処理に戻る。
【００２８】
ステップＳ２０７の分析、ステップＳ２０８のコード抽出、およびステップＳ２０９の表示の各処理について、以下に詳細に説明する。
【００２９】
図３は、以下に説明する各処理で使用される変数データ（制御データ）の説明図である。これらの変数データは、ＲＡＭ１０３に確保される。以下の説明では、変数名と変数値名を同じ記号で表記する。例えば「ｕｌＴｉｍｅｎ」と記述したときは、ＲＡＭ１０３に確保される変数データｕｌＴｉｍｅｎの変数名とその値の両方を示すものとする。また、［ｉ］などが付いているものは、配列変数データを表す。例えば、ｄｏＤａｔａ［ｊ］は、ｊが０からｉＦｒａｍｅ２−１までの間で変化するｉＦｒａｍｅ２  個の要素値を有するデータである。各変数データの詳細な説明については、フローチャートの説明とともに後述する。
【００３０】
図４は、周波数解析手段としての機能を実現する図２のステップＳ２０７の分析の制御処理例を示すフローチャートである。
【００３１】
ここでは、ＣＰＵ１０１は、ＲＡＭ１０３に確保される変数データｉ（図３には特には図示せず）の値を０に初期設定した後（ステップＳ４０１）、その変数ｉの値を＋１ずつインクリメントしながら（ステップＳ４０８）、その変数ｉの値が、例えばＲＡＭ１０３に確保される選曲された音楽音響データの全フレーム数ｕｌＴｉｍｅｎ（図３）に達したと判定するまで（ステップＳ４０２）、変数ｉで定まるフレーム毎に、以下のステップＳ４０３からＳ４０７までの一連の処理を繰り返し実行する。
【００３２】
ここで、音楽音響データは例えば４４．１ｋＨｚ（キロヘルツ）でサンプリングされたデジタルデータであり、１フレームは例えば４０９６または８１９２サンプルである。なお、実際には、音楽音響データはステレオデータであり、左右の各チャネルについて処理が実行されるが、以下の説明では、理解を容易にするために、１チャネルに対する処理として説明する。また、フレームデータは、周波数成分の連続性を確保するために、一定サンプル数ずつオーバーラップして（重ねて）切り出される。ＣＰＵ１０１は予め、ＲＡＭ１０３上の変数に設定したサンプリング周波数ｆｓ（図３）から１サンプルの時間間隔を算出し、この時間間隔に１フレームのサンプル数からフレーム両端のオーバーラップ分を除いたサンプル数を乗算することにより、１フレームの時間間隔を算出し、ＲＡＭ１０３上の変数ｄｏＴｉｍｅＵｎｉｔ（図３）にセットする。また、ＣＰＵ１０１は、図２のステップＳ２０６で楽曲の音楽音響データを読み込むと、音楽音響データ全体の時間をオーバーラップ分を含まない１フレームの時間間隔ｄｏＴｉｍｅＵｎｉｔで除算することにより、その音楽音響データの全フレーム数を算出し、ＲＡＭ１０３上の変数ｕｌＴｉｍｅｎ（図３）にセットする。
【００３３】
まず、ＣＰＵ１０１は、音響入力部１０７またはＲＡＭ１０３、外部記憶装置１０８等の音楽音響データから、ｉ番目のフレームの一定サンプル数のデータを切り出す（ステップＳ４０３）。なお、このときのフレームデータのサンプル数は、前述したオーバーラップ分を含む数である。
【００３４】
次に、ＣＰＵ１０１は、ステップＳ４０３で切り出したフレームデータに対して、窓関数をかける（ステップＳ４０４）。窓関数は、フレームデータ両端でデータがカットされることによるステップＳ４０５でのＦＦＴにおける高周波成分への悪影響を除去するために、フレームデータ両端で振幅が徐々に０になるようにするための重みデータである。窓関数としては、例えば良く知られたハミング窓やハニング窓などが使用される。
【００３５】
続いて、ＣＰＵ１０１は、ステップＳ４０４で得られたフレームデータに対して、ＦＦＴ（Ｆｉｒｔ  Ｆｏｕｒｉｅｒ  Ｔｒａｎｓｆｏｒｍ：高速フーリエ変換）による時間−周波数変換演算処理を実行する（ステップＳ４０５）。
【００３６】
ＣＰＵ１０１は、ステップＳ４０５でのＦＦＴの結果得られる各周波数成分値毎に、各周波数成分値を２乗演算することにより、各周波数成分の強度を示すパワー値（強度値）を算出する（ステップＳ４０６）。ここで、ＣＰＵ１０１は、ステップＳ４０３で切り出されたオーバーラップ分を含む１フレームのサンプル数を、予めＲＡＭ１０３上の変数ｉＦｒａｍｅＳｉｚｅ（図３）に設定しておく。また、ｉＦｒａｍｅＳｉｚｅの１／２の値を、ＲＡＭ１０３上の変数ｉＦｒａｍｅ２（図３）に予め設定しておく。ここで、ＦＦＴの性質から、ＦＦＴの結果得られるｉＦｒａｍｅ２番目からｉＦｒａｍｅＳｉｚｅ−１番目までの周波数成分値は、同じく０番目からｉＦｒａｍｅ２−１番目までの周波数成分値を対称に折り返して得られるデータとなる。このため、パワー値の算出は、０番目からｉＦｒａｍｅ２−１番目までの周波数成分値に対して行えばよい。
【００３７】
ＣＰＵ１０１は、ステップＳ４０６で算出したパワー値を、例えばＲＡＭ１０３（図１の外部記憶装置１０８でもよい）に保存する（ステップＳ４０７）。
【００３８】
以上のようにして、ＣＰＵ１０１は、ユーザが選択した１曲分の音楽音響データの全フレーム数ｕｌＴｉｍｅｎの各フレームに対してそれぞれ、０番目からｉＦｒａｍｅ２−１番目までの各周波数成分のパワー値の算出、保存が終了すると、図４のステップＳ４０２の判定がＮＯとなって、図２のステップＳ２０７の分析の処理を終了する。
【００３９】
次に、ＣＰＵ１０１は、図２のステップＳ２０８のコード抽出の処理を実行する。この処理の詳細について説明する前に、本実施形態におけるコード抽出の処理の動作原理について、以下に説明する。図５は、コード抽出の処理の動作原理の説明図である。
【００４０】
本実施形態では、コード抽出は、例えば楽曲の小節のおおよそ１／２（半小節）の時間間隔で行われる。この処理単位を「コード区間」と呼び、ＣＰＵ１０１が、例えば現在処理している楽曲のテンポ情報を取得することにより、このコード区間の時間間隔を算出し、変数ｄｏＢａｒＺｏｏｍ（図３）として予めＲＡＭ１０３に設定する。また、ＣＰＵ１０１は、コード区間時間間隔ｄｏＢａｒＺｏｏｍを１フレームの時間間隔ｄｏＴｉｍｅＵｎｉｔで除算した値として、１つのコード区間のフレーム数を算出し、それを図１のＲＡＭ１０３上の変数ｃｖｎ（図３）にセットする。
【００４１】
ＣＰＵ１０１は、入力している楽曲の音楽音響データにおいて、先頭の無音部分を除いた楽曲が開始する小節の音楽音響データの先頭からの時間を予め抽出し、ＲＡＭ１０３上の変数ｄｏＢａｒＳｈｉｆｔにセットする。ＣＰＵ１０１は、開始小節時間ｄｏＢａｒＳｈｉｆｔ以降、各フレームに対するコード抽出のための累算処理を進める毎に、開始小節時間ｄｏＢａｒＳｈｉｆｔから順次１フレームの時間間隔ｄｏＴｉｍｅＵｎｉｔを累算してゆくことにより、現在コード付け（コード抽出）を行おうとする処理対象のフレームの開始時間を算出し、ＲＡＭ１０３上の変数ｄｏＣｈｏｒｄＴｉｍｅ（図３）にセットする。
【００４２】
ＣＰＵ１０１は、開始小節時間ｄｏＢａｒＳｈｉｆｔ以降、１つのコード区間時間間隔ｄｏＢａｒＺｏｏｍに対するコード抽出が開始する毎に、現在のコード区間の回数をコード区間カウンタとしてＲＡＭ１０３上の変数ｃｖｃｎｔ（図３）にセットする。なお、変数ｃｖｃｎｔの初期値は「１」である。ＣＰＵ１０１は、コード区間時間間隔ｄｏＢａｒＺｏｏｍにコード区間カウンタｃｖｃｎｔを乗算し、楽曲開始小節時間ｄｏＢａｒＳｈｉｆｔに加算することにより、次のコード区間の開始時刻を算出し、ＲＡＭ１０３上の変数ａ（図５参照）（図３には特には図示しない）にセットする。
【００４３】
ＣＰＵ１０１は、開始小節時間ｄｏＢａｒＳｈｉｆｔからのコード抽出処理の開始後、または前回のコード区間の処理が終了後、コード付け処理対象フレーム時間ｄｏＣｈｏｒｄＴｉｍｅが次コード区間開始時刻ａに達するまで、現在のコード区間に対する各フレーム毎のコード抽出のための累算処理を実行する。
【００４４】
図４のフローチャートで示される図２のステップＳ２０７の分析の処理によって、図５（ａ）または（ｂ）に示される時間軸方向に進行する１つのコード区間内のフレーム番号０，１，２，３，４，・・・，ｃｖｎ−２，ｃｖｎ−１で示されるフレーム時間毎に、周波数軸方向の各周波数成分０，１，・・・，ｐ，・・・，ｑ，・・・ｉＦｒａｍｅ２−１に対応して、パワー軸方向の各パワー値ｄｏＤａｔａ［０］，ｄｏＤａｔａ［１］，・・・，ｄｏＤａｔａ［ｐ］，・・・，ｄｏＤａｔａ［ｑ］，・・・，ｄｏＤａｔａ［ｉＦｒａｍｅ２−１］が算出される。一般的には、図２のステップＳ２０７の分析の処理によってＲＡＭ１０３等に得られている周波数成分ｊ（０≦ｊ≦ｉＦｒａｍｅ２−１）毎のパワー値が、変数ｄｏＤａｔａ［ｊ］（図３）に記憶される。なお、ここでは、ｄｏＤａｔａ［０］からｄｏＤａｔａ［ｉＦｒａｍｅ２−１］に向かって周波数が高くなる（音高が高くなる）ものとする。
【００４５】
図５（ａ）は、コード区間において楽曲中でコード（和音）が演奏されている場合の周波数スペクトラムとその時間変化の特性を模式的に示す図である。この場合、演奏されているコードの構成音の音階に対応する周波数成分ｐ，ｑ等のパワー値ｄｏＤａｔａ［ｐ］，ｄｏＤａｔａ［ｑ］等の値が、それ以外の周波数成分のパワー値に比較してかなり大きな値となる傾向がある。
【００４６】
上述の傾向より、楽曲中でコード（和音）が演奏されているコード区間内の各フレームの周波数スペクトラムについてみたときに、１つのフレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いは、大きな値となる傾向がある。すなわち、ある１つのフレーム内の各周波数成分のパワー値の分散が大きくなる傾向がある。
【００４７】
さらに、コード演奏が継続すると、コード区間内の各フレームでは、上記周波数成分ｐ，ｑ等のパワー値が持続的に大きな値となる傾向がある。これはすなわち、動きが多く非和声音を含む場合も多いメロディーの音に比べて、コードの音はある程度持続される場合が多く、１つのコード区間内で変化無く持続されている音はコード構成音である可能性が高いと考えられるからである。
【００４８】
従って、上記周波数成分ｐ，ｑ等についてそれぞれ、コード区間内のフレーム０からｃｖｎ−１までの各フレームのパワー値ｄｏＤａｔａ［ｐ］，ｄｏＤａｔａ［ｑ］を累算し、累算結果をそれぞれｄｏＤａｔａＢｕｆ［ｐ］，ｄｏＤａｔａＢｕｆ［ｑ］とすれば、これらのパワー累算値（強度累算値）は、それ以外の周波数成分のパワー累算値と比較して大きな値となる傾向がある。また、コード構成音は、あるコード区間内で持続的に音が演奏される傾向が強いため、コード区間内のフレーム０からｃｖｎ−１までの各フレームのパワー値のばらつき度合いが小さな値となる傾向がある。すなわち、ある周波数のフレーム０からｃｖｎ−１までの各フレームにおけるパワー値の分散が小さくなる傾向がある。
【００４９】
一方、図５（ｂ）は、コード区間において楽曲中でコード（和音）は演奏されておらず例えば打楽器が演奏されているような場合の周波数スペクトラムとその時間変化の特性を模式的に示す図である。この場合、０からｉＦｒａｍｅ２−１までの全ての周波数成分について、同じような値のパワー値ｄｏＤａｔａ［０］〜ｄｏＤａｔａ［ｉＦｒａｍｅ２−１］が観測される傾向がある。これは、打楽器音が、１つのフレーム内でみればホワイトノイズ的な周波数特性を有することによる。
【００５０】
上述の傾向より、コードが演奏されていないコード区間内の各フレームの周波数スペクトラムについてみたときに、１つのフレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いは、小さな値となる傾向がある。このことは、仮にコードが演奏されていたとしても、それと合わせて打楽器音が鳴っていた場合には、コード音のみが演奏されているフレームと比較すれば、当該フレームにおける各周波数成分のパワー値のばらつき度合いが比較的小さくなるという同様の傾向を示す。
【００５１】
さらに、打楽器の演奏により観測される周波数成分毎のパワー値は、コード区間のような半小節程度の比較的短時間内で急速に減衰する傾向が強い。打楽器は、一般的に音のアタック後に、音の持続はせずに減衰していく傾向の楽器が多いからである。
【００５２】
そこで、本実施形態ではまず、強度値累算手段の機能として、ＣＰＵ１０１が、コード区間内の各フレーム０〜ｃｖｎ−１ごとに、周波数成分ｊ毎のパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）をそれぞれ、そのコード区間の各周波数成分ｊに対応するＲＡＭ１０３上の変数ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）（図３）にパワー累算値として累算する。
【００５３】
次に、ＣＰＵ１０１は、コード抽出手段の機能（その１）として、周波数成分毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）からオクターブ情報を取り除いた１オクターブ内の半音単位の音階毎のパワー累算値をピッチクラスパワー累算値として算出し、ＲＡＭ１０３上の変数ｐｃｐｏｗｅｒ［ｉ］（０≦ｉ≦１２）（図３）に記憶させる。そして、ＣＰＵ１０１は、１オクターブ内のルート音階とコード種別を変数ｒｏｏｔと変数ｔｙｐｅ（図３）に順次セットしながら、ルート音階ｒｏｏｔとコード種別ｔｙｐｅとで定まるコード毎に、そのコードを構成する音階に対応するピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］を加算する。ＣＰＵ１０１は、その加算結果をそのコードを構成する音階の数で正規化して、そのコードに対応するコードパワー値（コード強度値）を算出し、ＲＡＭ１０３上の変数ｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］に格納する。
【００５４】
ＣＰＵ１０１は、コード抽出手段の機能（その２）として、コードパワー値が大きい順に、そのコードパワー値に対応するコードを、現在のコード区間に対応するコードの候補として出力する。
【００５５】
上述の処理において、本実施形態では、前述したように、楽曲中の１つのコード区間でコード（和音）が演奏されている場合とそうでない場合とで、コード区間内の各フレーム内における周波数軸方向の各周波数成分のパワー値のばらつき度合いが異なる傾向があることを利用して、強度値調整手段の機能として、以下の制御が実施される。ＣＰＵ１０１は、フレームの処理毎に、そのフレーム内における周波数成分毎のパワー値の、周波数軸方向のばらつき度合い例えば分散値を計算する。ＣＰＵ１０１は、その値に応じて、周波数成分毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に累算される、現在のフレームの各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）の割合を調整する。より具体的には、ＣＰＵ１０１は、上述のばらつき度合い例えば分散値が所定の閾値（これを「第１の閾値」とする）に比較して小さいときには、そのフレームはコード演奏には寄与していないと判定する。そして、ＣＰＵ１０１は、現在のフレームの各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に１より小さい所定値（これを「第１の所定値」とする）をそれぞれ乗算し、各乗算の結果値を各周波数成分毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に累算する。このようにして、あるフレームがコード演奏に寄与していないと判定された場合には、そのフレームのパワー値に１より小さい比率を乗算して、すなわち重み付けを小さくして、累算するようにしている。
【００５６】
このようにして、本実施形態では、フレーム内における各周波数成分のパワー値の周波数軸方向のばらつき度合いに基づいて、例えば図５（ｂ）のケースのような、コード演奏には寄与していないフレームを判定することができる。そして、この判定結果に基づいて、コード抽出の基礎となる各周波数成分のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）への、現在のフレームの各周波数成分のパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）の寄与割合を下げることができる。これらの制御により、コード演奏の構成音以外の演奏要素の影響を効果的に取り除くことが可能となり、コード抽出の精度を向上させることが可能となる。
【００５７】
さらに、本実施形態では、コード区間のような半小節程度の時間内でみたときに、コードの構成音の音階に対応する周波数成分のパワー値はあまり変化しない値を維持するのに対し、打楽器音等に対応する周波数成分毎のパワー値は急速に減衰する傾向が強いことに着目して、強度累算値調整手段の機能として、以下の制御が実施される。ＣＰＵ１０１は、現在のコード区間における全てのフレームに対する累算処理が終了して、周波数成分毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を算出すると、以下の演算を実行する。すなわち、ＣＰＵ１０１は、周波数成分ｊ（０≦ｊ≦ｉＦｒａｍｅ２−１）毎に、フレーム毎の調整されたパワー値ｄｏＤａｔａ［ｊ］の、コード区間内における時間軸方向のばらつき度合い例えば分散値を算出する。ＣＰＵ１０１は、その値に応じて、周波数成分ｊにおけるパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］を調整する。より具体的には、ＣＰＵ１０１は、上述のばらつき度合い例えば分散値が所定の閾値（これを「第２の閾値」とする）に比較して大きいときには、その周波数成分ｊはそのコード区間において持続的に発音されていた音ではなく、例えば打楽器等や動きのあるメロディ等の影響を受けている音高の周波数である可能性が高いと考えられるので、コード演奏の構成音には寄与していないと判定する。そして、ＣＰＵ１０１は、周波数成分ｊのパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］に１より小さい所定値（これを「第２の所定値」とする）を乗算し、その乗算の結果値を周波数成分ｊの現在のコード区間におけるパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（調整強度累算値）として出力する。このようにして、ある周波数成分ｊが持続的に発音されていた音ではなく、例えば打楽器等や動きのあるメロディ等の影響を受けている音高の周波数である可能性が高いと判定された場合には、その周波数成分ｊのパワー値に１より小さい比率を乗算して、すなわち重み付けを小さくして、出力するようにしている。
【００５８】
このようにして、本実施形態では、周波数成分毎に、コード区間内におけるその周波数成分のパワー値の時間軸方向のばらつき度合いに基づいて、コード演奏以外の演奏に対応する音階の周波数成分を判定することができる。そして、この判定結果に基づいて、そのような周波数成分のパワー累算値を下げることができる。これらの制御により、コード演奏以外の演奏要素の影響を効果的に取り除くことが可能となり、コード抽出の精度を向上させることが可能となる。
【００５９】
上述の制御において、ボーカルやメロディー演奏などの主旋律が演奏されている場合には、ある周波数成分におけるパワー値ｄｏＤａｔａ［ｊ］が強くなって、コード区間の一部のフレーム内における各周波数成分のパワー値の周波数軸方向のばらつき度合い例えば分散値が大きくなる可能性がある。しかし、主旋律が同じ周波数で持続する場面は少ないため、その周波数成分について、コード区間内の時間軸方向でみたときに、パワー累算値を生成したフレーム毎のパワー値の時間軸方向の分散は大きくなる可能性が高い。従って、そのような場合には、主旋律の周波数成分に対応するパワー累算値を下げることにより、主旋律の演奏がコードの抽出精度に及ぼす影響も、効果的に取り除くことが可能となる。
【００６０】
ボーカルの主旋律演奏においては、ボーカルのピッチ周波数の倍音成分が存在する。しかし、本実施形態では、ピッチ抽出の基礎となるパワー累算値としては、周波数成分毎の強度累算値からオクターブ情報を取り除いた１オクターブ内の半音単位の音階毎のピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］（０≦ｉ≦１２）が用いられるため、倍音の影響を取り除くことが可能である。
【００６１】
上述の動作原理に基づく図２のステップＳ２０８のコード抽出の処理について、以下に詳細に説明する。
【００６２】
図６は、図２のステップＳ２０８のコード抽出の制御処理例を示すフローチャートである。
【００６３】
まず、初期設定処理として、ＣＰＵ１０１は、フレーム数を示す変数ｉに値「０」を、コード区間カウンタの変数ｃｖｃｎｔに値「１」を、処理対象フレームの開始時間を示す変数ｄｏＣｈｏｒｄＴｉｍｅに楽曲開始時間を示す変数ｄｏＢａｒＳｈｉｆｔの値を、それぞれセットする。また、ＣＰＵ１０１は、パワー累算値計算用の変数ｄｏＤａｔａＢｕｆ［ｊ］、ｄｏＤａｔａＢｕｆ２［ｊ］、ｄｏＤａｔａＢｕｆ３［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に、それぞれ初期値「０」をセットする（以上、ステップＳ６０１）。なお、実際には、ｊを０からｉＦｒａｍｅ２−１まで、順次インクリメント（＋１）しながら、ループ処理を行って、各要素について処理を行う。以下の説明でも同様である。
【００６４】
次に、ＣＰＵ１０１は、下記（１）式に示されるようにして、コード区間時間間隔ｄｏＢａｒＺｏｏｍにコード区間カウンタｃｖｃｎｔを乗算し、楽曲開始小節時間ｄｏＢａｒＳｈｉｆｔに加算することにより、次のコード区間の開始時刻を算出し、ＲＡＭ１０３上の変数ａにセットする（ステップＳ６０２）。
【００６５】
ａ＝ｄｏＢａｒＳｈｉｆｔ＋ｄｏＢａｒＺｏｏｍ×ｃｖｃｎｔ  ・・・（１）
【００６６】
そして、ＣＰＵ１０１は、ステップＳ６１１でフレーム数ｉを＋１ずつインクリメントしながら、ステップＳ６０３で音楽音響データの全フレーム数ｕｌＴｉｍｅｎの分のフレーム処理が終了したと判定するまで、以下の処理を繰返し実行する。なお、本実施形態では、フレーム数ｉ＝０が最初のフレームに対応するものであるとし、全フレーム数ｕｌＴｉｍｅｎの処理が終わってフレーム数ｉをインクリメントした時点で、フレーム数ｉ＝全フレーム数ｕｌＴｉｍｅｎとなってステップＳ６０３の判定がＮＯとなり、コード抽出の処理が終了する。
【００６７】
まず、ＣＰＵ１０１は、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅが、次コード区間開始時刻ａに達したか否かを判定する（ステップＳ６０４）。
【００６８】
ステップＳ６０４の判定がＮＯならば、ＣＰＵ１０１は、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅが次コード区間開始時刻ａに達するまでのコード区間内の各フレーム毎に、以下のステップＳ６０５からＳ６１１の一連の処理を実行する。
【００６９】
まず、ＣＰＵ１０１は、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅから始まるフレーム時間間隔ｄｏＴｉｍｅＵｎｉｔに対応する、周波数成分ｊ毎のパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）をＲＡＭ１０３等から読み込む（ステップＳ６０５）。このパワー値は、図２のステップＳ２０７（詳細は図４）で算出され、ＲＡＭ１０３等に保存されているものである。
【００７０】
次に、ＣＰＵ１０１は、ステップＳ６０５で読み込んだ、現在処理中のフレーム（フレームｉ）における各周波数成分ｊのパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）の、周波数軸方向の分散値を計算する（ステップＳ６０６）。具体的には、０≦ｊ≦ｉＦｒａｍｅ２−１でのパワー値ｄｏＤａｔａ［ｊ］の２乗の和の平均から、パワー値ｄｏＤａｔａ［ｊ］の平均の２乗が減算されることにより、分散値が計算される。
【００７１】
次に、ＣＰＵ１０１は、ステップＳ６０６で計算した分散値が、第１の閾値よりも小さいか否かを判定する（ステップＳ６０７）。
【００７２】
ステップＳ６０７の判定がＹＥＳならば、ＣＰＵ１０１は、そのフレームはコード演奏には寄与していないとして、現在のフレームの各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に１より小さい値の第１の所定値をそれぞれ乗算し、その乗算結果を新たなパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）として出力する（ステップＳ６０８）。
【００７３】
上述のステップＳ６０７およびＳ６０８の処理が、前述した強度値調整手段の機能を実現する。
【００７４】
ステップＳ６０７の判定がＮＯならば、ＣＰＵ１０１は、現在のフレームの各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）をそのまま出力する。
【００７５】
ＣＰＵ１０１は、強度値累算手段の機能として、下記（２）式に示されるように、ステップＳ６０７およびＳ６０８を介して出力された現在のフレームの各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を、各周波数ごとにそれぞれ、パワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に加算する。すなわち、ステップＳ６１１でフレーム数ｉを＋１ずつインクリメントしながら、各周波数ごとのパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に、現在処理中のフレーム（フレームｉ）での各周波数のパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を加算してループさせることで、時間軸方向の累算値が求められることになる。また、同様に、各パワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を、各周波数ごとにそれぞれ、パワー累算値ｄｏＤａｔａＢｕｆ２［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に累算する。さらに、各パワー値の２乗値ｄｏＤａｔａ［ｊ］×ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を、各周波数ごとにそれぞれ、パワー累算値ｄｏＤａｔａＢｕｆ３［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に累算する（以上、ステップＳ６０９）。
【００７６】
ｄｏＤａｔａＢｕｆ［ｊ］＝ｄｏＤａｔａＢｕｆ［ｊ］＋ｄｏＤａｔａ［ｊ］
ｄｏＤａｔａＢｕｆ２［ｊ］＝ｄｏＤａｔａＢｕｆ２［ｊ］＋ｄｏＤａｔａ［ｊ］
ｄｏＤａｔａＢｕｆ３［ｊ］＝ｄｏＤａｔａＢｕｆ３［ｊ］
＋ｄｏＤａｔａ［ｊ］×ｄｏＤａｔａ［ｊ］
・・・（２）
【００７７】
パワー累算値ｄｏＤａｔａＢｕｆ［ｊ］とｄｏＤａｔａＢｕｆ２［ｊ］には、同じ値が代入されるが、パワー累算値ｄｏＤａｔａＢｕｆ２［ｊ］はパワー２乗累算値ｄｏＤａｔａＢｕｆ３［ｊ］とともに、時間軸方向の分散の計算用に用いられる。なお、ｄｏＤａｔａＢｕｆ［ｊ］とｄｏＤａｔａＢｕｆ２［ｊ］は、１つの変数で共用することとしても良い。
【００７８】
その後、ＣＰＵ１０１は、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅにフレーム時間間隔ｄｏＴｉｍｅＵｎｉｔを加算して次の処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅを算出する（ステップＳ６１０）。
【００７９】
さらに、ＣＰＵ１０１は、フレーム数ｉをインクリメント（＋１）する（ステップＳ６１１）。
【００８０】
ＣＰＵ１０１は、ステップＳ６０３の判定処理に戻り、全フレーム数ｕｌＴｉｍｅｎの処理がまだ完了しておらずステップＳ６０３の判定がＹＥＳならば、さらにステップＳ６０４で、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅが次コード区間開始時刻ａに達したか否かを判定する。
【００８１】
処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅが次コード区間開始時刻ａに達しておらずステップＳ６０４の判定がＮＯならば、現在のコード区間内の次のフレームに対して、上述したステップＳ６０５からＳ６０９で、前述した強度値累算手段および強度値調整手段に対応する処理が実行される。
【００８２】
以上の動作が、処理対象フレーム開始時間ｄｏＣｈｏｒｄＴｉｍｅが次コード区間開始時刻ａに達してステップＳ６０４の判定がＹＥＳになるまで順次インクリメントされるフレーム数ｉに対応するフレーム毎に実行される。これにより、１つのコード区間全般にわたるパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］とｄｏＤａｔａＢｕｆ２［ｊ］、およびパワー２乗累算値ｄｏＤａｔａＢｕｆ３［ｊ］が算出される。
【００８３】
ステップＳ６０４の判定がＹＥＳになると、ＣＰＵ１０１は、図７のステップＳ７０１の処理に移行する。ステップＳ７０１で、ＣＰＵ１０１はまず、ＲＡＭ１０３に確保される周波数成分カウント用の変数ｊ（図３には特には図示しない）の値を「０」に初期設定する。
【００８４】
次に、ＣＰＵ１０１は、周波数成分カウンタｊについて、ステップＳ７０７で＋１ずつインクリメントしながら、ステップＳ７０２で周波数成分の数ｉＦｒａｍｅ２に達したと判定するまで、各周波数成分ｊ（０≦ｊ≦ｉＦｒａｍｅ２−１）毎に、コード区間内の時間軸方向のパワー値ｄｏＤａｔａ［ｊ］の分散を算出して判定する。
【００８５】
まず、ＣＰＵ１０１は、前述したように、コード区間時間間隔ｄｏＢａｒＺｏｏｍを１フレームの時間間隔ｄｏＴｉｍｅＵｎｉｔで除算した値として、１つのコード区間のフレーム数ｃｖｎを算出する（例えば図５（ａ）の時間軸を参照）。なお、このｃｖｎは、ステップＳ６０５からステップＳ６１１の間のループで＋１ずつインクリメントして、１つのコード区間における実際のフレーム数をカウントして用いるようにしても良い。次に、ＣＰＵ１０１は、下記（３）式に示されるように、周波数成分ｊの時間軸方向計算用のパワー累算値ｄｏＤａｔａＢｕｆ２［ｊ］をｃｖｎで除算することにより、周波数成分ｊのパワー平均値ａｖｅを算出する（以上、ステップＳ７０３）。
【００８６】
ａｖｅ＝ｄｏＤａｔａＢｕｆ２［ｊ］／ｃｖｎ    ・・・（３）
【００８７】
次に、ＣＰＵ１０１は、下記（４）式に示されるように、周波数成分ｊの時間軸方向計算用のパワー２乗累算値ｄｏＤａｔａＢｕｆ３［ｊ］をｃｖｎで除算して得られる周波数成分ｊのパワー２乗平均値「ｄｏＤａｔａＢｕｆ３［ｊ］／ｃｖｎ」から、周波数成分ｊのパワー平均値の２乗値「ａｖｅ×ａｖｅ」を減算する。これにより、ＣＰＵ１０１は、周波数成分ｊについて、コード区間内の時間軸方向のパワー値ｄｏＤａｔａ［ｊ］の分散値を算出し、ＲＡＭ１０３上の変数ｂｕｎｓａｎに記憶させる（以上、ステップＳ７０４）。
【００８８】
ｂｕｎｓａｎ＝ｄｏＤａｔａＢｕｆ３［ｊ］／ｃｖｎ−ａｖｅ×ａｖｅ  ・・（４）
【００８９】
次に、ＣＰＵ１０１は、ステップＳ７０４で計算した分散値ｂｕｎｓａｎが、第２の閾値よりも大きいか否かを判定する（ステップＳ７０５）。
【００９０】
ステップＳ７０５の判定がＹＥＳならば、ＣＰＵ１０１は、その周波数成分ｊはコード演奏の構成音には寄与していないとして、周波数成分ｊのパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］に１より小さい値の第２の所定値を乗算し、その乗算の結果値を周波数成分ｊの現在のコード区間におけるパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］として出力する（ステップＳ７０６）。
【００９１】
ステップＳ７０５の判定がＮＯならば、ＣＰＵ１０１は、周波数成分ｊのパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］をそのまま出力する。
【００９２】
上述のステップＳ７０３からＳ７０６の処理が、前述した強度累算値調整手段の機能を実現する。
【００９３】
その後、ＣＰＵ１０１は、周波数成分カウンタｊを＋１インクリメントする（ステップＳ７０７）。
【００９４】
そして、ＣＰＵ１０１は、ステップＳ７０２の判定処理に戻り、全周波数成分ｉＦｒａｍｅ２の処理がまだ完了しておらずステップＳ７０２の判定がＹＥＳならば、次の周波数成分ｊに対して、上述したステップＳ７０３からＳ７０６で、前述した強度累算値調整手段に対応する処理が実行される。
【００９５】
以上の動作が、周波数成分ｊが全周波数成分ｉＦｒａｍｅ２に達してステップＳ７０２の判定がＮＯになるまで順次インクリメントされる周波数成分ｊ毎に実行される。現在のコード区間に対応して、周波数成分全般にわたるパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］が算出される。
【００９６】
ステップＳ７０２の判定がＮＯになると、ＣＰＵ１０１は、現在のコード区間に対して出力された周波数成分ｊ毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を用いて、コード判定処理を実行する（ステップＳ７０８）。この結果、ＣＰＵ１０１は、現在のコード区間に対応するコードを判定して出力する。この処理の詳細については、後述する。
【００９７】
コード判定処理の後、ＣＰＵ１０１は、パワー累算値計算用の変数ｄｏＤａｔａＢｕｆ［ｊ］、ｄｏＤａｔａＢｕｆ２［ｊ］、ｄｏＤａｔａＢｕｆ３［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）に、それぞれ初期値「０」をセットする（以上、ステップＳ７０９）。
【００９８】
さらに、ＣＰＵ１０１は、コード区間カウンタの変数ｃｖｃｎｔを＋１インクリメントして、コード区間を１つ進める（ステップＳ７１０）。
【００９９】
ＣＰＵ１０１は、図６のステップＳ６０２の処理に戻り、コード区間時間間隔ｄｏＢａｒＺｏｏｍに新たなコード区間カウンタｃｖｃｎｔを乗算し、楽曲開始小節時間ｄｏＢａｒＳｈｉｆｔに加算することにより、１つ進んだコード区間の次のコード区間の開始時刻を算出し、ＲＡＭ１０３上の変数ａにセットする。
【０１００】
ＣＰＵ１０１は、ステップＳ６０３以降の処理を再度実行することにより、次のコード区間に対して、上述した制御処理を繰り返し実行する。
【０１０１】
図８および図９は、図７のステップＳ７０８のコード判定の制御処理例を示すフローチャートである。図８のフローチャートでは、このフローチャートの前までの処理で求められた、周波数軸方向の各周波数成分のパワー値に基づき、平均律における音階の各音ごとのパワーを決定する。そして、図９のフローチャートでは、図８で求められた音階の各音のパワーについて、オクターブを度外視した、１２音（１オクターブ分）の各音のパワーを算出する。
【０１０２】
ＣＰＵ１０１はまず、処理する音階数を決定する。例えば、ピアノ楽曲を想定すれば、処理音階数＝８８鍵である。次に、ＣＰＵ１０１は、処理音階数をさらに細かく分割した高分解能で、処理を実行することを設定する。このために、ＣＰＵ１０１は、処理音階数を何倍の分解能にするかを、ＲＡＭ１０３上の変数ｒｅｓ１００ｃｅｎｔ（図３）にセットする。例えば、８８鍵に対してその５倍の分解能が設定される場合には、ｒｅｓ１００ｃｅｎｔ＝５がセットされる。また、ＣＰＵ１０１は、処理音階数の範囲で処理を開始する要素番号と、処理の終了を判定する要素番号を、ＲＡＭ１０３上の変数ｉｓｐとｉｅｄ（図３には特には図示しない）にセットする。このｉｓｐおよびｉｅｄは、上述した、処理音階をさらに細かくした高分解能での処理を行う要素数に相当する数である。例えばｉｓｐ＝０である。また、ｉｅｄ＝処理音階数×ｒｅｓ１００ｃｅｎｔであり、例えばｉｅｄ＝８８×５＝４４０である。
【０１０３】
なお、ここでは８８音階を例として説明するが、電子楽器の演奏データの通信規格であるＭＩＤＩ（Ｍｕｓｉｃａｌ  Ｉｎｓｔｒｕｍｅｎｔ  Ｄｉｇｉｔａｌ  Ｉｎｔｅｒｆａｃｅ）との関連で、最大で１２８音階までを処理可能である。
【０１０４】
ＣＰＵ１０１は、ＲＡＭ１０３上の変数ｊを音階（要素数）カウンタとして、まず、変数ｊに初期値ｉｓｐ（例えばｉｓｐ＝０）をセットする（ステップＳ８０１）。
【０１０５】
その後、ＣＰＵ１０１は、音階（要素数）カウンタｊについて、ステップＳ８０９で＋１ずつインクリメントさせながら、ステップＳ８０２で処理の終了を判定する要素番号ｉｅｄ（例えばｉｅｄ＝４４０）に達したと判定するまで、以下のステップＳ８０３からＳ８０８までの一連の処理により、各音階要素ｊのパワー累算値（後述するパワー累算値ｄｏＤａｔａＢｕｆ［ｉｎｄｅｘ］）を半音単位の音階（後述するＭＩＤＩノート番号ｉＰｉｔｃｈ）のパワー累算値（後述するピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］）に変換する処理を実行する。
【０１０６】
まず、ＣＰＵ１０１は、ｉｓｐからｉｅｄ−１までの要素番号の間で順次インクリメントされる音階要素ｊについて、その音階要素ｊの周波数を下記（５）式により計算し、ＲＡＭ１０３の変数ｄｆｒにセットする（ステップＳ８０３）。なお、（５）式で、「＾」は、べき乗の演算子を示す。
【０１０７】
ｄｆｒ＝４４０×２＾（（ｊ／ｒｅｓ１００ｃｅｎｔ−６９＋２１）／１２）
・・・（５）
【０１０８】
上記（５）式は、例として、入力される音楽音響データの楽曲がピアノ楽曲で、音階要素ｊ＝０のときにピアノの最低音が指定される場合の計算式である。ピアノの最低音のＭＩＤＩノート番号は「２１」である。また、４４０Ｈｚの周波数のＡ４音（Ａ３音の場合もある）のＭＩＤＩノート番号は「６９」である。そして、例えばｒｅｓ１００ｃｅｎｔ＝５とすれば、上記（５）式により、音階要素ｊ＝０のときの周波数ｄｆｒは、
ｄｆｒ＝４４０×２＾（（０／５−６９＋２１）／１２）＝２７．５Ｈｚ
となって、ＭＩＤＩノート番号＝２１の音階の周波数に等しくなる。また、音階要素ｊ＝２４０のときの周波数ｄｆｒは、
ｄｆｒ＝４４０×２＾（（２４０／５−６９＋２１）／１２）＝４４０Ｈｚ
となって、ＭＩＤＩノート番号＝６９の音階の周波数に等しくなる。
【０１０９】
次に、ＣＰＵ１０１は、上述のようにして算出した音階要素ｊに対応する周波数ｄｆｒと、図２のステップＳ２０７での分析の処理におけるオーバーラップを含む１フレームのサンプル数ｉＦｒａｍｅＳｉｚｅと、入力する音楽音響データのサンプリング周波数ｆｓとから、音階要素ｊに対応するＦＦＴデータ上の周波数成分番号を下記（６）式により算出し、ＲＡＭ１０３上の変数ｉｎｄｅｘにセットする（ステップＳ８０４）。（６）式において、「ｉｎｔ（・・・）」は、括弧内の値の整数値を算出する演算関数である。
【０１１０】
ｉｎｄｅｘ＝ｉｎｔ（ｉＦｒａｍｅＳｉｚｅ×ｄｆｒ／ｆｓ）  ・・・（６）
【０１１１】
この結果、ＣＰＵ１０１は、上記ＦＦＴ上の周波数成分番号ｉｎｄｅｘに対応して前述した図７のステップＳ７０２からＳ７０７の処理によりＲＡＭ１０３に求まっているパワー累算値ｄｏＤａｔａＢｕｆ［ｉｎｄｅｘ］を、現在の音階要素ｊに対応するパワー累算値としてＲＡＭ１０３上の変数ｄ（図３には特には図示しない）に記憶させる（ステップＳ８０５）。
【０１１２】
次に、ＣＰＵ１０１は、以下のステップＳ８０６からＳ８０８の処理により、音階の分解能を「ｉｅｄ＝処理音階数×ｒｅｓ１００ｃｅｎｔ（例えば８８×５）」音階（要素数）から半音単位の処理音階数に縮退させながら、連続するｒｅｓ１００ｃｅｎｔ（例えば５）音階要素毎に、それらのパワー値の中で最も大きなパワー値を、その連続する音階から縮退される半音単位の音階のパワーとして算出する。
【０１１３】
まず、ＣＰＵ１０１は、下記（７）式により、現在の音階要素ｊに対応する半音単位に縮退された音階のＭＩＤＩ上でのノート番号を算出し、ＲＡＭ１０３上の変数ｉＰｉｔｃｈにセットする（ステップＳ８０６）。（７）式において、「ｉｎｔ（・・・）」は、括弧内の値の整数値を算出する演算関数である。
【０１１４】
ｉＰｉｔｃｈ＝ｉｎｔ（ｊ／ｒｅｓ１００ｃｅｎｔ＋２１）  ・・・（７）
【０１１５】
上記（７）式は、前述の（５）式に対応して、例として、入力される音楽音響データの楽曲がピアノ楽曲で、音階要素ｊ＝０のときにピアノの最低音（ＭＩＤＩノート番号ｉＰｉｔｃｈ＝２１）が指定される場合の計算式である。
【０１１６】
上記（７）式により算出されるＭＩＤＩノート番号ｉＰｉｔｃｈは、ステップＳ８０２からＳ８０９が連続してｒｅｓ１００ｃｅｎｔ（例えば５）回実行される間は、同じ値をとる。
【０１１７】
そこで、ＣＰＵ１０１は、その連続する回数＝ｒｅｓ１００ｃｅｎｔ回の間で繰り返し順次算出される音階要素ｊに対応するパワー累算値ｄ（ステップＳ８０５）を、ＭＩＤＩノート番号ｉＰｉｔｃｈに対応するパワー累算値（以下、これを「ピッチパワー累算値」と呼ぶ）を格納するＲＡＭ１０３上の変数ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］（図３）の値と順次比較する（ステップＳ８０７）。
【０１１８】
そして、ＣＰＵ１０１は、音階要素ｊに対応するパワー累算値ｄがその音階要素ｊから縮退されるＭＩＤＩノート番号ｉＰｉｔｃｈのピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］よりも大きければ、ピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］の値を音階要素ｊに対応するパワー累算値ｄの値で置き換える（ステップＳ８０７の判定がＹＥＳ→Ｓ８０８）。
【０１１９】
ＣＰＵ１０１は、音階要素ｊに対応するパワー累算値ｄがその音階要素ｊから縮退されるＭＩＤＩノート番号ｉＰｉｔｃｈのピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］よりも大きくなければ、ピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］の値は置き換えない（ステップＳ８０７の判定がＮＯ）。
【０１２０】
その後、ＣＰＵ１０１は、音階要素ｊの値を＋１インクリメントし（ステップＳ８０９）、ステップＳ８０２の判定処理に戻る。
【０１２１】
ＣＰＵ１０１は、音階要素ｊが０からｉｅｄ−１までの間、ステップＳ８０２でＹＥＳと判定して、音階要素ｊをインクリメントしながら上述したステップＳ８０３からＳ８０８の一連の処理を繰り返し実行する。
【０１２２】
以上のようにして、本実施形態では、ｉｅｄ＝処理音階数×ｒｅｓ１００ｃｅｎｔ（例えば８８×５）音階の高解像度の各音階要素ｊのパワー累算値ｄｏＤａｔａＢｕｆ［ｉｎｄｅｘ］から、半音単位のＭＩＤＩノート番号ｉＰｉｔｃｈ毎のピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］を算出し、ＲＡＭ１０３に記憶させることができる。
【０１２３】
ＣＰＵ１０１は、音階要素ｊが処理の終了を判定する要素番号ｉｅｄになってステップＳ８８０２の判定がＮＯになると、図９のステップＳ９０１の処理に進む。
【０１２４】
ＣＰＵ１０１は、ＲＡＭ１０３上の変数ｊを半音単位のＭＩＤＩノート番号をカウントする変数として、まずＭＩＤＩノート番号ｊを最低音の値「０」にセットする（ステップＳ９０１）。
【０１２５】
その後、ＣＰＵ１０１は、ＭＩＤＩノート番号ｊについて、ステップＳ９０４でその値を＋１ずつインクリメントしながら、ステップＳ９０２でＭＩＤＩで指定可能な最高音の値「１２７」を超えた（「１２８」になった）と判定するまで、次の処理を実行する。
【０１２６】
ＣＰＵ１０１は、下記（８）式に示されるように、ＭＩＤＩノート番号ｊに対応するピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｊ］を、ＭＩＤＩノート番号ｊを１２で除算した剰余値「ｊ  ｍｏｄ  １２」に対応するノート番号のパワー累算値（以下、これを「ピッチクラスパワー累算値」と呼ぶ）に足し込み、ＲＡＭ１０３上の変数ｐｃｐｏｗｅｒ［ｊ  ｍｏｄ  １２］に記憶させる。なお、ピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｊ］は、図８のステップＳ８０１からＳ８０９によって算出され、ＲＡＭ１０３に記憶されているものである。ただし、ｉｅｄ／ｒｅｓ１００ｃｅｎｔ＜１２７の場合には、ピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｉｅｄ／ｒｅｓ１００ｃｅｎｔ＋１］からｐｉｔｃｈｐｏｗｅｒ［１２７］までの値は「０」とする。同様に、０＜ｉｓｐ／ｒｅｓ１００ｃｅｎｔの場合には、ピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［０］からｐｉｔｃｈｐｏｗｅｒ［ｉｓｐ／ｒｅｓ１００ｃｅｎｔ−１］までの値は「０」とする。
【０１２７】
ｐｃｐｏｗｅｒ［ｊ  ｍｏｄ  １２］＝ｐｃｐｏｗｅｒ［ｊ  ｍｏｄ  １２］
＋ｐｉｔｃｈｐｏｗｅｒ［ｊ］
・・・（８）
【０１２８】
ここで、ｉ＝ｊ  ｍｏｄ  １２  とすれば、０≦ｉ≦１２となる。従って、ステップＳ９０２からＳ９０４の繰り返し処理によって、０から１２７までの各ＭＩＤＩノート番号ｊのピッチパワー累算値ｐｉｔｃｈｐｏｗｅｒ［ｊ］から、オクターブ情報を取り除いた１オクターブ＝１２音階中の半音単位の各音階ｉのピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］（０≦ｉ≦１２）を算出することができる。
【０１２９】
ＣＰＵ１０１は、ＭＩＤＩノート番号ｊがＭＩＤＩで指定可能な最高音の値「１２７」を超えてステップＳ９０２の判定がＮＯとなると、ステップＳ９０５のコードパワーの算出の制御処理とステップＳ９０６のランキングの制御処理を実行する。
【０１３０】
図１０は、コードパワーの算出の制御処理例を示すフローチャートである。図１０では、図９で求められた、１オクターブ分の音階（１２音）の各音のパワーに基づき、ルート音とコード種別を変えながら、各ルート音の各コード種別について、その構成音となっている音のパワーがどのくらい強いかを算出する。
【０１３１】
ＣＰＵ１０１は、コードのルート音を指定するＲＡＭ１０３上の変数ｒｏｏｔについて、ステップＳ１００１で１オクターブの１２音中の最低音階の値「０」を初期設定した後、ステップＳ１０１３で＋１ずつインクリメントしながら、ステップＳ１００２で値「１２」より小さいと判定する間、以下のステップＳ１００３からＳ１０１２までの一連の処理を、各ルート音階ｒｏｏｔ毎に繰り返し実行する。
【０１３２】
この一連の処理の中で、ＣＰＵ１０１は、コード種別ｔｙｐｅを指定するＲＡＭ１０３上の変数ｔｙｐｅについて、ステップＳ１００３で最初のコード種別を示す値「０」を初期設定した後、ステップＳ１０１２で＋１ずつインクリメントしながら、ステップＳ１００４でＲＡＭ１０３上の変数ｃｔｙｐｅｎに格納されたコード種別の数より小さいと判定する間、以下のステップＳ１００５からＳ１０１１までの一連の処理を、各コード種別ｔｙｐｅ毎に繰り返し実行する。
【０１３３】
この一連の処理の中で、ＣＰＵ１０１は、ステップＳ１００５でルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードパワー値を示すＲＡＭ１０３上の変数ｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］の値を「０」に初期設定する（ステップＳ１００５）。その後、ＣＰＵ１０１は、１オクターブ中の音階を指定するＲＡＭ１０３上の変数ｉについて、ステップＳ１００６で最低音の音階を示す値「０」を初期設定した後、ステップＳ１０１０で＋１ずつインクリメントしながら、ステップＳ１００７で１オクターブ中の最高音の値「１２」より小さいと判定する間、以下のステップＳ１００８とＳ１００９の処理を、各音階ｉ毎に繰り返し実行する。
【０１３４】
以上の３重の繰返し処理により、各ルート音階ｒｏｏｔと各コード種別ｔｙｐｅとで決まるコードに対して、１オクターブ中の各音階毎に、以下のステップＳ１００８とＳ１００９の処理が繰り返し実行されることになる。
【０１３５】
図１１は、図１０のフローチャートで参照される図１のＲＯＭ１０２または外部記憶装置１０８等に記憶されるコード構成音テーブルのデータ構成例を示す図である。このテーブルは、ルート音階ｒｏｏｔ＝０である場合の、コード種別の値１１０１毎の、コード種別の名称１１０２と、コード構成音の音階番号１１０３を記憶したデータである。ＣＰＵ１０１は、このテーブル内容を、コード構成音を格納するＲＡＭ１０３上の変数ｃｔｙｐｅ［ｔｙｐｅ］［ｉ］（０≦ｉ＜１２）（図３）にセットする。また、ＣＰＵ１０１は、コード種別の値１１０１＝ｔｙｐｅ毎のコード構成音の数（図１１のテーブル上の該当行上で値「１」が設定されている数）を、ＲＡＭ１０３上の変数ｃｔｙｐｅｎｎ［ｔｙｐｅ］（図３）にセットする。
【０１３６】
例えば、コード種別の値１１０１＝０（コード種別の名称１１０２＝「ｍａｊ」）に対応するコード構成音配列ｃｔｙｐｅ［０］［ｉ］（０≦ｉ＜１２）としては、図１１より、音階番号ｉ＝０，４，７がコード構成音である。このコード種別「ｍａｊ」は、メジャーコードであり、例えば、ルート音ｒｏｏｔがＣ（ド）を表す値となった場合は、Ｃメジャーコードを表す。従って、ｃｔｙｐｅ［０］［０］とｃｔｙｐｅ［０］［４］と１ｃｔｙｐｅ［０］［７］に、それぞれ値「１」がセットされる。また、ｃｔｙｐｅ［０］［１］とｃｔｙｐｅ［０］［２］とｃｔｙｐｅ［０］［３］とｃｔｙｐｅ［０］［５］とｃｔｙｐｅ［０］［６］とｃｔｙｐｅ［０］［８］とｃｔｙｐｅ［０］［９］とｃｔｙｐｅ［０］［１０］とｃｔｙｐｅ［０］［１１］には、それぞれ値「０」がセットされる。コード構成音数は、ｃｔｙｐｅｎｎ［０］＝３である。他のコード種別の値＝ｔｙｐｅについても、図１１のコード構成音の設定内容に従って、同様にコード構成音配列ｃｔｙｐｅ［ｔｙｐｅ］［ｉ］（０≦ｉ＜１２）とコード構成音数ｃｔｙｐｅｎｎ［ｔｙｐｅ］への設定が行われる。
【０１３７】
ルート音階ｒｏｏｔが値「０」ではない値＝ｒｏｏｔである場合には、ｃｔｙｐｅ［ｔｙｐｅ］［ｉ］の代わりに、ｃｔｙｐｅ［ｔｙｐｅ］［（ｉ―ｒｏｏｔ＋１２）  ｍｏｄ  １２］としてアクセスすれば、ルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対するコード構成音を得ることができる。ここで、「（ｉ―ｒｏｏｔ＋１２）  ｍｏｄ  １２」は、値（ｉ―ｒｏｏｔ＋１２）を１２で除算した剰余値を表す。
【０１３８】
図１０のステップＳ１００８において、ＣＰＵ１０１は、現在選択している音階番号ｉが現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅで決まるコードのコード構成音であるか否か、すなわち、コード構成音ｃｔｙｐｅ［ｔｙｐｅ］［（ｉ―ｒｏｏｔ＋１２）  ｍｏｄ  １２］＝１であるか否かを判定する。
【０１３９】
ＣＰＵ１０１は、ステップＳ１００８の判定がＹＥＳならば、現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］に、現在選択している音階ｉに対応するピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］を累算する（ステップＳ１００９）。すなわち、現在選択している音階ｉが現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードの構成音である場合には、その音階ｉに対して現在のコード区間で抽出されたパワー累算値が、そのコードに対して累算されることになる。
【０１４０】
ＣＰＵ１０１は、ステップＳ１００８の判定がＮＯならば、現在選択している音階ｉのピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］は無視する。
【０１４１】
ＣＰＵ１０１は、現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードに対して、１オクターブ内の全ての音階ｉのピッチクラスパワー累算値ｐｃｐｏｗｅｒ［ｉ］（０≦ｉ＜１２）のアサインが終了しステップＳ１００７の判定がＮＯになったら、ステップＳ１０１１で、現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードに対応するコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］の値を、そのコードに対応するコード構成音数ｃｔｙｐｅｎｎ［ｔｙｐｅ］で除算して新たにコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］の値とする。コード構成音数ｃｔｙｐｅｎｎ［ｔｙｐｅ］は、コードの種別により異なるから、この処理により、コードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］の値がコード構成音数で正規化される。
【０１４２】
以上のようにして、全てのルート音階ｒｏｏｔとコード種別ｔｙｐｅの組合せで決まるコード毎に、コードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］が算出されると、ステップＳ１００２の判定がＮＯとなって、ＣＰＵ１０１は、図９のステップＳ９０５のコードパワーの算出の制御処理を終了する。
【０１４３】
図１２は、図９のステップＳ９０６のランキングの制御処理例を示すフローチャートである。この制御処理では、ＣＰＵ１０１は、１位から５位までのコードパワー値の高い順にランキングを行って、現在のコード区間に対応するコードの候補を出力する。
【０１４４】
ＣＰＵ１０１はまず、コード種別ｔｙｐｅおよびルート音階ｒｏｏｔの全ての組合せ（０≦ｔｙｐｅ＜ｃｔｙｐｅｎ，０≦ｒｏｏｔ＜１２）に対して、ランクが付けられているか否かを示すＲＡＭ１０３上の配列変数ｃｈｏｒｄＬｉｋｅｌｉｈｏｏｄ［ｔｙｐｅ］［ｒｏｏｔ］に、ランクがまだ付けられていないことを示す値「−１」をセットする（ステップＳ１２０１）。
【０１４５】
その後、ＣＰＵ１０１は、現在出力を行うランクを指定するＲＡＭ１０３上の変数ｉｉについて、ステップＳ１２０２で第１位のランクの値「０」を初期設定した後、ステップＳ１２１４で＋１ずつインクリメントしながら、ステップＳ１２０３で値「５」より小さいと判定する間、以下のステップＳ１２０４からＳ１０１３までの一連の処理を、各ランクｉｉ（０≦ｉｉ＜５）毎に繰り返し実行する。
【０１４６】
この一連の処理の中で、ＣＰＵ１０１は、まず、ステップＳ１２０４で、最大パワーを示すＲＡＭ１０３上の変数ｍａｘに値「０．０」をセットし、最大パワーコード種別および最大パワールート音階をそれぞれ示すＲＡＭ１０３上の変数ｔｙｐｅｍａｘおよびｒｏｏｔｍａｘ（図３には特には図示しない）にともに無効値「−１」をセットする。その後、ＣＰＵ１０１は、コードのルート音を指定するＲＡＭ１０３上の変数ｒｏｏｔについて、ステップＳ１２０５で１オクターブの１２音中の最低音階の値「０」を初期設定した後、ステップＳ１２１２で＋１ずつインクリメントしながら、ステップＳ１２０６で値「１２」より小さいと判定する間、以下のステップＳ１２０７からＳ１２０８までの一連の処理を、各ルート音階ｒｏｏｔ毎に繰り返し実行する。
【０１４７】
この一連の処理の中で、ＣＰＵ１０１は、コード種別ｔｙｐｅを指定するＲＡＭ１０３上の変数ｔｙｐｅについて、ステップＳ１２０７で最初のコード種別を示す値「０」を初期設定した後、ステップＳ１２１１で＋１ずつインクリメントしながら、ステップＳ１２０８でＲＡＭ１０３上の変数ｃｔｙｐｅｎに格納されたコード種別の数（図１０のステップＳ１００４で設定されている）より小さいと判定する間、以下のステップＳ１２０９とＳ１２１０の処理を、各コード種別ｔｙｐｅ毎に繰り返し実行する。
【０１４８】
以上の３重の繰返し処理により、１位から５位のランク毎に、以下のステップＳ１２０９とＳ１２１０の処理により、各ルート音階ｒｏｏｔ（０≦ｒｏｏｔ＜１２）と各コード種別ｔｙｐｅ（０≦ｔｙｐｅ＜ｃｔｙｐｅｎ）とで決まるコードの組合せの中で、ランク付けがまだされていないコードのうちコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］が最も大きなコードが、そのランクのコードとして抽出される。
【０１４９】
すなわちまず、ＣＰＵ１０１は、現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応して、図９のコードパワーの算出の制御処理によりＲＡＭ１０３に記憶してあるコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］が最大パワーｍａｘ以上であって、かつランク付け有無指示配列ｃｈｏｒｄＬｉｋｅｌｉｈｏｏｄ［ｔｙｐｅ］［ｒｏｏｔ］の値が「−１」（ランク付けがまだされていない）か否かを判定する（ステップＳ１２０９）。
【０１５０】
ＣＰＵ１０１は、ステップＳ１２０９の判定がＹＥＳならば、最大パワーｍａｘに現在選択しているルート音階ｒｏｏｔおよびコード種別ｔｙｐｅに対応するコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］をセットする。また、ＣＰＵ１０１は、最大パワーコード種別ｔｙｐｅｍａｘに現在選択しているコード種別ｔｙｐｅをセットし、最大パワールート音階ｒｏｏｔｍａｘに現在選択しているルート音階ｒｏｏｔをセットする（以上、ステップＳ１２１０）。
【０１５１】
ＣＰＵ１０１は、ステップＳ１２０９の判定がＮＯならば、ステップＳ１２１０の処理をスキップする。
【０１５２】
ＣＰＵ１０１は、ステップＳ１２０６の判定がＮＯとなった時点で、現在選択しているランクｉｉにおいて、ルート音階ｒｏｏｔとコード種別ｔｙｐｅの全ての組合せの中で、ランク付けがまだされていないコードのうちコードパワーｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］が最大となるルート音階ｒｏｏｔとコード種別ｔｙｐｅを、最大パワールート音階ｒｏｏｔｍａｘおよび最大パワーコード種別ｔｙｐｅｍａｘとして算出することができる。
【０１５３】
このとき、ＣＰＵ１０１は、最大パワールート音階ｒｏｏｔｍａｘおよび最大パワーコード種別ｔｙｐｅｍａｘに対応するランク付け有無指示配列ｃｈｏｒｄＬｉｋｅｌｉｈｏｏｄ［ｔｙｐｅｍａｘ］［ｒｏｏｔｍａｘ］に現在のランクｉｉが付与されたことを示す値ｉｉをセットする。また、ＣＰＵ１０１は、コード区間カウンタｃｖｃｎｔが示す現在のコード区間に対応し、現在のランクｉｉに対応して、最大パワールート音階を格納するＲＡＭ１０３上の変数ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［０］（図３）に、最大パワールート音階ｒｏｏｔｍａｘの値をセットする。さらに、ＣＰＵ１０１は、コード区間カウンタｃｖｃｎｔが示す現在のコード区間に対応し、現在のランクｉｉに対応して、最大パワーコード種別を格納するＲＡＭ１０３上の変数ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［１］（図３）に、最大パワーコード種別ｔｙｐｅｍａｘの値をセットする（以上、ステップＳ１２１３）。
【０１５４】
その後、ＣＰＵ１０１は、現在のランクｉｉを＋１インクリメントし、ステップＳ１２０３に戻って、次の新たなランクｉｉに対する最大パワールート音階ｒｏｏｔｍａｘと最大パワーコード種別ｔｙｐｅｍａｘの検出を行う。
【０１５５】
現在のコード区間に対して、すべてのランクｉｉ（０≦ｉｉ＜５）に対するコード抽出処理が終了し、ステップＳ１２０３の判定がＮＯとなると、ＣＰＵ１０１は、図１２のフローチャートで示される図９のステップＳ９０６のランキングの算出の制御処理を終了し、図８のフローチャートで示される図７のステップＳ７０８のコード判定処理を終了する。
【０１５６】
ＣＰＵ１０１は、上述のコード判定処理を含む図６のコード抽出処理を、音楽音響データ中の例えば半小節単位の各コード区間カウンタｃｖｃｎｔが示すコード区間毎に実行することにより、各コード区間で演奏されている可能性の高いコード（ルート音階とコード種別）を、１位から５位までランク付けして、ＲＡＭ１０３上の変数ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［０］およびｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［１］（０≦ｉｉ＜５）として得ることができる。
【０１５７】
図１３は、本実施形態によるコード抽出の動作事例を示す図である。図１３（ａ）は、入力される音楽音響データに対して図２のステップＳ２０７で分析の処理を行った結果得られる、コード区間ｄｏＢａｒＺｏｏｍ毎の誌面上方向に伸びる周波数軸上の周波数成分ｊ毎のパワー値ｄｏＤａｔａ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）を表示したものである。これに対して、図１３（ｂ）は、本実施形態によって得られるコード区間ｄｏＢａｒＺｏｏｍ毎の誌面上方向に伸びる周波数軸上の周波数成分ｊ毎のパワー累算値ｄｏＤａｔａＢｕｆ［ｊ］（０≦ｊ≦ｉＦｒａｍｅ２−１）と、それから抽出されるコードを１位から３位までランク付けして表示した例を示す図である。なお、図１３（ａ）と（ｂ）では、それぞれ上方が高音、下方が低音を表している。
【０１５８】
実際には、ＣＰＵ１０１は、図２のステップＳ２０９の表示の処理において、ＲＡＭ１０３上の変数ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［０］およびｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［１］に記憶されているコード区間ｃｖｃｎｔ毎のルート音階およびコード種別を、図１の表示部１０５に、例えば図１３（ｂ）の上部の表示例のようにランク付けして表示する。これにより、ユーザは、選択した楽曲のコード進行を知ることが可能となる。
【０１５９】
以上説明したように、本実施形態では、音響信号から、コード演奏音以外の音の影響を効果的に取り除いて、精度の高いコード抽出を実現することが可能となる。
【０１６０】
以上の実施形態において、周波数成分毎の強度値および強度累算値を示すデータとして、パワー値およびそのパワー累算値を用いたが、振幅値およびその振幅累積値などが用いられてもよい。
【０１６１】
また、上記実施例中の図８におけるコード判定処理において、ステップＳ８０３、Ｓ８０４で、処理音階数をさらに細かく分割した高分解能で、処理を実行する一例を示しているが、他の方法により高分解能な処理を実現したり、高精度でのコード分析を可能とする処理を行っても良い。例えば、処理音階数＝８８鍵の各処理音階の音ごとに、いくつの周波数成分を割り当てるかを設定して、各音階ごとに、この設定された数の周波数成分の値を用いてコード分析処理を行うようにしても良い。例えば、各処理音階の音ごとに５個の周波数成分を用いることと設定された場合、８８鍵の各音階について、それぞれ、その音階を代表する中心周波数に相当するｄｏＤａｔａの要素と、その隣接する上下の周波数２つずつ、計５つの周波数に相当するｄｏＤａｔａの要素のデータ値を、当該音階のパワーとして用いることとして、以下同様に、各音階の音のパワー値を計算し、その結果の値に基づいてコード判別を行うようにしても良い。
【０１６２】
また、上記の説明では、音数について、ＭＩＤＩの１２８音に基づいて説明しているが、これに限らず、さらに新しい規格に依拠してより多いもしくは少ない音数で実施する事も可能である。また、微分音や、平均律以外の調律やスケールに基づいた周波数でのパワーを分析することとしても良い。
以上の実施形態に関して、更に以下の付記を開示する。
【０１６３】
（付記１）
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出する周波数解析手段と、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整する強度値調整手段と、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記強度値調整手段によって調整された前記強度値を累算して、前記周波数成分毎の強度累算値を算出する強度値累算手段と、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とする強度累算値調整手段と、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出するコード抽出手段と、
を備えることを特徴とするコード抽出装置。
（付記２）
前記コード抽出手段は、
前記周波数成分毎の調整強度累算値から半音単位の音階毎の調整強度累算値を算出し、
ルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出し、
該コード強度値が大きい順に、該コード強度値に対応するコードを、前記第２所定期間に対応するコードの候補として出力する、
ことを特徴とする付記１に記載のコード抽出装置。
（付記３）
前記コード抽出手段は、前記周波数成分毎の調整強度累算値からオクターブ情報を取り除いた１オクターブ内の半音単位の音階毎の調整強度累算値を算出し、１オクターブ内のルート音とコード種別とで定まるコード毎に、該コードを構成する音階に対応する前記調整強度累算値を加算し該コードを構成する音階の数で正規化して該コードに対応するコード強度値を算出する、
ことを特徴とする付記１または２に記載のコード抽出装置。
（付記４）
前記強度値調整手段は、ある前記第１所定期間における前記周波数軸方向のばらつき度合いが第１の閾値に比較して小さい場合に、当該第１所定期間における前記周波数成分毎の強度値に１よりも小さい第１の所定値をそれぞれ乗算して調整する、
ことを特徴とする付記１ないし３のいずれかに記載のコード抽出装置。
（付記５）
前記強度累算値調整手段は、ある前記周波数成分に対する、前記時間軸方向のばらつき度合いが第２の閾値に比較して大きい場合に、該周波数成分の強度累算値に１よりも小さい第２の所定値を乗算し、該乗算の結果値を該周波数成分の前記第２所定期間における調整強度累算値として出力する、
ことを特徴とする付記１ないし４のいずれかに記載のコード抽出装置。
（付記６）
前記第２所定期間は前記音響信号に対応する楽曲の半小節に対応する期間である、
ことを特徴とする付記１ないし５のいずれかに記載のコード抽出装置。
（付記７）
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出し、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整し、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出し、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とし、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出する、
ことを特徴とするコード抽出方法。
（付記８）
入力する音響信号に対して第１所定期間毎に周波数解析を行って複数の周波数成分毎の強度値を算出するステップと、
前記第１所定期間毎に、前記周波数解析によって得られる前記周波数成分毎の強度値の周波数軸方向のばらつき度合いを算出し、該周波数軸方向のばらつき度合いに応じて、前記第１所定期間における前記周波数成分毎の強度値を調整するステップと、
前記周波数成分毎に、前記第１所定期間よりも長い第２所定期間内で、前記調整された強度値を累算して、前記周波数成分毎の強度累算値を算出するステップと、
前記周波数成分毎に、前記第１所定期間毎の前記調整された強度値の、前記第２所定期間内における時間軸方向のばらつき度合いを算出し、前記強度累算値を該時間軸方向のばらつき度合いに応じた割合で調整して調整強度累算値とするステップと、
前記第２所定期間毎に、前記周波数成分毎の調整強度累算値に基づいて、前記音響信号から該第２所定期間内で発音されたコードを抽出するステップと、
をコンピュータに実行させることを特徴とするコード抽出プログラム。
【符号の説明】
【０１６４】
１０１  ＣＰＵ
１０２  ＲＯＭ
１０３  ＲＡＭ
１０４  入力部
１０５  表示部
１０６  音響出力部
１０７  音響入力部
１０８  外部記憶装置
１０９  バス
ｄｏＤａｔａ［ｊ］  パワー値
ｄｏＤａｔａＢｕｆ［ｊ］、ｄｏＤａｔａＢｕｆ２［ｊ］  パワー累算値
ｄｏＤａｔａＢｕｆ３［ｊ］  パワー２乗累算値
ｉＦｒａｍｅＳｉｚｅ  １フレームのサイズ
ｉＦｒａｍｅ２  １フレームのサイズ÷２
ｕｌＴｉｍｅｎ  全フレーム数
ｃｖｃｎｔ  コード区間カウンタ
ｃｖｎ  １つのコード区間のフレーム数
ｆｓ  サンプリング周波数
ｄｏＢａｒＳｈｉｆｔ  楽曲開始時間
ｄｏＢａｒＺｏｏｍ  コード区間時間間隔
ｄｏＣｈｏｒｄＴｉｍｅ  処理対象フレーム開始時間
ｄｏＴｉｍｅＵｎｉｔ  フレーム時間間隔
ａｖｅ  平均
ｂｕｎｓａｎ  分散
ｄｆｒ  処理対象の周波数
ｉｎｄｅｘ  分析結果（ＦＦＴ結果）配列のインデックス
ｄ  周波数ｄｆｒのパワー累算値
ｉＰｉｔｃｈ  ＭＩＤＩノート番号
ｒｅｓ１００ｃｅｎｔ  倍率データ
ｐｉｔｃｈｐｏｗｅｒ［ｉＰｉｔｃｈ］  ピッチパワー累算値
ｐｃｐｏｗｅｒ［ｉ］  ピッチクラスパワー累算値
ｒｏｏｔ  ルート音階
ｔｙｐｅ  コード種別
ｃｔｙｐｅｎ  コード種別の数
ｃｔｙｐｅ［ｔｙｐｅ］［ｉ］  コード構成音配列
ｃｔｙｐｅｎｎ［ｔｙｐｅ］  コードｔｙｐｅの構成音数
ｃｈｏｒｄｐｏｗｅｒ［ｔｙｐｅ］［ｒｏｏｔ］  コードパワー
ｃｈｏｒｄＬｉｋｅｌｉｈｏｏｄ［ｔｙｐｅ］［ｒｏｏｔ］  ランク付け有無指示配列
ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［０］  最大パワールート音階格納配列
ｃｈｏｒｄ［ｃｖｃｎｔ］［ｉｉ］［１］  最大パワーコード種別格納配列
【図１】
2015040964.tif 000003
【図２】
2015040964.tif 000004
【図３】
2015040964.tif 000005
【図４】
2015040964.tif 000006
【図６】
2015040964.tif 000007
【図７】
2015040964.tif 000008
【図８】
2015040964.tif 000009
【図９】
2015040964.tif 000010
【図１０】
2015040964.tif 000011
【図１２】
2015040964.tif 000012
【図５】
2015040964.tif 000013
【図１１】
2015040964.tif 000014
【図１３】
2015040964.tif 000015