8

嗨,我是音频相关编码方面的菜鸟,我正在研究音高跟踪 DLL,我将使用它来尝试创建一种开源版本的视频游戏 Rocksmith 作为学习体验。

到目前为止,我已经设法让 FFT 工作,因此我可以检测音高频率 (Hz),然后通过使用算法和下表我可以设法确定八度音阶(第 2 到第 6)和音符(C 到 B)演奏音符。

下一步是检测琴弦,以便确定音品。

在此处输入图像描述

我一直在考虑它,理论上我可以使用它,我会知道用户何时演奏正确的音符,但游戏可能是“Hack”,因为仅使用 Hz,游戏无法检测到音符以正确的字符串播放。例如第 5 弦 + 1 品 = C4 261.63Hz等于6 弦 + 5 品 = C4 261.63Hz

让用户在错误的字符串中弹奏音符并使其正确的可能性很低,但我认为知道字符串真的很好,这样我可以在用户弹奏错误的字符串时向用户提供一些错误反馈(比如你应该向上或向下移动一个字符串)。

你知道我能做些什么来检测字符串吗?提前致谢 :)

[编辑]

我们使用的吉他和琴弦会影响音色,因此分析音色似乎不是检测琴弦的简单方法:

“吉他音色的变化是由许多因素造成的,包括拾音器设计和位置、吉他的自然共振和阻尼,由于使用的木材(这是一种不同的木材!)以及它的结构和形状,你的弦的规格和年龄,你的演奏技巧,你在哪里按弦和拨弦,等等。”

4

3 回答 3

3

这可能有点晚了,因为帖子已经有一年了。但这是一个解决方案,我在对吉他的音高检测进行了长期研究后发现了这个解决方案。

这就是 FFT 不起作用的原因:

您不能使用 FFT,因为结果会为您提供一个线性数组,并且声音是按对数计算的(音符之间的指数距离)。另外,FFT 为您提供了您的频率可能是的 bin 数组,它不会为您提供精确的结果。

这是我的建议:

使用 dywapitchtrack。它是一个使用小波算法的库,它直接在你的波上工作,而不是像 FFT 那样计算大的 bin。

描述:dywapitchtrack 基于定制的算法,质量非常高:非常准确(精度 < 0.05 半音)、非常低的延迟(< 23 ms)和非常低的错误率。它已经在人声上进行了彻底的测试。最好将其描述为动态小波算法(dywa):

下载:https ://github.com/inniyah/sndpeek/tree/master/src/dywapitchtrack

USE(C++):把 .c 和 .h 放在你需要的地方,然后在你的项目中导入

包含头文件

//Create a dywapitchtracker Object
dywapitchtracker pitchtracker;

//Initialise the object with this function
dywapitch_inittracking(&pitchtracker);

当您的缓冲区已满时(缓冲区需要为 44100 分辨率和长度为 2 的幂,我的是 2048):

//use this function with your buffer
double thePitch = dywapitch_computepitch(&pitchtracker, yourBuffer, 0, 2048);

瞧,thePitch 正好包含您需要的内容。(如果有不清楚的地方可以随时提问)

于 2014-11-11T03:17:29.470 回答
2

由于许多潜在的强泛音,一个简单的 FFT 峰值估计器不是一个好的吉他音高检测器/估计器。存在更强大的音高估计算法(搜索 stackoverflow 和 DSP.stackexchange)。但是,如果您要求演奏者在开始游戏之前对他们各自乐器上的每个琴弦进行预表征,包括开弦和按弦演奏,这些表征的 FFT 指纹可能能够区分在某些吉他上不同琴弦上演奏的相同音符。较粗的弦会在一些较高的泛音中释放出略微不同的能量比例,以及不同程度的轻微不和谐。

于 2013-09-09T18:17:29.883 回答
0

其他答案似乎暗示了一种简单的音高检测方法。但是,这是您必须研究的事情。

具体来说,比较 5 弦 1 品和 6 弦 5 品的泛音。也就是说,只查看 261.63*2、261.63*3、*4 等。另外,请尝试查看 261.63*0.5。比较两个信号在这些频率上的幅度。可能存在可以检测到的模式。

于 2013-09-10T05:16:36.687 回答