Ставим себе Strudel REPL полностью локально
… или как заиметь достаточно большую библиотеку различных бесплатных семплов.

“1948 advertisement for Aerophos - Apple Strudel” by Matthew Paul Argall - Old Ads is marked with Public Domain Mark 1.0, modified by SEVA77
Статья – не обзор, а всего лишь инструкция, ибо я сам пока осваиваю это чудо. Хотя и обзор делать вряд ли буду: в падлу.
Навигация
- Скачивание Strudel REPL и стандартных семплов
- Способ настройки 1 – 100%-ный с запуском двух локальных серверов
- Способ настройки 2 – не 100%-ный, но с запуском одного локального сервера
- Заключение
Собственно сам Strudel REPL как-то резко появился в инфополе в виде тикток нарезок девушек, делающих в ней достаточно залипательные приколы. Ну я, конечно, неплохо так ахренел от такой интерактивной среды разработки, мол музыку можно норм так кодить, да не просто кодить, а настраивать визуал, выводить осциллограмму, пьеноролл и, таким образом, делать из кодинга неплохое шоу. Так понравилось, что даже у себя запостил их видео, можете ознакомиться.
Это все, конечно, хорошо, но я все равно не верил в удобство создания музыки именно таким способом, мол сложно это все, вникать в синтаксис надо… Не верил до тех пор, пока Ваганыч не выпустил видос, а на момент написания этой статьи уже и второй, где он сам пробует освоить Strudel REPL. И вот уже глядя у него в видео, что означают эти квадратные, треугольные скобочки, циферки и пр. и как этим всем можно манипулировать, я осознал, на сколько это наоборот ахренеть как удобно. И вот после его видео захотелось не просто освоить это чудо, но и всерьез делать в нем свою музыку.
Забегая вперед, у Strudel REPL нет экспорта в какой-либо звуковой файл. Единственный способ превратить ваш код в звуковой файл – записывать звук “с рабочего стола” в реальном времени. Но меня этот нюанс не остановил и в конце объясню, почему.
Так как это для меня теперь рабочимй инструмент, я захотел поставить его себе локально, чтоб был к нему доступ даже при хреновом интернете или его отсутствии. Однако, клонировав репозиторий, установив зависимости и запустив, неожиданно для себя обнаружил, что даже локально ему необходим интернет для подгрузки его самых стандартных семплов.
Забегая вперед скажу, что сделано это не просто так: весь набор семплов после скачивания весит 7,3 Гб (12,1 Гб если не удалять папки .git) и тащить в проект для совместной разработки такой объем данных ну оооочень неудобно. А потому все эти семплы лежат на CDN отдельно от Strudel REPL, подгружаются только нужные семплы, а сам CDN (и не только) закопан где-то далеко в коде.

