1

ランダムな自然な音符を表示し、ユーザーがギターでその音符を演奏するのを待つプログラムを書いています。オーディオ入力が処理され、正しいピッチが再生されたかどうかが確認されます。正しいピッチが再生された場合は、次の音符が表示され、ユーザーのスコアが更新されます。アイデアは、基本的なギターの音符を教えることです。

オーディオ処理には SFML を使用し、GUI には QT4 を使用する予定です。関連する QObject および SFML クラスから派生したウィジェットを作成します。

質問: SFML を使用してマイク入力のピッチを検出するにはどうすればよいですか? 入力の一部を sf::sound オブジェクトに単純に格納し、その getPitch() メソッドを呼び出すことは可能ですか?

4

2 に答える 2

1

入力の一部を sf::sound オブジェクトに単純に格納し、その getPitch() メソッドを呼び出すことは可能ですか?

GetPitch()fromは、使用した値または defaultsf::SoundSourceを返します。サウンドを編集することであり、情報を取得することではありません。それを行う唯一の方法は、サウンド サンプルの配列を取得し、何らかのアルゴリズムで処理することだと思います。この配列を使用して取得できます。SetPitch(pitch)1.0f

sf::SoundBufferRecorder recorder;
recorder.Start();
// ...
recorder.Stop();
const sf::SoundBuffer& buffer = recorder.GetBuffer();

size_t           sample_count       = buffer.GetSamplesCount();
const sf::Int16* samples            = buffer.GetSamples();
unsigned int     samples_per_second = buffer.GetSampleRate();
于 2011-12-21T12:17:03.993 に答える
0

結局のところ、SFML にはピッチを検出するためのアルゴリズムが組み込まれていません。私の心を正しい方向に向けさせてくれた LBg に感謝します。SFML は、サウンドを録音してバッファに保存するために必要なツールのみを提供します。

高速フーリエ変換を使用して、周波数のバッファーを評価できることがわかりました。次に、この周波数を、既知のピッチ周波数のリストと、ピッチしきい値とともに比較できます。

SFML には fft アルゴリズムが組み込まれていませんが、サウンド バッファを取得するために必要なツールが含まれています。これが最もクロスプラットフォームな方法であるかどうかを確認する必要があります。

于 2012-03-08T06:37:08.947 に答える