Привет! Меня зовут Дмитрий Сергеев, я облачный администратор в Битрикс24.
Рассказываю о создании проекта для Хакатона в нашей компании: музыкального ИИ‑приложения PromptBeats.
Установить проект можно с репозитория: github.com/dimyard/PromptBeats. Для работы ИИ‑функций нужно подключить API‑ключ языковой модели. PromptBeats поддерживает OpenAI, Anthropic и Gemini, а провайдер и ключ указываются в файле .env.
Без подключения модели можно дать агенту доступ к проекту и генерировать треки в JSON, которые можно загружать, воспроизводить, сохранять в библиотеке и редактировать.
В проекте, кроме меня, участвовали двое моих коллег: Максим Тишковский и Дмитрий Баранов.
Содержание
Как выглядит PromptBeats
Как родилась идея PromptBeats
Проект помогает развить мелодию, которая играет в голове
Промпты к музыке
Как проектировали архитектуру
Что такое Song JSON
Как работает ИИ‑часть и сколько стоила генерация
Что осталось за пределами MVP и что в потенциальных планах на будущее
Как выглядит PromptBeats
Слева находится часть для работы с моделью: чат и его история.
Есть примеры промптов, чтобы пользователю было проще начать. Например, у человека вообще нет конкретной идеи или он плохо разбирается в музыке, но хочет попробовать. Тогда можно выбрать один из готовых вариантов и оттолкнуться от него:

Есть библиотека треков, которые мы сгенерировали во время тестирования. Чтобы открыть её, нужно нажать на иконку с нотой:

Откроется библиотека:

В самом редакторе находится набор инструментов. Его можно менять, добавлять свои дорожки и выбирать звуки из встроенного каталога. В ручном режиме можно самостоятельно создать дорожку, выбрать синтезатор и звук, а затем расставить ноты.
Набор инструментов и звуков пока довольно базовый:

У проекта есть метаданные: тональность, темп, количество тактов и дорожек. Справа можно посмотреть Song JSON текущей композиции — подробнее о его устройстве расскажу ниже.

Как родилась идея PromptBeats
Я немного занимаюсь музыкой, играю в группе. При записи репетиции столкнулся со сложностями и задумался, можно ли сделать свой инструмент.
Понятно, что создать собственную DAW (программу для создания и записи музыки) с нуля — слишком амбициозная задача для хакатона. Поэтому начали сужать идею до того, что реально можно сделать за один день. В основе получался своего рода лупер. Вспомнился FL Studio, в котором я когда‑то делал демки:

Источник: image‑line.com
Я подумал, что можно сделать похожий упрощённый инструмент, в котором ИИ используется для создания и редактирования музыки. В итоге мы остановились на этой идее: для наших хакатонов это выглядело довольно свежо, глубоких музыкальных проектов раньше не было.
Проект помогает развить мелодию, которая играет в голове
Важная идея проекта в том, что музыку необязательно генерировать через модель с нуля.
Если у человека уже есть собственная идея, можно, как в FL Studio, самостоятельно выбрать инструменты, расставить свою мелодию, а затем использовать промпты для ее развития.
Это был один из основных посылов проекта. Иногда у тебя в голове звучит мелодия, хочется её дописать, но не хватает фантазии, чтобы продолжить или как‑то развить. PromptBeats должен помогать именно в такой ситуации.
Промпты к музыке
Cпециальные музыкальные промпты писать не нужно. Желательно базово понимать, что такое темп и бит, различать основные инструменты — например, барабаны и бас.
Мы специально ориентировались на достаточно широкую аудиторию и не хотели заставлять пользователя погружаться в тональности, доминанты, сильные и слабые доли. Особенно на хакатоне: если бы жюри пришлось сначала разбираться в музыкальной теории, показать проект мы бы просто не успели.
Как проектировали архитектуру
Изначально мы понимали далеко не всё, хотя базово роли разделить могли, потому что представляли основные части системы: бэкенд с моделью и промптами, фронтенд с редактированием и воспроизведением и сам движок, который должен проигрывать музыку. Это мы обсуждали еще до хакатона, когда питчили идею друг другу.
Но конкретная реализация определялась уже во время разработки: выбор стека, библиотеки для генерации звука, способ работы с моделью.
В первый час мы окончательно определяли контракты и то, как всё должно работать. Здесь сильно помогли агенты: они подсказывали решения с учётом того, сколько времени у нас вообще есть. Например, были библиотеки с большим количеством более интересных звуков, но их интеграция и доработка заняли бы слишком много времени. А смысл хакатона — успеть сделать работающий и способный заинтересовать пользователя MVP.
Для независимой разработки использовали общий пример трека: фронтенд и плеер могли работать с ним, пока подключалась модель. Для агентов зафиксировали границы ответственности и вели общий журнал изменений, что готово, где находится и как использовать результат соседнего компонента.
Приложение изначально проектировали браузерным, чтобы оно не зависело от конкретной платформы. Для плеера выбрали Tone.js: в нем уже есть базовые инструменты и возможность добавлять собственные. Сам проект в основном написан на JavaScript.
Мы втроем параллельно работали над разными частями проекта, поэтому в первый час согласовали контракты между ними. Центральным стал Song JSON: фронтенд, бэкенд и плеер должны были одинаково понимать структуру композиции.
Что такое Song JSON
Для создания, редактирования и ИИ‑генерации все треки представлены в JSON. По сути, это своеобразная партитура: дорожки, на каком шаге конкретный инструмент звучит, какую ноту играет, какова ее продолжительность и интенсивность.

