使用带有 partitionByInstrument() 的 music21 读取 MIDI 文件以获取返回空列表的音符和和弦
reading MIDI file using music21 with partitionByInstrument() to get notes and chords returning empty list
我正在尝试使用此 github repository's .py file (the get_notes() function) to extract the notes and chords data from this midi file 中的代码。这是从我正在使用的回购协议中复制的确切代码:
def get_notes():
""" Get all the notes and chords from the midi files in the ./midi_songs directory """
notes = []
for file in glob.glob("midi_songs/*.mid"):
midi = converter.parse(file)
print("Parsing %s" % file)
notes_to_parse = None
try: # file has instrument parts
s2 = instrument.partitionByInstrument(midi)
notes_to_parse = s2.parts[0].recurse()
except: # file has notes in a flat structure
notes_to_parse = midi.flat.notes
for element in notes_to_parse:
if isinstance(element, note.Note):
notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
notes.append('.'.join(str(n) for n in element.normalOrder))
with open('data/notes', 'wb') as filepath:
pickle.dump(notes, filepath)
return notes
我的 midi 文件有多个乐器,我相信由于某种原因导致没有任何东西被附加到音符列表中。既然我刚刚克隆了存储库的代码并将其 运行 到我自己的 midi 文件中,我不确定为什么它不起作用。我查看了 music21 的 partitionByInstrument() 的文档,并尝试通过更改来遍历不同的乐器:
notes_to_parse = s2.parts[0].recurse()
到
notes_to_parse = s2.parts[1].recurse()
因为文件中的不同部分应该是不同的工具,但它仍然是一个空列表returns。我该怎么办?
这只是一个事实,它正在使用它找到的第一个乐器,该乐器没有音符、持续时间或偏移量的数据。遍历仪器我得到不同的返回完整列表。
v6.1 添加了从 MIDI 乐器名称和轨道名称消息创建 Instrument
对象的功能。今天发布的 v6.5 添加了一项功能,用于删除在同一滴答声中程序更改消息中还存在 Instrument
时导致的重复项。如果您试用 v6.5,您可能会发现它更易于使用。
我正在尝试使用此 github repository's .py file (the get_notes() function) to extract the notes and chords data from this midi file 中的代码。这是从我正在使用的回购协议中复制的确切代码:
def get_notes():
""" Get all the notes and chords from the midi files in the ./midi_songs directory """
notes = []
for file in glob.glob("midi_songs/*.mid"):
midi = converter.parse(file)
print("Parsing %s" % file)
notes_to_parse = None
try: # file has instrument parts
s2 = instrument.partitionByInstrument(midi)
notes_to_parse = s2.parts[0].recurse()
except: # file has notes in a flat structure
notes_to_parse = midi.flat.notes
for element in notes_to_parse:
if isinstance(element, note.Note):
notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
notes.append('.'.join(str(n) for n in element.normalOrder))
with open('data/notes', 'wb') as filepath:
pickle.dump(notes, filepath)
return notes
我的 midi 文件有多个乐器,我相信由于某种原因导致没有任何东西被附加到音符列表中。既然我刚刚克隆了存储库的代码并将其 运行 到我自己的 midi 文件中,我不确定为什么它不起作用。我查看了 music21 的 partitionByInstrument() 的文档,并尝试通过更改来遍历不同的乐器:
notes_to_parse = s2.parts[0].recurse()
到
notes_to_parse = s2.parts[1].recurse()
因为文件中的不同部分应该是不同的工具,但它仍然是一个空列表returns。我该怎么办?
这只是一个事实,它正在使用它找到的第一个乐器,该乐器没有音符、持续时间或偏移量的数据。遍历仪器我得到不同的返回完整列表。
v6.1 添加了从 MIDI 乐器名称和轨道名称消息创建 Instrument
对象的功能。今天发布的 v6.5 添加了一项功能,用于删除在同一滴答声中程序更改消息中还存在 Instrument
时导致的重复项。如果您试用 v6.5,您可能会发现它更易于使用。