我对确定音频样本的音乐键感兴趣。一种(或者可能的)算法如何尝试近似计算出一个音乐音频样本的键呢?
Antares Autotune和Melodyne是两个能够完成这种任务的软件。
有没有人可以用通俗易懂的方式解释一下这是如何工作的呢?使用数学方法通过分析和弦进程等频谱来推导一个歌曲的键。
这个话题非常吸引我!
编辑 - 来自所有为这个问题做出贡献的人的精彩资源和丰富信息。
尤其是来自: the_mandrill 和 Daniel Brückner。
我对确定音频样本的音乐键感兴趣。一种(或者可能的)算法如何尝试近似计算出一个音乐音频样本的键呢?
Antares Autotune和Melodyne是两个能够完成这种任务的软件。
有没有人可以用通俗易懂的方式解释一下这是如何工作的呢?使用数学方法通过分析和弦进程等频谱来推导一个歌曲的键。
这个话题非常吸引我!
编辑 - 来自所有为这个问题做出贡献的人的精彩资源和丰富信息。
尤其是来自: the_mandrill 和 Daniel Brückner。
那只是一个非常简单的方法,但可能足以找到弹奏或持续和弦的键。你还必须将信号分成小间隔(例如20ms),并分析每个间隔以建立更健壮的估计。
编辑:
如果你想尝试一下,我建议下载像Octave或CLAM这样的软件包,它可以更轻松地可视化音频数据并运行FFT和其他操作。
其他有用的链接:
我在大学里致力于将多声部CD录音转写成乐谱的问题上工作了两年多。这个问题是出了名的难。与该问题相关的第一篇科学论文可以追溯到20世纪40年代,直到今天为止,对于一般情况还没有强大的解决方案。
通常所说的所有基本假设都不完全正确,其中大部分都错得足以使它们除了非常简单的情况外都无法使用。
泛音频率不是基础频率的倍数——存在非线性效应,因此高谐波会偏离预期的频率——而且不仅仅是几赫兹的偏差;在你期望第6个时,很常见地发现第7个谐波。
傅里叶变换与音频分析并不相容,因为人们感兴趣的频率是按对数间隔排列的,而傅里叶变换产生的频率是线性排列的。在低频时,你需要高频率分辨率来区分邻近的音高——但这会导致时间分辨率变差,你就失去了能够分离快速演奏的音符的能力。
音频录音(可能)并不包含重建乐谱所需的所有信息。我们的音乐感知的很大一部分发生在我们的耳朵和大脑中。这就是为什么一些最成功的系统是专家系统,拥有有关(西方)音乐结构的大型知识库,只依靠信号处理从音频录音中提取信息的一小部分。
当我回到家后,我会翻阅我已经阅读过的论文,并选择20到30篇最相关的论文并在此添加。我真诚地建议在决定实现某些东西之前先阅读它们——如前所述,大多数常见假设都有些不正确,你真的不想在实施和测试时重新发现这些已经发现和分析了50年以上的事情。
这是一个难题,但也很有趣。我真的很想听听你尝试了什么以及它的效果如何。
现在您可以了解一下常量Q变换、倒谱法和Wigner(-Ville)分布。还有一些关于如何从短时傅里叶谱的相移中提取频率的好论文 - 这允许使用非常短的窗口大小(以获得高时间分辨率),因为可以确定频率的精度比基础傅里叶变换的频率分辨率高数千倍。
所有这些变换都比普通的傅里叶变换更适合音频处理问题。如果要改进基本变换的结果,请查看能量重新分配的概念。
在这里,样本大小可能非常重要。理想情况下,每个样本将是单独的音符(这样就不会在一个样本中得到两个和弦)。如果您过滤并集中于低频率,您可能可以利用通常与打击乐器相关联的音量峰来确定歌曲的节奏,并将算法“锁定”在音乐的节拍上。从半拍长的样本开始,然后进行调整。准备好丢弃一些没有太多有用数据的样本(例如,在滑动中间取样的样本)。
这是一个复杂的话题,但确定单个键(单个音符)的简单算法如下:
对包含音符的样本的一部分进行傅里叶变换,例如4096个样本(确切大小取决于您的分辨率要求)。确定频谱中的功率峰值 - 这是音符的频率。
如果有和弦、不同的“乐器/效果”或非同音乐模式,则情况会变得更加紧密。