【问题标题】:How to detect string when pitch-tracking on electric guitar?在电吉他上进行音高跟踪时如何检测弦?
【发布时间】:2013-09-12 17:22:52
【问题描述】:

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

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

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

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

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

你知道我可以做些什么来检测字符串吗?在此先感谢:)

[编辑]

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

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

【问题讨论】:

  • 我不确定这是否可行,因为如果调整得当,两个琴弦都会发出相同的音符。不知道这个时候电脑能不能检测出音色上的差异。
  • 同意 NWard - 同一个音符在较低的琴弦上演奏时会有不同(稍微圆润)的音色,但我怀疑你会很幸运地检测到这一点 - 它可能会稍微容易一些一种单一的、已知的乐器。我假设您对定制皮卡不感兴趣? :)
  • 我只会将它用于标准调音的电吉他。从快速研究看来,音色检测是一项过于复杂的任务......我可能必须创建一个算法,以便最好地识别用户错误,将播放的音符与预期音符附近的音符进行比较。

标签: c# audio fft guitar pitch-tracking


【解决方案1】:

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

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

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

这是我的建议:

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

说明: dywapitchtrack 基于定制的算法,质量非常好: 非常准确(精度

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

使用(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 正好包含您需要的内容。 (如果有不清楚的地方欢迎提问)

【讨论】:

  • 我有一个问题。 dywapitchtracker 库是一颗明珠,但它似乎在未初始化后无法释放内存。知道为什么吗?
【解决方案2】:

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

【讨论】:

  • 有一些基于 FFT 的 f0 估计算法运行良好(例如 Maher 和 Beauchamp 的“双向失配程序”JASA 04 1994)。您可能想更正您的回答,说“FFT 上的简单峰值拾取不是一个好的音高检测器”。
  • 完成。 FFT 可用作更稳健的复合估计方法(倒谱等)的第一步。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 2011-07-24
    • 1970-01-01
    • 2017-05-30
    • 2011-06-29
    • 1970-01-01
    • 2011-05-13
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多