music21.converter.parseFile解析MIDI后输出异常问题咨询
问题描述
使用以下代码解析并展示MIDI文件时,解析后的MIDI所有乐器变为打击乐,音符也存在明显差异,重新生成的文件和原文件偏差极大:
score = music21.converter.parseFile(midi_file) score.show('midi')
注:原MIDI包含常规乐器及对应音符;解析后的MIDI轨道全部显示为打击乐,音符排布与原文件完全不同
可能的解决方案
显式指定解析格式
尝试给parseFile方法明确指定format='midi'参数,避免自动识别逻辑出错:score = music21.converter.parseFile(midi_file, format='midi') score.show('midi')检查并修正轨道乐器识别
先遍历解析后的score对象,确认轨道的乐器识别情况:score = music21.converter.parseFile(midi_file) for part in score.parts: print(f"轨道名称: {part.partName}") print(f"识别乐器: {part.getInstrument()}") # 查看前5个音符信息 for n in part.flat.notes[:5]: print(f"音符: {n}, 音高: {n.pitch if hasattr(n, 'pitch') else '打击乐音符'}")如果发现轨道被错误标记为打击乐,手动重置为对应乐器(以钢琴为例):
from music21.instrument import Piano for part in score.parts: part.insert(0, Piano()) score.show('midi')使用底层MidiFile类解析
绕过converter.parseFile,直接调用底层的MidiFile类读取数据,提升解析精准度:from music21.midi import MidiFile mf = MidiFile() mf.open(midi_file) mf.read() mf.close() # 转换为Score对象并展示 score = mf.stream() score.show('midi')标准化原MIDI文件
若原文件为老旧或非标准格式,先用专业MIDI编辑器打开,导出为标准MIDI 1.0格式后再尝试解析。
内容的提问来源于stack exchange,提问作者Davikch
相关产品推荐
相关产品推荐

