这是一个比您想象的更复杂的过程。
这个研究问题通常被称为音乐转录:将音乐的低级表示(例如波形)转换为高级表示(如 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