# Strudel · fork del hacklab

Fork de [Strudel](https://codeberg.org/uzu/strudel) (live coding de música en
el navegador, port de TidalCycles a JavaScript) con mejoras de usabilidad para
pinchar en directo. Misma licencia que upstream: AGPL-3.0 (ver `LICENSE`).

![El REPL con la pestaña Projects y la barra de transporte](./docs/captura.png)

## Qué añade

- Interfaz multiidioma (castellano, inglés, francés, alemán, italiano,
  portugués y más). Selector en el header.
- Pestaña Projects: proyectos locales con carpetas, buscador y una librería
  de tracks de fábrica para empezar a pinchar: bases techno/acid originales
  y 50 remixes retro (80s/90s/2000s) escritos en código.
- Barra de transporte bajo el editor: anterior / play-pausa / siguiente,
  tiempo y barra de progreso arrastrable (seek real sobre el reloj del
  scheduler). Al cargar un track el loop arranca desde cero; editar y
  actualizar en vivo no reinicia nada.
- Pestaña Guía: chuleta de síntesis y sonidos.
- Pestaña **KISUM** (*musik al revés*): sube un audio o vídeo y te lo devuelve
  como código Strudel (tempo + batería por bandas). Lo procesa un mini-servidor
  Python local (`kisum/`) que arranca solo con el lanzador. Ver más abajo.
- Pestaña **Visor**: pentagrama (piano-roll), onda (osciloscopio) y espectro
  **en vivo** de lo que suena, sin tener que escribir `.pianoroll()` ni
  `.scope()` en el código.
- Accesos directos en la cabecera: `projects`, `KISUM`, `visor`, `ajustes`.
- Packs de temas del editor: neon-madrid y hacklab-pack.
- Lanzador de escritorio: `strudel-launcher.sh`.

## Instalación (Linux)

Requisitos: `git`, `node` >= 20, `pnpm` (`corepack enable`) y, para KISUM,
`python3` + `ffmpeg`.

**Fácil (un comando):**

```bash
git clone https://gitea.laenre.net/hacklab/strudel.git
cd strudel
./install.sh            # instala Node deps + build + entorno de KISUM
./strudel-launcher.sh   # http://127.0.0.1:3009 (+ KISUM en 3010) y abre el navegador
```

El `install.sh` no descarga los paquetes al repo: usa `pnpm` (Node) y un
`venv` de Python para KISUM. Todo eso queda en `.gitignore`.

**Manual / desarrollo:**

```bash
pnpm i
pnpm dev                # recarga en vivo, http://localhost:4321
# o, para el uso diario (build estática + lanzador):
pnpm build
./strudel-launcher.sh
```

Icono de escritorio: `~/.local/share/applications/strudel.desktop`

```ini
[Desktop Entry]
Type=Application
Name=Strudel
Comment=Live coding de musica
Exec=/ruta/a/strudel/strudel-launcher.sh
Icon=audio-x-generic
Terminal=false
Categories=AudioVideo;Audio;
```

## Packs de proyectos propios

La librería de fábrica está en
`website/src/repl/components/panel/default-projects.mjs`. Para un pack
personal crea un módulo con el mismo formato `{name, folder, code}` y
concaténalo en `DEFAULT_PROJECTS` (los packs personales están en
`.gitignore`). También se pueden crear proyectos desde la propia pestaña.

## KISUM (audio → código Strudel)

KISUM escucha una canción (audio **o vídeo**: mp3, wav, flac, m4a, mp4, mkv…),
detecta el tempo y los golpes por bandas (bombo/caja/hats) y lo devuelve como
código Strudel listo para pegar. Vive en la carpeta `kisum/` (Python + librosa)
y se usa de dos formas:

- **Desde Strudel**: pestaña *KISUM* → arrastra el archivo → *Analizar* →
  *Cargar en editor*. El mini-servidor (`kisum/kisum_server.py`, en
  `127.0.0.1:3010`) lo arranca solo `strudel-launcher.sh`.
- **Desde la terminal**:

  ```bash
  cd kisum
  ./kisum tu_cancion.mp3            # imprime el código Strudel
  ./kisum clip.mp4 --bars 8 --bass # vídeo, 8 compases, con línea de bajo
  ```

Requiere `python3` y `ffmpeg`. Si `./install.sh` no lo dejó listo (o quieres
reinstalarlo): `./kisum/install.sh`. Detalles y limitaciones en
[`kisum/README.md`](./kisum/README.md).

> Nota: la transcripción de la v0 analiza la mezcla completa (aún no separa
> instrumentos), así que en temas muy densos el patrón sale cargado. La
> separación por stems (demucs) está en la hoja de ruta.

## Actualizar desde upstream

```bash
git fetch upstream
git merge upstream/main
```

## Enlaces

- Strudel (upstream): <https://codeberg.org/uzu/strudel> — su README original: [README-upstream.md](./README-upstream.md)
- Documentación / tutorial: <https://strudel.cc/learn>
- TidalCycles, el original en Haskell: <https://tidalcycles.org>
- Algorave, la escena: <https://algorave.com>
- Samples para empezar a jugar:
  - Dirt-Samples (la librería clásica de Tidal): <https://github.com/tidalcycles/Dirt-Samples>
  - tidal-drum-machines (Roland TR-808/909 y muchas más): <https://github.com/ritchse/tidal-drum-machines>
- Para ver de qué va esto en directo: <https://www.youtube.com/watch?v=iu5rnQkfO6M>
