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

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


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

Поделиться публикацией

Комментарии 19

    0
    Классно! Года четыре назад задумывался о чём-то таком, но руки не дошли (да и не возникло прям огромной необходимости). Грустно только, что приходится вот так вот извращаться для того, чтобы получить мидишку, которая в принципе для мелодии есть, но не у тебя.
      0
      Согласен немного грустно, однако выход нашёлся =)
      0

      Как дела с точностью тайминга? Есть подозрение, что 25-30 кадров в секунду из видео будет недостаточно для правильной мелодии

        0
        Зависит от мелодии, в большинстве случаев хватает за глаза, в некоторых случаях после реконструкции нужно немного «доработать напильником», что намного лучше нежели перерисовывать с нуля…
        0

        Death Waltz тоже будете учить? :D

        0
        В общем открыт для предложений, если есть идеи как улучшить пишите =)
          0
          Вдохновляющая работа! Простите за глупый вопрос, а правая/левая руки учитываются?
            +1
            Если в видео потоке есть разбиение на обе руки, то в текущей версии будут учитываться. Так как там реализовано разнесение по каналам. В файле v2m.py можно задать цвета для активации клавиш в переменной keyp_colors после в keyp_colors_channel указать соотнесение цвета клавиши каналу, Можно таким образом можно добиться нужного разнесения (правая рука, левая рука) либо поменять местами (левая рука, правая рука).
            0
            Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно. Так то конвертеры внешние есть, наверняка и библиотеки должны быть. По поводу длительностей — чтобы не зависеть от частоты кадров может стоит длину полосочек считать, а не длительность нажатия?
              0
              Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно.

              Не совсем понял о чём идёт речь, если о том что бы передавать любому приложению на midi вход, то смысла особого нет по двум причинам:
              1. Многие midi плееры умеют это делать.
              2. Скорее всего производительности может не хватить что бы в реалтайм отправлять ноты.

              По поводу длительностей — чтобы не зависеть от частоты кадров может стоит длину полосочек считать, а не длительность нажатия?


              Это реализовать сложнее, тут как вариант возможны 2 пути решения:
              1. Нужно будет составлять карту нот (которая для некоторых мелодий может быть очень и очень длинная, а это будет сильный удар по ресурсам) и уже от неё плясать.
              2. Делать систему отслеживания движения нот, это сложнее
              Оба варианта реализовать возможно, но особого смысла на данный момент не вижу. Возможно в будущем займусь этой темой. Ещё проблема будет с перекрывающимися нотами, в этом случае отследить их будет куда сложнее…
              0
              Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)
              Сейчас может из любопытства попробую, но именно в плане учебы хочется более фундаментально подходить. Замечал, что в синтезии мелодия запоминается больше спинным мозгом (будто в гитар хиро играешь), нежели чем когда вникаешь в ноты, длительности и учишься ноты читать, нежели зубрить. Но не критикую ни в коем разе)
                +1
                Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)

                Я даже не знаю куда писать… Может есть тематические форумы или ещё что, в любом случае, если есть желание можете где Вам удобно выложить ссылку на гитхаб, не буду против =)

                А так думаю может видео на Ютубе выложить как этой программой пользоваться =)
                  0
                  Попробуйте реддит, тот же сабреддит питона, можно даже слукавить и в раздел learnpython выложить, а там разнесут. Иначе тоже не знаю, где можно было б популяризовать, никогда на профильных музыкальных форумах не сидел.
                  На ютуб наверное тоже можно, только не знаю как там привлекать широкую публику.
                +1
                Обновил релиз, улучшил гуи, в общем используйте на здоровье =)
                  0
                  А может кто-нибудь скомпилировать в exe?
                  Или подскажите как запустить в windows. Поставил Питон — ругается на отсутствующий vc2. Поставил Анаконду — не понял как ей пользоваться.
                    0
                    1.Устанавливаешь анаконду с питоном 2.7
                    2.В пуске находишь anaconda prompt
                    3.В неё pip install opencv-python midiutil pygame pyopengl
                    4.Пишешь python путь-до-v2m.py путь до видео
                      0
                      Ещё обнаружил баг, который приводил к белому экрану видео ряда на винде (приходилось нажимать клавиши перемотки видео), исправил, так что если встретили этот баг, обновите скрипт.
                      0
                      Обновил релиз (0.3.5), исправил баги, добавил клавиши для сохранения и загрузки настроек и положений всех клавиш, в общем используйте на здоровье =)

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое