我正在开发依赖于音乐和弦检测的软件。我知道一些基于倒谱分析或自相关技术的音调检测算法,但它们主要关注单声道材料识别。但我需要使用一些复音识别,即同时进行多个音高,就像在和弦中一样;有谁知道一些关于这个问题的好的研究或解决方案?
我目前正在开发一些基于FFT的算法,但如果有人对我可以使用的某些算法或技术有所了解,那将会有很大的帮助。
答案 0 :(得分:12)
Mac的转录程序Capo的作者有一个非常深入的博客。条目"A Note on Auto Tabbing"有一些很好的跳跃点:
我在2009年中期开始研究不同的自动转录方法,因为我很好奇这项技术有多远,以及它是否可以整合到未来版本的Capo中。
这些自动转录算法中的每一个都以音频数据的某种中间表示开始,然后将它们转换为符号形式(即音符开头和持续时间)。
这是我遇到一些计算上昂贵的频谱表示(连续小波变换(CWT),恒定Q变换(CQT)等)。)我实现了所有这些频谱变换,这样我也可以实现由我正在阅读的论文。这会让我知道它们是否会在实践中发挥作用。
Capo有一些impressive technology。突出的特点是它的主视图不像大多数其他音频节目那样是频谱图。它呈现出像钢琴卷一样的音频,肉眼可以看到音符。
http://supermegaultragroovy.com/products/Capo/img/screen1_sm-nq8.png
(注意:硬笔条是由用户绘制的。下面的模糊点是Capo显示的。)
答案 1 :(得分:11)
这是一个非常好的开源项目: https://patterns.enm.bris.ac.uk/hpa-software-package
它根据色度图检测和弦 - 一个很好的解决方案,将整个光谱的窗口分解为具有浮点值的音高类别(大小:12)。然后,可以通过隐马尔可夫模型检测和弦。
..应该为您提供所需的一切。 :)
答案 2 :(得分:7)
和弦检测与键检测之间存在显着重叠,因此您可能会发现我的previous answer对该问题有用,因为它与论文和论文有一些联系。获得一个好的复音识别器是非常困难的。
我自己的观点是,应用复音识别提取音符,然后尝试从音符中检测和弦是错误的方法。原因是这是一个模棱两可的问题。如果你有两个复杂的音调,只有一个八度音程,则无法检测是否有一个或两个音符在播放(除非你有额外的背景,比如知道谐波曲线)。 C5的每个谐波也是C4(以及C3,C2等)的谐波。因此,如果您在复音识别器中尝试大调和弦,那么您可能会得到与您的和弦谐音相关的整个音符序列,但不一定是您演奏的音符。如果您使用基于自相关的音高检测方法,那么您将非常清楚地看到这种效果。
相反,我认为最好寻找某些和弦形状(Major,Minor,7th等)制作的模式。
答案 3 :(得分:5)
请参阅我对这个问题的回答: How can I do real-time pitch detection in .Net?
此IEEE论文的引用主要是您正在寻找的内容:http://ieeexplore.ieee.org/Xplore/login.jsp?reload=true&url=/iel5/89/18967/00876309.pdf?arnumber=876309
谐波让你失望。而且,即使基本不存在,人类也可以在声音中找到基础知识!想想阅读,但要覆盖一半的字母。大脑填补了空白。
混音中其他声音的背景以及之前发生的事情对于我们如何感知音符非常重要。
答案 4 :(得分:4)
这是一个非常困难的模式匹配问题,可能适用于AI技术,如训练神经网络或遗传算法。
基本上,在每个时间点,您都会猜测正在播放的音符数量,音符,演奏音符的乐器,音量以及音符的持续时间。然后你将所有这些乐器所产生的所有谐波和泛音的大小相加,当它们在那个音量上播放时(包括攻击,衰变等)。从信号频谱中减去所有这些谐波的总和,然后最小化所有可能性的差异。模式识别砰砰声/吱吱声/拔除瞬态噪声/等。在笔记开头可能也很重要。然后做一些决策分析,以确保你的选择有意义(例如单簧管没有突然变成小号演奏另一个音符,然后80小时后再次返回),以最大限度地减少错误概率。
如果你可以限制你的选择(例如只有2个长笛演奏四分音符等),特别是对于泛音能量非常有限的乐器,它会使问题变得容易得多。
答案 5 :(得分:2)
另外http://www.schmittmachine.com/dywapitchtrack.html
dywapitchtrack库实时计算音频流的音高。音高是波形的主要频率(正在播放或演唱的'音符')。它表示为以Hz为单位的浮点数。
http://clam-project.org/可能会有所帮助。
答案 6 :(得分:2)