You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:45:37