Как стать автором
Обновить

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

Время на прочтение 2 мин
Количество просмотров 7.6K

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


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

Теги:
Хабы:
+26
Комментарии 20
Комментарии Комментарии 20

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн