我正在编写一个显示随机自然音符并等待用户在吉他上弹奏该音符的程序。处理音频输入以查看是否播放了正确的音高,如果是,则显示下一个音符并更新用户的分数。这个想法是教基本的吉他音符。
我打算将 SFML 用于音频处理,将 QT4 用于 gui。我将有一个从相关 QObject 和 SFML 类派生的小部件。
问题:如何使用 SFML 检测麦克风输入的音高?是否可以简单地将输入的一部分存储在 sf::sound 对象中并调用它的 getPitch() 方法?
是否可以简单地将输入的一部分存储在 sf::sound 对象中并调用它的 getPitch() 方法?
GetPitch()
fromsf::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();
事实证明,SFML 没有内置任何用于检测音高的算法。感谢 LBg 让我的思维朝着正确的方向发展。SFML 仅提供录制声音并将其存储在缓冲区中所需的工具。
我发现我可以使用快速傅里叶变换来评估缓冲区的频率。然后可以将该频率与已知音调频率列表以及音调阈值进行比较。
虽然 SFML 没有内置 fft 算法,但它确实具有获取声音缓冲区所需的工具。我将不得不检查这是否是最跨平台的做事方式。