music21 getElementsByClass 未显示 class stream.Voice 的任何输出

music21 getElementsByClass not showing any output for class stream.Voice

我很难理解为什么下面的代码在大约一年前 运行 无缝地抛出错误。代码片段来自一个流行的 Coursera 课程。 Music21 软件包最近在 stream.Voice 附近有一些变化吗?

data_fn = 'data/original_metheny.mid'
midi_data = converter.parse(data_fn)
melody_stream = midi_data[5] # For Metheny piece, Melody is Part #5.
melody1, melody2 = melody_stream.getElementsByClass(stream.Voice)

抛出的错误是ValueError: not enough values to unpack (expected 2, got 0),这意味着stream.Voice class 没有输出,而之前有相同数据(midi 文件)的输出。 melody_stream.getElementsByClass('Measure') 确实显示输出。

你能指导如何调试吗?

是的,music21 v.7 中的一项改进是,从 MIDI 导入的文件现在具有与从 MusicXML 和其他格式导入的文件类似的表示。具体来说,声部现在有小节,可能有也可能没有声部,而不是直接包含声部的声部。代码不应依赖于查找直接包含在声部中的声部,这正是本示例所做的。

相反,使用此代码查找所有测量声音:

melody_stream.recurse().getElementsByClass(stream.Voice)

或者,等效地,使用 v.7 中的快捷语法:

melody_stream[stream.Voice]

或者,如果您根本不需要这些措施,请根据您的用例调用 flatten()chordify()