2011-12-20 102 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