Всё описывается в таком формате, и модели очень удобно с ним работать: подобную структурированную информацию она легко генерирует. Мы начинали с простой тестовой композиции, а позднее модель уже генерировала гораздо более сложные варианты, например треки с семью дорожками. Причём такие композиции уже полностью генерировала модель: она знала формат и структуру проекта и создавала трек.
Например, так будет выглядеть начало «К Элизе» Бетховена:
{ "version": 1, "title": "Für Elise — opening", "bpm": 80, "key": "A minor", "bars": 2, "tracks": [ { "id": "piano", "role": "lead", "instrument": "synth", "sound": "sampled_piano", "gain": 0.8, "events": [ { "step": 0, "note": "E5", "dur": 2, "vel": 0.8 }, { "step": 2, "note": "D#5", "dur": 2, "vel": 0.7 }, { "step": 4, "note": "E5", "dur": 2, "vel": 0.8 }, { "step": 6, "note": "D#5", "dur": 2, "vel": 0.7 }, { "step": 8, "note": "E5", "dur": 2, "vel": 0.8 }, { "step": 10, "note": "B4", "dur": 2, "vel": 0.75 }, { "step": 12, "note": "D5", "dur": 2, "vel": 0.78 }, { "step": 14, "note": "C5", "dur": 2, "vel": 0.75 }, { "step": 16, "note": "A4", "dur": 4, "vel": 0.82 } ] } ] }
Идея такая: модели передаётся промпт пользователя и контракт Song JSON. Модель по этому контракту генерирует сам трек.
Song JSON — внутренний стандарт приложения. В этом формате трек создаётся, редактируется, записывается, импортируется и экспортируется: готовый луп можно скачать в WAV для дальнейшего использования, а проект сохранить в JSON для последующего редактирования.
Таким образом треки можно генерировать вне PromptBeats. Song JSON можно создать и вне интерфейса нашего приложения. Например, агент с доступом к репозиторию может прочитать лежащие там контракты, сгенерировать совместимый JSON, а готовый файл затем можно импортировать.
Как работает ИИ‑часть и сколько стоила генерация
Здесь всё достаточно просто. На бэкенде есть LLM‑шлюз с ограничением частоты и повторных попыток. В.env‑файле задаём API‑ключ. Для тестирования мы купили ключ OpenAI на пять долларов. Его хватило на весь день генерации, и даже немного осталось.
Изначально мы опасались, что генерация будет расходовать очень много токенов и на входе, и на выходе. Но оказалось, что формат Song JSON позволяет делать это довольно экономично. При генерации более объёмных композиций столкнулись с ограничением длины ответа модели, и увеличили лимит.
Что осталось за пределами MVP и что в потенциальных планах на будущее
Мы хотели добавить запись и отдельные аудиодорожки. Например, у пользователя уже есть записанная основа в WAV, а приложение добавляет к ней инструменты.
Другая идея — интеграция с VST‑плагинами, но это уже очень амбициозная задача и постепенно превращает проект в полноценную DAW. Для браузера это тоже достаточно сложно, поэтому в условиях хакатона от идеи отказались.
Ещё хотели сделать piano roll, чтобы выбирать ноты на виртуальной клавиатуре вместо селектора.
И хотелось расширить эффекты. Сейчас возможности этой части ограничены, а в задумке были reverb, delay, фильтры и другие эффекты.
