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


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

Комментарии (15)


  1. multiprogramm
    06.05.2019 19:16

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


    1. svsd_val Автор
      07.05.2019 04:15

      Согласен немного грустно, однако выход нашёлся =)


  1. andreymal
    06.05.2019 20:50

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


    1. svsd_val Автор
      07.05.2019 04:21

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


  1. Tempest
    06.05.2019 22:12

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


    1. svsd_val Автор
      07.05.2019 04:22

      Нет ;)


  1. svsd_val Автор
    07.05.2019 04:21

    В общем открыт для предложений, если есть идеи как улучшить пишите =)


  1. ImLoaD
    07.05.2019 12:30

    Вдохновляющая работа! Простите за глупый вопрос, а правая/левая руки учитываются?


    1. svsd_val Автор
      07.05.2019 12:32

      Если в видео потоке есть разбиение на обе руки, то в текущей версии будут учитываться. Так как там реализовано разнесение по каналам. В файле v2m.py можно задать цвета для активации клавиш в переменной keyp_colors после в keyp_colors_channel указать соотнесение цвета клавиши каналу, Можно таким образом можно добиться нужного разнесения (правая рука, левая рука) либо поменять местами (левая рука, правая рука).


  1. KiRex
    07.05.2019 14:40

    Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно. Так то конвертеры внешние есть, наверняка и библиотеки должны быть. По поводу длительностей — чтобы не зависеть от частоты кадров может стоит длину полосочек считать, а не длительность нажатия?


    1. svsd_val Автор
      07.05.2019 14:53

      Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно.

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

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


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


  1. selotec
    07.05.2019 15:23

    Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)
    Сейчас может из любопытства попробую, но именно в плане учебы хочется более фундаментально подходить. Замечал, что в синтезии мелодия запоминается больше спинным мозгом (будто в гитар хиро играешь), нежели чем когда вникаешь в ноты, длительности и учишься ноты читать, нежели зубрить. Но не критикую ни в коем разе)


    1. svsd_val Автор
      07.05.2019 15:43

      Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)

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

      А так думаю может видео на Ютубе выложить как этой программой пользоваться =)


      1. selotec
        07.05.2019 17:56

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


  1. svsd_val Автор
    08.05.2019 12:14

    Обновил релиз, улучшил гуи, в общем используйте на здоровье =)