Миди-Реконструкция Из Видеороликов Synthesia (И Подобных)

Однажды, серфя по YouTube и ища интересные развивающие мелодии, я наткнулся на видео от Synthesia, некоторые из которых мне очень понравились, поэтому я решил скачать и изучить.

=) Но увы, как оказалось, видео есть , но никто не горел желанием выкладывать миди файлы =( Я зашёл в гугл и решил посмотреть, есть ли готовые решения, которые меня бы устроили, но увы, из того, что я нашёл, были только конвертеры аудио в миди, что меня немного расстроило.

Недолго думая я решил, что это так.

этого было бы достаточно для восстановления частоты кадров по MIDI в видеоклипах.

, и я решил попробовать реализовать это дело.

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

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

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

  
  
   

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

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

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

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

Миди-реконструкция из видеороликов Synthesia (и подобных)

Итак, решив, что покадрово, при чтении изображения из видеопотока, я буду читать активные ноты с позиции виртуальных клавиш (активными считаются только те ноты, пиксели которых совпадают с эталонным цветом или находятся недалеко от него).

) и отправить их в MIDI. Регистрация нот невозможно было реализовать просто, как если бы ситуация была на обычной миди-клавиатуре, только немного проще.

Проверил на видео, посмотрел сколько нот мне попалось (а их было очень много) ) Я подумал ну осталось разобраться как записывать заметки в файл, немного поискав, нашел отличный Python-пакет python-midiutil. Через некоторое время я смог записывать ноты в формате миди.

Как оказалось, 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)

Загрузка полученного миди в LMMS оказалась вполне успешной.

Первое, что я сделал, это восстановил пару любимых мелодий.

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

Миди-реконструкция из видеороликов Synthesia (и подобных)

Думаю, что эта программа может быть полезна многим людям, поэтому все выложил на github Теги: #Звук #python #программирование #OpenCV #midi

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.