我正在处理大量使用音乐21为现有流行歌曲制作的midi文件。
虽然第10频道是为打击乐而保留的,但是旋律音轨遍布不同的频道,所以我想知道是否有一种有效的方式来挑选主旋律(人声)音轨。
我猜测一种方法是选择一个由单个音符组成的音轨而不是重叠的和声(和弦),以及在整首歌曲中播放的音轨,但是还有其他有效的方法吗? / p>
答案 0 :(得分: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
答案 1 :(得分:0)
SMF格式对事件如何组织成轨道没有限制。每个频道通常有一个音轨,但也可以在一个音轨中有多个音轨,或者在同一个音频通道中有多个音轨。
轨道的组织完全由人类决定。您不太可能编写能够正确确定随机大脑如何工作的代码。
所有你必须继续的是约定(例如,旋律可能在第一首曲目中,或者具有某种结构),但是你必须知道这些约定是否实际用在了你的文件中。重新处理。
答案 2 :(得分: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)