1 ГиБ = 1,0737 Гб; 1 Гб = 0,9313 ГиБ.
Но скачать семплы и исправить пару адресов в коде не так уж и сложно. Другое дело – способ встраивания. И у меня их два, исключая прописывания samples('http://localhost:5432/'); в код вашей композиции: так себе идея для стандартных семплов.
Но сначала загрузим Strudel REPL и сами семплы.
Скачивание Strudel REPL и стандартных семплов
Репозиторий Strudel REPL с инструкцией для скачивания и установки всех зависимостей для его работы находится по адресу:
https://codeberg.org/uzu/strudel
После клонирования репозитория и установки всех его зависимостей, скачиваем репозиторий с семплами куда удобно, например рядом с папкой, куда клонирован Strudel REPL, но желательно не в нее: кажись есть риск после обновления репозитория или жесткого отката эти семплы потерять.
git clone --recurse-submodules https://github.com/felixroos/dough-samples.git
В случае ошибки скачивания переходите в [следующий раздел].
Однако это все набор семплов из одного найденного репозитория. Если посмотреть в самом проекте Strudel файл website/src/repl/prebake.mjs, то можно заметить, что помимо уже скачанных семплов есть еще и дополнительные: uzu-drumkit и uzu-wavetables. Они уже скачиваются у другого пользователя – tidalcycles. Скачаем их в ту же папку, что и остальные семплы – dough-samples:
git clone https://github.com/tidalcycles/uzu-drumkit.git ./dough-samples/uzu-drumkit
git clone https://github.com/tidalcycles/uzu-wavetables.git ./dough-samples/uzu-wavetables
Но и это не все. Помимо обычных семплов используются так называемые audiofont: файлы формата .sf2. Помню когда LMMS ковырял, видел плагин, позволяющий такие файлы использовать, но никогда в жизни не натыкался на их коллекции и использования на практике, а тут не то чтобы большой набор, скорее сами “аудиошрифты” большие и куча других файлов под их использование. Что именно подгружает программа не разбирался, но репозиторий, размером около гигабайта, в любом случае скачиваем весь. Как обычно скачиваем в ту же папку dough-samples:
git clone https://github.com/felixroos/webaudiofontdata.git ./dough-samples/webaudiofontdata
И на этом скачивание семплов закончено. Далее необходимо изменить пару конфигурационных файлов под тот или иной способ запуска и использования локального Strudel REPL. А способов целых два со своими плюсами и минусами. Причем способ именно с самым неудобным запуском на данный момент будет 100% рабочим, в отличие от другого, но обо всем по порядку.
В случае ошибки при скачивании
Тут есть очень важный момент, что клонирование репозиториев с большим объемом данных при нестабильном соединении или неудачном расположении меркурия относительно венеры или марса может прервать скачивание без шанса на продолжение. Может быть что-то типо такой ошибки:
RPC failed; curl 18 transfer closed with outstanding read data remaining
На форумах разное советуют: поменять в конфигурации версию HTTP протокола, изменить значение постбуфера, изменить значение сжатия репозитория и многое другое. Помогает, я бы даже сказал железобетонно помогает, только скачивания через SSH. Но для этого необходимо иметь учетку на гитхабе и настроить собственный ключ доступа. Инструкция по ссылке:
Через SSH вы можете скачать только свои репозитории и собственные форки чужих репозиториев. Т.е. вам еще и нужно форкнуть себе чужой большой репозиторий. И это не dough-samples.
Сам dough-samples состоит из нескольких других репозиториев, так называемых модулей. При его скачивании через SSH его модули скачиваются по-обычному не через SSH, что приведет к той же ошибке (уже пробовал). А потому нам необходимо скачать репозиторий dough-samples отдельно от его модулей (без ключа --recurse-submodules) и поочередно докачать в него его модули.
Выглядит это примерно так:
git clone https://github.com/felixroos/dough-samples.git
git clone https://github.com/tidalcycles/Dirt-Samples.git ./dough-samples/Dirt-Samples
git clone https://github.com/yaxu/mrid.git ./dough-samples/mrid
git clone https://github.com/geikha/tidal-drum-machines.git ./dough-samples/tidal-drum-machines
git clone https://github.com/felixroos/VCSL.git ./dough-samples/VCSL
И в случае, если одна или более из перечисленных команд не сработала, ее надо переделать под команду под скачивание через SSH следующего формата:
git clone git@github.com:my_group/my_repository.git
Например, последнюю команду для скачивания семплов VCSL я для себя как раз и переделывал под скачивание через SSH, предварительно форкнув его себе. Для моего пользователя на гитхабе SEVA77 выглядит примерно так:
git clone git@github.com:SEVA77/VCSL.git ./dough-samples/VCSL
После чего скачиваем и остальные семплы:
git clone https://github.com/tidalcycles/uzu-drumkit.git ./dough-samples/uzu-drumkit
git clone https://github.com/tidalcycles/uzu-wavetables.git ./dough-samples/uzu-wavetables
git clone https://github.com/felixroos/webaudiofontdata.git ./dough-samples/webaudiofontdata
Способ настройки 1 – 100%-ный с запуском двух локальных серверов
Пожалуй этот способ – это примерно то, как задумывали авторы Strudel REPL еще до введения идеи держать семплы на отдельном CDN.
Прежде всего в папку с семплами dough-samples нужно скопировать недостающие .json файлы из папки ./strudel/website/src/repl/, а именно tidal-drum-machines-alias.json, uzu-drumkit.json, uzu-wavetables.json.
После этого в файле ./strudel/website/src/repl/prebake.mjs необходимо изменить значение константы baseCDN с 'https://strudel.b-cdn.net' на 'http://localhost:6543', т.е.:
было:
const baseCDN = 'https://strudel.b-cdn.net';
стало:
const baseCDN = 'http://localhost:6543';
Далее также в файле ./strudel/packages/soundfonts/fontloader.mjs меняем значение переменной defaultSoundfontUrl следующим образом:
было:
let defaultSoundfontUrl = 'https://felixroos.github.io/webaudiofontdata/sound';
стало:
let defaultSoundfontUrl = 'http://localhost:6543/webaudiofontdata/sound';
Готово!
Запуск локального Strudel REPL при данной конфигурации состоит из двух этапов: сначала запускаем локальный сервер с хранилищем семплов, а потом отдельно и сам Strudel REPL.
Запускаем локальный сервер с хранилищем семплов в папке dough-samples следующей командой:
npx serve -p 6543 --cors
Strudel REPL запускается по инструкции командой:
pnpm dev
Но можно и pnpm start, и pnpm repl, разницы нет. Strudel REPL для браузера будет доступен по адресу http://localhost:4321/, если не настроено иначе.
И вот в этом то и неудобство, что приходится запускать два сервера. Ну а что поделать? Мой изначальный способ свести все к запуску одного локального сервера уперся в некоторые ограничения самого фреймворка. Пока не нашел, как решить проблему и в случае ее решения просто уберу из инструкции акцент на ней. Тем не менее способ не должен оставаться без внимания.
Способ настройки 2 – не 100%-ный, но с запуском одного локального сервера
Еще на этапе загрузки семплов я как-то сразу смекнул, что сами семплы можно просто поместить в папку, которая является точкой запуска самого Strudel REPL: ./strudel/website/public/. Но не в тупую поместить, а по-умному: ссылками. Тут я опять же боялся, что при обновлении или откате изменений репозитория семплы пропадут, но в любом случае куда удобнее будет держать семплы отдельно от проекта.
В моем случае папка с семплами стоит рядом с папкой со Strudel REPL, т.е. папка dough-samples рядом с папкой strudel. В этом случае для создания ссылок на наборы семплов, находясь в папке strudel (!!!), можно просто выполнить одну большую команду:
ln -sr ../dough-samples/Dirt-Samples/ ./website/public/Dirt-Samples;\
ln -sr ../dough-samples/mrid/ ./website/public/mrid;\
ln -sr ../dough-samples/piano/ ./website/public/piano;\
ln -sr ../dough-samples/tidal-drum-machines/ ./website/public/tidal-drum-machines;\
ln -sr ../dough-samples/VCSL/ ./website/public/VCSL;\
ln -sr ../dough-samples/uzu-drumkit/ ./website/public/uzu-drumkit;\
ln -sr ../dough-samples/uzu-wavetables/ ./website/public/uzu-wavetables;\
ln -sr ../dough-samples/webaudiofontdata/ ./website/public/webaudiofontdata
Ключ -r в команде позволяет использовать относительные пути и в случае нахождения папки с семплами в ином месте, можно составить такую же команду без этого ключа, но с полными, абсолютными путями до папки с семплами. Команда применима для линукс дистрибутивов и мак оси.
Для винды, если не используйте bash терминал от git, по идее нужно просто заменить ln -sr на mklink /d и привести относительные пути в порядок. По идее этот набор команд в командном терминале виндовс должен сработать:
mklink /d ..\dough-samples\Dirt-Samples\ .\website\public\Dirt-Samples
mklink /d ..\dough-samples\mrid\ .\website\public\mrid
mklink /d ..\dough-samples\piano\ .\website\public\piano
mklink /d ..\dough-samples\tidal-drum-machines\ .\website\public\tidal-drum-machines
mklink /d ..\dough-samples\VCSL\ .\website\public\VCSL
mklink /d ..\dough-samples\uzu-drumkit\ .\website\public\uzu-drumkit
mklink /d ..\dough-samples\uzu-wavetables\ .\website\public\uzu-wavetables
mklink /d ..\dough-samples\webaudiofontdata\ .\website\public\webaudiofontdata
Причем можно скопировать все команды целиком, я помню виндовый терминал при вставленном переносе на новую строку команду сразу выполнит.
Далее в файле ./website/src/repl/prebake.mjs необходимо сделать пустой значение константы baseCDN следующим образом:
было:
const baseCDN = 'https://strudel.b-cdn.net';
стало:
const baseCDN = '';
Далее также в файле ./packages/soundfonts/fontloader.mjs меняем значение переменной defaultSoundfontUrl следующим образом:
было:
let defaultSoundfontUrl = 'https://felixroos.github.io/webaudiofontdata/sound';
стало:
let defaultSoundfontUrl = '/webaudiofontdata/sound';
Готово!
Теперь нам достаточно просто запустить Strudel REPL по инструкции командой:
pnpm dev
Или pnpm start, или pnpm repl, разницы нет.
Почему же способ не 100%-ный? К сожалению при всех корректно прописанных адресах самих семплов не все семплы подгружаются. Причем корректность адресов до “недоступного” семпла проверял по-разному: от прописывания его части в отдельном локальном сервере с семплами до прописывания его части в браузере для локальной файловой системы (через file://). Вывод консоли при проверке семплов выглядел примерно так:

Ошибку 404 генерирует и выдает сам фреймворк Astro. Есть предположение, что плохо воспринимаются некоторые символы в адресе, например символ решетки, но, скорее всего, как мне кажется, просто есть ограничения на количество … как бы это корректнее назвать … вложений. Имею в виду количество вложенных папок, за которыми и спрятан семпл. Разные конфиги, файлы просматривал, решения, к сожалению, пока так и не нашел.
Как только найду, в чем дело, обязательно переделаю статью, убрав все упоминания о проблеме.
Заключение
Заключение? В инструкции? Ну вообще да, я там во вступлении начал мысль, но не закончил.
В общем сам Strudel REPL по первому впечатлению выглядит ахренеть каким удобным. Прям сильно кажется, что накодить электронную музыку в этой штуке будет ахренеть как удобно. Особенно мне, человеку, планирующему первое время писать исключительно синтезаторную музыку.
Тем не менее и самые базовые неудобства заметны. Отсутствует пауза и, как я писал ранее, нет экспорта музыки. Ну и плюс еще есть подозрение, что нет возможности писать прям длинные, кардинально меняющиеся во времени композиции с заново прописанными инструментами. Если это так, то Strudel REPL в этом плане скорее является обычным секвенсором, нежели, чем DAW в привычном его понимании.
Однако, если это все же не так и хотя бы по частям можно будет собрать целую композицию, меня не покидает ахирительная мысль, что помимо публикации самих треков я могу также публиковать их Strudel версии со своими ахирительными комментариями например о том, зачем я беру тот или иной набор аккордов и пр. Про публикацию кода под ахерительно требовательными лицензиями, типа GNU GPL3, я уже шутил.
Ну и в целом, кстати, перенести ручками уже готовую композицию из Strudel REPL в нормальный DAW и дошлифовать ее, задача, конечно, достаточно трудоемкая, но вполне выполнимая, учитывая возможность визуализации пьенорола и, о как удобно, наличие уже всех необходимых семплов под рукой. Как сказал один великий человек:
Всю жизнь учились на программиста, айтишника, а на самом деле хотели записывать музыку, сочинять, делать что-то великое? Ничего. Мы ваш позорный недуг обратим в подвиг.
Ваганыч, пародируя реплику из ДМБ ©
Последний коммит на момент написания статьи: db49b37780
04.01.2026
