这是一个比你想象中更为复杂的过程。
这个研究问题通常被称为音乐转录:将音乐的低级表示(例如波形)转换为更高级别的表示,如MIDI甚至乐谱。
你的解决方案的复杂性取决于输入数据的复杂性。许多研究论文仅就单声道钢琴或鼓进行音乐转录……因为它们很容易转录。(相对来说)小提琴更难。人声更难。小提琴加上人声和钢琴要更困难。交响乐几乎不可能。你明白了吧。
音乐转录的基本元素包括以下任意重叠区域:
在Google学术或ISMIR会议记录中搜索“音乐转录”的论文:http://www.ismir.net。如果你更感兴趣其中的某个子主题,我可以为你指引更多资源。祝好运。
编辑:话虽如此,我们可以在网上找到现有的解决方案。请随意尝试它们。但是,在这个过程中,请以批判的眼光和耳朵来评估它们。什么类型的音频信号会导致转录失败?
编辑2:啊,你只需要钢琴。好的,这是可行的。音乐转录已经发展到可以很好地转录单声道钢琴的程度了。但是拉赫玛尼诺夫协奏曲仍然会带来问题。
我们的建议取决于你的最终目标。你说“需要在Java中执行……”。所以看起来你只是想让它能够工作,而不考虑它如何实现。在这种情况下,我完全同意其他人的建议:使用现有的解决方案。
这其实是一个有趣的问题;我所知道的所有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软件:我们使用的工具
对于Matlab,您可能会对MIR工具箱感兴趣。
这里是一个常见数据集的好网页:MIR数据集
因此,如果您只是在录音室工作并需要进行几个转换,使用已经为此任务设计的工具可能会节省您一些时间(并避免很多麻烦)。
这是一个仍在高度开发中的领域,但是已经有一些(实验性)的算法可用。
您可以安装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
Dolphin,抱歉直言不讳,但你完全低估了这个问题。你想实现的——涉及到演奏时使用的所有参数的完整钢琴音乐转录——需要大量研究,并与在该领域工作多年的人合作。即使是一组信号处理的博士也必须投入大量的工作才能接近你所说的东西。音乐转录甚至需要几十年的工作才能实现一半的可靠性。我建议你选择一个你能够比这个更好地管理的问题。