Как то раз сидя в ютубе ведя поиск интересных обучающих мелодий наткнулся на ролики с 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)
Спустя некоторое время написал функцию генерации положений клавиш виртуальной клавиатуры, и отображение их (в виде прямоугольников) поверх изображения потока и выгрузил картинку получилось следующее:
Так решив что кадр за кадром при считывании изображения с видео потока буду считывать с положения виртуальных клавиш активные ноты (активными считаются только те ноты пиксели которых совпадают с эталонным цветом либо не далеко от него) и отправлять их в 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, сделал простенькое, но с функцией расстановки клавиш
Думаю что многим может пригодиться эта программка, потому выложил всё на гитхабе
Комментарии (15)
andreymal
06.05.2019 20:50Как дела с точностью тайминга? Есть подозрение, что 25-30 кадров в секунду из видео будет недостаточно для правильной мелодии
svsd_val Автор
07.05.2019 04:21Зависит от мелодии, в большинстве случаев хватает за глаза, в некоторых случаях после реконструкции нужно немного «доработать напильником», что намного лучше нежели перерисовывать с нуля…
svsd_val Автор
07.05.2019 04:21В общем открыт для предложений, если есть идеи как улучшить пишите =)
ImLoaD
07.05.2019 12:30Вдохновляющая работа! Простите за глупый вопрос, а правая/левая руки учитываются?
svsd_val Автор
07.05.2019 12:32Если в видео потоке есть разбиение на обе руки, то в текущей версии будут учитываться. Так как там реализовано разнесение по каналам. В файле v2m.py можно задать цвета для активации клавиш в переменной keyp_colors после в keyp_colors_channel указать соотнесение цвета клавиши каналу, Можно таким образом можно добиться нужного разнесения (правая рука, левая рука) либо поменять местами (левая рука, правая рука).
KiRex
07.05.2019 14:40Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно. Так то конвертеры внешние есть, наверняка и библиотеки должны быть. По поводу длительностей — чтобы не зависеть от частоты кадров может стоит длину полосочек считать, а не длительность нажатия?
svsd_val Автор
07.05.2019 14:53Можно еще выгрузку нот реализовать из MIDI — было бы вообще прикольно.
Не совсем понял о чём идёт речь, если о том что бы передавать любому приложению на midi вход, то смысла особого нет по двум причинам:
1. Многие midi плееры умеют это делать.
2. Скорее всего производительности может не хватить что бы в реалтайм отправлять ноты.
По поводу длительностей — чтобы не зависеть от частоты кадров может стоит длину полосочек считать, а не длительность нажатия?
Это реализовать сложнее, тут как вариант возможны 2 пути решения:
1. Нужно будет составлять карту нот (которая для некоторых мелодий может быть очень и очень длинная, а это будет сильный удар по ресурсам) и уже от неё плясать.
2. Делать систему отслеживания движения нот, это сложнее
Оба варианта реализовать возможно, но особого смысла на данный момент не вижу. Возможно в будущем займусь этой темой. Ещё проблема будет с перекрывающимися нотами, в этом случае отследить их будет куда сложнее…
selotec
07.05.2019 15:23Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)
Сейчас может из любопытства попробую, но именно в плане учебы хочется более фундаментально подходить. Замечал, что в синтезии мелодия запоминается больше спинным мозгом (будто в гитар хиро играешь), нежели чем когда вникаешь в ноты, длительности и учишься ноты читать, нежели зубрить. Но не критикую ни в коем разе)svsd_val Автор
07.05.2019 15:43Крутая штука, мне в свое время такой не хватало очень сильно. Думаю многим может пригодиться, вот только не все они на хабре сидят)
Я даже не знаю куда писать… Может есть тематические форумы или ещё что, в любом случае, если есть желание можете где Вам удобно выложить ссылку на гитхаб, не буду против =)
А так думаю может видео на Ютубе выложить как этой программой пользоваться =)selotec
07.05.2019 17:56Попробуйте реддит, тот же сабреддит питона, можно даже слукавить и в раздел learnpython выложить, а там разнесут. Иначе тоже не знаю, где можно было б популяризовать, никогда на профильных музыкальных форумах не сидел.
На ютуб наверное тоже можно, только не знаю как там привлекать широкую публику.
multiprogramm
Классно! Года четыре назад задумывался о чём-то таком, но руки не дошли (да и не возникло прям огромной необходимости). Грустно только, что приходится вот так вот извращаться для того, чтобы получить мидишку, которая в принципе для мелодии есть, но не у тебя.
svsd_val Автор
Согласен немного грустно, однако выход нашёлся =)