Javascript:如何确定 mp3 文件的音调

Posted

技术标签:

【中文标题】Javascript:如何确定 mp3 文件的音调【英文标题】:Javascript: How to determine the musical key of mp3 files 【发布时间】:2016-09-09 12:11:27 【问题描述】:

我在 Google 上进行了很多搜索,但无法找到有关如何确定 mp3 文件的音符的示例。

到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,可以从中计算音频文件的音高,并根据音高符号导出音符。

但后来我读到the mp3 file format is in the time domain,由于有损压缩格式不包含频率分析所需的样本值...这是否意味着您必须将 mp3 转换为 wav 文件以便要计算密钥吗?

我发现了几个用于视觉目的的实时音高检测示例,但不适用于分析整个 mp3 文件并输出音调。

我希望有人能指出我正确的方向。

谢谢。

【问题讨论】:

“mp3 文件格式在时域中”——嗯,不完全是。它是未压缩文件的编码(数据压缩)版本,例如WAV PCM,它又是时域信号的表示。 MP3 是一种有损格式,可以改变和过滤频率。你无法恢复不存在的东西。但是阅读您提供的信息,您可以看到转换确实应该/可能会有所帮助,因为 FFT 适用于“原始”数据。我只是不知道这与 javascript 有什么关系?尤其是在客户端上,我不太确定您是否能够读取此类数据。 这是一个非常复杂的问题,许多研究人员仍在研究,没有简单的一刀切解决方案。不过,忘记 MP3 与 WAV,这不是问题。你需要得到信号,然后用它做很多复杂的事情来估计密钥。 好的,但是不能根据时域中的幅度来确定音高符号吗? 这是一个有关实时音高检测(在 C# 中)和我的少数音高估计器(谐波积谱、韦尔奇谱图、布莱克曼图基谱估计器)的 Python 实现的相关问题:gist.github.com/fasiha/957035272009eb1c9eb370936a6af2eb你关于音乐调的更广泛的问题是一个超出我对音乐非常有限的理解的问题——你能解释一下,如果你有一个音高序列(以赫兹为单位),你将如何从中获得音乐调? 【参考方案1】:

我创建了一个应用程序 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)。我们通过寻找在频率间隔上具有数学关系的谐波组来检测 pitch

我没有使用 FFT,而是使用修改后的对数 DFT 变换,以便其频率通道可以与音乐信号中谐波所在的位置对齐。对数 DFT 变换还在执行中提供了明显的速度优势。

一旦您检测到音乐信号中的多个音高,您就可以通过根据该音乐信号中的成员音符数量对 12 个不同的候选键进行评分来检测音乐键。我的另一个应用 PitchScope Navigator 也可以实时检测音调。

您可能想要获得一个 C++ 编译器并重新编译我的源代码,以便您可以逐步执行它以了解我的算法是如何工作的。它还将解码 MP3 文件。您还可以从 Web 上的许多地方下载该应用程序的可执行文件 PitchScope Player,以查看它在带有您选择的 MP3 文件的 Windows 机器上的执行情况。

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

下面是对数 DFT(由我的 C++ 软件创建)在复音 mp3 录音中吉他独奏 3 秒的图像。它显示了演奏独奏时吉他上各个音符的谐波如何出现。对于这个对数 DFT 上的每个音符,我们可以看到它的多个谐波垂直延伸,因为每个谐波将具有相同的时间宽度。

【讨论】:

以上是关于Javascript:如何确定 mp3 文件的音调的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 mp3 文件头的长度?

使用纯 JavaScript 和 Chromium WebAudio API 生成音调

如何在不实际转换的情况下确定转换后音频文件的理论文件大小(即 mp3 到 wav)

如何在没有任何 html5 功能的情况下通过 javascript 播放 mp3 文件?

在java中录制音频并确定实时是不是播放了x频率的音调,如果是这样的话

如何在 JavaScript 中从 MP3 文件中读取元数据属性?