我正在编写一个程序,显示随机自然音符并等待用户在吉他上弹奏该音符。处理音频输入以查看是否播放了正确的音调,如果是,则显示下一个音符并更新用户的分数。这个想法是教基本的吉他笔记。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