2011-12-20 38 views
1

我正在編寫一個程序,顯示隨機自然音符並等待用戶在吉他上彈奏該音符。處理音頻輸入以查看是否播放了正確的音調,如果是,則顯示下一個音符並更新用戶的分數。這個想法是教基本的吉他筆記。Qt4和SFML音高識別和處理

我打算使用SFML進行音頻處理,並使用QT4作爲gui。我將從相關的QObject和SFML類派生一個小部件。

問題:如何使用SFML檢測麥克風輸入的音高?是否有可能簡單地將輸入的一部分存儲在sf :: sound對象中,並將其稱爲getPitch()方法?

+0

我已經刪除了qt4標籤,因爲問題與它無關 – 2011-12-21 08:05:58

回答

0

事實證明,SFML沒有任何算法用於檢測內置間距感謝LBG爲讓我的心在正確的方向努力。 SFML僅提供錄製聲音並將其存儲在緩衝區中所需的工具。

我發現我可以使用快速傅立葉變換來評估頻率的緩衝區。然後可以將該頻率與已知音調頻率的列表以及音調閾值進行比較。

雖然SFML沒有內置fft算法,但它確實有獲得聲音緩衝所需的工具。我將不得不檢查一下,看看這是否是最具跨平臺的做事方式。

1

是否可以簡單地將輸入的一部分存儲在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(); 
+0

感謝您的輸入;我發現關於聲音緩衝器的FFT是間接的結果。 – Adam 2012-03-08 06:38:01