language-agnostic - 区分音乐文件中的乐器

标签 language-agnostic

给定一个音乐文件,是否可以分离出正在演奏的每种乐器? IE。假设我有一些Song.mp3,那首歌中有人声、吉他、贝斯和鼓。我想要 4 个“轨道”——每个轨道对应一种不同的乐器。

我猜这几乎是不可能的,因为乐器可以重叠,而且众所周知,区分重叠的声音非常困难,更不用说乐器了。

但是是否有一个库、算法或某种方法可以做到这一点,我很想知道如何实现。

最佳答案

我的本​​科项目涉及将音符从 WAV 文件转录为 MIDI 文件。我们只处理一种乐器的简单情况,可能一次演奏多个音符(例如钢琴)。我们在开始之前对该主题的研究表明,即使这个(即只有一台仪器)也被认为是不平凡的。基本上,问题是:

  • 查找在任何给定时间播放的频率。这可以通过一次一个小窗口的 DFT/FFT 来完成。
  • 使用一些启发式方法来猜测哪些频率是同一音符的和声,哪些频率属于不同音符。如果您知道正在演奏的乐器,这可能很容易,但在一般情况下很难,因为每种和声的幅度因乐器而异。例如,您可能有两个 C,与一台乐器相距一个 Octave ,或者您可能有一个 C,但来自另一台乐器。
  • 知道每次演奏的音符后,您必须猜测音符何时出现中断。您可以有一个长笔记或一系列短笔记。根据您用于初始 DFT 的窗口大小,您可能会得到不同的结果。

现在,如果您同时拥有不止一种乐器,并且没有两种乐器同时演奏相同的音符或和声,您可能可以使用一些启发式方法来区分这些乐器和声的大小或他们演奏的音符顺序。最有可能的是,有时两种乐器会演奏同一个音符。那么你实际上没有任何方法来决定是否有(a)一种乐器在演奏音符,(b)两种乐器以相同的音量演奏,(c)一种乐器演奏轻柔,另一种乐器演奏大声或(d)任何乐器其组合。

无论如何,这就是要解决的问题的简短列表。我不知道有什么算法可以在一般情况下解决这个问题。我认为这个问题还没有解决。

编辑:我的项目演示可以在 http://www-sipl.technion.ac.il/new/Archive/Special_Events/sipl2004/Projects_PowerPoint/WAV-to-MIDI.pdf 找到。

关于language-agnostic - 区分音乐文件中的乐器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698191/

相关文章:

language-agnostic - 进度条等的实际时间估计

data-structures - 用于快速位置查找的数据结构

version-control - 如何在 Perforce 树中查找未跟踪的文件? (svn状态的模拟)

c++ - 使用户界面保持最新状态的最佳方式?

c++ - GCD 如果正数和负数

language-agnostic - 通用代码重复检测工具

asynchronous - 为什么异步编程更快

math - float 学有问题吗?

算法 - 找到代表所有行的最小单元格子集

language-agnostic - 为什么将 super 类和子类颠倒?