Java中Wav文件的音乐转录

我有一个关于使用Java进行音乐转录的项目,事情是,我创建了一个记录声音并将其保存到WAV文件中的applet,播放器应该只播放他/她想要转录的片段,之后我被卡住了在这一点上,我必须从保存的WAV文件中获取信息并使用此信息创建一个MIDI文件,并在创建MIDI文件后,我必须为它生成一个乐谱(乐谱),所有这些必须完成在Java中。 我到处寻找关于如何完成这些工作的明确解释,但我没有找到任何直接的东西:(因为我是Java的新手,我希望有人能帮我解决这个问题,我在编程时遇到的问题是: 获取有关在WAV文件中播放的音符的信息。 知道笔记。 创建一个等同于WAV文件的MIDI文件。 从MIDI文件生成SCORE。 在对正在读取的数据执行分段后,我也尝试过快速傅立叶变换,但我认为这绝对是在错误的方向:( 如果有人可以帮助我完成上面指定的主题,以及如何只用Java编程,那将非常感激:) 顺便说一下,该项目是: 玩家在钢琴上弹奏音符>>记录他的演奏>>玩家获得他演奏的分数。     
已邀请:
我绝不是这方面的专家,所以如果这都是垃圾,我会提前道歉。 为了从文件中获取音符,我认为您需要在WAV文件上进行FFT(快速傅里叶变换),但一次只能使用10ms的声音。然后你会在那个时间帧上找到FFT的最高峰值,然后继续前进到10ms的下一个“帧”,或者其他什么。你再次进行FFT,如果最高峰值与前一个峰值的频率不同,那么它会说它是一个新音符。要查看音符的长度,请计算彼此特定阈值内的峰值数量,并将它们乘以每帧使用的时间(10ms等) 我会再说一遍,我不是专家,可能有其他方法可以做到这一点。 除此之外,我希望这有助于......甚至一点点。     
我不是那个领域的专家,但是一旦我玩Xuggler(java ffmpeg wrapper)。该库能够从媒体文件中提取大量有趣的数据,允许文件转码和许多其他很酷的功能。这是链接:http://www.xuggle.com/xuggler/     
你想做什么目前是不可能的。你所描述的范围超出了当前专业音乐课程所能做到的范围,并且他们拥有数百个人工年的程序员投入时间。 如果你彻底削减你的要求,你可能会取得成就。 找到声音的音高,使用FFT;这是最简单的部分;你必须在这里限制自己的单个音符,你将无法干净地阅读和弦。 你将无法发现曲调的时间签名或速度(bpm) - 你唯一的机会是在你的应用程序中包含某种节拍器并强制玩家坚持节拍。如果你想支持挥杆时间,它也必须由玩家配置。 制作midi时,对所有音符进行定量(=将其开始和结尾移动到最接近的1/4,1/8或1/16的小节) 使用准备好的排版系统来创建分数; musictex可能适合你;生成一个tex文件比为自己绘图要容易得多;如果我是你,我会忽略排版音乐的一些规则(我肯定会放弃光束;关于它们的规则有很多) 如果你把自己限制在单个旋律中,选择忽略大部分音乐排版,让钢琴演奏者使用你自己的节拍器并限制他的韵律选择,你可能会成功。     
我有同样的想法,尝试了一个非常简单但不完整的解决方案。 正如fdreger的帖子指出的那样,即使是专业软件也无法正确执行此任务。 (我尝试了一些IntelliScore,AudioScore和其他软件的演示版本,在使用复音音乐时,这些软件似乎都没有特别高效) 但如果您想尝试自己,我使用了这里的源代码:http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/ 这有助于我找出如何确定频率。 (FFT将更准确,但更复杂)。 要在屏幕上显示注释,我使用了可在此处找到的abc4j库: http://code.google.com/p/abc4j/ 但是,如上所述,它仅适用于单声道音乐(单一声音)。 祝好运!     
有一个非常好的开源声音编辑器叫做Audacity。是的,它是用C ++编写的,但您可以在源代码中找到您正在寻找的答案。将C ++代码翻译成Java并不难。     

要回复问题请先登录注册