如何使用python获取midi轨道乐器名称?

use*_*819 0 python midi midi-instrument music21

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

m = converter.parse(path)
for m in m.parts:
    print(m[0])
Run Code Online (Sandbox Code Playgroud)

但它的输出不正确:

Piano


Piano
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

例如:

mid = mido.MidiFile('PaintItBlack.mid')

for msg in mid:
    if msg.type == 'program_change':
        print(msg)
Run Code Online (Sandbox Code Playgroud)

这将产生

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
Run Code Online (Sandbox Code Playgroud)

其中通道程序值是该通道的仪器。

例如,程序 27 是一个电吉他。

请参阅https://jazz-soft.net/demo/GeneralMidi.html以查找程序乐器。