Live coding music with real-time WebSocket playback using Strudel patterns.
A Strands Agents tool for algorithmic music composition with a beautiful mobile-friendly player UI.
- π§ Real-time WebSocket streaming - Send patterns to connected players instantly
- π± Mobile-friendly player - Glass morphism UI accessible from any device on your network
- πΉ 13 preset styles - Techno, ambient, DnB, house, acid, lofi, and more
- π Pattern history - Timeline of all played patterns with one-click replay
- π Multi-client support - Broadcast to multiple players simultaneously
pip install strands-strudelfrom strands import Agent
from strands_strudel import strudel
agent = Agent(tools=[strudel])
# Start the server and open player
agent("Start strudel and open the browser")
# Play a beat
agent("Play a techno beat")
# Create custom pattern
agent("Play s('bd*4') with some hi-hats")from strands_strudel import strudel
# Start server and open player in browser
strudel(action="start", open_browser=True)
# Play by style
strudel(action="play", style="techno")
# Play custom code
strudel(action="play", code='s("bd sd hh sd")')
# Stop playback
strudel(action="hush")
# Check status
strudel(action="status")
# List available styles
strudel(action="styles")
# Stop server
strudel(action="stop")| Action | Description |
|---|---|
start |
Start WebSocket + HTTP servers, optionally open browser |
play |
Send pattern code or preset style to connected players |
hush |
Stop all playback |
stop |
Stop servers |
status |
Show server status and connected players |
styles |
List available preset styles |
| Style | Description |
|---|---|
techno |
Four-on-the-floor kick with classic drums |
ambient |
Atmospheric pads with reverb and delay |
dnb |
Fast drum and bass patterns (140 BPM feel) |
house |
Classic house groove with bass |
acid |
303-style acid basslines with filter sweeps |
lofi |
Lo-fi hip hop beats |
minimal |
Sparse minimal techno |
breakbeat |
Syncopated breakbeat patterns |
dub |
Dubby rhythms with heavy delay |
trance |
Uplifting trance with supersaw |
jungle |
Fast jungle/breakcore patterns |
chillout |
Relaxed downtempo vibes |
industrial |
Distorted industrial sounds |
βββββββββββββββββββ WebSocket βββββββββββββββββββ
β Strands Agent β βββββββββββββββββΆ β Browser Player β
β β Port 9999 β (Strudel.js) β
βββββββββββββββββββ βββββββββββββββββββ
β
HTTP β
Port 10000 βΌ
βββββββββββββββββββββββββββββββ
β Mobile / Other Browsers β
β http://<your-ip>:10000 β
βββββββββββββββββββββββββββββββ
Environment variables:
| Variable | Default | Description |
|---|---|---|
STRUDEL_WS_PORT |
9999 |
WebSocket server port |
STRUDEL_WS_HOST |
0.0.0.0 |
WebSocket bind address |
Samples (from dirt-samples):
s("bd") // bass drum
s("sd") // snare drum
s("hh") // hi-hat
s("cp") // clap
s("808") // 808 sounds
s("piano") // piano
s("bd:0 bd:1") // sample variationsSynthesizers (built-in):
note("c4").sound("sine") // sine wave
note("c4").sound("sawtooth") // sawtooth wave
note("c4").sound("triangle") // triangle wave
note("c4").sound("square") // square wave
note("c4").sound("supersaw") // detuned saws"a b c d" // sequence (4 equal parts)
"[a b] c" // subdivide: a and b share one slot
"a*4" // repeat 4 times
"a/2" // play every 2 cycles
"~" // rest/silence
"a?" // 50% chance
"<a b c>" // one per cycle
"a,b,c" // play simultaneously (chord)
"a(3,8)" // Euclidean: 3 hits over 8 steps.lpf(1000) // lowpass filter
.hpf(200) // highpass filter
.gain(0.8) // volume
.pan(0.5) // stereo position
.room(0.5) // reverb
.delay(0.5) // delay amount
.distort(2) // distortion
.speed(2) // playback speedBasic Beat:
stack(
s("bd*4"),
s("~ sd ~ sd"),
s("hh*8").gain(0.6)
)Melodic:
n("0 2 4 <5 7>")
.scale("C:minor")
.sound("sawtooth")
.lpf(800)Ambient:
note("<[c3,e3,g3] [d3,f3,a3]>")
.sound("triangle")
.lpf(sine.range(400, 2000).slow(8))
.room(0.8)- Strudel REPL - Browser-based live coding
- Strudel Docs - Full documentation
- TidalCycles - The original Haskell version
- Strands Agents - Strands Agents SDK
MIT