Skip to content

Instantly share code, notes, and snippets.

@nourspace
Created October 2, 2025 11:28
Show Gist options
  • Save nourspace/7fcecb3fb8f23ad3b4e55e0d49313ba4 to your computer and use it in GitHub Desktop.
Save nourspace/7fcecb3fb8f23ad3b4e55e0d49313ba4 to your computer and use it in GitHub Desktop.
Palm City - Techno
// 3-Minute Palm City
// Techno @ 120 BPM
setcpm(120/4)
// samples('github:geikha/tidal-drum-machines')
// samples('github:tidalcycles/dirt-samples')
// ARRANGEMENT SECTIONS (96 cycles total = ~3.2 minutes)
// Pattern /16 = 6 elements × 16 cycles each = 96 total cycles
// At 120 BPM: each cycle = 2 seconds
let intro = "<1 1 0 0 0 0>/16" // cycles 0-31 (time 00:00-01:04)
let buildup = "<0 0 1 0 0 0>/16" // cycles 32-47 (time 01:04-01:36)
let drop = "<0 0 0 1 1 0>/16" // cycles 48-79 (time 01:36-02:40)
let outro = "<0 0 0 0 1 1>/16" // cycles 64-95 (time 02:08-03:12)
// ^^ OVERLAP: cycles 64-79 play both drop + outro
//////// TESTS /////////
// let intro = "<0 0 0 0 0 0>/16"
// let buildup = "<0 0 0 0 0 0>/16"
// let drop = "<0 0 0 0 0 0>/16"
// let outro = "<1 1 1 1 1 1>/16" // Only outro plays
//////// TESTS /////////
// DRUM PATTERNS
// let kickPattern = s("bd*4").gain("1 .8 .9 .8")
// let mainHats = s("hh*8").gain(".3 .2 .4 .2 .3 .2 .5 .2")
// let openHats = s("~ ~ oh ~").gain(.6)
// let buildupHats = mainHats.fast(2) // double-time for tension
// let percussion = s("rim*4").n("0 ~ 1 2").gain(.3)
// DRUM PATTERNS - Enhanced with Roland machines
let kickPattern = s("bd*4").gain("1 .8 .9 .8").bank('RolandTR909')
let mainHats = s("hh*8").gain(".3 .2 .4 .2 .3 .2 .5 .2").bank('RolandTR909')
let openHats = s("~ ~ oh ~").gain(.6).bank('RolandTR909')
let buildupHats = mainHats.fast(2) // double-time for tension
let percussion = s("rim*4").n("0 ~ 1 2").gain(".3").bank('RolandTR808')
// BASS ELEMENTS
let bassLine = n("0 3 7 5 0 10 7 3").s("sawtooth").octave(2).gain(.8)
let bassAccents = n("0 ~ 7 ~").s("sawtooth").octave(3).gain(.5).delay(.125)
let bassFilter = sine.range(200,800).slow(1)
let buildupBassFilter = sine.range(200,50).slow(2) // closing filter
// MELODIC ELEMENTS
let leadMelody = n("12 ~ 15 ~ 19 ~ 17 ~").s("square").octave(5).gain(.5)
.lpf(sine.range(1000,3000).fast(4)).delay(.125).room(.3)
// NEW: CLASSICAL ORCHESTRAL LAYERS
// Synthetic strings using multiple oscillators
let strings1 = stack(
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("sawtooth").octave(4),
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("square").octave(4).gain(.3)
).gain(.3).lpf(sine.range(600,1800).slow(6)).room(.7)
// More bouncy synthetic strings
let strings2 = stack(
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("sawtooth").octave(4),
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("square").octave(4).gain(.3)
).gain(.3).lpf(sine.range(600,1800).slow(6)).room(.7)
.late("0 .02 0 .01") // swing timing
.sometimes(fast(2)) // occasional double hits
.gain(sine.range(.2,.4).fast(1)) // bouncy volume modulation
// Even more rhythmic bounce
let strings3 = stack(
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("sawtooth").octave(4)
.struct("x ~ x ~"), // add rhythmic gaps
n("<[0,4,7] [2,5,9] [7,11,2] [5,8,0]>/2").s("square").octave(4).gain(.3)
).gain(.3).lpf(sine.range(600,1800).slow(6)).room(.7)
.late("0 .02 0 .01")
let cello = n("0 3 7 5 0 10 7 3").s("sawtooth").octave(1)
.gain(slider(4.1, 0, 10, 0.1)).lpf(sine.range(150,400).slow(2))
let violin1 = n("19 ~ 22 ~ 26 ~ 24 ~").s("square").octave(5)
.gain(slider(5, 0, 10, 0.1)).delay(slider(0.3, 0, 1, 0.05)).room(.5).sometimes(fast(2))
let violin2 = n("19 ~ 22 ~ 26 ~ 24 ~").s("square").octave(5)
.gain(slider(5, 0, 10, 0.1)).delay(saw.range(0.5, 2.5).slow(16)).room(.5).sometimes(fast(2))
let violin3 = n("19 ~ 22 ~ 26 ~ 24 ~").s("square").octave(5)
.gain(slider(1.5, 0, 10, 0.1)).delay(sine.range(0.5, 2.5).slow(32)).room(.5).sometimes(fast(2))
let violin4 = n("19 ~ 22 ~ 26 ~ 24 ~").s("square").octave(5)
.gain(tri.range(0.5, 3).slow(16)).delay(tri.range(0.5, 2.5).slow(16)).room(.5).sometimes(fast(2))
// Electric glitch elements
let electricGlitch = s("click*16").gain(".05 .15 .05 .1 .2 .05 .15 .1")
.pan(sine.range(-.4,.4).fast(6)).hpf(3000).delay(.03125)
let electricBass = n("0 ~ 7 ~ 0 ~ 12 ~").s("square").octave(2)
.gain(.6).shape(.4).lpf(400).hpf(60)
let glitchPerc = s("perc*8").mask("1 0 1 1 0 1 0 1")
.gain(.2).pan(rand.range(-.2,.2)).delay(.03125).hpf(1000)
// OUTRO EFFECTS
let outroFilter = sine.range(2000,200).slow(8)
// Orchestral outro enhancement
let outroStrings = strings3.gain(.6).lpf(sine.range(1200,400).slow(8))
let outroViolin = violin4.gain(.8).delay(sine.range(.8,3).slow(12))
stack(
// INTRO - Gradual build
// kickPattern.mask(intro),
// mainHats.mask(intro),
// INTRO - Gradual build
kickPattern.mask(intro),
mainHats.mask(intro),
strings3.mask(intro).gain(.2),
// BUILDUP - Tension with filter close and fast hats
// kickPattern.mask(buildup),
// buildupHats.mask(buildup),
// bassLine.lpf(buildupBassFilter).mask(buildup),
// BUILDUP - Tension with filter close and fast hats
kickPattern.mask(buildup),
buildupHats.mask(buildup),
bassLine.lpf(buildupBassFilter).mask(buildup),
cello.mask(buildup), // <- ADD THIS LINE
// DROP - Full arrangement
kickPattern.mask(drop),
mainHats.mask(drop),
openHats.mask(drop),
bassLine.lpf(bassFilter).mask(drop),
bassAccents.mask(drop),
leadMelody.mask(drop),
percussion.mask(drop),
violin4.mask(drop), // <- ADD THIS LINE
electricGlitch.mask(drop), // <- ADD THESE
electricBass.mask(drop), // <-
glitchPerc.mask(drop), // <-
// OUTRO - Filter sweep out
// kickPattern.lpf(outroFilter).mask(outro),
// mainHats.lpf(outroFilter).mask(outro)
// OUTRO - Filter sweep out
kickPattern.lpf(outroFilter).mask(outro),
mainHats.lpf(outroFilter).mask(outro),
outroStrings.mask(outro), // <- Enhanced strings
outroViolin.mask(outro), // <- Enhanced violin
electricGlitch.mask(outro).gain(.05).lpf(outroFilter), // <- Fading glitch
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment