iPodライブラリ(iPhoneでも)の曲のBPMを計算するメカニズムを統合しようとしています。Web で検索したところ、これを行うために最も使用され信頼できるライブラリは soundtouch であることがわかりました。このライブラリの経験がある人はいますか? iPhoneハードウェアで実行することは計算上可能ですか?
1 に答える
私は最近、サウンドタッチ ライブラリの BPMDetect クラスのコードをうまく使用しています。最初はC++でコンパイルし、後でコードをC#に変換し、最近はJNI を介してAndroidアプリでC++コードを使用しています。私はiOSでの開発にはあまり詳しくありませんが、あなたがやろうとしていることはほぼ間違いありません。
soundtouchソース コードから使用する必要があるファイルは次のとおりです。
C++ ファイル
- BPMDetect.cpp
- FIFOSampleBuffer.cpp
- PeakFinder.cpp
ヘッダファイル
- BPMDetect.h
- FIFOSampleBuffer.h
- FIFOSamplePipe.h
- PeakFinder.h
- soundtouch_config.h
- STTypes.h
少なくともこれらは、私がそれを機能させるために使用しなければならなかった唯一のものです.
BPMDetectクラスは、 inputSamples()メソッドを介して生のサンプルを受け取ります。ファイル全体がまだバッファにロードされていない場合でも、bpm 値を計算できます。私の経験では、これらの中間値は、ファイル全体がロードされた後に取得された値とは異なり、より正確であることがわかりました。
お役に立てれば。
編集:
コメントで説明するのは一種の複雑なプロセスなので、回答を編集します。
その要点は、Android アプリがネイティブ コードを使用する必要があるということです。そのためには、 Android NDKツールセットを使用して、soundtouch ライブラリから上記のファイルをコンパイルする必要があります。
これにより、未加工のサウンド データを処理できるネイティブ コードが残りますが、サウンド ファイルからデータを取得する必要があり、これにはいくつかの方法があると思います。私が行っていた方法は、 Android 用の FMOD ライブラリを使用することでした。これは、その良い例です: FMOD for Android。
C コードで次のようなメソッドを宣言したとします。
void Java_your_package_YourClassName_cPlay(JNIEnv *env, jobject thiz)
{
sound->play();
}
Android アプリでは、ネイティブ メソッドを次のように使用します。
public class Sound {
// Native method declaration
private native void cPlay();
public void play()
{
cPlay();
}
}
使いやすい API を使用するために、これらの関数呼び出しのラッパーを作成できます。
使用していたネイティブ C コードを Gist hereに置きます。
お役に立てれば。