Как получить название инструмента миди-трека с помощью 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 чтобы найти программные инструменты.