【问题标题】:How to get midi track instrument name with python?如何使用 python 获取 midi 轨道乐器名称?
【发布时间】:2017-03-21 13:43:37
【问题描述】:

我发现的唯一方法是使用 music21

m = converter.parse(path)
for m in m.parts:
    print(m[0])

但它的输出不正确:

Piano


Piano

empty places 也是一个乐器名称,它只是无法读取它,但问题不在文件中,因为我可以将它正确导入到 tuxguitar。此外,music21 无法粘贴大的 MIDI 文件并卡住。我尝试了 mido 库,但没有办法获得轨道乐器,我找到了一个 attribute,但不知道如何使用它。

如何用python解析midi曲目的乐器?

【问题讨论】:

    标签: python midi music21 midi-instrument


    【解决方案1】:

    程序更改消息中的 MIDI 文件中设置乐器。

    例如:

    mid = mido.MidiFile('PaintItBlack.mid')
    
    for msg in mid:
        if msg.type == 'program_change':
            print(msg)
    

    这将产生

    program_change channel=1 program=32 time=0
    program_change channel=2 program=27 time=0
    program_change channel=3 program=27 time=0
    program_change channel=4 program=27 time=0
    program_change channel=5 program=25 time=0
    program_change channel=6 program=27 time=0
    program_change channel=7 program=104 time=0
    program_change channel=8 program=30 time=0
    program_change channel=10 program=52 time=0
    

    其中通道程序值是该通道的工具。

    例如,程序 27 是电吉他。

    请参阅https://jazz-soft.net/demo/GeneralMidi.html 查找程序工具。

    【讨论】:

      【解决方案2】:

      为什么美度没有工作?

      from mido import MidiFile
      mid = MidiFile('song.mid')  
      for i, track in enumerate(mid.tracks):
          print('Track {}: {}'.format(i, track.name))
          for msg in track:
              print(msg)
      

      tracks 属性是一个曲目列表。每个轨道都是消息和元消息的列表,每个消息的时间属性设置为其增量时间(以滴答为单位)。
      更多信息可以在here找到。

      【讨论】:

      • 我需要获取乐器名称(钢琴、萨克斯等),而不是 midi 事件。抱歉,我编辑了问题。
      • 我找到了!除了其他事件之外,您的代码输出值“程序”,它是仪器值。
      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      相关资源
      最近更新 更多