C’è un modo di creare musica che non passa né da una tastiera MIDI né da una workstation audio piena di menu, e che negli ultimi anni si è ritagliato uno spazio interessante, ovvero il live coding. L’idea è semplice e divertente da provare. Grazie a Strudel scrivi qualche riga di codice, premi una combinazione di tasti e quel codice diventa un ritmo, una melodia, un intero brano che evolve mentre lo modifichi.
Strudel gira interamente dentro una scheda del browser e non chiede di installare assolutamente nulla. Sotto il cofano è la versione JavaScript di TidalCycles, il linguaggio per pattern musicali nato nella scena algorave, quella dei concerti in cui i musicisti proiettano lo schermo e fanno ballare il pubblico programmando la musica dal vivo.
La cosa che lo rende rilevante per chi non è un musicista di professione è la barriera d’ingresso bassa. Apri il sito, scrivi sound("bd hh sd hh"), premi due tasti e hai già una batteria che suona. Non serve conoscere JavaScript, non serve la teoria musicale, e il progetto funziona anche offline. In questa guida vediamo come partire da zero, fino a costruire un brano completo.
Lo sviluppo di Strudel è attivo e il progetto ha spostato di recente il proprio codice su Codeberg, una piattaforma di hosting indipendente, una scelta in linea con la natura libera e open source dell’iniziativa.
Cos’è il live coding e perché Strudel abbassa la barriera d’ingresso
Il live coding musicale è una pratica in cui il suono viene generato e modificato in tempo reale scrivendo istruzioni testuali, invece di disegnare note su una griglia o registrare strumenti.
Nasce in ambito sperimentale e ha il suo riferimento storico in TidalCycles, una libreria scritta in Haskell che richiede però una catena di installazione non banale, ovvero l’interprete del linguaggio, un motore audio separato come SuperCollider e un editor configurato a dovere. Per molti curiosi quella complessità iniziale è sempre stata il vero ostacolo, più ancora dei concetti musicali.
Strudel rimuove proprio quell’ostacolo. È un porting ufficiale del linguaggio di pattern di Tidal in JavaScript, e poiché JavaScript è il linguaggio del web, tutto avviene nel browser senza alcun software da scaricare. Il suono viene prodotto direttamente dalla Web Audio API, la stessa tecnologia che permette ai siti di riprodurre audio, quindi non c’è nessun motore esterno da collegare. In pratica apri l’indirizzo del progetto, ti trovi davanti a un editor di testo e a un pulsante di play, e sei già operativo.
Non devi saper programmare per usarlo. Le righe che scriverai non sono codice nel senso classico del termine, con cicli e condizioni, ma una notazione compatta pensata per descrivere ritmi e sequenze. Gli sviluppatori la chiamano mini-notation, ed è il cuore di tutto il sistema.
La logica di fondo è quella del ciclo. Strudel ragiona per “cicli” (cycles), brevi unità temporali che per impostazione predefinita durano due secondi e che si ripetono all’infinito finché non fermi l’esecuzione. Tutto quello che scrivi viene distribuito automaticamente dentro quel ciclo. Capito questo principio, il resto viene da sé.
La mini-notation: una batteria completa in una riga
Il modo migliore per prendere confidenza è partire dalle percussioni, perché il risultato è immediato e non richiede di ragionare sulle note. La funzione di base si chiama sound (abbreviabile in s) e accetta tra virgolette il nome dei suoni da riprodurre. Apri l’editor sul sito ufficiale, scrivi la riga qui sotto e premi Ctrl+Invio per avviarla. Per fermare tutto userai Ctrl+. (punto).
sound("bd hh sd hh")
Le sigle corrispondono alle parti di una batteria, ovvero bd per la cassa (bass drum), sd per lo snare drum, hh per il charleston (hi-hat) e oh per il charleston aperto. Lo spazio tra un suono e l’altro è l’elemento più importante di tutta la sintassi. Separare due suoni con uno spazio significa metterli in sequenza, e tutta la sequenza viene compressa dentro un singolo ciclo. Di conseguenza, più elementi aggiungi, più ognuno diventa breve e veloce, perché lo spazio a disposizione resta lo stesso.
Da qui in poi si tratta di combinare pochi simboli. Le parentesi quadre creano sotto-sequenze, cioè raggruppano più suoni nello spazio di un singolo passo; la virgola sovrappone più pattern in parallelo, facendoli suonare insieme; l’asterisco moltiplica la velocità di un elemento. Mettendo insieme questi pezzi si ottiene già un groove credibile.
sound("bd*2, [~ sd]*2, hh*8").bank("RolandTR909")
Qui succedono tre cose contemporaneamente. La cassa suona due volte (bd*2), il rullante cade sul secondo e quarto movimento (il simbolo ~, come il trattino, indica una pausa), e il charleston scandisce otto colpi regolari.
La funzione bank aggiunge un dettaglio che fa la differenza, ovvero seleziona il “modello” di drum machine da cui prelevare i campioni. In questo caso è la Roland TR-909, leggendaria nella house e nella techno, ma puoi sostituirla con RolandTR808, RolandTR707 o AkaiLinn e sentire come cambia completamente il carattere del ritmo pur mantenendo lo stesso pattern. Se vuoi regolare il tempo, anteponi setcpm(90/4), che imposta i cicli al minuto e con la divisione /4 corrisponde in modo intuitivo ai canonici 90 battiti al minuto in quattro quarti.
Dalle percussioni alle note e alle scale
Una volta impostato il ritmo, il passo successivo è suonare le note. La logica non cambia. Al posto di sound si usa note, e dentro le virgolette si indicano le note con le lettere anglosassoni (c è il do, d il re, e così via) oppure direttamente con dei numeri, dove ogni unità corrisponde a un semitono. La funzione sound, in questo caso, serve a scegliere il timbro con cui suonarle.
note("c e g b").sound("piano")
Strudel include una vasta libreria di suoni General MIDI, riconoscibili dal prefisso gm_. Trovi gm_acoustic_bass per un basso acustico, gm_electric_guitar_muted per una chitarra in palm muting, oppure le classiche forme d’onda dei sintetizzatori come sawtooth, square e triangle. La scelta del numero al posto delle lettere torna utile soprattutto a chi non ha dimestichezza con i nomi delle note, perché permette di ragionare per distanze invece che per nomi assoluti.
Indicando una scala con scale, puoi scrivere semplici numeri interi a partire da zero e lasciare che sia il sistema a tradurli nelle note “giuste”, cioè quelle che appartengono a quella scala e che quindi suonano bene insieme.
setcpm(60)
n("0 2 4 <[6,8] [7,9]>").scale("C:minor").sound("piano")
Nota due dettagli. Il primo è che, quando lavori con le scale, si usa n invece di note, perché i numeri non indicano più semitoni ma “gradi” della scala. Il secondo riguarda le parentesi < >, che a differenza delle quadre fanno suonare un solo elemento per ogni ciclo, alternandoli uno dopo l’altro.
Sono perfette per le melodie lunghe, perché aggiungere o togliere note non altera il tempo generale del brano. Prova a cambiare i numeri quasi a caso e a sostituire C:minor con D:dorian o A2:minor:pentatonic.
Effetti e modulazione per dare corpo al suono
La terza famiglia di strumenti riguarda gli effetti, che in Strudel si applicano concatenandoli alla fine di un pattern con la notazione a punto, esattamente come nelle catene di metodi che si vedono in JavaScript. Il più usato è il filtro passa-basso lpf, che taglia le frequenze alte, dove i valori bassi rendono il suono ovattato e lontano mentre i valori alti lo rendono brillante.
note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth").lpf("200 1000 200 1000")
L’aspetto interessante è che quasi ogni parametro accetta a sua volta un pattern scritto con la stessa mini-notation. Nell’esempio sopra il filtro non è fisso ma alterna quattro valori, creando un movimento ritmico senza toccare le note. Accanto a lpf ci sono room per il riverbero, delay per l’eco, gain per il volume e pan per la posizione nello spazio stereo. Una piccola accortezza sulle dinamiche fa una notevole differenza, perché variare il volume dei colpi con gain toglie quella rigidità da metronomo che rende artificiali i ritmi programmati.
sound("hh*16").gain("[.25 1]*4")
Invece di scrivere valori a mano, puoi anche pilotare un parametro con un segnale continuo, cioè un’onda che oscilla nel tempo, tra cui sine (sinusoide), saw (dente di sega), tri (triangolare), oltre ai segnali casuali rand e perlin. Per impostazione predefinita queste onde oscillano tra 0 e 1, ma con range puoi fissare l’intervallo che ti serve, e con slow o fast rallentarne o accelerarne il movimento.
note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth")
.lpf(sine.range(100, 2000).slow(4))
Una volta capito questo meccanismo, ti accorgi che modulare un valore con un’onda è uno dei trucchi che danno vita al suono, e vale per il volume, il riverbero, l’intonazione e quasi qualsiasi altro parametro.
Mettere insieme i pezzi e costruire un brano
Finora abbiamo lavorato su una linea per volta, ma un brano è fatto di più parti che suonano insieme, ovvero batteria, basso, accordi e melodia. Strudel offre una sintassi pulita per sovrapporle. Basta anteporre $: davanti a ogni pattern, e ciascuno diventa una “traccia” indipendente che gira in parallelo alle altre dentro lo stesso ciclo. È l’equivalente delle tracce di un sequencer, ma scritto come testo.
setcpm(90/4)
$: sound("bd*4, [~ sd]*2, hh*8").bank("RolandTR909")
$: note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("sawtooth").lpf(sine.range(300, 1200).slow(4))
$: n("0 2 4 <[6,8] [7,9]>")
.scale("C:minor").sound("gm_synth_strings_1")
.room(.4).gain(.6)
Questo frammento contiene tre tracce, ovvero una batteria in stile house, una linea di basso filtrata da un’onda lenta e un tappeto di accordi con un po’ di riverbero. Eseguendolo tutto insieme con Ctrl+Invio, senti già qualcosa che assomiglia a un brano.
Il vantaggio del live coding si nota proprio qui. Puoi modificare una singola traccia mentre il resto continua a suonare, premere di nuovo Ctrl+Invio e sentire il cambiamento al volo, senza mai interrompere la riproduzione. Per silenziare temporaneamente una parte senza cancellarla, ti basta trasformare il suo $: in _$: e rieseguire.
A questo punto entra in gioco la sperimentazione, che è il vero punto di forza dello strumento. Cambia RolandTR909 in RolandTR808 per spostarti verso sonorità hip hop; sostituisci la scala C:minor con D:dorian per un colore più sospeso; alza il valore di room sugli accordi per allargare lo spazio. Ogni modifica costa pochi caratteri e ti dà un riscontro immediato. È un approccio che premia la curiosità più della pianificazione, perché invece di costruire il brano dall’inizio alla fine lo fai crescere per tentativi, ascoltando di continuo dove ti porta.
Campioni personalizzati e MIDI
Se dopo aver sperimentato ti piace l’idea e vuoi andare oltre, Strudel ti offre altre possibilità. La prima riguarda i suoni, dato che non sei limitato alla libreria interna. Con la funzione samples puoi caricare cartelle di campioni audio ospitate altrove, e la scorciatoia più comoda è puntare direttamente a un repository su una piattaforma di hosting del codice. La riga seguente carica una raccolta condivisa da qualcun altro e la rende immediatamente utilizzabile nei tuoi pattern.
samples('github:tidalcycles/dirt-samples')
sound("bd hh sd hh")
La seconda possibilità interessa chi ha già una postazione musicale. Strudel non vive isolato, perché può inviare segnali MIDI agli strumenti hardware o software collegati al computer, comportandosi come un sequencer testuale a tutti gli effetti. In questo scenario Strudel diventa il “cervello” ritmico di un setup più ampio, dove il suono vero e proprio lo producono i tuoi sintetizzatori.
Installare Strudel in locale per usarlo off-line
Se vuoi avere Strudel sempre a portata di mano, anche su un portatile senza rete, devi scaricare il codice e avviarlo in locale. In questo caso serve avere installato Node.js (se non lo hai ancora, scaricalo dal sito ufficiale nodejs.org scegliendo la versione LTS, quella più stabile e adatta all’uso quotidiano), dopodiché basta clonare il repository ufficiale e avviare il server di sviluppo con il gestore di pacchetti pnpm.
git clone https://codeberg.org/uzu/strudel
cd strudel
pnpm install
pnpm dev
Una volta lanciato l’ultimo comando, il terminale ti mostrerà un indirizzo locale, di solito qualcosa come http://localhost:4321, che puoi aprire nel browser per ritrovarti l’editor identico a quello online ma servito dalla tua macchina.
Se pnpm non è presente sul tuo sistema dovrai installarlo. La via più semplice, valida su Windows, macOS e Linux, è sfruttare npm, il gestore di pacchetti che viene installato in automatico insieme a Node.js. Ti basta aprire il terminale e digitare questo comando.
npm install -g pnpm
Per verificare che tutto sia andato a buon fine, controlla la versione installata con pnpm --version: se compare un numero (ad esempio 9.x), il programma è pronto e puoi tornare ai passaggi precedenti per avviare Strudel in locale.
Dall’idea al suono con un semplice prompt
Anche se non hai mai studiato musica né scritto una riga di codice in vita tua, oggi puoi comunque metterti a fare live coding musicale sfruttando l’intelligenza artificiale come intermediario. Invece di imparare a memoria le funzioni di Strudel, descrivi a parole il brano che hai in testa, per esempio “un beat lo-fi rilassato a 80 bpm con piano elettrico”, e lasci che un assistente AI traduca quella richiesta in codice Strudel pronto all’uso.
Generate a complete, runnable Strudel patch for a lo-fi chill beat that evokes a relaxed, late-night vibe.
## Output rules
- Use ONLY valid Strudel syntax (the JavaScript port of TidalCycles): mini-notation in strings, functions like sound/s, note, n, scale, bank, stack, and chained effects with dot notation.
- Put each layer on its own track using the `$:` prefix so they play in parallel.
- The code must run as-is when pasted into strudel.cc. Do not invent function names.
- Add an inline `//` comment above each layer describing what it does.
- Start with a tempo line using setcpm (e.g. setcpm(82/4) for ~82 bpm).
## Musical brief
- Tempo: 80–85 bpm, with a slightly swung feel (use elongation `@` or shuffled sub-sequences, not random timing).
- Key/mood: minor key, calm, nostalgic and smooth — good for studying or unwinding.
## Layers
- Dusty drums: soft bd/sd/hh, lightly humanized with `gain` variation; choose a vintage bank (e.g. RolandTR707 or AkaiLinn).
- Warm Rhodes chords: use a gm_epiano sound with lush 7th/9th chords, gentle `room`.
- Mellow bass: simple root-note line, rounded with `lpf`.
- Soft synth pad: long attack/release, low-pass filtered, sitting in the background.
- Vinyl crackle / texture: load a sample set via `samples('github:...')` if available, otherwise emulate it with a quiet, fast noisy sound.
## Production feel
- Fake sidechain: pump the pad/chords with a `gain` pattern synced to the kick.
- Atmosphere: add slow filter automation with `sine.range(...).slow(...)` on `lpf`, plus a couple of reverb swells via `room`.
## Structure
- An 8-bar loop with gentle variation every 4 bars (use `<...>` alternation so something changes across cycles).
End with a one-line note on how to tweak tempo and swing.Un prompt ben definito come quello qui sopra serve esattamente a questo, perché guida l’AI a generare istruzioni corrette, organizzate in tracce e già commentate. A te resta la parte divertente: incollare il risultato nell’editor del browser, premere play e iniziare a cambiare qualche numero per sentire come si trasforma il suono.
Questo qui sotto è il risultato ottenuto con Claude Opus 4.8. Copialo ed eseguilo ora su Strudel.cc.
// ~82 BPM, 4 beats per bar — relaxed, late-night tempo
setcpm(82/4)
// To use real samples instead of the synth crackle below, load a pack, e.g.:
// samples('github:tidalcycles/dirt-samples')
// Dusty drums — soft TR-707 kit: kick on 1 & 3, snare backbeat, swung hats, humanized gain
$: stack(
s("bd ~ ~ ~ bd ~ ~ ~").gain(0.9),
s("~ ~ sd ~ ~ ~ sd ~").gain(0.7).room(0.3),
s("hh@2 hh").fast(4).gain(perlin.range(0.18, 0.4)), // @2 = triplet swing on the hats
s("~ ~ ~ ~ ~ ~ ~ <~!4 oh!4>").gain(0.3).room(0.4) // open hat rings on the "and of 4" in bars 5–8
).bank("RolandTR707")
// Warm Rhodes — lush min9 / maj7 chords, one per bar; harmony shifts at bar 5; slow filter shimmer + room swell
$: note("<[a3,c4,e4,g4,b4] [a3,c4,e4,g4,b4] [d3,f3,a3,c4,e4] [d3,f3,a3,c4,e4] [f3,a3,c4,e4] [f3,a3,c4,e4] [e3,g3,b3,d4] [e3,g3,b3,d4]>")
.sound("gm_epiano1")
.attack(0.02).release(0.6)
.lpf(sine.range(800, 2200).slow(12))
.room("<0.3 0.3 0.35 0.35 0.5 0.55 0.6 0.45>") // reverb blooms across the loop
.gain(saw.range(0.6, 1).fast(2)) // light sidechain pump synced to the kick
// Mellow bass — simple syncopated root line under the chords, rounded with a low LPF
$: note("<a2 a2 d2 d2 f2 f2 e2 e2>")
.struct("x ~ ~ x ~ ~ x ~")
.sound("sawtooth")
.lpf(520).attack(0.01).release(0.25)
.gain(0.8)
// Soft pad — same chords as a warm wash: long attack/release, heavy moving LPF, background, pumped
$: note("<[a3,c4,e4,g4,b4] [a3,c4,e4,g4,b4] [d3,f3,a3,c4,e4] [d3,f3,a3,c4,e4] [f3,a3,c4,e4] [f3,a3,c4,e4] [e3,g3,b3,d4] [e3,g3,b3,d4]>")
.sound("sawtooth")
.attack(2).release(4)
.lpf(sine.range(300, 900).slow(16)) // slow atmospheric filter automation
.room(0.6)
.gain(saw.range(0.25, 0.7).fast(2)) // stronger sidechain duck on each kick
// Vinyl crackle — quiet, fast noise bursts emulating dust on the record (high-passed so it stays thin)
$: s("white*16").decay(0.02).sustain(0).hpf(1500).gain(perlin.range(0.0, 0.06))
// Tweak: change 82 in setcpm(82/4) for tempo (80–85 feels best); deepen swing by raising hh@2 → [email protected] (or add .swingBy(1/3, 8) to the drum stack) and lighten it toward [email protected].Un punto di partenza per chi vuole avvicinarsi al live coding musicale
Strudel non è un sostituto delle workstation audio tradizionali e non pretende di esserlo. Il terreno di Strudel è la generazione di pattern ritmici e melodici per tentativi, l’improvvisazione, e quel piacere un po’ ipnotico di vedere il suono cambiare a ogni riga che riscrivi.
Il limite più evidente, per chi parte da zero, è proprio l’approccio testuale, che all’inizio spiazza chi è abituato a un’interfaccia visiva con manopole e griglie; ma è anche ciò che lo rende veloce e portatile una volta superato lo scoglio iniziale. A favore gioca tutto il resto, ovvero nessuna installazione, funzionamento offline, un sistema di scale che ti impedisce quasi di sbagliare e una community attiva che condivide patch e campioni.
La cosa che lo rende, a mio giudizio, meritevole di una prova è la distanza minima tra l’idea e il suono. Apri una scheda del browser, scrivi quattro sigle, premi due tasti, e stai facendo musica. Pochi strumenti riescono a essere così immediati senza rinunciare alla profondità. Se hai del tempo e un po’ di curiosità, è uno di quei progetti che ripagano l’esperimento molto più di quanto il loro aspetto spartano lasci immaginare.













