СофтХабрахабр

[Из песочницы] Генератор музыкальных каверов на Python в Blender

В данной статье я расскажу о моём аддоне к блендеру, о причинах, побудивших меня к его созданию, процессе разработки и об «успехе» на YouTube.

Предыстория

Началось всё с того, что примерно год назад (в ноябре 2018го) я увидел в предложке ютуба вот такой необычный кавер на The Ultimate Canon

Кому как, но, думаю, это по меньшей мере забавно. Парень записал семплы каждой ноты песни и путём кропотливого монтажа собрал из них песню целиком. Да и количество просмотров (на тот момент чуть больше 1 000 000) говорило о том, что тема (1% guitar skill 99% editing skills) пользуется популярностью.

Я тоже раньше делал классические каверы, и у меня ещё тогда закрадывалась идея психануть и слепить кавер в точности, как это сделал парень из видео. Уверен, те, кто хоть немного занимался сведением песен, знают, что порою легче чутка подрезать и подвинуть дорожку, чем просить нерадивого гитариста переиграть партию. Я было раздосадовался, что мой поезд ушёл, но вдруг меня осенило, что я могу сделать то же самое, но на другом уровне, добавив новый шаг — 1% guitar 1% editing 98% programming skills. И вот я вижу, что «мою идею нагло украли» и получили неплохой выхлоп.

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

Разработка

Итак, задача была автоматизировать процесс нарезки звуковых семплов в музыкальную композицию.

Я сразу же задумался о GuitarPro и его вариантах экспорта данных: MusicXML и MIDI. Прежде всего необходимо было как-то передать будущей программе данные о композиции, её ноты, дорожки, инструменты.

Это не только лишь парсер, но кроме этого мне от модуля ничего не нужно. Поиски привели меня к выбору парсера midi-файлов на Python music21. А аналоги были либо с ужасной документацией, либо вообще не могли делать, что мне надо настолько легко, как music21.

Едем дальше. Отлично, теперь я могу получать данные из midi-файлов о дорожках, об их нотах, их положении и длительности.

Тут я выбрал достаточно быстро. Теперь надо на основе этих данных делать нарезку из видео/аудио файлов. Я имею опыт работы с Adobe PremierePro, After Effects, однако там свой диалект скриптинга, который нигде больше не пригодится, да и его возможности мне неизвестны. Однозначно Blender, даже не смотря на его скромные возможности как видео-редактора. И это уже совпадает с языком music21. В Blender'е же практически любое действие может быть осуществлено через скрипт на Python. Бинго! Тут стоит пояснить, что с Python я на тот момент был вообще не знаком, поэтому этот проект я рассматривал ещё и как отличный повод ознакомиться с этим популярным языком.

Записал на гитаре каждую уникальную ноту и приступил к нарезке, но вскоре осёкся. Постепенно начал вникать в язык, выводил через music21 ноты midi-файла в консоль, бегло посмотрел как делать аддоны к блендеру и приступил к первой практической задаче: формированию данных-семплов. А это надо было бы нарезать ноты и по-отдельности их рендерить в отдельные файлы, а для этого подгонять каждую дорожку-ноту по длине в начало таймлайна… В общем, надо было упростить и этот процесс. Мой внутренний программист протестовал против этой кропотливой работы (а ведь нот на каждый инструмент может быть очень много: 30-50).

Это по сути точки с текстовой информацией, которые можно выставлять на определённый кадр. Решением стало использование такой вещи в Blender как маркеры. Затем информация о маркерах записывается в файл и используется уже при нарезке отдельных нот. Логика была такая: пользователь располагает своё видео и аудио (если аудио записывалось на отдельную дорожку), подгоняет их друг к другу и маркерами помечает начало каждой ноты на видео, а в тексте маркера указывает, что это за нота (A#, D, C и т.д.) и её максимальную длительность на записи.

По иронии судьбы, говорить тут особо нечего: было много чтения документации, документация Блендера далеко не всегда достаточно подробная, но постепенно я добился желаемого. Следующим пунктом шло уже собственно «ядро» функционала — нарезка нот и их позиционирование на таймлайне. Думаю, всем знакомо чувство, когда что-то наконец получается. Когда увидел (и услышал) первый результат (это была короткая композиция группы Эпидемия — Фродо), счастью не было предела.

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

Нюансы

Теперь по нюансам реализации. У Блендера стоит ограничение в слоях редактора, максимум 32. Из картинки видно, что семплы аудио и видео (зелёные и сиреневые) занимают по 14 слоёв и формируются по возрастанию, потом опять на начало своего сектора. Это сделано из-за того, что Блендер не позволят спавнить семпл поверх другого. А в музыке часто бывает, что следующая нота начинается ещё до окончания звучания предыдущей. Поэтому, чтобы избежать наложения, я решил спавнить следующую ноту на слое выше предыдущей, а когда слои сектора заканчиваются, опять начинать с первого слоя (вряд ли первая нота будет звучать на целых 14 слоёв вперёд). Да, это можно было бы сделать умнее, экономя слои, но как я уже сказал, я торопился.

Дело в том, что для спавна ноты, приходится через скрипт спавнить 2 оригинальных дорожки (видео и аудио) и уже потом вырезать из них нужную ноту. Самые внимательные могли заметить, что всего сектора 2 по 14 слоёв, это 28, а максимум в Блендере 32. 29й и 30й используются для промежуточного хранения уже сгенерированных дорожек: генерация происходит под одному треку из midi-файла, затем ноты группируются в одну дорожку, переносится на 29/30 слой, генерируем следующую дорожку и т.д. А спавнить поверх другой дорожки нельзя, поэтому я зарезервировал 31й и 32й слой под это дело.

И она может внутри композиции меняться множество раз. Тут тоже есть нюанс: в midi партитурах есть такое свойство как скорость воспроизведения. Поэтому скорость сгенерированных нот будет совпадать с самой первой скоростью, указанной в midi-файле. В music21 я так и не отыскал возможности отследить эти переключения скоростей. Тут 2 решения:

  1. для каждого участка с новой скоростью делать новый midi-файл только с ним;
  2. генерировать ноты участка заново с модификатором скорости Tempo (мультипликативный коэффициент к изначальной скорости).

Я предпочитаю в GuitarPro для каждой скорости добавлять свои дорожки, потом в Блендере, достаточно будет только их сгенерировать с модификатором скорости, так быстрее и сложнее запутаться.

Утилиты видеоредактора

Теперь, когда есть черновой набор сгенерированных дорожек, надо смонтировать смотрибельный кавер. Т.е. спозиционировать дорожки по углам видео, переключаться в зависимости от музыки и т.д. В блендере с этим всё довольно плохо. Для наложения эффекта к дорожке надо «приклеивать» другую дорожку сверху, которая и будет отрисовываться при рендере, и выставлять её в нужное положение.

Это когда несколько нот звучат в одно и то же время, т.е. Особо следует упомянуть аккорды. Решением было всё то же добавление эффекта (по счастью, они не ломаются при наложении друг на друга). при рендеринге видео будет отображаться только верхняя нота аккорда. Как вы понимаете, этот нюанс я тоже автоматизировал. Если при обычном монтаже сгенерированных дорожек я бы мог делать всё вручную, то редактировать каждую ноту аккорда — это уж слишком. Теперь одним нажатием кнопки «Chordify strips» выделенные семплы будут трансформированы нужным образом и каждая нота аккорда будет отрисовываться.

Это из-за того, что в партитурах в этих местах, внезапно, пустые места. И ещё один момент автоматизации: иногда сгенерированные семплы имеют между собой пустые участки. Однако в блендере образуются пустоты. В GuitarPro это звучит нормально, из-за различных эффектов, звучание ноты сохраняется в промежутках. Ровно это задачу выполняет кнопка «Fill gaps». Их надо заполнять растяжением предыдущей ноты до начала следующей.

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

Слава на YouTube

Итак, аддон готов. От начала задумки было потрачено примерно полтора месяца, работал по вечерам, в свободное время. Время делать кавер, который переплюнет ручной кавер того паренька. Выбрал ту же композицию, но в рок-аранжировке: Canon Rock. Она гораздо мелодичнее и сложнее оригинала, и позволит ярко продемонстрировать новый уровень моего подхода. Да и как ответка уже популярному видео может привлечь внимание аудитории.

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

Отснял вступление и концовку, в которых на ломаном английском попытался объяснить всю крутизну моей ответки. И вот кавер готов и отполирован! Подготовил превьюшку. Некоторые слова говорил нарочито с ошибками (компликатед, дабл ю ти эф), в надежде сбайтить зрителей на поправку в комментах. Разослал в тематических группах по каверам, и скинул ссылку в инстаграм тому парню. С замиранием сердца, в предвкушении ожидаемого триумфа, загрузил и опубликовал ролик. У него, кстати, очень триумфальный ник: Ralph Jay Triumfo.

Триумфа всё не было. Время шло. Затем наступило затишье. В первые сутки набралось около 100 просмотров, половина которых были моими и моих друзей. Неужели люди не понимают, насколько крутую штуку я сделал? С каждым новым днём я всё больше разочаровывался во всей этой затее. Или может быть сама затея была крутой лишь в моей голове? Почему сарафанное радио не работает?

Результатом стало появление небольшого репортажа обо мне. Как бы там ни было, мне нравился результат, и я стал постепенно делать всё новые каверы.
В то время я участвовал в съёмках передачи «Моделирование мозга» на местном ТВ, и однажды я упомянул о своей поделке в разговоре с ведущим. Мама, я в телеке!

Я прекрасно понимал, что местное ТВ смотрят в основном пенсионеры, поэтому никаких ожиданий от этого не было.

К тому же тогда во всю готовился релиз новой версии Блендера, и менялся API. Я ещё тогда хотел довести код аддона до ума, оптимизировать генерацию и выложить аддон в общий доступ, но провал триумфа поубавил мой пыл. Я хотел дождаться его выхода летом и перенести аддон на новую версию, и тогда уже выложить, но опять же, особого желания не было.

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

80, но оказалось, что видео-редактор не только не улучшили, а даже ухудшили. Конечно, попробовал перенести аддон на новую версию 2. Сам редактор подтормаживать стал. Производительность значительно хуже, порою вылетает при генерации тяжёлых дорожек. А пока что для аддона нужна старая добрая версия 2. Невозможность заглушить определённые звуковые дорожки (надеюсь, это баг, и в следующем минор-релизе пофиксят). 79

Жду массового появления синтезированных каверов от вас. Вот ссылка на аддон, не забудьте поставить на интерпретатор питона блендера music21.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

СофтХабрахабр

[Из песочницы] Генератор музыкальных каверов на Python в Blender

В данной статье я расскажу о моём аддоне к блендеру, о причинах, побудивших меня к его созданию, процессе разработки и об «успехе» на YouTube.

Предыстория

Началось всё с того, что примерно год назад (в ноябре 2018го) я увидел в предложке ютуба вот такой необычный кавер на The Ultimate Canon

Кому как, но, думаю, это по меньшей мере забавно. Парень записал семплы каждой ноты песни и путём кропотливого монтажа собрал из них песню целиком. Да и количество просмотров (на тот момент чуть больше 1 000 000) говорило о том, что тема (1% guitar skill 99% editing skills) пользуется популярностью.

Я тоже раньше делал классические каверы, и у меня ещё тогда закрадывалась идея психануть и слепить кавер в точности, как это сделал парень из видео. Уверен, те, кто хоть немного занимался сведением песен, знают, что порою легче чутка подрезать и подвинуть дорожку, чем просить нерадивого гитариста переиграть партию. Я было раздосадовался, что мой поезд ушёл, но вдруг меня осенило, что я могу сделать то же самое, но на другом уровне, добавив новый шаг — 1% guitar 1% editing 98% programming skills. И вот я вижу, что «мою идею нагло украли» и получили неплохой выхлоп.

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

Разработка

Итак, задача была автоматизировать процесс нарезки звуковых семплов в музыкальную композицию.

Я сразу же задумался о GuitarPro и его вариантах экспорта данных: MusicXML и MIDI. Прежде всего необходимо было как-то передать будущей программе данные о композиции, её ноты, дорожки, инструменты.

Это не только лишь парсер, но кроме этого мне от модуля ничего не нужно. Поиски привели меня к выбору парсера midi-файлов на Python music21. А аналоги были либо с ужасной документацией, либо вообще не могли делать, что мне надо настолько легко, как music21.

Едем дальше. Отлично, теперь я могу получать данные из midi-файлов о дорожках, об их нотах, их положении и длительности.

Тут я выбрал достаточно быстро. Теперь надо на основе этих данных делать нарезку из видео/аудио файлов. Я имею опыт работы с Adobe PremierePro, After Effects, однако там свой диалект скриптинга, который нигде больше не пригодится, да и его возможности мне неизвестны. Однозначно Blender, даже не смотря на его скромные возможности как видео-редактора. И это уже совпадает с языком music21. В Blender'е же практически любое действие может быть осуществлено через скрипт на Python. Бинго! Тут стоит пояснить, что с Python я на тот момент был вообще не знаком, поэтому этот проект я рассматривал ещё и как отличный повод ознакомиться с этим популярным языком.

Записал на гитаре каждую уникальную ноту и приступил к нарезке, но вскоре осёкся. Постепенно начал вникать в язык, выводил через music21 ноты midi-файла в консоль, бегло посмотрел как делать аддоны к блендеру и приступил к первой практической задаче: формированию данных-семплов. А это надо было бы нарезать ноты и по-отдельности их рендерить в отдельные файлы, а для этого подгонять каждую дорожку-ноту по длине в начало таймлайна… В общем, надо было упростить и этот процесс. Мой внутренний программист протестовал против этой кропотливой работы (а ведь нот на каждый инструмент может быть очень много: 30-50).

Это по сути точки с текстовой информацией, которые можно выставлять на определённый кадр. Решением стало использование такой вещи в Blender как маркеры. Затем информация о маркерах записывается в файл и используется уже при нарезке отдельных нот. Логика была такая: пользователь располагает своё видео и аудио (если аудио записывалось на отдельную дорожку), подгоняет их друг к другу и маркерами помечает начало каждой ноты на видео, а в тексте маркера указывает, что это за нота (A#, D, C и т.д.) и её максимальную длительность на записи.

По иронии судьбы, говорить тут особо нечего: было много чтения документации, документация Блендера далеко не всегда достаточно подробная, но постепенно я добился желаемого. Следующим пунктом шло уже собственно «ядро» функционала — нарезка нот и их позиционирование на таймлайне. Думаю, всем знакомо чувство, когда что-то наконец получается. Когда увидел (и услышал) первый результат (это была короткая композиция группы Эпидемия — Фродо), счастью не было предела.

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

Нюансы

Теперь по нюансам реализации. У Блендера стоит ограничение в слоях редактора, максимум 32. Из картинки видно, что семплы аудио и видео (зелёные и сиреневые) занимают по 14 слоёв и формируются по возрастанию, потом опять на начало своего сектора. Это сделано из-за того, что Блендер не позволят спавнить семпл поверх другого. А в музыке часто бывает, что следующая нота начинается ещё до окончания звучания предыдущей. Поэтому, чтобы избежать наложения, я решил спавнить следующую ноту на слое выше предыдущей, а когда слои сектора заканчиваются, опять начинать с первого слоя (вряд ли первая нота будет звучать на целых 14 слоёв вперёд). Да, это можно было бы сделать умнее, экономя слои, но как я уже сказал, я торопился.

Дело в том, что для спавна ноты, приходится через скрипт спавнить 2 оригинальных дорожки (видео и аудио) и уже потом вырезать из них нужную ноту. Самые внимательные могли заметить, что всего сектора 2 по 14 слоёв, это 28, а максимум в Блендере 32. 29й и 30й используются для промежуточного хранения уже сгенерированных дорожек: генерация происходит под одному треку из midi-файла, затем ноты группируются в одну дорожку, переносится на 29/30 слой, генерируем следующую дорожку и т.д. А спавнить поверх другой дорожки нельзя, поэтому я зарезервировал 31й и 32й слой под это дело.

И она может внутри композиции меняться множество раз. Тут тоже есть нюанс: в midi партитурах есть такое свойство как скорость воспроизведения. Поэтому скорость сгенерированных нот будет совпадать с самой первой скоростью, указанной в midi-файле. В music21 я так и не отыскал возможности отследить эти переключения скоростей. Тут 2 решения:

  1. для каждого участка с новой скоростью делать новый midi-файл только с ним;
  2. генерировать ноты участка заново с модификатором скорости Tempo (мультипликативный коэффициент к изначальной скорости).

Я предпочитаю в GuitarPro для каждой скорости добавлять свои дорожки, потом в Блендере, достаточно будет только их сгенерировать с модификатором скорости, так быстрее и сложнее запутаться.

Утилиты видеоредактора

Теперь, когда есть черновой набор сгенерированных дорожек, надо смонтировать смотрибельный кавер. Т.е. спозиционировать дорожки по углам видео, переключаться в зависимости от музыки и т.д. В блендере с этим всё довольно плохо. Для наложения эффекта к дорожке надо «приклеивать» другую дорожку сверху, которая и будет отрисовываться при рендере, и выставлять её в нужное положение.

Это когда несколько нот звучат в одно и то же время, т.е. Особо следует упомянуть аккорды. Решением было всё то же добавление эффекта (по счастью, они не ломаются при наложении друг на друга). при рендеринге видео будет отображаться только верхняя нота аккорда. Как вы понимаете, этот нюанс я тоже автоматизировал. Если при обычном монтаже сгенерированных дорожек я бы мог делать всё вручную, то редактировать каждую ноту аккорда — это уж слишком. Теперь одним нажатием кнопки «Chordify strips» выделенные семплы будут трансформированы нужным образом и каждая нота аккорда будет отрисовываться.

Это из-за того, что в партитурах в этих местах, внезапно, пустые места. И ещё один момент автоматизации: иногда сгенерированные семплы имеют между собой пустые участки. Однако в блендере образуются пустоты. В GuitarPro это звучит нормально, из-за различных эффектов, звучание ноты сохраняется в промежутках. Ровно это задачу выполняет кнопка «Fill gaps». Их надо заполнять растяжением предыдущей ноты до начала следующей.

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

Слава на YouTube

Итак, аддон готов. От начала задумки было потрачено примерно полтора месяца, работал по вечерам, в свободное время. Время делать кавер, который переплюнет ручной кавер того паренька. Выбрал ту же композицию, но в рок-аранжировке: Canon Rock. Она гораздо мелодичнее и сложнее оригинала, и позволит ярко продемонстрировать новый уровень моего подхода. Да и как ответка уже популярному видео может привлечь внимание аудитории.

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

Отснял вступление и концовку, в которых на ломаном английском попытался объяснить всю крутизну моей ответки. И вот кавер готов и отполирован! Подготовил превьюшку. Некоторые слова говорил нарочито с ошибками (компликатед, дабл ю ти эф), в надежде сбайтить зрителей на поправку в комментах. Разослал в тематических группах по каверам, и скинул ссылку в инстаграм тому парню. С замиранием сердца, в предвкушении ожидаемого триумфа, загрузил и опубликовал ролик. У него, кстати, очень триумфальный ник: Ralph Jay Triumfo.

Триумфа всё не было. Время шло. Затем наступило затишье. В первые сутки набралось около 100 просмотров, половина которых были моими и моих друзей. Неужели люди не понимают, насколько крутую штуку я сделал? С каждым новым днём я всё больше разочаровывался во всей этой затее. Или может быть сама затея была крутой лишь в моей голове? Почему сарафанное радио не работает?

Результатом стало появление небольшого репортажа обо мне. Как бы там ни было, мне нравился результат, и я стал постепенно делать всё новые каверы.
В то время я участвовал в съёмках передачи «Моделирование мозга» на местном ТВ, и однажды я упомянул о своей поделке в разговоре с ведущим. Мама, я в телеке!

Я прекрасно понимал, что местное ТВ смотрят в основном пенсионеры, поэтому никаких ожиданий от этого не было.

К тому же тогда во всю готовился релиз новой версии Блендера, и менялся API. Я ещё тогда хотел довести код аддона до ума, оптимизировать генерацию и выложить аддон в общий доступ, но провал триумфа поубавил мой пыл. Я хотел дождаться его выхода летом и перенести аддон на новую версию, и тогда уже выложить, но опять же, особого желания не было.

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

80, но оказалось, что видео-редактор не только не улучшили, а даже ухудшили. Конечно, попробовал перенести аддон на новую версию 2. Сам редактор подтормаживать стал. Производительность значительно хуже, порою вылетает при генерации тяжёлых дорожек. А пока что для аддона нужна старая добрая версия 2. Невозможность заглушить определённые звуковые дорожки (надеюсь, это баг, и в следующем минор-релизе пофиксят). 79

Жду массового появления синтезированных каверов от вас. Вот ссылка на аддон, не забудьте поставить на интерпретатор питона блендера music21.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть