我正在編寫一個程序,顯示隨機自然音符並等待用戶在吉他上彈奏該音符。處理音頻輸入以查看是否播放了正確的音調,如果是,則顯示下一個音符並更新用戶的分數。這個想法是教基本的吉他筆記。Qt4和SFML音高識別和處理
我打算使用SFML進行音頻處理,並使用QT4作爲gui。我將從相關的QObject和SFML類派生一個小部件。
問題:如何使用SFML檢測麥克風輸入的音高?是否有可能簡單地將輸入的一部分存儲在sf :: sound對象中,並將其稱爲getPitch()方法?
我正在編寫一個程序,顯示隨機自然音符並等待用戶在吉他上彈奏該音符。處理音頻輸入以查看是否播放了正確的音調,如果是,則顯示下一個音符並更新用戶的分數。這個想法是教基本的吉他筆記。Qt4和SFML音高識別和處理
我打算使用SFML進行音頻處理,並使用QT4作爲gui。我將從相關的QObject和SFML類派生一個小部件。
問題:如何使用SFML檢測麥克風輸入的音高?是否有可能簡單地將輸入的一部分存儲在sf :: sound對象中,並將其稱爲getPitch()方法?
事實證明,SFML沒有任何算法用於檢測內置間距感謝LBG爲讓我的心在正確的方向努力。 SFML僅提供錄製聲音並將其存儲在緩衝區中所需的工具。
我發現我可以使用快速傅立葉變換來評估頻率的緩衝區。然後可以將該頻率與已知音調頻率的列表以及音調閾值進行比較。
雖然SFML沒有內置fft算法,但它確實有獲得聲音緩衝所需的工具。我將不得不檢查一下,看看這是否是最具跨平臺的做事方式。
是否可以簡單地將輸入的一部分存儲在sf :: sound對象中並將其稱爲getPitch()方法?
GetPitch()
從sf::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();
感謝您的輸入;我發現關於聲音緩衝器的FFT是間接的結果。 – Adam 2012-03-08 06:38:01
我已經刪除了qt4標籤,因爲問題與它無關 – 2011-12-21 08:05:58