曲のテンポ/ BPMをプログラムで決定するにはどうすればよいですか?一般的にどのアルゴリズムが使用され、どのような考慮事項が必要ですか?
これは、単一のStackOverflow投稿で説明するのが困難です。一般的に、最も簡単なビート検出アルゴリズムは、検出しやすい音エネルギーのピークを見つけることにより機能します。より洗練されたメソッドは、comb filtersおよびその他の統計的/波形メソッドを使用します。コードサンプルを含む詳細な説明については、 このGameDevの記事 を確認してください。
検索するキーワードは、「Beat Detection」、「Beat Tracking」、および「Music Information Retrieval」です。ここには多くの情報があります: http://www.music-ir.org/
MIREXと呼ばれる(たぶん)年次コンテストがあり、そこではビート検出パフォーマンスでさまざまなアルゴリズムがテストされます。
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
これにより、テストするアルゴリズムのリストが表示されます。
古典的なアルゴリズムはBeatroot(google it)で、これはニースで理解しやすいものです。それはこのように動作します:
私の経験ではこのアルゴリズムの欠点:
ここ は、このアルゴリズムのライブバージョンのデモであり、スペクトルフラックス(下部の黒い線)とオンセット(緑色の円)を示しています。緑色の円からonlyからビートが抽出されるという事実を考慮する価値があります。私はオンセットをクリックするだけで再生しましたが、正直なところ、それらからビートを聞くことができるとは思わないので、いくつかの点でこのアルゴリズムはビート検出の人々よりも優れています。しかし、このような低次元信号への低減は、その弱いステップだと思います。
迷惑なことに、数年前にビート検出用の多くのアルゴリズムとコードを備えた非常に優れたサイトを見つけました。私はそれを完全に見つけることができませんでした。
始めるのに役立つすばらしいリンクを次に示します。
ビート抽出には、音楽の認知メトリック構造の識別が含まれます。非常に多くの場合、これらは物理的な音エネルギーに対応しません。たとえば、ほとんどの音楽ではシンコペーションのレベルがあります。これは、これが物理的な音の検出であるonset detectionとは全く異なるフィールドであり、異なる方法で実行されることを意味します。
Aubio ライブラリを試すことができます。これは、開始およびビート抽出ツールの両方を提供する単純なCライブラリです。
オンライン Echonest API もありますが、これにはMP3をWebサイトにアップロードし、XMLを取得する必要があるため、あまり適切ではありません。
EDIT:昨夜私は出会った-非常に有望なC/C++ライブラリであるが、自分では使っていない。 Vampプラグイン
あなたが興味を持っている研究の一般的な領域は、音楽情報検索と呼ばれます
これを行う多くの異なるアルゴリズムがありますが、それらはすべて基本的にONSET DETECTIONに集中しています。
開始検出は、イベントの開始を測定します。この場合のイベントは、再生されているノートです。重み付けされたフーリエ変換(高周波コンテンツ)の変化を調べることができます。スペクトルコンテンツの大きな変化を調べることができます。 (スペクトルの違い)。 (さらに詳しく調べることをお勧めする論文がいくつかあります)発症検出アルゴリズムを適用したら、しきい値処理によってビートがどこにあるかを選びます。
ビートの時間定位を取得したら、使用できるさまざまなアルゴリズムがあります。これをパルス列に変換して(常に0で、ビートが発生したときにのみ1になる信号を作成します)、FFTを適用すると、BAMで最大ピークにオンセットの周波数が得られます。
正しい方向に導くためのいくつかの論文があります:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
これは、一部の人々が議論しているものの拡張です。
誰かが機械学習アルゴリズムの適用を検討していると述べました:基本的に、オンセット検出関数(上記)から一連の機能を収集し、それらをニューラルネットワーク/ロジスティック回帰で生信号と組み合わせて、ビートをビートにするものを学習します。
andrew Ng博士に目を向けると、彼はスタンフォード大学から無料の機械学習講義をオンラインで受けています(長時間のビデオ講義ではなく、実際にオンラインの遠隔講座があります)
pythonプロジェクト内のコードとのインターフェースを管理できる場合、 Echo Nest Remix API =は、Python用の非常に滑らかなAPIです。
BPMを提供するメソッドanalysis.tempo
があります。 APIドキュメントまたはthisチュートリアルからわかるように、単純なBPMよりもはるかに多くのことができます。
フーリエ変換 を実行し、パワースペクトルのピークを見つけます。人間の聴覚の20 Hzカットオフ以下のピークを探しています。通常、0.1〜5 Hzの範囲で十分だと思います。
役に立つかもしれない質問: Bpmオーディオ検出ライブラリ
また、SOに関するいくつかの「ピーク検出」質問の1つです。 測定信号のピーク検出
編集:私がオーディオ処理をするわけではありません。これは、ファイルの周波数領域プロパティを探しているという事実に基づく単なる推測です...
別の編集:mp3のような非可逆圧縮形式は、そもそも時間領域データではなくフーリエ領域データを保存することに注意する価値があります。少し賢くすれば、重い計算を省くことができます...しかし、cobbalの思慮深いコメントを見てください。
BPMを取得する方法はいくつかありますが、最も効果的な方法は「ビートスペクトル」です(ここ )。このアルゴリズムは、音楽の各短いサンプルを他のすべてのサンプルと比較することにより、類似度マトリックスを計算します。類似度マトリックスが計算されると、各時間間隔Tのすべてのサンプルペア{S(T); S(T + 1)}間の平均類似度を取得できます。これはビートスペクトルです。ビートスペクトルの最初の高いピークは、ほとんどの場合、ビート持続時間です。最良の部分は、音楽構造やリズム分析などのこともできるということです。
他の人はすでにいくつかのビート検出方法を説明しています。この種のタスクのためのテクニックとアルゴリズムを提供するライブラリがいくつかあります。
Aubio はそのうちの1つで、評判が高く、C++ラッパーを使用してCで記述されているため、ココアアプリケーションと簡単に統合できます(AppleのフレームワークのすべてのオーディオもCで記述されています)/C++)。
正確なBPM検出は非常に困難です。 このstackoverflowの質問 とそれに対する私の返信を参照してください。
私の答えを再投稿するには:簡単な方法は、ユーザーにビートに合わせてボタンをタップさせ、タップ数を時間で割って数えることです。
無料プログラム は、BPMを分析してID3V2タグに書き込みます。よくわからない