← На главную

Без AI: Petri nets и Bjorklund генерируют треки на beats.bitwrap.io

03.08.2026 17:34 · hackernews

На beats.bitwrap.io выбираешь жанр из 19 вариантов — от techno и jazz до ambient и drum & bass — жмёшь Generate и получаешь готовый трек. Смена seed даёт другой трек, повторение того же seed — тот же самый. Внутри нет ни piano roll, ни DAW. Музыку считают Petri nets: кружки, стрелки и токены, которые переходят между ними. Каждая нота — буквально токен, сделавший шаг по диаграмме.

Самый простой пример — кольцо из 8 кружков и один токен. Каждый тик он прыгает дальше, и если приземлился на кружок с ударом — звучит kick. Паттерн ударов строит алгоритм Bjorklund: он равномерно распределяет K ударов по N шагам. 3 удара на 8 шагов дают tresillo — ритм, который встречается от афро-кубинского son до песен Рианны. 4 удара на 16 шагов — four-on-the-floor техно. У каждого инструмента своё кольцо; разные длины колец дают полиритмию.

Мелодии, басы, арпеджио и гармонии устроены так же. Каждый шаг кольца несёт ноту с высотой, скоростью и длительностью. Музыкальная теория подбирает ноты по аккордам: на сильных долях — аккордовые тоны, на слабых — проходящие, между ними — паузы. Никакого AI и сэмплов — только теория музыки и случайные числа с seed.

Одних петель мало для песни с интро, дропами и брейкдаунами. Поэтому добавили control nets — кольца, которые не звучат, а отдают команды вроде «заглушить хай-хэт» или «впустить бас». Первая версия была неэффективной: цепочка из 1536 отдельных шагов, и трёхминутный трек занимал 22 MB. Заменили на countdown timers: 384 токенов в одном кружке, по одному на тик, а inhibitor arc держит событие до нуля. Вместо 37 148 мест и 37 120 переходов стало по 800, файл похудел до 242 KB.

Переходы между треками Auto-DJ тоже сделали частью сети. Раньше координация main thread и worker роняла макросы при пересечении границ. Теперь каждый переход — это control net с fire-macro: на первом тике нового трека worker шлёт control-fired, main thread выполняет макрос через обычную очередь. Гонка и потеря макроса исчезли — переход стал просто ещё одним токеном в графе.

Единое состояние — токены. Поэтому один seed на любой машине даёт один трек. Диаграмму можно нарисовать на экране и увидеть, где застрял токен. Инструменты отделены от структуры песни, модульность получается сама собой.

Звук тянет Tone.js: полифонические синтезаторы, реверберация, компрессия, точный тайминг. Исполнитель Petri net — около 400 строк чистого JavaScript, ещё 700 — в секвенсорном worker. Без npm и бандлера: Tone.js с CDN, Go-сервер отдаёт статику, а вся идея — 60-летняя модель из кружков и стрелок. Всё работает в браузере, ставить ничего не нужно. Исходники: github.com/stackdump/beats-bitwrap-io.

Читать оригинал →