区分音乐文件中的乐器

时间:2009-03-30 17:28:48

标签: language-agnostic

鉴于音乐文件,是否可以拆分正在播放的每个乐器?即假设我有一些歌曲.mp3,那首歌中有人声,吉他,贝司和鼓。我想得到4个“曲目” - 每个不同的乐器一个。

我猜这样做几乎是不可能的,因为乐器可以重叠,而且很难区分重叠的声音,更不用说乐器了。

然而是有一个库,一个算法,或者这样做的一些方法,我很想知道如何。

6 个答案:

答案 0 :(得分:29)

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

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

现在,如果您一次有多个乐器,并且没有两个乐器同时演奏相同的音符或和声,您可能可能能够使用某种启发式来区分乐器关于和声的大小或他们正在演奏的音符序列。最有可能的是,有两种乐器会播放同一音符。然后你真的没有办法决定是否有(a)一个乐器演奏音符,(b)两个乐器以同一音量演奏,(c)一个演奏柔和而另一个演奏大声或(d)任何它的组合。

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

修改:我可以在http://www-sipl.technion.ac.il/new/Archive/Special_Events/sipl2004/Projects_PowerPoint/WAV-to-MIDI.pdf

找到我的项目演示文稿

答案 1 :(得分:9)

我实际上碰到了一个非常有趣的算法ICA(独立分量分析)。 这种算法背后的概念不是来自信号处理世界,而是来自概率理论。 我们用它来分离两首混合成单个mp3文件的歌曲。 你可以在Matlab \ C ++ \ Python中找到一个名为FastICA here的实现库。 试一试,真的很好。

答案 2 :(得分:2)

每个乐器都有一个特有的虚假振荡,因此如果您将单个音符(使用DFT / FFT)隔离并比较该时间点的其他频率,您可能至少会区分不同类型的乐器。

答案 3 :(得分:1)

最简单的方法是首先单独维护乐器,这就是为什么许多中级音乐处理应用程序使用MIDI以抽象形式在不同的轨道上存储乐器消息。

答案 4 :(得分:0)

长话短说:除了你的四种乐器是纯正弦波的合成器之外,你不能这样做。

答案 5 :(得分:-1)

mp3是一种有损格式。它的工作原理是对一个人的声学反应进行建模,并丢弃一个人认为无法听到的信息。本质上更响亮的乐器,掩盖软乐器 - 柔和的乐器被抛弃。这意味着你永远无法提取最初进入mp3的内容,更不用说将乐器分开了。

我有一个音响工程师的朋友,他总是要求那些要求他重新设计录制为mp3的曲目的人说“不”。

几个星期前,我看到一项研究表明,年轻一代实际上更喜欢mp3的声音而不是更完整的格式,因为这是他们长大的。