2

我正在处理大量使用music21 为现有流行歌曲制作的midi 文件。

虽然通道 10 是为打击乐保留的,但旋律轨道遍布不同的通道,所以我想知道是否有一种有效的方法来挑选主旋律(人声)轨道。

我猜一种方法是选择由单个音符而不是重叠谐波(和弦)组成的曲目,以及在整首歌曲中播放的曲目,但还有其他有效的方法吗?

4

3 回答 3

1

根据您的特定文件的编码方式,您可以尝试根据每个部分的名称进行过滤。看起来像这样:

import music21
from music21 import *

piece = converter.parse("full_path_to_piece.midi")
for part in piece.parts:
  print(part[0].bestName()) # replace this print statement with a relevant if statement
于 2016-12-08T16:10:24.643 回答
0

SMF 格式对如何将事件组织成轨道没有任何限制。每个通道有一个轨道是很常见的,但一个轨道中也可以有多个通道,或者同一通道有多个带有事件的轨道。

轨道的组织完全由人类决定。您不太可能编写可以正确确定某个随机大脑如何工作的代码。

您所要做的只是约定(例如,旋律可能出现在第一首曲目中,或者具有某种结构),但是您必须知道这些约定是否实际用于您正在处理的文件中。

于 2016-12-08T15:35:11.107 回答
0

我发现不是使用.bestName(),而是.partName找到正确的旋律非常有用。文档可以在这里找到:http ://web.mit.edu/music21/doc/moduleReference/moduleStream.html#part

这是我使用它的方式:

midi_data = converter.parse(data_fn) #data_fn is the path to the .mid file I use
for part in midi_data.parts:
    print(part.partName)
于 2018-03-14T23:43:03.570 回答