【问题标题】:Music Transcription of Wav files in Java [closed]Java中Wav文件的音乐转录[关闭]
【发布时间】:2011-06-22 14:30:16
【问题描述】:

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

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

  1. 获取有关在 WAV 文件中播放的音符的信息。
  2. 了解注释。
  3. 创建一个与 WAV 文件等效的 MIDI 文件。
  4. 从 MIDI 文件生成 SCORE。

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

如果有人可以帮助我解决上面指定的主题,以及如何仅用 Java 编写这些内容,我们将不胜感激 :)

顺便说一下,项目是:
演奏者在钢琴上弹奏音符>>记录他的演奏>>演奏者得到他演奏的分数。

【问题讨论】:

  • wav-to-midi conversion的可能重复
  • 出于好奇,你能不能直接读取 MIDI 格式的输入?大多数乐器都支持某种 MIDI 输出(在钢琴的情况下,一个 MIDI 键盘),似乎这将完全消除进行这种困难的后处理的需要。
  • 没有为 WAV 文件生成乐谱的项目,不是已经存在 MIDI:D
  • @Jam 那不是一个很好的编辑;如果您打算花时间插入<br /> 换行符,那么您真的应该将其设为“真实”列表。此外,您可以在行尾添加两个空格的换行符,不需要<br />
  • +1 表示写得很好的问题,尽管它类似于an older question

标签: java pitch-tracking transcription


【解决方案1】:

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

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

我再说一遍,我不是专家,可能还有其他方法。

除此之外,我希望这会有所帮助……哪怕只是一点点。

【讨论】:

  • 是的,它在 10 毫秒段的想法上帮助了我一点谢谢 :)
  • 不客气!我很高兴这篇文章有一些的用途:-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案4】:

      我有同样的想法,并尝试了一个非常简单但不完整的解决方案。 正如 fdreger 的帖子所指出的,即使是专业软件实际上也无法正确执行此任务。 (我尝试了一些 IntelliScore、AudioScore 和其他一些软件的演示版本,但在处理和弦音乐时,这些软件似乎都不是特别有效)

      但是如果你想自己尝试一下,我使用了这里的源代码:http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/ 这帮助我找出了如何确定频率。 (FFT 会更准确,但会更复杂)。

      为了在屏幕上显示注释,我使用了 abc4j 库,可以在这里找到: http://code.google.com/p/abc4j/

      但是,如上所述,它仅适用于单声道音乐(单声部)。

      祝你好运!

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 非常感谢 :) 但我正在寻找 Java 中已经可用的东西来帮助我让这个东西工作,非常感谢我会尝试从 Audacity 获取我需要的所有信息 :D
        猜你喜欢
        • 2013-03-07
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 2012-04-06
        • 2010-11-15
        • 1970-01-01
        相关资源
        最近更新 更多