Форум сайта python.su
0
Как из midi файла получить массив нот. Все имеющиеся библиотеки выдают массив типо [<meta message midi_port port=0 time=0>, <message sysex data
126,127,9,1) time=0>, <meta message midi_port port=0 time=0>…
мне нужен массив без текста только числа.
Офлайн
186
Да всё очень просто
# pip install python-midi
import midi >>> treki = midi.read_midifile("/home/rodegast/solaris.mid") >>> [ [ x.data for x in e] for e in treki ] [[[73, 99, 104, 32, 114, 117, 102, 39, 32, 122, 117, 32, 100, 105, 114, 44, 32, 72, 101, 114, 114, 32, 74, 101, 115, 117, 32, 67, 104, 1 14, 105, 115, 116], [74, 46, 32, 83, 46, 32, 66, 97, 99, 104, 32, 47, 32, 84, 114, 97, 110, 115, 99, 105, 112, 116, 105, 111, 110, 32, 9 8, 121, 32, 74, 105, 109, 32, 71, 105, 108, 115, 105, 110, 97, 110, 32, 73, 86, 10], ......
Офлайн
0
(((у меня модуль midi не работает ругается на read_midifile.
Офлайн
186
Ну тогда вот вариант с mido
>>> import mido >>> mid = mido.MidiFile("/home/rodegast/solaris.mid") >>> [ x.note for x in mid if x.type == "note_on" ] [72, 56, 41, 29, 56, 60, 41, 29, 60, 65, 41, 29, 65, 64, 41, 29,.....
Офлайн
0
Вроде с mido работает. А можно массив со всей последовательностью нот времени каналов и так что бы потом его можно было обратно загрузить в миди файл?
Офлайн
186
Ты может быть и удивишся, но mido.MidiFile как раз такой объект и возвращает:
>>> mid = mido.MidiFile("/home/rodegast/solaris.mid") >>> m = list(mid)[25] >>> m <message note_on channel=2 note=41 velocity=80 time=0> >>> m.channel 2 >>> m.note 41 >>> m.time 0 >>> m.velocity 80
Офлайн
0
<message note_on channel=2 note=41 velocity=80 time=0> этим меня не удивишь.
В общем очень признателен. Думаю дальше сам справлюсь.
Офлайн