Как получить название инструмента миди-трека с помощью python?

Единственный способ сделать это - использовать музыку21:

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

но вывод неверный:

Piano


Piano

Пустые места также являются названиями инструментов, они просто не могут его прочитать, но проблема не в файле, потому что я могу правильно импортировать их в смокинг. Также music21 не может записывать большие MIDI-файлы и зависать. Я попробовал мидо-библиотеку, но нет способа отследить инструмент, я нашел атрибут, но понятия не имею, как его использовать.

Как я могу разобрать инструменты миди треков с питоном?

1 ответ

Решение

Почему Мидо не работает?

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)

Атрибут track - это список треков. Каждая дорожка представляет собой список сообщений и мета-сообщений с атрибутом времени каждого сообщения, установленным на его дельта-время (в тиках).
Более подробную информацию можно найти здесь.

Инструменты устанавливаются в 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 чтобы найти программные инструменты.

Другие вопросы по тегам