music21:挑选旋律曲目

music21: picking out melody track

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

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

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

SMF 格式对事件组织到轨道的方式没有限制。通常每个通道有一个轨道,但也可以在一个轨道中有多个通道,或者多个轨道具有同一通道的事件。

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

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

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

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

我没有使用 .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)