I Feel Love
KentSt.FM × Max Headroom — Strudel Live Code
// ─────────────────────────────────────────────────────────────────────────────
// I FEEL LOVE — KentSt.FM × Max Headroom
// Moroder/Summer, reconstructed in Strudel
// Max vocals generated on Disco (Pi 5) via Supertonic TTS
// ─────────────────────────────────────────────────────────────────────────────
samples({
'max_full': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-full.mp3',
'max_intro': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-intro.mp3',
'max_monologue': 'https://glueratglobal.com/static/assets/audio/max-ifl/ifl-monologue.mp3',
})
// 136 BPM — Moroder original tempo
// 1 bar = 1.765s at 136 BPM
// Vocal timeline (64-bar cycle, no overlaps):
// Bar 1: intro fires (~4 bars, clears bar 5)
// Bar 9: full lyric (~7 bars, clears bar 16)
// Bar 25: monologue (~30 bars, clears bar 55)
// Bar 65: cycle repeats
setcps(136/60/4)
stack(
// ── Drums ──────────────────────────────────────────────────
s("bd").bank('RolandTR808').gain(1.1),
s("hh*16").bank('RolandTR808').gain(0.55)
.pan(sine.range(0.3,0.7).slow(4)),
s("~ ~ oh ~").bank('RolandTR808').gain(0.4),
// ── Bass ───────────────────────────────────────────────────
note("e2 b2 e3 b2 e2 b2 e3 [b2 g#2]").sound("sawtooth")
.cutoff(900).resonance(10)
.attack(0.001).decay(0.035).sustain(0).release(0.02)
.gain(0.9),
note("e1").sound("sine")
.attack(0.01).release(0.1)
.gain(0.5).lpf(120),
// ── Synths ─────────────────────────────────────────────────
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.38).pan(0.65),
note("e2").sound("sawtooth")
.cutoff(sine.range(200,2800).slow(16)).resonance(5)
.gain(0.22).pan(0.4),
note("/2").sound("sine")
.room(0.95).roomsize(0.9).gain(0.15)
.pan(sine.range(0.2,0.8).slow(7)),
note("<~ [e4,g#4,b4] ~ ~>/2").sound("sawtooth")
.cutoff(1800).resonance(4)
.attack(0.002).decay(0.3).sustain(0).release(0.1)
.gain(0.3).pan(0.3),
// ── Max Headroom Vocals — sequential, no overlaps ──────────
// 64-bar cycle. late() offsets by fraction of cycle.
// Bar 1: "I'm M-M-Max Headroom..." (~4 bars)
s("max_intro").slow(64).gain(1.0).room(0.2),
// Bar 9: "I Feel Love" full lyric (~7 bars) — late by 8 bars
s("max_full").slow(64).late(8/64).gain(1.15).room(0.25),
// Bar 25: Max monologue (~30 bars) — late by 24 bars
s("max_monologue").slow(64).late(24/64).gain(0.88).room(0.3)
)