我正在处理大量使用music21 为现有流行歌曲制作的midi 文件。
虽然通道 10 是为打击乐保留的,但旋律轨道遍布不同的通道,所以我想知道是否有一种有效的方法来挑选主旋律(人声)轨道。
我猜一种方法是选择由单个音符而不是重叠谐波(和弦)组成的曲目,以及在整首歌曲中播放的曲目,但还有其他有效的方法吗?
根据您的特定文件的编码方式,您可以尝试根据每个部分的名称进行过滤。看起来像这样:
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
SMF 格式对如何将事件组织成轨道没有任何限制。每个通道有一个轨道是很常见的,但一个轨道中也可以有多个通道,或者同一通道有多个带有事件的轨道。
轨道的组织完全由人类决定。您不太可能编写可以正确确定某个随机大脑如何工作的代码。
您所要做的只是约定(例如,旋律可能出现在第一首曲目中,或者具有某种结构),但是您必须知道这些约定是否实际用于您正在处理的文件中。
我发现不是使用.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)