Однажды, серфя по 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)
Через некоторое время я написал функцию генерации положений клавиш виртуальной клавиатуры и отображения их (в виде прямоугольников) поверх изображения потока и загрузил картинку, результат получился следующий:
Итак, решив, что покадрово, при чтении изображения из видеопотока, я буду читать активные ноты с позиции виртуальных клавиш (активными считаются только те ноты, пиксели которых совпадают с эталонным цветом или находятся недалеко от него).
) и отправить их в 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, сделал простой, но с функцией расстановки клавиш
Думаю, что эта программа может быть полезна многим людям, поэтому все выложил на github
Теги: #Звук #python #программирование #OpenCV #midi
-
Adobe Запускает Революционный Проект
19 Oct, 24 -
Онлайн Психолог - Сбор Требований
19 Oct, 24 -
Парадокс Дня Рождения Для Троих
19 Oct, 24