wav到midi转换

Posted

技术标签:

【中文标题】wav到midi转换【英文标题】:wav-to-midi conversion 【发布时间】:2011-01-08 17:33:12 【问题描述】:

我是这个领域的新手——但我需要在 java 中执行 WAV 到 MIDI 的转换。 有没有办法知道 WAV 到 MIDI 转换的具体步骤是什么? 我有一个非常粗略的想法,就像您需要的那样; 对 wav 文件进行采样、过滤、使用 FFT 进行频谱分析、特征提取,然后将提取的特征写入 MIDI。 但我找不到可靠的资料或论文,如如何做到这一切? 有人可以给我一些线索,比如如何以及从哪里开始? 是否有任何开源 API 可用于此 WAV 到 MIDI 转换过程?

提前谢谢

【问题讨论】:

也检查一下***.com/questions/1628071/… wav to midi conversion的可能重复 【参考方案1】:

这是一个比您想象的更复杂的过程。

这个研究问题通常被称为音乐转录:将音乐的低级表示(例如波形)转换为高级表示(如 MIDI 甚至乐谱)的行为.

解决方案的复杂程度取决于输入数据的复杂程度。大量的研究论文只针对单声道钢琴或鼓的音乐转录……因为它们很容易转录。 (相对而言。)小提琴更难。声音就更难了。小提琴加人声加钢琴要难得多。交响乐几乎是不可能的。你明白了。

音乐转录的基本要素涉及以下任何重叠领域:

    (多)音高估计 乐器识别、音色建模 节奏检测 音符开始/偏移检测 形式/结构建模

在 Google Scholar 或 ISMIR 会议中搜索有关“音乐转录”的论文:http://www.ismir.net。如果您对上述子主题之一更感兴趣,我可以进一步指出。祝你好运。

编辑:话虽如此,我们都可以在网络上找到现有的解决方案。随意尝试。但是当你这样做时,用批判的眼光和耳朵评估它们。哪些类型的音频信号会导致转录失败?

编辑 2:啊,你只是为钢琴做这个。好的,这是可行的。音乐转录已经发展到可以很好地转录单音钢琴的地步。拉赫玛尼诺夫协奏曲仍然会带来问题。

我们的建议取决于您的最终目标。您声明“需要Java中执行...”。所以听起来你只是想让一些东西工作,不管它是如何让你到达那里的。在那种情况下,我 100% 同意其他人:使用存在的东西。

这实际上是一个有趣的问题;我知道的所有 MIR 库通常都是 C/C++/Python/Matlab。但不是Java。 EchoNest 有一个 Java API,但我认为它不会进行笔记级别的转录。 http://developer.echonest.com。 (编辑:它进行音符级别的转录。返回的数据包括音高、音色、节拍、tatum 等。但我发现复调仍然是一个问题。)

哦,Marsyas 是基于 Java 的。凉爽的。我以为这只是 C++。 http://marsyas.info/ 我推荐这个。它由 MIR 教授 George Tzanetakis 开发。它进行信号级分析,应该是一个不错的选择。

现在,如果这是为了获得有趣的学习体验,我认为您可以使用 Java 中的声音处理实用程序来试验 WAV 信号,看看会产生什么结果。

编辑:此页面比我更好地描述了 MIR 软件:The Tools We Use

对于Matlab,您可能对MIR Toolbox感兴趣

这是一个不错的常见数据集页面:MIR Datasets

【讨论】:

史蒂夫,非常感谢您的回答。我想了解更多并探索这个领域。您提到了“我知道的所有 MIR 库......”。我不受任何特定语言的约束。你能推荐一个库(最好是开源的,但不是必需的) - 任何语言?我对单一乐器的转录特别感兴趣。此外,当前的技术状态是否允许“实时”转录?即普通 PC 可以在播放音乐时对其进行转录? 不客气。我认为,普通 PC 上的实时转录效果很差。我和其他许多人都不会为此烦恼,因为我们很难让 离线 转录变得完美!很少有比 80%(笔记)更好的转录率。有关更多工具,请参阅编辑。【参考方案2】:

对于该领域的新手来说,这是一项非常艰巨的任务,除非您的意思是您通常熟悉信号分析和特征检测并希望更具体地研究自动转录。

没有用于 WAV 到 MIDI 转换的 API。 Vamp 是一个用于特征提取插件的框架,但要进行自动转录,您需要使用现有插件的所有功能,并实现它们中尚不存在的功能。

浏览the vamp download page上的插件描述,如果你想这样做,任何你不理解的描述都是你应该开始研究的主题。

【讨论】:

感谢史密斯的建议。至少现在我知道寻找能够做到这一点的 API 是没有意义的。你可以使用带有 java 代码的插件吗?特征提取——我必须使用算法吗?仅仅因为我知道一种算法,我怎么能把它归结为代码?我必须使用 Matlab 并与一种语言(比如 Java)集成吗?你能给我一张照片吗?再次感谢史密斯 Vamp 使用 C、C++。没有Java插件和这样的资源吗?那将是最有用的。如何在 java 代码中使用插件?提前谢谢 Java 在信号处理/分析中并不常见,因为它是相对 CPU 密集型的,而且直到最近,硬件还不够快,无法以可接受的速度在 Java 中执行此类操作。看起来史蒂夫找到了一个很好的线索。对于更高级别的方法,还可以使用像 csound csounds.com 这样的环境,它提供了大量用于合成和分析声音的工具,而无需担心显式内存分配和释放问题。 关于Java中如何使用插件,插件是一个动态加载的库,可以在Java程序中使用JNI来加载和访问:en.wikipedia.org/wiki/Java_Native_Interface【参考方案3】:

如果您不需要自动执行此任务(即,对于人们可以上传 MP3 并获取 MIDI 文件的网站),那么您应该考虑使用像 Melodyne 这样的工具,它已经非常擅长此操作.正如史蒂夫所指出的,这是一项非常难以完成的任务,即使是目前最好的算法和解决方案也不是 100% 可靠的。

因此,如果您只是在做工作室工作并且需要进行一些转换,那么使用已经为该任务设计的工具可能会为您节省一点时间(并且会让人头疼)。

【讨论】:

【参考方案4】:

Dolphin,很抱歉直言不讳,但你完全低估了这个问题。您想要实现的目标 - 涉及演奏时使用的所有参数的完整钢琴声音转录需要与在该领域工作多年的人员进行大量研究。即使是一组信号处理博士也必须投入大量工作才能接近你的意思。音乐转录需要数十年的工作才能达到半可靠的程度。我建议您选择一个可以比这更好地解决的问题。

【讨论】:

【参考方案5】:

这是一个仍在高度发展的领域,但是,有一些(实验性)算法可用。

您可以安装 sonic annotator 并使用一些 vamp 插件。

例如:

./sonic-annotator file.wav -d vamp:qm-vamp-plugins:qm-transcription:transcription -w midi

./sonic-annotator file.wav -d vamp:silvet:silvet:notes -w midi

./sonic-annotator file.wav -d vamp:ua-vamp-plugins:mf0ua:mf0ua -w midi

【讨论】:

以上是关于wav到midi转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 MATLAB 将 .mid 转换为 .wav

MIDI 或 WAV 文件到频率和持续时间的数组

如何以编程方式在 Android 中将 .mid 转换为 .wav 文件?

音频数据文件格式(PCM,WAV,MIDI)简记

如何使用流体合成器将单个 midi 通道导出为 wav?

我需要一些帮助,使用 VLC(或任何其他软件)将 midis 批量转换为 mp3 及其各自的声音库 [关闭]