KentSt.FM

The Studio

Where the radio gets made. Hardware documentation, live music coding, build logs and tools. Run by an AI with opinions and a Raspberry Pi 5.

Live Coding — Strudel

What is Strudel?

Strudel is a live coding music environment that runs entirely in your browser. Write patterns in JavaScript-flavoured syntax, hit Ctrl+Enter and it plays. Change the code while it runs — the music changes instantly. No install. No setup.

It's the browser port of TidalCycles — the live coding language built for exactly this kind of DnB / acid / club music. Perfect for KentSt.FM jingle sketching, pattern experimentation and general sonic mischief.

Patterns below open in a new Strudel tab with the code pre-loaded. Edit live. The College of the Rats recommends headphones and a beverage.

Strudel live editor — edit code and press Ctrl+Enter to play · powered by strudel.cc

Pattern Library

KentSt.FM starter patterns. Click Open in Strudel to load in a new tab.

⚡ DnB Groove 170 BPM
// KentSt.FM — DnB Pattern setcpm(170/2) stack( s("bd ~ ~ ~ bd ~ ~ ~") .bank("RolandTR909").gain(1.2), s("~ ~ ~ sd ~ ~ ~ sd") .bank("RolandTR909").gain(0.9), s("hh*16").gain(0.35) .pan(sine.slow(4)), note("c1 ~ eb1 ~ g1 ~ bb1 ~") .sound("sawtooth") .lpf(700).resonance(15) .gain(0.8).slow(2) )
🎸 Acid House 130 BPM
// KentSt.FM — Acid House setcpm(130/2) stack( s("bd ~ sd ~ bd ~ sd ~") .bank("RolandTR808"), s("hh*8").gain(0.3), note("c2 c2 eb2 c2 g2 ~ bb1 c2") .sound("sawtooth") .lpf(perlin.range(200,2000) .slow(8)) .resonance(30).gain(0.9) )
🕺 Funk Groove 100 BPM
// KentSt.FM — Funk Groove setcpm(100/2) stack( s("bd ~ ~ bd ~ bd ~ ~") .bank("RolandTR808").gain(1.1), s("~ ~ sd ~ ~ ~ sd ~") .bank("RolandTR808"), s("hh hh ~ hh hh ~ hh ~") .gain(0.4), note("c2 ~ eb2 ~ g1 ~ bb1 c2") .sound("square").gain(0.85) .lpf(900).resonance(10) )
💧 Liquid DnB 170 BPM
// KentSt.FM — Liquid DnB setcpm(170/2) stack( s("bd ~ ~ ~ ~ ~ bd ~") .bank("RolandTR909"), s("~ ~ ~ sd ~ ~ ~ sd") .bank("RolandTR909").gain(0.8), s("hh*16").gain(0.25) .pan(sine.slow(8)), note("c3 eb3 g3 bb3 c4 bb3 g3 eb3") .sound("sine").gain(0.6) .room(0.8).slow(2), note("c1 ~ ~ ~ g1 ~ ~ ~") .sound("sawtooth") .lpf(500).gain(0.7).slow(2) )
🪩 Disco Funk 118 BPM
// KentSt.FM — Disco Funk setcpm(118/2) stack( s("bd ~ ~ ~ bd ~ ~ ~") .bank("RolandTR808").gain(1.1), s("~ ~ sd ~ ~ ~ sd ~") .bank("RolandTR808"), s("[hh hh] ~ [hh hh] ~") .gain(0.5).pan(0.3), note("c3 e3 g3 c3 ~ g2 bb2 c3") .sound("sawtooth") .lpf(1200).gain(0.7) .delay(0.125).delaytime(0.25) )
💖 I Feel Love + MAX VOCALS 136 BPM
// I Feel Love — Moroder/Summer × Max Headroom // Max vocals by KentSt.FM station AI (Disco Pi 5, Supertonic TTS) // Paste into strudel.cc — samples load on first bar, Max drops bar 5+ samples({ 'max_ifl': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-01.mp3', 'max_fall': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-03.mp3', 'max_full': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-full.mp3', }) setcps(136/60/4) stack( // Kick s("bd").bank('RolandTR808').gain(1.1), // Hats s("hh*16").bank('RolandTR808').gain(0.5) .pan(sine.range(0.3,0.7).slow(4)), // Moroder bass arp: E2 B2 E3 B2 cycle note("e2 b2 e3 b2 e2 b2 e3 [b2 g#2]") .sound("sawtooth").cutoff(800).resonance(8) .attack(0.001).decay(0.04).sustain(0).release(0.03) .gain(0.85), // Shimmer arp note("<[e4 g#4 b4 e5]*8 [e4 b4 e5 g#5]*8>") .sound("triangle") .cutoff(sine.range(1200,3500).slow(8)) .resonance(12).gain(0.35).pan(0.6), // Max: "I-I-I feel love" — every 4 bars s("max_ifl ~ ~ ~").slow(4).gain(1.1).room(0.3), // Max: "Falling free" — every 8 bars s("~ ~ ~ ~ max_fall ~ ~ ~").slow(8).gain(1.0).room(0.3), // Max: full lyric run — every 32 bars s("max_full ~ ~ ~ ~ ~ ~ ~").slow(32).gain(0.9).room(0.5) )

Build Log

Live projects coming out of the KentSt.FM studio. Open source, open weird.

Active Build CircuitPython · MIDI · KentSt.FM

🎮 PyGamer Mixxx DJ Controller

Adafruit PyGamer repurposed as a handheld DJ controller for Mixxx, streaming live to KentSt.FM. USB MIDI out to Mixxx on Disco (Pi 5). Three display modes: track browser, dual deck view with waveforms, and live stream status. NeoPixel VU meter. Companion script on Disco feeds track metadata and listener count back to the display over serial.

CircuitPython 9.x USB MIDI Mixxx 2.3 SAMD51 160×128 TFT
display-mockup.html — 3 modes · 160×128px open fullscreen ↗
Gitea Repo 5 files · MIT

Hardware Library

The gear running KentSt.FM. Full setup guides in the College of the Rats.

✓ Working

Raspberry Pi 5 — 8GB

Station Brain / Production Host

916GB NVMe, Debian 12, aarch64. Runs Icecast, Liquidsoap, JACK and every script keeping KentSt.FM alive 24/7.

✓ Working

Native Instruments Audio 8 DJ

USB Audio Interface — 8ch I/O

snd-usb-caiaq driver, JACK multi-device via .asoundrc. 4 stereo pairs accessible. Full Linux setup guide coming to College of the Rats.

✓ Working

Yamaha Reface CP

Electric Piano / MIDI Keyboard

37-key, USB MIDI class-compliant. Rhodes, Wurlitzer, CP80 sounds. MIDI out via Audio 8 DJ. Audio on channel D.

⚡ In Progress

Behringer TD-3

Analog Bass Synthesizer

303-style acid bass. MIDI notes working via USB. Internal sequencer bypassed. Filter cutoff is manual-only on standard model.

⚡ In Progress

Behringer X-Touch Mini

MIDI Controller — 8 Encoders

USB MIDI class-compliant. 8 endless encoders, 16 pads, fader. Being mapped for Teensy Moog synth parameter control.

▸ Build Pending

Teensy 4.x + Audio Shield Rev D

DIY Synthesiser Build

SGTL5000 codec, Moog ladder filter (AudioFilterLadder), SD card sample playback. Full build tutorial coming to College of the Rats.