Реконструкция Midi из видео роликов Synthesia (и ей подобным)

в 12:38, , рубрики: MIDI, opencv, python, звук, Программирование

Как то раз сидя в ютубе ведя поиск интересных обучающих мелодий наткнулся на ролики с Synthesia, часть из которых мне очень понравилась, решил скачаю да и поучусь… =) Но увы как оказалось ролики есть, а вот midi файлы никто не горел желанием выкладывать =(

Засев за гугл решил посмотреть может есть готовые решения которые бы меня устроили, но увы из того что нашёл были только аудио конвертеры в midi, что меня слегка расстроило… Недолго думая решил что для восстановления MIDI частоты кадров в видео роликах будет достаточно..., и Я решил попробовать реализовать это дело....

Мне не хотелось писать всё с нуля, потому решил что буду делать на уже готовых компонентах которые предоставляет мне Debian GNU/Linux, из того что было лучше всего подходил питон.

В начале реализации решил что буду использовать готовые (выдернутые из видео роликов) картинки, но после первых же выгрузок понял что нет смысла… Оказалось что это очень медленно и к тому же потребляет значительные ресурсы на винте… Тогда Я решил опробовать для себя новую штуку как OpenCV (уж больно давно хотел пощупать), оказалось OpenCV очень хорошо работает с видео потоком, предоставляя все необходимые мне функции ( считать пиксель, вывести рамки и текст ).

К примеру открытие видео файла и получение одного кадра можно описать двумя строчками:

vidcap = cv2.VideoCapture('test.mp4')
success,image = vidcap.read()

А при желании можно сразу дампить кадры на винт:

cv2.imwrite("/tmp/frame%d.jpg" % frame, image)

Спустя некоторое время написал функцию генерации положений клавиш виртуальной клавиатуры, и отображение их (в виде прямоугольников) поверх изображения потока и выгрузил картинку получилось следующее:
image

Так решив что кадр за кадром при считывании изображения с видео потока буду считывать с положения виртуальных клавиш активные ноты (активными считаются только те ноты пиксели которых совпадают с эталонным цветом либо не далеко от него) и отправлять их в midi. Регистрацию нот реализовал до нельзя просто, так как будто дело обстоит на обычной midi клавиатуре, только немного проще… Проверил на видео, посмотрел сколько нот попалось (а их попалось немало) Я подумал неплохо, осталось только придумать как записать ноты в файл, поискав немного, нашёл отличный пакет для питона python-midiutil. Через некоторое время смог записать ноты в midi. Как оказалось python-midiutil очень простой и очень удобный в использовании пакетик. К примеру создание файла и добавление нот осуществляется парой строк:

mf.addTrackName(track, time, "Sample Track")
mf.addTempo(track, time, 60 )

mf.addNote(track, channel, pitch, keytime, duration, volume)

with open(outputmid, 'wb') as outf:
    mf.writeFile(outf)

Загрузив полученный midi в LMMS, оказалось вполне удачно. Первом же делом восстановил пару любимых мелодий. Дальше стало ясно что функция генерации положений клавиш не очень удобна от ролика к ролику их расположение менялось, решил что буду делать GUI, сделал простенькое, но с функцией расстановки клавиш

image

Думаю что многим может пригодиться эта программка, потому выложил всё на гитхабе

Автор: svsd_val

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js