我做了很多谷歌搜索,但找不到一个关于如何确定 mp3 文件的音符的例子。
到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,可以从中计算音频文件的音高,并根据音高符号导出音符。
但是后来我读到mp3 文件格式在时域中,由于有损压缩格式不包含频率分析所需的样本值……这是否意味着您必须将 mp3 转换为 wav文件以计算密钥?
我发现了几个用于视觉目的的实时音高检测示例,但不适用于分析整个 mp3 文件并输出音乐键。
我希望有人能指出我正确的方向。
谢谢。
我做了很多谷歌搜索,但找不到一个关于如何确定 mp3 文件的音符的例子。
到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,可以从中计算音频文件的音高,并根据音高符号导出音符。
但是后来我读到mp3 文件格式在时域中,由于有损压缩格式不包含频率分析所需的样本值……这是否意味着您必须将 mp3 转换为 wav文件以计算密钥?
我发现了几个用于视觉目的的实时音高检测示例,但不适用于分析整个 mp3 文件并输出音乐键。
我希望有人能指出我正确的方向。
谢谢。
我创建了一个应用程序 PitchScope Player,它可以实时对 MP3 文件进行音高检测,其完整的源代码发布在 GitHub 上,但它是用 C++ 编写的。音高检测和音调检测,尤其是实时检测,要求极高,可能需要 C++ 的速度才能在此时执行。您刚刚开始探索一项非常困难的音频工程任务,并且确实需要首先了解我们如何感知“音高”、“谐波”是什么的物理学背景,并探索如何制作频率的选择- 原始信号的域变换(参见下面的维基百科链接)。
当在钢琴上按下一个键时,我们听到的不仅仅是一个声音振动频率,而是在不同数学相关频率上发生的多个声音振动的复合。这种不同频率的振动复合的元素被称为谐波或分音。例如,如果我们按下钢琴上的中间 C 键,复合谐波的各个频率将从 261.6 Hz 作为基频开始,523 Hz 将是 2 次谐波,785 Hz 将是 3 次谐波,1046 Hz 将是 4 次谐波等。后面的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。我们检测音高通过寻找在频率间隔中具有这种数学关系的谐波组。
我没有使用 FFT,而是使用修改后的对数 DFT 变换,以便其频率通道可以与音乐信号中谐波的位置对齐。对数 DFT 变换还在执行中提供了明显的速度优势。
一旦您检测到音乐信号中的多个音高,您就可以通过根据该音乐信号中的成员音符数量对 12 个不同的候选键进行评分来检测音乐键。我的另一个应用 PitchScope Navigator 也可以实时检测音调。
您可能想要获得一个 C++ 编译器并重新编译我的源代码,以便您可以逐步执行它以了解我的算法是如何工作的。它还将解码 MP3 文件。您还可以从网络上的许多地方下载该应用程序的可执行文件 PitchScope Player,以查看它在带有您选择的 MP3 文件的 Windows 机器上的执行情况。
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
下面是对数 DFT(由我的 C++ 软件创建)在复调 mp3 录音中吉他独奏 3 秒的图像。它显示了演奏独奏时吉他上各个音符的谐波如何出现。对于这个对数 DFT 上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。