しかし、該特許文献1に示す構成では、上記倍音を除去する作業は、楽器の種類による倍音構造の違い、打鍵強さによる倍音の出方の違い、時間による倍音のパワー変化、同じ周波数を倍音成分として持つ音同士の位相干渉の問題などから非常に困難であることが知られている。即ち、この音符情報を検出するという工程が、多くの楽器や歌唱などが混じった一般の音楽CDなどの音源で必ずしも正しく機能するとは考えられない。
他方、音楽音響信号からコードを検出する上記特許文献2に示す構成では、各音階音のレベルをオクターブ内で同じ音階関係にあるもの同士、つまり12の音名毎に積算してしまっているので、同じ構成音からなる複数の和音、例えばラ、ド、ミ、ソからなるAm7とド、ミ、ソ、ラからなるC6という2つのコードを判別することができない。
また、この特許文献2の和音検出装置には、テンポや小節の検出機能はなく、和音検出は所定のタイミング毎に行うとなっている。つまり、あらかじめ曲のテンポを設定してそのテンポで発音するメトロノームに合わせて演奏するようなケースを想定しており、音楽CD等のような演奏後の音響信号に適用した場合、一定時間間隔毎のコード名は検出できるが、テンポや小節を検出していないので、コード譜またはリードシートと呼ばれているような各小節のコード名が書かれた楽譜のような形式に出力することはできない。
仮に曲のテンポを与えたとしても、一般的に音楽CDに収録されている演奏のテンポは一定ではなく多少揺らぐため、正しく小節毎のコードを検出することはできない。
また、一定のテンポで発音されるメトロノームなどに合わせて正確なテンポで演奏することは初心者の演奏者にとっては非常に困難であり、一般的には演奏のテンポは揺らいでしまうのが通常である。
さらに、特許文献2の構成では、入力される音響信号に対して、異なる特性のディジタルフィルタリング処理を時分割で行う構成が採用されているが、この構成の採用理由として、FFT演算では低域で周波数分解が悪いことをあげている。しかし、入力音響信号をダウンサンプリングしてFFTを行うことで低域でもある程度の周波数分解能を得ることは可能であるし、ディジタルフィルタリング処理では、フィルタ出力信号のレベルを求めるためにエンベロープ抽出部が必要になってしまうのに対し、FFTでは、FFT後のパワーそのものが各周波数でのレベルを表しているためそのようなものは必要なく、FFTポイント数とシフト量のパラメータを適宜選ぶことで周波数分解能や時間分解能を自由に設定できるメリットもある。
仮に和音が検出できたとしても、検出された和音中に、7th、9thなどの音程があると、実際には、3和音で良いのに、4和音のコードとして検出される可能性がある。また特徴的な音程の強度が比較的小さく、所望のコードが候補に入らないこともある。従って自動採譜ができるようになったとしても、採譜された結果にある程度ユーザ側で自由な設定ができる必要がある。
特別な音楽的知識を有する専門家でなくても、音楽CD等の複数の楽器音の混ざり、しかも演奏テンポに揺らぎのある音楽音響信号(オーディオ信号)から、個々の音符情報を検出することなしに、全体の響きから、コード名(和音名)を検出することができるコード名検出装置を提供すると共に、その結果においてユーザ側で自由に採譜結果に手を加えることができるようにする構成が望まれる。
また、そのような構成が提供された場合でも、実際には、検出したコードの演奏音と元の音響信号を同時に聴き比べ、検出されたコードやベース音が合っているかどうかを確認する必要がある。仮に上記の様なコード検出装置が提供されたとしても、音響信号と検出されたコード演奏を別々に聴き比べるか、せいぜい同時に鳴らしたとしても、音響信号とコード演奏の夫々の音量は別個に調整され、検出されたベース音やコードが正しいものか判別するのに、その音量調整にさえも手間を割いてしまい、簡単に聴き比べを行うことが困難であった。
本発明は、以上のような問題に鑑み創案されたもので、コード検出を行いながらも、音響信号と検出されたコード演奏との聴き比べのために、1回の操作で両方の音量が調整できる構成を提案し、併せて、これらの構成をコンピュータ上に実現できるコンピュータ・プログラムについても、提供する。
そのため本発明に係るコード名検出装置の構成は、
音響信号を入力する入力手段と、
入力された音響信号から、所定の時間間隔で、ビート検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求める第1の音階音レベル検出手段と、
この所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して、所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート間隔と各ビートの位置を検出するビート検出手段と、
このビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す値を求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置を検出する小節検出手段と、
上記入力された音響信号から、先のビート検出の時とは異なる別の所定の時間間隔で、コード検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求める第2の音階音レベル検出手段と、
検出した各音階音のレベルのうち、各小節内における低域側の音階音のレベルからベース音を検出するベース音検出手段と、
検出したベース音と各音階音のレベルから各小節のコード名を決定するコード名決定手段と、
検出した全てのコード毎に、コード位置、ベース検出期間におけるベースの検出音域の音階音のレベルより求められる(ベース検出期間におけるベース検出音域の各音階音のレベルの平均的なレベルを計算することによって求められる)ベース域音階音強度、ベース音、コード検出期間におけるコードの検出音域の音階音のレベルより求められる(コード検出期間における各音階音の平均的なレベルを計算することによって求められる)コード音階音強度、コード構成音、コード構成音数、コード名を記憶するコード情報記憶手段と、
上記コード名決定手段で決定されたコード名乃至コード構成音、及び/又はベース音を表示する表示手段と、
入力音響信号及び決定された上記コードを演奏する演奏手段と、
該演奏手段の両出力の音量バランスを調整する調整手段と、
上記コード名乃至コード構成音を変更する変更手段と、
上記変更手段によるコード名乃至コード構成音の変更に基づき、コード情報記憶手段に記憶されたコード音階音強度及びコード構成音を参照して、コード構成音、コード構成音数、コード名を、コード名決定手段に変更させ、その変更情報を上記コード情報記憶手段に再記憶させると共に、少なくとも表示手段にコード名乃至コード構成音を再表示させる再設定手段と
を有することを基本的特徴としている。
上記構成によれば、入力手段に入力された音響信号から所定の時間毎の各音階音のレベルを音階音レベル検出手段によって求め、上記ビート検出手段によって、この所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、同じくビート検出手段により、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート(拍)間隔(つまりテンポ)と各ビートの位置を検出し、次に上記小節検出手段により、このビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す上記値求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置(1拍目の位置)を検出することになる。
すなわち、入力された音響信号から所定の時間毎の各音階音のレベルを求め、この所定の時間毎の各音階音のレベルの変化から平均的なビート(拍)間隔(つまりテンポ)と各ビートの位置を検出し、次にこのビート毎の各音階音のレベルの変化から拍子と小節線位置(1拍目の位置)を検出することになる。
また上記ベース音検出手段において、ベース音が小節内で複数検出される場合は、そのベース音検出結果に応じて、上記コード名決定手段は、小節を幾つかのコード検出範囲に分断し、この各コード検出範囲におけるコード名を、ベース音と各コード検出範囲における各音階音のレベルから、決定するものとする。
上記構成によれば、入力手段から入力された入力音響信号に対し、第1の音階音レベル検出手段により、所定の時間間隔で、まずビート検出に適したパラメータでFFT演算を行い、これにより所定の時間毎の各音階音のレベルを求め、ビート検出手段により、この所定の時間毎の各音階音のレベルの変化から平均的なビート間隔と各ビートの位置を検出する。次に、小節検出手段により、このビート毎の各音階音のレベルの変化から拍子と小節線位置を検出する。さらに、本発明のコード名検出装置は、第2の音階音レベル検出手段により、入力音響信号に対し先のビート検出の時とは異なる別の所定の時間間隔で、今度はコード検出に適したパラメータでFFT演算を行い、これにより所定の時間毎の各音階音のレベルを求める。そしてベース音検出手段により、この各音階音のレベルの内、低域側の音階音のレベルから各小節のベース音を検出し、コード名決定手段により、検出したベース音と各音階音のレベルから各小節のコード名を決定することになる。
また上記のように、ベース音検出手段でこのベース音が小節内で複数検出される場合は、そのベース音検出結果に応じて、上記コード名決定手段は、小節を幾つかのコード検出範囲に分断し、この各コード検出範囲におけるコード名をベース音と各コード検出範囲における各音階音のレベルから決定することになる。
以上のように、本発明のコード名検出装置の構成では、簡単な構成のみでビート検出という時間分解能が必要な処理(謂わばテンポ検出装置の構成と言って良い)と、和音検出という周波数分解能が必要な処理(上記テンポ検出装置の構成を基にさらに和音を検出できる構成)を同時に行うことができるようになる。
さらに、検出されたコード毎に、上記コード情報記憶手段に、それらの、コード位置、ベース検出期間におけるベースの検出音域の音階音のレベルより求められるベース域音階音強度、ベース音、コード検出期間におけるコードの検出音域の音階音のレベルより求められるコード音階音強度、コード構成音、コード構成音数、コード名が記憶される。そして、上記表示手段に、上記コード名決定手段で決定されたコード名乃至コード構成音やベース音が表示される。
このコード名乃至コード構成音やベース音が表示されただけでは、実際にその検出結果が正しいか否かが判定できない。そのために、本発明装置では、上記演奏手段により、入力音響信号及び決定された上記コードが演奏される構成とした。
ただし、上記の様な調整手段により、該演奏手段の両出力につき、その音量バランスが調整できるようにしている。すなわち、たとえばスライド抵抗の様な、1つの操作子で操作し、一回操作するだけで、全体の音量を変化させずに、これらの音量調整ができる様にしている。
両方の音を適切な音量の調整ができた状態で聴いたユーザは、その結果においてコード名が適切でない、或いはコード進行を聞いた時に不自然、と感じて訂正を加えたい時は、上記変更手段を使用して、ユーザ側で、コード名乃至コード構成音の変更(コード構成音の数の変更もできる)をすることができる。例えばコード構成音の数の変更の1つの例として、採用個数を変える場合、3和音、4和音のコントロールをすることが可能となるなどである。
そのような変更が行われた場合、上記再設定手段により、コード情報記憶手段に記憶されたコード音階音強度及びコード構成音を参照させて、コード構成音、コード構成音数、コード名を、コード名決定手段に変更させ、その変更情報を上記コード情報記憶手段に再記憶させると共に、少なくとも表示手段にコード名乃至コード構成音を再表示させるようにすることになる。
コード構成音数を変更させる場合に、コード情報記憶手段に記憶されたコード音階音強度やコード構成音を参照するのは、たとえば、構成音とする音階音の強度に閾値が設けられており、その閾値を増減することで、そのコード音階音強度の高い順に、コード構成音数を簡単に増減できるようになるからである。そのコード構成音数の変更によっては、コード名も変わるようになる。
さらに、2つ目の本発明の構成は、第1の発明の構成を、コンピュータに実行させるために、該コンピュータで実行可能なプログラム自身を規定している。すなわち、上述した課題を解決するための構成として、上記各手段を、コンピュータの構成を利用することで実現する、該コンピュータで読み込まれて実行可能なプログラムである。この場合、コンピュータとは中央演算処理装置の構成を含んだ汎用的なコンピュータの構成の他、特定の処理に向けられた専用機などを含むものであっても良く、中央演算処理装置の構成を伴うものであれば特に限定はない。
上記各手段を実現させるためのプログラムが該コンピュータに読み出されると、第1の発明の構成として規定された各機能実現手段と同様な機能実現手段が達成されることになる。
第1の発明のより具体的構成は、
コンピュータに読み込まれて実行されることにより、該コンピュータを、
音響信号を入力する入力手段と、
入力された音響信号から、所定の時間間隔で、ビート検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求める第1の音階音レベル検出手段と、
この所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して、所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート間隔と各ビートの位置を検出するビート検出手段と、
このビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す値を求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置を検出する小節検出手段と、
上記入力された音響信号から、先のビート検出の時とは異なる別の所定の時間間隔で、コード検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求める第2の音階音レベル検出手段と、
検出した各音階音のレベルのうち、各小節内における低域側の音階音のレベルからベース音を検出するベース音検出手段と、
検出したベース音と各音階音のレベルから各小節のコード名を決定するコード名決定手段と、
検出した全てのコード毎に、コード位置、ベース検出期間におけるベースの検出音域の音階音のレベルより求められるベース域音階音強度、ベース音、コード検出期間におけるコードの検出音域の音階音のレベルより求められるコード音階音強度、コード構成音、コード構成音数、コード名を記憶するコード情報記憶手段と、
上記コード名決定手段で決定されたコード名乃至コード構成音、及び/又はベース音を表示する表示手段と、
入力音響信号及び決定された上記コードを演奏する演奏手段と、
該演奏手段の両出力の音量バランスを調整する調整手段と、
上記コード名乃至コード構成音を変更する変更手段と、
上記変更手段によるコード名乃至コード構成音の変更に基づき、コード情報記憶手段に記憶されたコード音階音強度及びコード構成音を参照して、コード構成音、コード構成音数、コード名を、コード名決定手段に変更させ、その変更情報を上記コード情報記憶手段に再記憶させると共に、少なくとも表示手段にコード名乃至コード構成音を再表示させる再設定手段と
して機能させることを特徴とするコード名検出用プログラムである。
以上のようなプログラムの構成であれば、既存のハードウェア資源を用いてこのプログラムを使用することにより、既存のハードウェアで新たなアプリケーションとしての本発明の夫々の装置が容易に実現できるようになる。
このプログラムという態様では、通信などを利用して、これを容易に使用、配布、販売することができるようになる。また、既存のハードウェア資源を用いてこのプログラムを使用することにより、既存のハードウェアで新たなアプリケーションとしての本発明の装置が容易に実行できるようになる。
尚、第2の発明の構成の各機能実現手段のうち一部の機能は、コンピュータに組み込まれた機能(コンピュータにハードウェア的に組み込まれている機能でも良く、該コンピュータに組み込まれているオペレーティングシステムや他のアプリケーションプログラムなどによって実現される機能でも良い)によって実現され、前記プログラムには、該コンピュータによって達成される機能を呼び出すあるいはリンクさせる命令が含まれていても良い。
これは、第1の発明の構成として規定された各機能実現手段の一部が、例えばオペレーティングシステムなどによって達成される機能の一部で代行され、その機能を実現するためのプログラムないしモジュールなどは直接存在するわけではないが、それらの機能を達成するオペレーティングシステムの機能の一部を、呼び出したりリンクさせるようにしてあれば、実質的に同じ構成となるからである。
本発明に規定されたコード名検出装置及びプログラムによれば、特別な音楽的知識を有する専門家でなくても、音楽CD等の複数の楽器音の混ざり、しかも演奏テンポに揺らぎのある音楽音響信号(オーディオ信号)から、個々の音符情報を検出することなしに、全体の響きから、コード名(和音名)を検出することができるというだけでなく、その判定結果を確認する際に、コード名乃至コード構成音やベース音が表示されただけでは、実際にその検出結果が正しいか否かが判定できないので、本発明構成では、上記演奏手段により、入力音響信号及び決定された上記コードが演奏される構成とし、しかも上記調整手段により、該演奏手段の音響信号及びコード演奏出力につき、その音量バランスが調整できるようにし、一回操作するだけで、全体の音量を変化させずに、これらの音量調整ができる様になるという優れた効果を奏することになる。また、そのような出力を聴いて、検出結果に満足できない場合は、ユーザ側で自由に採譜結果に手を加えることができるようになるという効果も有している。
以下、本発明の実施の形態を図示例と共に説明する。
(前提例)
図1は、本発明の前提となるテンポ検出装置の全体ブロック図である。このテンポ検出装置の構成は、テンポ検出用プログラムが読み込まれて実行可能なコンピュータにより構成されており、該コンピュータをテンポ検出用機能ブロックとして分けた場合、図1に示すように、音響信号を入力する入力部1と、入力された音響信号から、所定の時間間隔で、FFT演算を行い、所定の時間毎の各音階音のレベルを求める音階音レベル検出部2と、この所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して、所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート間隔と各ビートの位置を検出するビート検出部3と、このビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す値を求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置を検出する小節検出部4とを有するもので構成される。
上記入力部1は、後述するように、コンピュータに接続されたマイクや、同じくコンピュータに接続されたMIDIインタフェースなどのI/Oインターフェースで構成されており、上述のように、音響信号を入力する機能を有している。
上記音階音レベル検出部2は、テンポ検出用プログラムが読み込まれて実行され、以下に示す処理を行うコンピュータのCPUにより構成されている。そしてそれは、上述のように、入力された音響信号から、所定の時間間隔で、FFT演算を行い、所定の時間毎の各音階音のレベルを求める機能を有している。
上記ビート検出部3は、同じくテンポ検出用プログラムが読み込まれて実行され、以下に示す処理を行うコンピュータのCPUにより構成されている。それは、上述のように、所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して、所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート間隔と各ビートの位置を検出する機能を有している。
上記小節検出部4は、同じくテンポ検出用プログラムが読み込まれて実行され、以下に示す処理を行うコンピュータのCPUにより構成されている。それは、上述のように、上記ビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す値を求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置を検出する機能を有している。
音楽音響信号を入力する上記入力部1は、テンポ検出をする対象の音楽音響信号を入力する部分である。マイク等の機器から入力されたアナログ信号をA/D変換器(図示無し)によりディジタル信号に変換しても良いし、音楽CDなどのディジタル化された音楽データの場合は、そのままファイルとして取り込み(リッピング)、これを指定して開くようにしても良い。このようにして入力したディジタル信号がステレオの場合、後の処理を簡略化するためにモノラルに変換する。
このディジタル信号は、音階音レベル検出部2に入力される。この音階音レベル検出部は図2の各部から構成される。
そのうち波形前処理部20は、音楽音響信号の上記入力部1からの音響信号を今後の処理に適したサンプリング周波数にダウンサンプリングする構成である。
ダウンサンプリングレートは、ビート検出に使う楽器の音域によって決定する。すなわち、シンバル、ハイハット等の高音域のリズム楽器の演奏音をビート検出に反映させるには、ダウンサンプリング後のサンプリング周波数を高い周波数にする必要があるが、ベース音とバスドラム、スネアドラム等の楽器音と中音域の楽器音から主にビート検出させる場合には、ダウンサンプリング後のサンプリング周波数はそれほど高くする必要はない。
例えば検出する最高音をA6(C4が中央のド)とする場合、A6の基本周波数は約1760Hz(A4=440Hzとした場合)となるので、ダウンサンプリング後のサンプリング周波数は、ナイキスト周波数が1760Hz以上となる、3520Hz以上にすれば良い。これから、ダウンサンプリングレートは、元のサンプリング周波数が44.1kHz(音楽CD)の場合、1/12程度にすれば良いことになる。この時、ダウンサンプリング後のサンプリング周波数は、3675Hzとなる。
ダウンサンプリングの処理は、通常、ダウンサンプリング後のサンプリング周波数の半分の周波数であるナイキスト周波数(今の例では1837.5Hz)以上の成分をカットするローパスフィルタを通した後に、データを読み飛ばす(今の例では波形サンプルの12個に11個を破棄する)ことによって行われる。
このようにダウンサンプリングの処理を行うのは、この後のFFT演算において、同じ周波数分解能を得るために必要なFFTポイント数を下げることで、FFTの演算時間を減らすのが目的である。
なお、音楽CDのように、音源が固定のサンプリング周波数で既にサンプリングされている場合は、このようなダウンサンプリングが必要になるが、音楽音響信号の入力部1が、マイク等の機器から入力されたアナログ信号をA/D変換器によりディジタル信号に変換するような場合には、当然A/D変換器のサンプリング周波数を、ダウンサンプリング後のサンプリング周波数に設定することで、この波形前処理部を省くことが可能である。
このようにして波形前処理部20によるダウンサンプリングが終了したら、所定の時間間隔で、波形前処理部の出力信号を、FFT演算部21によりFFT(高速フーリエ変換)する。
FFTのパラメータ(FFTポイント数とFFT窓のシフト量)は、ビート検出に適した値とする。つまり、周波数分解能を上げるためにFFTポイント数を大きくすると、FFT窓のサイズが大きくなってしまい、より長い時間から1回のFFTを行うことになり、時間分解能が低下する、というFFTの特性を考慮しなくてはならない(つまりビート検出時は周波数分解能を犠牲にして時間分解能をあげるのが良い)。窓のサイズと同じだけの長さの波形を使わないで、窓の一部だけに波形データをセットし残りは0で埋めることによって、FFTポイント数を大きくしても時間分解能が悪くならない方法もあるが、低音側のパワー(ここでパワーは、上記レベルと同意;以下同じ)も正しく検出するためには、ある程度の波形サンプル数は必要である。
以上のようなことを考慮し、本実施例では、FFTポイント数512、窓のシフトは32サンプルで、0埋めなしという設定にした。このような設定でFFT演算を行うと、時間分解能約8.7ms、周波数分解能約7.2Hzとなる。時間分解能約8.7msという値は、四分音符=300のテンポの曲で、32分音符の長さが、25msであることを考えると、十分な値であることがわかる。
このようにして、所定の時間間隔毎にFFT演算が行われ、その実数部と虚数部のそれぞれを二乗したものの和の平方根からパワーが計算され、その結果がレベル検出部22に送られる。
レベル検出部22では、FFT演算部21で計算されたパワー・スペクトルから、各音階音のレベルを計算する。FFTは、サンプリング周波数をFFTポイント数で割った値の整数倍の周波数のパワーが計算されるだけであるので、このパワー・スペクトルから各音階音のレベルを検出するために、以下のような処理を行う。つまり、音階音を計算するすべての音(C1からA6)について、その各音の基本周波数の上下50セントの範囲(100セントが半音)の周波数に相当するパワー・スペクトルの内、最大のパワーを持つスペクトルのパワーをこの音階音のレベルとする。
すべての音階音についてレベルが検出されたら、これをバッファに保存し、波形の読み出し位置を所定の時間間隔(先の例では32サンプル)進めて、FFT演算部21とレベル検出部22の処理を波形の終わりまで繰り返す。
以上により、音楽音響信号の入力部1に入力された音響信号の、所定時間毎の各音階音のレベルが、バッファ23に保存される。
次に、図1のビート検出部3の構成について説明する。該ビート検出部3は、図3のような処理の流れで実行される。
ビート検出部3は、音階音レベル検出部が出力した所定時間(以下、この1所定時間を1フレームと呼ぶ)毎の各音階音のレベルの変化を元に平均的なビート(拍)間隔(つまりテンポ)とビートの位置を検出する。そのために、まずビート検出部3は、各音階音のレベル増分値の合計(前のフレームとのレベルの増分値をすべての音階音で合計したもの。前のフレームからレベルが減少している場合は0として加算する)を計算する(ステップS100)。
つまり、フレーム時間tにおけるi番目の音階音のレベルをLi(t)とするとき、i番目の音階音のレベル増分値Laddi(t)は、下式数1に示すようになり、このLaddi(t)を使って、フレーム時間tにおける各音階音のレベル増分値の合計L(t)は、下式数2で計算できる。ここで、Tは音階音の総数である。
この合計L(t)値は、フレーム毎の全体での音の変化度合いを表している。この値は、音の鳴り始めで急激に大きくなり、同時に鳴り始める音が多いほど大きな値となる。音楽はビートの位置で音が鳴り始めることが多いので、この値が大きなところはビートの位置である可能性が高いことになる。
例として、図4に、ある曲の一部分の波形と各音階音のレベル、各音階音のレベル増分値の合計の図を示す。上段が波形、中央がフレーム毎の各音階音のレベルを濃淡で表したもの(下が低い音、上が高い音。この図では、C1からA6の範囲)、下段がフレーム毎の各音階音のレベル増分値の合計を示している。この図の各音階音のレベルは、音階音レベル検出部から出力されたものであるので、周波数分解能が約7.2Hzであり、G#2以下の一部の音階音でレベルが計算できずに歯抜け状態になっているが、この場合はビートを検出するのが目的であるので、低音の一部の音階音のレベルが測定できないのは、問題ない。
この図の下段に見られるように、各音階音のレベル増分値の合計は、定期的にピークをもつ形となっている。この定期的なピークの位置が、ビートの位置である。
ビートの位置を求めるために、ビート検出部3では、まずこの定期的なピークの間隔、つまり平均的なビート間隔を求める。平均的なビート間隔はこの各音階音のレベル増分値の合計の自己相関から計算できる(図3;ステップS102)。
あるフレーム時間tにおける各音階音のレベル増分値の合計をL(t)とすると、この自己相関φ(τ)は、以下の式数3で計算される。
自己相関計算の概念図を、図5に示す。この図のように、時間遅れτがL(t)のピークの周期の整数倍の時に、φ(τ)は大きな値となる。よって、ある範囲のτについてφ(τ)の最大値を求めれば、曲のテンポを求めることができる。
自己相関を求めるτの範囲は、想定する曲のテンポ範囲によって変えれば良い。例えば、メトロノーム記号で四分音符=30から300の範囲を計算するならば、自己相関を計算する範囲は、0.2秒から2秒となる。時間(秒)からフレームへの変換式は、以下の数4式に示す通りとなる。
この範囲の自己相関φ(τ)が最大となるτをビート間隔としても良いが、必ずしもすべての曲で自己相関が最大となる時のτがビート間隔とはならないので、自己相関が極大値となる時のτからビート間隔の候補を求め(図3;ステップS104)、これら複数の候補からユーザにビート間隔を決定させるのが良い(図3;ステップS106)。
このようにしてビート間隔が決定したら(決定したビート間隔をτmaxとする)、まず最初に先頭のビート位置を決定する。
先頭のビート位置の決定方法を、図6を用いて説明する。図6の上段はフレーム時間tにおける各音階音のレベル増分値の合計L(t)で、下段M(t)は決定したビート間隔τmaxの周期で値を持つ関数である。式で表すと、下式数5に示すようになる。
この関数M(t)を、0からτmax−1の範囲でずらしながら、L(t)とM(t)の相互相関を計算する。
相互相関r(s)は、上記M(t)の特性から、下式数6で計算できる。
この場合のnは、最初の無音部分の長さに応じて適当に決めれば良い(図6の例では、n=10)。
r(s)をsが0からτmax−1の範囲で求め、r(s)が最大となるsを求めれば、このsのフレームが最初のビート位置である。
最初のビート位置が決まったら、それ以降のビートの位置を1つずつ決定していく(図3;ステップS108)。
その方法を、図7を用いて説明する。図7の三角印の位置に先頭のビートが見つかったとする。2番目のビート位置は、この先頭のビート位置からビート間隔τmaxだけ離れた位置を仮のビート位置とし、その近辺でL(t)とM(t)が最も相関が取れる位置から決定する。つまり、先頭のビート位置をb0とするとき、以下の式のr(s)が最大となるようなsの値を求める。この式のsは仮のビート位置からのずれで、以下の式数7の範囲の整数とする。Fは揺らぎのパラメータで0.1程度の値が適当であるが、テンポの揺らぎの大きい曲では、もっと大きな値にしてもよい。nは5程度でよい。
kは、sの値に応じて変える係数で、例えば図8のような正規分布とする。
r(s)が最大となるようなsの値が求まれば、2番目のビート位置b1は、下式数8で計算される。
以降、同じようにして3番目以降のビート位置も求めることができる。
テンポがほとんど変わらない曲ではこの方法でビート位置を曲の終わりまで求めることができる。
以上のようにして、各ビートの位置が決定したら、この結果をバッファ30に保存すると共に、検出した結果を表示する。
次に、拍子および小節の検出について説明する。
これまでの処理で、ビートの位置が確定しているので、今度は、ビート毎の音の変化度合いを求める。ビート毎の音の変化度合いは、音階音レベル検出部が出力した、フレーム毎の各音階音のレベルから計算する。
j番目のビートのフレーム数をbjとし、その前後のビートのフレームをbj−1、bj+1とする時、j番目のビートのビート毎の音の変化度合いは、フレームbj−1からbj−1までのフレームの各音階音のレベルの平均とフレームbjからbj+1−1までのフレームの各音階音のレベルの平均を計算し、その増分値から各音階音のビート毎の音の変化度合いを求め、それらをすべての音階音で合計して計算することができる。
つまり、フレーム時間tにおけるi番目の音階音のレベルをLi(t)とするとき、j番目のビートのi番目の音階音のレベルの平均Lavgi(j)は、下式数9であるから、j番目のビートのi番目の音階音のビート毎の音の変化度合いBaddi(j)は、下式数10に示すようになる。
よって、j番目のビートのビート毎の音の変化度合いB(j)は、下式数11に示すようになる。ここで、Tは音階音の総数である。
図9の最下段は、このビート毎の音の変化度合いである。このビート毎の音の変化度合いから拍子と1拍目の位置を求める。
拍子は、ビート毎の音の変化度合いの自己相関から求める。一般的に音楽は1拍目で音が変わることが多いと考えられるので、このビート毎の音の変化度合いの自己相関から拍子を求めることができる。例えば、下式数12に示す自己相関φ(τ)を求める式から、ビート毎の音の変化度合いB(j)の自己相関φ(τ)を遅れτが、2から4の範囲で求め、自己相関φ(τ)が最大となる遅れτを拍子の数とする。
Nは、総ビート数、τ=2〜4の範囲でφ(τ)を計算し、φ(τ)が最大となるτを拍子の数とする。
次に1拍目を求めるが、これは、ビート毎の音の変化度合いB(j)がもっとも大きい箇所を1拍目とする。つまり、φ(τ)が最大となるτをτmax、下式数13のX(k)が最大となるkをkmaxとするとき、kmax番目のビートが最初の1拍目の位置となり、以降、τmaxを足したビート位置が1拍目となる。
n
maxは、τ
max・n+k<Nの条件で最大となるn
以上のようにして、拍子及び1拍目の位置(小節線の位置)が決定したら、この結果をバッファ40に保存する。もちろん、検出した結果を画面表示しても良い。
以上の前提例構成により、人間が演奏したテンポの揺らぐ演奏の音響信号から、曲全体の平均的なテンポと正確なビート(拍)の位置、さらに曲の拍子と1拍目の位置を検出することが可能となる。
図10は、本発明のコード名検出装置の全体ブロック図である。同図において、ビート検出及び小節検出の構成は、前提例構成と基本的に同じであり、同一構成において、テンポ検出用とコード検出用の構成について、上記前提例構成の場合と異なるものもあるので、数式等を除き、同じ説明が重なるが、以下に示す。
同図によれば、本コード名検出装置の構成は、音響信号を入力する入力部1と、入力された音響信号から、所定の時間間隔で、ビート検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求めるビート検出用音階音レベル検出部2と、この所定の時間毎の各音階音のレベルの増分値をすべての音階音について合計して、所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計を求め、この所定の時間毎の全体の音の変化度合いを示すレベルの増分値の合計から、平均的なビート間隔と各ビートの位置を検出するビート検出部3と、このビート毎の各音階音のレベルの平均値を計算し、このビート毎の各音階音の平均レベルの増分値をすべての音階音について合計して、ビート毎の全体の音の変化度合いを示す値を求め、このビート毎の全体の音の変化度合いを示す値から、拍子と小節線位置を検出する小節検出部4と、上記入力された音響信号から、先のビート検出の時とは異なる別の所定の時間間隔で、コード検出に適したパラメータを使ってFFT演算を行い、所定の時間毎の各音階音のレベルを求めるコード検出用音階音レベル検出部5と、検出した各音階音のレベルのうち、各小節内における低域側の音階音のレベルからベース音を検出するベース音検出部6と、検出したベース音と各音階音のレベルから各小節のコード名を決定するコード名決定部7と、検出した全てのコード毎に、コード位置、ベース域音階音強度、ベース音、コード音階音強度、コード構成音、コード構成音数、コード名を記憶するコード情報記憶部8と、上記コード名決定部7で決定されたコード名乃至コード構成音、及び/又はベース音を表示する表示部9と、入力音響信号及び決定された上記コードを演奏する演奏部10と、該演奏部10の両出力の音量バランスを調整する調整部11と、コード名乃至コード構成音を変更する変更部12と、該変更部11によるコード名乃至コード構成音の変更に基づき、コード情報記憶部8に記憶されたコード音階音強度及びコード構成音を参照して、コード構成音、コード構成音数、コード名を、コード名決定部7に変更させ、その変更情報を上記コード情報記憶部8に再記憶させると共に、表示部9にコード名乃至コード構成音を再表示させる再設定部13とを有している。なお、同図では入力部1に入力された音響信号は、別にバッファ10aにも格納され、後の演奏部10による演奏に用いられることになる。
上記コード情報記憶部8は、コンピュータの内部又は外部記憶装置で構成されており、上述のように、検出した全てのコード毎に、コード位置、ベース域音階音強度、ベース音、コード音階音強度、コード構成音、コード構成音数、コード名を記憶する機能を有している。
上記表示部9は、コンピュータのディスプレイで構成されており、上述のように、上記コード名決定部7で決定されたコード名乃至コード構成音、及び/又はベース音を表示する機能を有している。
上記演奏部10は、コンピュータのオーディオ出力部(或いは該コンピュータにつながれたMIDIインターフェースから外部の楽音出力部)で構成されており、上述の様に、入力部1で入力されバッファ10に格納された音響信号と、コード名決定部7で決定されたコードとを一緒に外部に音声として出力する機能を有している。
上記調整部11は、同じくコンピュータ上で稼働するプログラムによってディスプレイ上に表示されたスライダのある操作子(後述する図15を参照)と該コンピュータに接続されたポインティングデバイスで構成されており、演奏部10の入力音響信号とコードの両出力の音量バランスを調整する機能(後述する図17を参照)を有している。
上記変更部12は、同じくコンピュータのディスプレイに表示されたカーソルと該コンピュータに接続されたポインティングデバイスで構成されており、上述のように、表示部9で表示されたコード名乃至コード構成音を変更(多くは構成音の数を変更)する構成である。
上記再設定部13は、コード名検出用プログラムが読み込まれて実行され、次に説明する処理を行うコンピュータのCPUにより構成されており、上述のように、変更部12によるコード名乃至コード構成音の変更に基づき、コード情報記憶部8に記憶されたコード音階音強度及びコード構成音を参照して、コード構成音、コード構成音数、コード名を、コード名決定部7に変更させ、その変更情報を上記コード情報記憶部8に再記憶させると共に、少なくとも表示部9にコード名乃至コード構成音を再表示させる機能を有している。その他にも、上記演奏部10でもう一度音響信号とコードとを演奏させても良い。
音楽音響信号を入力する上記入力部1は、コード検出をする対象の音楽音響信号を入力する部分であるが、基本的構成は上記実施例1の入力部1と同じであるので、その詳細な説明は省略する。ただし、通常センタに定位されるボーカルが後のコード検出でじゃまになる場合は、右チャンネルの波形と左チャンネルの波形を引き算することでボーカルキャンセルするようにしても良い。
このディジタル信号は、ビート検出用音階音レベル検出部2とコード検出用音階音レベル検出部5とに入力される。これらの音階音レベル検出部は、どちらも上記図2の各部から構成され、構成はまったく同じなので、同じものをパラメータだけを変えて再利用できる。
そしてその構成として使用される波形前処理部20は、上記と同様な構成であり、音楽音響信号の上記入力部1からの音響信号を今後の処理に適したサンプリング周波数にダウンサンプリングする。ただし、ダウンサンプリング後のサンプリング周波数、つまり、ダウンサンプリングレートは、ビート検出用とコード検出用で変えるようにしても良いし、ダウンサンプリングする時間を節約するために同じにしても良い。
ビート検出用の場合は、ビート検出に使う音域によってダウンサンプリングレートを決定する。シンバル、ハイハット等の高音域のリズム楽器の演奏音をビート検出に反映させるには、ダウンサンプリング後のサンプリング周波数を高い周波数にする必要があるが、ベース音とバスドラム、スネアドラム等の楽器音と中音域の楽器音から主にビート検出させる場合には、以下のコード検出時と同じダウンサンプリングレートで構わない。
コード検出用の波形前処理部のダウンサンプリングレートは、コード検出音域によって変える。コード検出音域とは、コード名決定部でコード検出するときに使う音域のことである。例えばコード検出音域をC3からA6(C4が中央のド)とする場合、A6の基本周波数は約1760Hz(A4=440Hzとした場合)となるので、ダウンサンプリング後のサンプリング周波数はナイキスト周波数が1760Hz以上となる、3520Hz以上にすれば良い。これから、ダウンサンプリングレートは、元のサンプリング周波数が44.1kHz(音楽CD)の場合、1/12程度にすれば良いことになる。この時、ダウンサンプリング後のサンプリング周波数は、3675Hzとなる。
ダウンサンプリングの処理は、通常、ダウンサンプリング後のサンプリング周波数の半分の周波数であるナイキスト周波数(今の例では1837.5Hz)以上の成分をカットするローパスフィルタを通した後に、データを読み飛ばす(今の例では波形サンプルの12個に11個を破棄する)ことによって行われる。これについては、前提例構成に説明したことと同じ理由による。
このようにして波形前処理部20によるダウンサンプリングが終了したら、所定の時間間隔で、波形前処理部の出力信号をFFT演算部21により、FFT(高速フーリエ変換)する。
FFTのパラメータ(FFTポイント数とFFT窓のシフト量)は、ビート検出時とコード検出時で異なる値とする。これは、周波数分解能を上げるためにFFTポイント数を大きくすると、FFT窓のサイズが大きくなってしまい、より長い時間から1回のFFTを行うことになり、時間分解能が低下する、というFFTの特性によるものである(つまりビート検出時は周波数分解能を犠牲にして時間分解能をあげるのが良い)。窓のサイズと同じだけの長さの波形を使わないで、窓の一部だけに波形データをセットし、残りは0で埋めることによってFFTポイント数を大きくしても時間分解能が悪くならない方法もあるが、本実施例のケースでは、低音側のパワーも正しく検出するためにある程度の波形サンプル数は必要である。
以上のようなことを考慮し、本実施例では、ビート検出時はFFTポイント数512、窓のシフトは32サンプルで、0埋めなし、コード検出時はFFTポイント数8192、窓のシフトは128サンプルで、波形サンプルは一度のFFTで1024サンプル使うようにした。このような設定でFFT演算を行うと、ビート検出時は、時間分解能約8.7ms、周波数分解能約7.2Hz、コード検出時は、時間分解能約35ms、周波数分解能約0.4Hzとなる。今レベルを求めようとしている音階音は、C1からA6の範囲であるので、コード検出時の周波数分解能約0.4Hzは、最も周波数差の小さいC1とC#1の基本周波数の差、約1.9Hzにも対応できる。また、四分音符=300のテンポの曲で32分音符の長さが25msであることを考えると、ビート検出時の時間分解能約8.7msは、十分な値であることがわかる。
このようにして、所定の時間間隔毎にFFT演算が行われ、その実数部と虚数部のそれぞれを二乗したものの和の平方根からパワーが計算され、その結果がレベル検出部22に送られる。
レベル検出部22では、FFT演算部21で計算されたパワー・スペクトルから、各音階音のレベルを計算する。FFTは、サンプリング周波数をFFTポイント数で割った値の整数倍の周波数のパワーが計算されるだけであるので、このパワー・スペクトルから各音階音のレベルを検出するために、前提例構成と同様な処理を行う。すなわち、音階音を計算するすべての音(C1からA6)について、その各音の基本周波数の上下50セントの範囲(100セントが半音)の周波数に相当するパワー・スペクトルの内、最大のパワーを持つスペクトルのパワーをこの音階音のレベルとする。
すべての音階音についてレベルが検出されたら、これをバッファに保存し、波形の読み出し位置を所定の時間間隔(先の例ではビート検出時は32サンプル、コード検出時は128サンプル)進めて、FFT演算部21とレベル検出部22の処理を波形の終わりまで繰り返す。
以上により、音楽音響信号の入力部1に入力された音響信号の、所定時間毎の各音階音のレベルが、ビート検出用とコード検出用の2種類のバッファ23及び50に保存される。
次に、図10のビート検出部3及び小節検出部4の構成については、前提例構成のビート検出部3及び小節検出部4と同じ構成なので、その詳細な説明は、ここでは、省略する。
前提例構成と同様な構成と手順で、小節線の位置(各小節のフレーム番号)が確定したので、今度は各小節のベース音を検出する。
ベース音は、コード検出用音階音レベル検出部5が出力した各フレームの音階音のレベルから検出する。
図11に前提例構成の図4と同じ曲の同じ部分のコード検出用音階音レベル検出部5が出力した各フレームの音階音のレベルを示す。この図のように、コード検出用音階音レベル検出部5での周波数分解能は、約0.4Hzであるので、C1からA6のすべての音階音のレベルが抽出されている。
ベース音は、小節の前半と後半で異なる可能性があるので、ベース音検出部6により、各小節の前半と後半でそれぞれ検出する。前半と後半のベース音が同じ音のときは、小節のベース音としてこれを確定し、コードも小節全体で検出する。前半と後半で別の音のベース音が検出されたときは、コードも前半と後半に分けて検出する。場合によっては、分割する範囲を更に半分にまで(小節の4分の1まで)狭めてもよい。
ベース音は、ベース検出期間におけるベース検出音域の音階音のレベルの平均的な強さから求める。すなわちこれがベース音の強度である。
フレーム時間tにおけるi番目の音階音のレベルをLi(t)とすると、フレームfsからfeのi番目の音階音の平均的なレベルLavgi(fs,fe)は、下式数14で計算できる。
この平均的なレベルをベース検出音域、例えばC2からB3の範囲で計算し、平均的なレベルが最も大きな音階音をベース音として、ベース音検出部6は、決定する。ベース検出音域に音が含まれない曲や無音部分で間違ってベース音を検出しないために、適当な閾値を設定し、検出したベース音の平均的なレベルが、この閾値以下の場合は、ベース音を検出しないようにしてもよい。また、後のコード検出でベース音を重要視する場合には、検出したベース音がベース検出期間中継続してあるレベル以上を保っているかどうかをチェックするようにして、より確実なものだけをベース音として検出するようにしてもよい。さらに、ベース検出音域中、平均的なレベルが最も大きい音階音をベース音として決定するのではなく、この各音名の平均的なレベルを12の音名毎に平均し、この音名毎のレベルが最も大きな音名をベース音名として決定し、その音名を持つベース検出音域の中の音階音で、平均的なレベルが最も大きい音階音をベース音として決定するようにしてもよい。
ベース音が決定したら、この結果をバッファ60に保存すると共に、ベース検出結果を画面表示して、間違っている場合にはユーザに修正させるようにしてもよい。また、曲によってベース音域が変わることも考えられるので、ユーザがベース検出音域を変更できるようにしてもよい。
図12に、ベース音検出部6によるベース検出結果の表示例を示す。
次にコード名決定部7によるコード検出処理であるが、該コード検出処理も、同じようにコード検出期間における各音階音の平均的なレベルを計算することによって決定する。すなわちこれがコードの強度である。
本実施例では、コード検出期間とベース検出期間は同一としている。コード検出音域、例えばC3からA6の各音階音のコード検出期間における平均的なレベルを計算し、これが大きな値を持つ音階音から順に数個の音名を検出し、これとベース音の音名からコード名候補を抽出する。
上記コード情報記憶部8は、検出した上記データを記憶する構成であり、上記コンピュータの内部又は外部記憶装置で構成される。
該コード情報記憶部8には、コード名検出の過程において、コード位置にはベース音検出期間の最初のフレーム番号(コード1、コード2、……)が記憶され、ベース域音階音強度には、ベース音域内であって、ベース音検出期間のC〜Bまでの各12音の強度の区間平均が記憶される。フレーム番号はサンプルにも変換できるのでサンプル番号で記憶しても良い。また、ベース音には、ベース音検出期間において検出されたベース音の音階番号が記憶される。コード音階音強度には、ベース検出期間のC〜Bまでの各12音の強度の区間平均が記憶され、コード構成音には、ベース検出期間において抽出されたコード構成音が記憶される。そしてコード名には、決定されたコード名(或いはそれに対応した番号でも良い)が記憶される。
コード名決定部7は、コード情報記憶部8を参照してコード名を決定する。コード名決定部7はコードのタイプ(m、M7等)とコード構成音のルート音からの音程を保存したコード名データベースから、1つのコード名とそのコード構成音を検索する。そのコード構成音の平均強度を、コード情報記憶部8のコード音階音強度より算出する。全てのコードのコード構成音平均強度が最も大きいコード名を、その区間のコード名と決定する。このとき、コードのルート音(根音)や5度の音は、コードを演奏する楽器では省略されることがあるので、これらを含まなくてもコード名候補として抽出するようにする。ベース音を検出した場合には、このコード名候補のコード名にベース音の音名を加える。すなわち、コードのルート音とベース音が同じ音名であれば、そのままで良いし、異なる音名の場合は分数コードとする。また、コード構成音平均強度が比較的大きなものを複数表示して、ユーザーに選択させるようにしても良い。
上記方法では、抽出されるコード名候補が多すぎるという場合には、ベース音による限定を行ってもよい。つまり、ベース音が検出された場合には、コード名候補の中でそのルート音がベース音と同じ音名でないものは削除する。
さらに、このコード構成音平均強度の計算に音楽的な知識を導入してもよい。例えば、各音階音のレベルを全フレームで平均し、それを12の音名毎に平均して各音名の強さを計算し、その強さの分布から曲の調を検出する。そして、調のダイアトニックコードにはコード構成音平均強度が大きくなるようにある定数を掛ける、あるいは、調のダイアトニックスケール上の音から外れた音を構成音に含むコードはその外れた音の数に応じてコード構成音平均強度が小さくなるようにする等が、考えられる。さらにコード進行のよくあるパターンをデータベースとして記憶しておき、それと比較することで、コード候補の中からよく使われる進行になるようなものはコード構成音平均強度が大きくなるようにある定数を掛けるようにしてもよい。
いずれにしても、コード名決定部7により、コード名が決定したら、この結果(変更情報)をバッファ70を介して、上記コード情報記憶部8に再記憶させる。
本実施例では、入力音響信号は、サンプリング周波数44.1kHzの信号とする。そして、本実施例では拍子=4/4、小節位置は、図13のように検出されたものとする。同図の小節線位置の単位は、Sampleとする。
この時、小節線位置、拍子、サンプリング周波数から曲のテンポは次のように計算できる。なお、テンポは1分間の四分音符の数であらわされる。
上記式数15のBarnはn番目の小節線位置、Beatは拍子の分子、fsはサンプリング周波数である。上記数15より、本実施例では、Tempoは120となる。
また、コード名を決定した結果を、図14に示す。同図は、本実施例におけるコード情報記憶部8の一部を示したものである。Bass、コード構成音の数字は、音名C〜Bまでを、0〜11で表したものである。−1は、コード構成音が存在しないことを意味する。コード構成音は最大7音までとする。またコード位置の単位は、Sampleとする。
コード名の検出が終わると、表示部9は、入力音響信号、レベル増分値、ビート位置、小節位置、コードを、図15のように、表示する。
またコード名決定部7は、検出されたコードに応じたコード演奏情報を作成し、バッファ70に記憶させる。
次に演奏情報の作成について説明する。
演奏情報のデータ構造を、図16に示す。これはSMF(スタンダードMIDIファイル)に準じており、その説明は省略する。同図において、ヘッダデータには、ヘッダデータを示す識別子と、トラック数と、四分音符分解能を含む。
また、トラックヘッダデータには、トラックヘッダデータを示す識別子と、データサイズと、イベントデータを含んでいる。このイベントデータはイベントタイム、ステータス、データから成る。
データの数はステータスに応じて異なる。例えば、発音の場合、ステータス=0×90、データ1は音程、データ2は発音の強さ(音量)を表す。0×90の0はMIDIチャネル、9は発音を表す。さらに発音停止の場合は、ステータス=0×80、データ1は音程、データ2は発音停止の強さとなる。(発音停止の強さとは、鍵盤楽器において、押下した鍵盤が戻るときの速さを表す。)
イベントタイムは、演奏開始からの経過時間を表す。単位はTickで、ヘッダデータで定義した四分音符分解能を用いる。イベントタイムの代わりにステップタイム(直前イベントからの経過時間)を用いても良い。
まずコード開始位置、コード終了位置をSampleからTickへ下式数16で変換する。
Chordnは、n番目のコードのコード開始または終了位置を、fsはサンプリング周波数を、Tempoは曲のテンポを、Divは四分音符分解能を、各示す。
各コードの開始位置は、夫々0、1920、3840、5760、7680、9600Tickに変換される。該Tickは整数である必要があるので、小数点以下を四捨五入すると、各コードの終了位置は、夫々1920、3840、5760、7680、9600、11520となる。
コードCのイベントデータには、音程60(中央ド)、64(ミ)、67(ソ)の各発音イベントと、各発音停止イベントを、書き込む。
各発音イベントのイベントタイムは、上記数16より求められる、Tickに変換したコード開始位置となる。
また各発音イベントのステータスは、MIDIに準じて、0×90とする。
各発音イベントのデータ1は、音程を表すので、夫々、0×3C、0×40、0×48となる。
各発音イベントのデータ2は、発音強さなので、任意の値とする。
発音停止イベントのイベントタイムは、発音時間がコード開始から終了までの9割程度になるようにする。これは、下式数17で求める。
ChordSnは、n番目のコードの開始位置、ChordEnは、n番目のコードの終了位置を示す。初停止イベントタイムもTickなので、小数点以下を四捨五入する。すると、各発音停止イベントのイベントタイムは1728となる。各発音停止イベントのステータスはMIDIに準じて0×80とする。そして各発音停止イベントのデータ1は音程を表すので、夫々、0×3C、0×40、0×48となる。また各発音イベントのデータ2は、発音停止強さなので、任意の値とする。
上記の要領で全てのコードの演奏データを作成する。
以上の様な動作で演奏情報が作成された後、表示部9、演奏部10、調整部11、変更部12及び再設定部13により、これまでのコード検出が正しく行われたかをユーザに確かめさせ、必要な場合には、その変更を行わせる。
検出後にユーザが、図15に示される演奏開始ボタン100を押すと、上記演奏部10によって、バッファ10aを経て入力される入力音響信号、及びコード情報記憶部8から読み出されるコードが、楽音として出力される。その際コードは、図15の小節番号2の小節音響信号内のSで示された演奏開始位置から、小節番号6の小節音響信号内のEで示された演奏終了位置までの範囲を、演奏する。これらは、マウスで小節番号表示領域をクリックすることで、任意の位置に移動できる。
演奏開始ボタン100を押すと、入力音響信号及びコードの演奏が開始され、演奏が演奏終了位置に至るか、演奏終了ボタン102が押されるか、することで、演奏が終了する。
コード情報記憶部8、演奏部10及び調整部11の機能ブロック図を、図17に示す。
演奏開始ボタン100が押されて、演奏が開始されると、演奏進行に伴い、図10の入力音響信号が格納されているバッファ10aから、演奏部10により、入力音響信号が読み出される。それに伴い、コード演奏情報記憶部8から、演奏部10のコード読出部104により、コード演奏情報が読み出され、音源部106からの楽音信号の読み出しがなされ、コード読出部104は、それに応じたコード演奏音響信号を生成し、それを出力する。
読み出された入力音響信号は、入力音響信号ボリューム112で振幅を調整される。同様にコード演奏音響信号もコード演奏音響信号ボリューム110で振幅を調整される。上述の調整部11は、これらのコード演奏音響信号ボリューム110と入力音響信号ボリューム112とで構成されることになる。
振幅調整された入力音響信号とコード演奏音響信号は、加算器114で加算されて、再生音響信号バッファ108に書き込まれる。
再生音響信号は、コンピュータシステムの音響出力手段により音楽音響信号が、D/A変換され、スピーカ等から外部に発音されて、再生される。
上記調整部11は、コード演奏音響信号ボリューム110と入力音響信号ボリューム112よりなることは上述の通りであるが、より詳細には、コード演奏音響信号ボリューム110及び入力音響信号ボリューム112に夫々連動しており、表示部9に表示される調整部11の操作子(スライダ)を操作することで、コード演奏音響信号ボリューム110及び入力音響信号ボリューム112の双方の値が変化することになる。
これらの両方の音を聴き比べることで、コードが間違って検出されていないか、ユーザは確かめることができる。
ユーザが何度も聴き比べてコードが間違っていると判断した場合、上記変更部12により、コンピュータの表示部9上に表示されたコード表示位置に、カーソルを合わせ、そこで表示されたコード名乃至コード構成音を変更する。
上記再設定部13は、変更部12によるコード名乃至コード構成音の変更に基づき、コード情報記憶部8に記憶されたコード音階音強度及びコード構成音を参照して、コード構成音、コード構成音数、コード名を、コード名決定部7に変更させ、その変更情報を上記コード情報記憶部8に再記憶させると共に、少なくとも表示部9にコード名乃至コード構成音を再表示させる機能を有している。またユーザの求めに応じて、上記演奏部10でもう一度音響信号とコードとを演奏させることもできる。
このように検出されたコード名を画面表示するだけであれば、表示されたコード名乃至コード構成音を見ただけで正しいかどうかは判断できないが、入力音響信号と検出されたコードとを再生し、且つその際、両音をユーザが判断し易いように、調整部11により、出力調整をしているので、コード検出の確認には非常に有効である。
以上説明した本実施例構成によれば、簡単な構成のみでビート検出という時間分解能が必要な処理(上記前提例のテンポ検出装置の構成と同じ)と、コード検出という周波数分解能が必要な処理(上記テンポ検出装置の構成を基にさらにコード名を検出できる構成)を同時に行うことができるようになって、特別な音楽的知識を有する専門家でなくても、音楽CD等の複数の楽器音の混ざった入力された音楽音響信号に対し、個々の音符情報を検出することなしに全体の響きから、コード名を検出でき、その際に構成音が同じ和音でも判別可能であるだけでなく、その検出結果を演奏部10により聴いたユーザが、コード進行上不自然なコード音であり、その検出結果に訂正を加えたい時は、上記変更部12を使用して、ユーザ側で、コード名やコード構成音を変更することができ、適切なコード名の決定ができるようになる。或いはコード進行を聴いた時に自然と感じるように、ユーザによる訂正ができるようになる。また、そのような入力音響信号と検出されたコードとの再生の聴き取りの際に、両音をユーザが判断し易いように、調整部11により、出力調整が簡単にできるようになる。
尚、本発明のコード名検出装置及びそれを実現できるプログラムは、上述の図示例にのみ限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加え得ることは勿論である。