我对确定音频样本的音乐键很感兴趣。算法将如何(或可能)尝试近似音乐音频样本的键?
Antares Autotune和Melodyne是完成此类任务的两个软件。
谁能给外行一些解释,说明这将如何工作?通过分析和弦进行等的频谱来数学推断歌曲的键
这个话题使我非常感兴趣!
编辑精采的资料和大量的信息可以从对此问题做出贡献的每个人中找到 。
特别是来自:the_mandrill和DanielBrückner。
值得注意的是,这是一个非常棘手的问题,如果您没有信号处理方面的背景(或者对学习它没有兴趣),那么您将面临非常沮丧的时间。如果您希望解决这个问题,那么您会走得很远。我希望您确实对此感兴趣,因为它是一个非常迷人的领域。
最初存在音高识别问题,使用简单的单声乐器(例如语音),使用自相关或谐波和谱等方法(例如,参见Paul
R的链接),该问题相当容易实现。但是,您经常会发现这样做会产生错误的结果:您经常会得到预期的音高的一半或两倍。这被称为基音 周期加倍 或 倍频程误差
,它的出现主要是因为FFT或自相关假设数据随时间具有恒定特性。如果您有人类演奏的乐器,总会有一些变化。
有些人将 键 识别问题看作是先进行音高识别然后从音高序列中找到键的问题。如果您没有单音高音序列,这将 非常
困难。如果您确实有一个单音高音序列,那么确定琴键仍然不是一种清晰的方法:例如,如何处理半音符,或者确定它是大音调还是小音调。因此,您需要使用类似于Krumhansl的密钥查找算法的方法。
因此,鉴于此方法的复杂性,另一种方法是同时查看所有正在演奏的音符。如果您有和弦或不止一种乐器,那么您将拥有一次演奏许多正弦波的丰富频谱。每个音符都由一个基频的多个谐波组成,因此A(在440Hz时)将由440、880、1320的正弦曲线组成。此外,如果您演奏E(音高,请参见此图),则为659.25。
Hz 几乎是
是A的一倍半(实际上是1.498)。这意味着A的每3次谐波与E的每2次谐波重合。这就是和弦共享谐音的原因。(顺便说一句,西方和谐之所以起作用的全部原因是命运的怪癖,即2的第12根到7的幂接近1.5)
如果您查看的范围超出了五分之一到大,小和弦及其他和弦的范围,那么您会发现其他比率。我认为许多关键的查找技术会枚举这些比率,然后为信号中的每个频谱峰值填充直方图。因此,在检测到和弦A5的情况下,您期望会在440、880、659、1320、1760、1977处找到峰值。对于B5,它将是494、988、741等。因此,请创建一个频率直方图,信号中的正弦波峰值(例如,来自FFT功率谱)会增加直方图条目。然后,对于每个密钥AG,将直方图中的垃圾箱相加,条目最多的垃圾箱很可能是您的密钥。
那只是一个非常简单的方法,但可能足以找到弹奏或持续的和弦的音调。您还必须将信号切成较小的间隔(例如20ms)并分析每个信号以建立更可靠的估计。
编辑:
如果您想进行实验,那么我建议您下载一个程序包,例如Octave或CLAM,这样可以更轻松地可视化音频数据并运行FFT和其他操作。
其他有用的链接:
我目前正在处理音频样本。我从AVAssetReader获得它们,并有一个,其内容如下: 如您所见,我找到的唯一用于转换[Int16]->[Float]的方法是,但这样做会增加我的处理时间。是否存在将Int16指针转换为Float指针的其他方法?
我正在使用这个方法将WAV文件读到字节数组(如下所示)。现在我已经将它存储在字节数组中,我想改变声音的音量。 编辑:根据要求提供音频格式的一些信息:
在flutter应用程序中存储key.jks文件对于flutter应用程序发布是安全的吗? 存储库密码、keyPassword、keyAlias 我的key.properties文件:
我使用函数将音频文件读入。 这是音频的和ASBD: 因此,我们获得并交织了2个声道的音频,每个声道的16位符号为int init: 并读入缓冲区: 是的和实例,它在前面的代码中启动,为了节省空间,我没有粘贴到这里。 我试图完成的是在渲染回调中修改音频样本。 是否有可能从音频数据的UInt32阵列中获得Sint16左右声道样本?
问题内容: 我有一个应用程序,在其中使用流式播放模式来播放动态生成的音频。该应用程序不必即时响应输入,因此延迟问题不会困扰我程序的那一边。 问题是我有一个动画,需要与音频尽可能精确地“同步”,并且似乎从停止阻塞呼叫并请求更多数据到何时停止播放的时间,不同的设备具有不同的时间量。从扬声器播放音频。 我目前的解决方案可以帮助我解决大部分问题- 我计算到目前为止已传递的帧数,并将其与进行比较。它基本上看
这个问题通常是作为另一个问题的一部分来问的,但结果是答案很长。我决定在这里回答它,这样我就可以链接到其他地方。 虽然我目前还不知道Java可以为我们制作音频样本的方法,但如果将来发生变化,这可能是一个地方。我知道有一些类似的东西,例如,但仍然不是直接访问样本的方法。 我正在使用< code>javax.sound.sampled进行回放和/或录音,但我想对音频做些什么。 也许我想直观地显示它或以某
我计划在key vault上保留密钥,但我不清楚密钥和秘密的版本控制,我有一些关于Azure key vault上的key/Secret的版本控制的问题。 如何创建现有密钥的新版本? 是否可以解密用不同版本的相同密钥加密的数据? 是否可以为某个版本的密钥设置过期日期?