8

我有一个关于使用 Java 进行音乐转录的项目,问题是,我创建了一个小程序,可以记录声音并将其保存到 WAV 文件中,播放器应该只播放他/她想要转录的作品,之后我就卡住了当时我必须从保存的 WAV 文件中获取信息并使用此信息创建 MIDI 文件,并且在创建 MIDI 文件后,我必须为其生成乐谱(乐谱),所有这些都必须完成在爪哇。

我到处寻找关于如何完成这些东西的清晰解释,但我没有找到任何直接的东西:(因为我是 Java 新手,我希望有人能帮我解决这个问题,我在编程时遇到问题的主题是:

  1. 获取有关在 WAV 文件中播放的音符的信息。
  2. 知道笔记。
  3. 创建与 WAV 文件等效的 MIDI 文件。
  4. 从 MIDI 文件生成 SCORE。

在对正在读取的数据执行分割后,我也尝试过快速傅立叶变换,但我认为这绝对是错误的方向:(

请如果有人可以在上面指定的主题上为我提供帮助,以及如何仅在 Java 中对这些主题进行编程,我们将不胜感激:)

顺便说一句,该项目是:
玩家在钢琴上弹奏音符>>记录他的演奏>>玩家获得他的演奏分数。

4

5 回答 5

3

我绝不是这方面的专家,所以如果这都是垃圾,我提前道歉。

要从文件中获取音符,我认为您需要对 WAV 文件进行FFT(快速傅立叶变换),但一次只有 10 毫秒的声音。然后你在 FFT 上找到那个时间帧的最高峰,然后移动到下一个 10 毫秒的“帧”,或者其他什么。你再做一次 FFT,如果最高峰值与前一个峰值的频率不同,那么它会说这是一个新的音符。要查看音符有多长,请计算彼此在某个阈值内的峰值数量,然后将它们乘以每帧使用的时间(10 毫秒等)

我再说一遍,我不是专家,可能还有其他方法可以做到这一点。

除此之外,我希望这会有所帮助......甚至有点。

于 2011-02-07T08:46:05.373 回答
1

我不是该领域的专家,但曾经我玩过 Xuggler(java ffmpeg 包装器)。这个库能够从媒体文件中提取大量有趣的数据,允许文件转码和许多其他很酷的功能。这是链接:http ://www.xuggle.com/xuggler/

于 2011-02-07T09:25:23.570 回答
1

I had the same idea in mind and tried out a very simple but incomplete solution. As fdreger's post pointed out, even professional software isn't actually able to perform this task correctly. (I tried some demo-versions of IntelliScore, AudioScore and some other software and none of these seemed to be particularly efficient when working with polyphonic music)

But if you want to try out on yourself, I used the source code found here : http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/ that helped me to find out how to determine the frequency. (FFT will be more accurate, but a bunch more complex).

To display the notes on screen, I used the abc4j library that can be found here : http://code.google.com/p/abc4j/

But, as pointed out above, it works only with monophonic music (one single voice).

Good Luck!

于 2012-02-12T17:15:07.050 回答
1

你想做的事情目前是不可能的。您所描述的范围超出了当前专业音乐程序所能做的任何事情,并且它们实际上投入了数百人年的程序员时间。

如果你从根本上削减你的要求,你可能会有所成就。

  • 要找到声音的音高,请使用 FFT;这是最简单的部分;您将不得不在此处将自己限制为单个音符,您将无法清晰地阅读和弦。

  • 您将无法发现曲调的拍号或速度 (bpm) - 您唯一的机会是在您的应用程序中包含某种节拍器并强制播放器遵守节拍。如果要支持挥杆时间,也必须由玩家配置。

  • 制作 midi 时,量化所有音符(=将它们的开始和结束移动到最接近的 1/4、1/8 或 1/16 小节)

  • 使用现成的排版系统来创建乐谱;musictex 可能对你有用;生成 tex 文件比自己绘制要容易得多;如果我是你,我会忽略一些排版音乐的规则(我肯定会放弃横梁;关于它们的规则有很多)

如果你把自己限制在单一的旋律上,选择忽略大部分音乐排版,让钢琴演奏者使用自己的节拍器并限制他的节奏选择,你可能会成功。

于 2011-03-11T10:48:33.143 回答
0

有一个非常好的开源声音编辑器,叫做Audacity。是的,它是用 C++ 编写的,但您可能会在其源代码中找到您正在寻找的答案。将 C++ 代码翻译成 Java 并不难。

于 2011-02-07T08:49:45.700 回答