Description:
Our live-coding performance explores the tension between collective harmony and individual expression through the integration of TidalCycles for audio and Hydra for GLSL visuals. Bound together by a shared MIDI “nervous system,” the performance is anchored by a collective foundation featuring a unified 171 BPM clock and Euclidean rhythmic structures. Against this synchronized framework, distinct individual “personalities” emerge, ranging sonically from organic world percussion to digital Moog bass, and visually through specialized shaders (ritualBalls and gloopFace) that interpret the same data through entirely different aesthetic lenses. As the piece unfolds, the performance dynamically evolves from minimalist geometry into a complex, reactive 3D climax, symbolizing how diverse, autonomous components can seamlessly merge into a singular, high-energy experience.
Video:
Code:
Tidalcycles:
setcps (171/60/4)
let shakers = s "{hc*3, casio:1*2}" # gain (range 0.7 0.9 rand) # pan (slow 8 sine)
let talking_drums = degradeBy 0.15 $ s "lt*4" # n (irand 8) # speed (range 0.9 1.4 rand) # gain 0.8
let bass_line = s "supermandolin" >| note (scale "minor" ("<0 [~ 2] 3 [~ -2]>")) # sustain 0.2 # lpf 1000 # gain 0.8
let piano_chord = slow 0.5 $ s "superpiano(3,8)" # n (choose [0, 4, 7, 11]) # gain 0.8 # room 0.5 # size 0.8
let intro_d1 = stack [s "<bd*2 bd> ~ <bd*2 bd> ~ sd bd" # room 0.6 # gain 1.2, s "~ hh*2" # room 0.5 # gain 1.2]
let build = stack [s "bd(3,8)" # gain 1.1, s "~ cp" # room 0.4, shakers, bass_line, n "0 ~ 3 ~ 5 ~ 7 ~" # s "casio" # gain 0.8 # room 0.3]
let main_groove = stack [s "<bd*2 [bd [~ bd]]> ~ bd [bd*2]" # gain 1.1,s "~ sd ~ sd" # n "2", jux rev $ s "tabla2:113(5,8)" # gain 0.8 # room 0.2,talking_drums # pan (slow 2 saw),shakers,bass_line # lpf (range 200 1200 $ slow 8 sine) # resonance 0.2,struct "t(3,8,1)" $ note (scale "minor" "<0 2 4 -1>" + "'m9") # s "superpiano" # sustain 2 # gain 0.7 # room 0.5]
let sbreak = stack [s "jungbass:9" # gain 0.9 # cut 1, s "auto:3" # gain 0.8 # lpf (slow 4 $ range 500 4000 saw), shakers # gain 0.6]
let filler= n "0 7*8" # s "supermandolin" # speed (range 1 2 saw) # sustain 0.1 # room 0.4 # gain 0.7
let outro_d5 = s "casio:1*4" # gain 0.8
let vizClearMidi = stack [
s "midi" # ccn "1" # ccv "0",
s "midi" # ccn "2" # ccv "0",
s "midi" # ccn "3" # ccv "0",
s "midi" # ccn "4" # ccv "0",
s "midi" # ccn "5" # ccv "0"
]
let vizShakersMidi = stack [
s "midi*12" # ccn "3" # ccv "90 0 95 0 88 0 100 0 92 0 98 0",
s "midi*8" # ccn "5" # ccv "0 0 127 0 0 0 127 0"
]
let vizTalkingDrumsMidi = s "midi*8" # ccn "4" # ccv "85 110 75 105 90 115 80 120"
let vizBassLineMidi = s "midi*8" # ccn "4" # ccv "115 0 105 118 0 112 0 108"
let vizPianoChordMidi = fast 2 $ s "midi*4" # ccn "5" # ccv "127 95 118 102"
let vizIntroD1Midi = stack [
s "midi*16" # ccn "1" # ccv "127 127 127 0 127 127 127 0 0 127 0 0 0 0 0 0",
s "midi*16" # ccn "2" # ccv "0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0",
s "midi*16" # ccn "3" # ccv "0 70 0 70 0 70 0 70 0 75 0 75 0 75 0 75"
]
let vizBuildLetMidi = stack [
s "midi*8" # ccn "1" # ccv "127 0 0 127 0 0 127 0",
s "midi*8" # ccn "2" # ccv "0 0 0 0 127 0 0 0",
s "midi*8" # ccn "3" # ccv "55 80 60 95 65 100 70 115",
s "midi*8" # ccn "4" # ccv "115 0 105 118 0 112 0 108",
s "midi*8" # ccn "5" # ccv "127 0 110 0 118 0 105 0"
]
let vizMainGrooveLetMidi = stack [
s "midi*16" # ccn "1" # ccv "127 80 0 0 127 0 0 80 127 0 0 0 127 80 0 0",
s "midi*16" # ccn "2" # ccv "0 0 0 0 127 0 0 0 0 0 0 0 127 0 0 0",
s "midi*16" # ccn "3" # ccv "45 70 55 90 50 80 60 100 45 70 55 90 50 80 60 110",
s "midi*8" # ccn "4" # ccv "85 110 75 105 90 115 80 120",
slow 2 (s "midi*8" # ccn "4" # ccv "115 0 105 118 0 112 0 108"),
struct "t(3,8,1)" $ s "midi*8" # ccn "5" # ccv "127 0 95 0 118 0 110 0"
]
let vizSbreakMidi = stack [
s "midi*8" # ccn "1" # ccv "127 60 127 55 127 50 127 45",
s "midi*8" # ccn "4" # ccv "90 100 110 120 100 90 85 95",
s "midi*12" # ccn "3" # ccv "90 0 95 0 88 0 100 0 92 0 98 0"
]
let vizFillerLetMidi = s "midi*16" # ccn "5" # ccv "127 110 105 115 100 118 95 120 90 0 0 0 0 0 0 0"
let rise = d1 $ qtrigger $ filterWhen (>=0) $ seqP [
(0, 1, n "0 7 0 7" # s "supermandolin"),
(1, 2, n "0 7 0 7 0 7 0 7" # s "supermandolin"),
(2, 3, n "0 7*8" # s "supermandolin"),
(3, 4, n "0 7*16" # s "supermandolin")
]
# room 0.3
# hpf (slow 4 (range 100 2000 saw))
# speed (slow 4 (range 1 3 saw))
# detune 2
let transition = do
d6 $ qtrigger $ filterWhen (>=0) $ seqP
[ (0,2, slow 2 $
s "supersquare*32"
# note (range (-24) 12 saw)
# sustain 0.08
# hpf (range 180 4200 saw)
# lpf 9000
# room 0.45
# gain (range 0.8 1.15 saw)
)
, (2,64, silence)
]
d7 $ qtrigger $ filterWhen (>=0) $ seqP
[ (0,2, silence)
, (2,2.25, stack
[ s "808bd*16" # gain 3.6 # speed 0.6 # crush 3 # distort 0.35 # room 0.3 # size 0.8
, s "tabla2:113*8" # gain 1.8 # speed 0.8 # room 0.35
, s "noise2:2*8" # gain 1.5 # hpf 1200 # room 0.25 # size 0.6
, s "casio:2" # note "-24" # sustain 0.35 # lpf 220 # gain 1.9
])
, (2.25,64, silence)
]
d11 $ qtrigger $ filterWhen (>=0) $ seqP
[ (0, 2.25, ccv "127" # ccn "4" # s "midi")
, (2.25, 64, ccv "0" # ccn "4" # s "midi")
]
d2 $ qtrigger $ filterWhen (>=0) $ seqP
[ (0,2.25, s "cp(3,8,2)" # room 0.85 # gain 0.7)
, (2.25,64, silence)
]
d1 $ s "bd(3,8)" # room 0.7 # gain 1.0
p "vizKickEuclid" $ s "midi*16"
# ccn "1"
# ccv "127 0 0 0 0 127 0 0 0 0 127 0 0 0 0 0"
d2 $ s "cp(3,8,2)" # room 0.85 # gain 0.7
p "vizClapEuclid" $ s "midi*16"
# ccn "2"
# ccv "0 0 127 0 0 0 0 127 0 0 0 0 127 0 0 0"
d3 $ slow 4 $ s "moog:2" >| note (scale "spanish" "0 ~ 2 ~ 4 ~ 5 ~" + "d4") # room 0.9 # gain 0.75 # legato 2.0 # lpf 800
d3 $ slow 4 $ s "moog:2" >| note (scale "spanish" "<[0 ~ 2 ~ 4 ~ 5 ~] [7 ~ 5 ~ 4 ~ 2 ~]>" + "d4") # room 0.9 # gain 0.75 # legato 2.0 # lpf 800
p "vizSpanishMoog" $ slow 4 $ s "midi*8"
# ccn "3"
# ccv "<[95 0 110 0 122 0 105 0] [127 0 105 0 95 0 80 0]>"
d1 $ every 4 (fast 2) $ s "bd ~ ~ bd ~ ~ bd ~" # room 0.7 # gain 1.1
p "vizFastKick" $ every 4 (fast 2) $ s "midi*8"
# ccn "1"
# ccv "127 0 0 127 0 0 127 0"
d2 $ s "cp ~ cp ~ cp ~ cp ~" # room 0.85 # gain 0.75
p "vizFourClaps" $ s "midi*8"
# ccn "2"
# ccv "127 0 127 0 127 0 127 0"
d1 silence
p "perfAfterSilenceD1" $ vizClearMidi
d3 silence
p "perfAfterSilenceD3" $ vizClearMidi
transition
p "perfDuringTransition" $ vizTransitionMidi
d1 intro_d1
p "perfDuringIntroD1" $ vizIntroD1Midi
d2 build
p "perfDuringBuild" $ vizBuildLetMidi
d6 filler
p "perfDuringFiller" $ vizFillerLetMidi
d2 silence
rise
d3 main_groove
p "perfDuringMainGroove" $ vizMainGrooveLetMidi
d6 silence
d1 $ s "bd*4"
# gain 1.15
# room 0.12
d10 $ s "midi*16"
# ccn "1"
# ccv "127 0 0 0 127 0 0 0 127 0 0 0 127 0 0 0"
d2 $ s "~ cp ~ cp"
# gain 0.9
# room 0.25
# size 0.35
d11 $ s "midi*16"
# ccn "2"
# ccv "0 0 0 0 127 0 0 0 0 0 0 0 127 0 0 0"
d3 $ s "hh*16"
# gain (range 0.65 0.95 $ slow 2 sine)
# pan (range 0.35 0.65 $ slow 4 sine)
d12 $ s "midi*16"
# ccn "3"
# ccv "35 70 45 90 35 75 45 95 35 70 45 90 35 75 45 105"
d7 $ s "~ tabla2:113 ~ tabla2:113"
# gain 0.8
# room 0.2
d4 $ slow 2 $ s "bass*8"
# note "<f2 c2 ef2 bf2>"
# legato 0.25
# cutoff 900
# resonance 0.25
# gain 0.95
d8 $ slow 2 $ s "bass"
# note "<f1 c1 ef1 bf1>"
# sustain 1.8
# cutoff 250
# gain 0.85
d5 $ slow 2 $ s "supersquare"
# note "<f'min c'min ef'maj bf'maj>"
# sustain 1.8
# lpf 2400
# room 0.4
# gain 0.75
d13 $ slow 2 $ s "midi*8"
# ccn "4"
# ccv "<100 75 90 80>"
rise
p "perfDuringRiseHydra" $ vizRiseSectionMidi
d6 $ slow 2 $ s "supersquare*8"
# note "<[f4 af4 c5 f5 c5 af4 c5 f4] [c4 ef4 g4 c5 g4 ef4 g4 c4] [ef4 g4 bf4 ef5 bf4 g4 bf4 ef4] [bf3 d4 f4 bf4 f4 d4 f4 bf3]>"
# sustain 0.18
# lpf 4500
# gain 0.7
# room 0.3
# delay 0.3
# delaytime 0.125
# delayfb 0.35
d9 $ slow 2 $ s "supersaw"
# note "<[f5 ~ ab5 c6 ~ ab5 ~ ~] [g5 ~ c6 ef6 ~ c6 ~ ~] [bf5 ~ ef6 g6 ~ ef6 ~ ~] [f5 ~ bf5 d6 ~ bf5 ~ ~]>"
# sustain 0.35
# legato 1
# lpf 5500
# room 0.45
# delay 0.3
# delaytime 0.1875
# delayfb 0.4
# gain 0.85
d14 $ slow 2 $ s "midi*8"
# ccn "5"
# ccv "<[127 0 95 120 0 90 0 0] [105 0 127 115 0 95 0 0] [120 0 127 110 0 95 0 0] [105 0 120 110 0 95 0 0]>"
d9 silence
d6 silence
d8 silence
d4 silence
d5 silence
d3 silence
d2 silence
d7 silence
hush
Hydra:
setFunction({
name: 'ritualBalls',
type: 'src',
inputs: [
{ type: 'float', name: 'kick', default: 0.0 },
{ type: 'float', name: 'clap', default: 0.0 },
{ type: 'float', name: 'hat', default: 0.0 },
{ type: 'float', name: 'bass', default: 0.0 },
{ type: 'float', name: 'rise', default: 0.0 },
{ type: 'float', name: 'phase', default: 0.0 }
],
glsl: `
vec2 uv = _st - 0.5;
uv.x *= resolution.x / resolution.y;
float t = time * 0.4;
uv.x += sin(uv.y * 90.0 + t * 18.0) * kick * 0.025;
uv.y += sin(uv.x * 60.0 - t * 12.0) * kick * 0.015;
float r = length(uv);
float a = atan(uv.y, uv.x);
vec3 col = vec3(0.005, 0.0, 0.015);
float center = 0.020 / (r + 0.04);
col += vec3(0.45, 0.04, 0.9) * center * (0.3 + bass * 0.9);
int balls = 3 + int(phase * 7.0);
for (int i = 0; i < 12; i++) {
if (i >= balls) break;
float fi = float(i);
float orbit = 0.18 + 0.08 * sin(t * 0.25 + fi);
orbit += kick * 0.08;
orbit += rise * 0.05;
orbit += phase * 0.05;
vec2 p = vec2(
cos(t * (0.4 + fi * 0.025) + fi * 6.283 / float(balls)),
sin(t * (0.4 + fi * 0.025) + fi * 6.283 / float(balls))
) * orbit;
float d = length(uv - p);
float ball = 0.008 / (d + 0.005);
float ring = sin(d * 95.0 - t * 5.0 + kick * 8.0);
ring = smoothstep(0.7, 1.0, ring) * 0.014 / (d + 0.01);
col += vec3(0.05, 0.8, 1.0) * ball;
col += vec3(1.0, 0.1, 0.65) * ring * (0.5 + rise * 1.0) * (0.4 + phase * 0.6);
}
float spokes = sin(a * 18.0 + sin(r * 25.0 - t * 3.0) * 2.0);
spokes = smoothstep(0.92 - kick * 0.15, 1.0, spokes);
spokes *= 0.025 / (r + 0.05);
col += vec3(0.2, 0.95, 1.0) * spokes * (0.3 + kick * 1.2) * (0.3 + phase * 0.7);
float scan = sin(_st.y * 850.0 + t * 15.0);
float scanMask = step(0.97 - hat * 0.2, scan);
col += vec3(0.0, 1.0, 0.35) * scanMask * 0.10 * (0.4 + phase * 0.6);
col += vec3(1.0, 0.9, 0.75) * clap * 0.20;
col += vec3(1.0, 0.08, 0.02) * rise * 0.15;
col *= smoothstep(1.05, 0.15, r);
return vec4(col, 1.0);
`
})
setFunction({
name: 'gloopFace',
type: 'src',
inputs: [
{ type: 'float', name: 'kick', default: 0.0 },
{ type: 'float', name: 'clap', default: 0.0 },
{ type: 'float', name: 'hat', default: 0.0 },
{ type: 'float', name: 'bass', default: 0.0 },
{ type: 'float', name: 'rise', default: 0.0 },
{ type: 'float', name: 'phase', default: 0.0 }
],
glsl: `
vec2 uv = _st - 0.5;
uv.x *= resolution.x / resolution.y;
uv *= 2.2;
// background swirl
float br = length(uv);
float ba = atan(uv.y, uv.x);
vec3 bg = vec3(0.025, 0.01, 0.07);
float swirl = sin(ba * 5.0 + br * 3.0 - time * 1.5 + hat * 5.0);
bg += 0.05 * vec3(0.6, 0.3, 1.0) * swirl;
bg += 0.06 * vec3(0.2, 0.4, 0.9) * (0.4 + bass * 0.8);
bg *= smoothstep(2.0, 0.2, br);
vec3 col = bg;
// ray
vec3 ro = vec3(0.0, 0.0, -3.2);
vec3 rd = normalize(vec3(uv, 2.0));
// orbit cam — yaw with bass+phase, pitch with clap
float camY = time * 0.4 + bass * 0.7 + phase * 1.4;
float cy = cos(camY), sy = sin(camY);
ro.xz = mat2(cy, -sy, sy, cy) * ro.xz;
rd.xz = mat2(cy, -sy, sy, cy) * rd.xz;
float camP = sin(time * 0.6 + clap * 2.5) * 0.22;
float cp1 = cos(camP), sp1 = sin(camP);
ro.yz = mat2(cp1, -sp1, sp1, cp1) * ro.yz;
rd.yz = mat2(cp1, -sp1, sp1, cp1) * rd.yz;
// gaze direction (eyes follow a wandering target)
vec2 gaze = vec2(
sin(time * 0.7 + phase * 6.0),
cos(time * 0.5 + phase * 4.0)
) * 0.06;
gaze.x += (clap - 0.5) * 0.04;
gaze.y -= kick * 0.05;
float t = 0.0;
float dHit = 0.0;
bool hit = false;
vec3 hp = vec3(0.0);
for (int i = 0; i < 56; i++) {
vec3 p = ro + rd * t;
// squash on kick, stretch on clap
vec3 q = p;
q.y *= 1.0 - kick * 0.22;
q.x *= 1.0 + kick * 0.12 + clap * 0.05;
// head ripple
float wob = sin(q.x * 4.0 + time * 2.5)
* sin(q.y * 3.5 + time * 2.0)
* sin(q.z * 4.0 + time * 2.7);
float headR = 0.85 + bass * 0.15;
float dHead = length(q) - headR + wob * (0.05 + rise * 0.14);
// eyes
vec3 eOff = vec3(0.30, 0.18, -0.55);
vec3 eL = q - vec3(-eOff.x, eOff.y, eOff.z);
vec3 eR = q - vec3( eOff.x, eOff.y, eOff.z);
eL.xy -= gaze * 0.5;
eR.xy -= gaze * 0.5;
float eyeR = 0.20 + clap * 0.07;
float dEyeL = length(eL) - eyeR;
float dEyeR = length(eR) - eyeR;
float dEyes = min(dEyeL, dEyeR);
// pupils (dark spheres slightly forward)
vec3 pL = eL - vec3(0.0, 0.0, -0.13);
pL.xy -= gaze * 0.6;
vec3 pR = eR - vec3(0.0, 0.0, -0.13);
pR.xy -= gaze * 0.6;
float pupR = 0.085;
float dPup = min(length(pL), length(pR)) - pupR;
// mouth (subtracted from face — opens with clap)
vec3 mp = q - vec3(0.0, -0.30 - clap * 0.05, -0.62);
float mouthR = 0.16 + clap * 0.12;
float dMouth = length(mp) - mouthR;
// smooth-union (head, eyes)
float k = 0.10;
float h = clamp(0.5 + 0.5*(dEyes - dHead)/k, 0.0, 1.0);
float dFace = mix(dEyes, dHead, h) - k*h*(1.0-h);
// smooth-subtract mouth from face
float ks = 0.07;
float hs = clamp(0.5 - 0.5*(dFace + dMouth)/ks, 0.0, 1.0);
dFace = mix(dFace, -dMouth, hs) + ks*hs*(1.0-hs);
float d = min(dFace, dPup);
if (d < 0.002) {
hit = true;
hp = q;
dHit = t;
break;
}
if (t > 10.0) break;
t += d * 0.6;
}
if (hit) {
// figure out which feature we hit (face / eye-white / pupil)
vec3 eOff2 = vec3(0.30, 0.18, -0.55);
vec3 eL2 = hp - vec3(-eOff2.x, eOff2.y, eOff2.z);
vec3 eR2 = hp - vec3( eOff2.x, eOff2.y, eOff2.z);
eL2.xy -= gaze * 0.5;
eR2.xy -= gaze * 0.5;
float dToEye = min(length(eL2), length(eR2)) - (0.20 + clap * 0.07);
vec3 pL2 = eL2 - vec3(0.0, 0.0, -0.13);
pL2.xy -= gaze * 0.6;
vec3 pR2 = eR2 - vec3(0.0, 0.0, -0.13);
pR2.xy -= gaze * 0.6;
float dToPup = min(length(pL2), length(pR2)) - 0.085;
int matId = 0;
if (dToPup < 0.01) matId = 2;
else if (dToEye < 0.02) matId = 1;
// sphere-ish normal — cheap and good enough for goofy
vec3 n = normalize(hp);
vec3 baseCol;
if (matId == 2) {
baseCol = vec3(0.02, 0.0, 0.05);
} else if (matId == 1) {
baseCol = mix(vec3(0.95, 0.95, 1.0), vec3(1.0, 0.5, 0.2), clap);
} else {
baseCol = 0.5 + 0.5 * sin(vec3(0.0, 1.5, 3.0) + time * 0.8 + hp.x * 1.5 + bass * 4.0);
baseCol = mix(baseCol, vec3(1.0, 0.4, 0.6), 0.25 + hat * 0.35);
}
vec3 lightDir = normalize(vec3(0.5, 0.8, -0.6));
float diff = max(0.0, dot(n, lightDir));
float fres = pow(1.0 - max(0.0, dot(n, -rd)), 2.5);
vec3 lit = baseCol * (0.30 + diff * 0.75);
lit += vec3(1.0, 0.9, 0.7) * fres * (0.3 + rise * 1.2);
float fog = exp(-dHit * 0.08);
col = mix(bg, lit, fog);
}
// overlays
col += vec3(1.0, 0.7, 0.4) * clap * 0.12;
col += vec3(0.8, 0.2, 1.0) * rise * 0.10;
col *= 0.92 + 0.08 * sin(_st.y * 600.0 + time * 8.0) * (0.3 + hat * 0.5);
return vec4(col, 1.0);
`
})
// d1 $ s "bd(3,8)" ===
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.0
).out(o0)
render(o0)
// d2 $ s "cp(3,8,2)" ===
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.10
).out(o1)
src(o1)
.blend(
src(o0).scale(() => 1.002 + (cc[1]||0) * 0.006),
0.22
)
.colorama(0.0008)
.out(o0)
render(o0)
// d3 $ slow 4 $ moog===
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.25
).out(o1)
src(o1)
.blend(
src(o0)
.scale(() => 1.003 + Math.sin(time * 0.3) * 0.001)
.rotate(() => Math.sin(time * 0.2) * 0.001 + (cc[2]||0) * 0.004),
0.26
)
.modulate(noise(2, 0.02), () => 0.006 + (cc[2]||0) * 0.022)
.colorama(() => 0.001 + (cc[2]||0) * 0.006)
.out(o0)
render(o0)
//d3 melody variation 2
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.4
).out(o1)
src(o1)
.blend(
src(o0)
.scale(() => 1.0035 + Math.sin(time * 0.4) * 0.0015)
.rotate(() => Math.sin(time * 0.25) * 0.0014 + (cc[2]||0) * 0.006),
0.28
)
.modulate(noise(2, 0.025), () => 0.008 + (cc[2]||0) * 0.028)
.colorama(() => 0.002 + (cc[2]||0) * 0.008)
.saturate(() => 1.10 + (cc[2]||0) * 0.40)
.out(o0)
render(o0)
//d1 $ every 4 (fast 2) $ s "bd ~ ~ bd ~ ~ bd ~" ===
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.5
).out(o1)
src(o1)
.pixelate(
() => 280 - (cc[0]||0) * 60,
() => 180 - (cc[0]||0) * 40
)
.blend(
src(o0).scale(() => 1.003 + (cc[0]||0) * 0.005),
0.30
)
.colorama(0.003)
.contrast(() => 1.05 + (cc[0]||0) * 0.4)
.out(o0)
render(o0)
//d2 $ s "cp ~ cp ~ cp ~ cp ~" ===
ritualBalls(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.6
).out(o1)
src(o1)
.kaleid(() => 4 + Math.floor((cc[1]||0) * 4))
.blend(
src(o0)
.scale(() => 1.0035 + Math.sin(time * 0.5) * 0.002)
.rotate(() => Math.sin(time * 0.3) * 0.002),
0.34
)
.modulate(noise(2, 0.03), () => 0.01 + (cc[1]||0) * 0.03)
.colorama(() => 0.003 + (cc[1]||0) * 0.008)
.saturate(1.2)
.out(o0)
render(o0)
//d1/d3 silence + transition
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.0
).out(o0)
render(o0)
//d1 intro_d1
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.15
).out(o1)
src(o1)
.blend(
src(o0).scale(() => 1.0025 + (cc[0]||0) * 0.005),
0.22
)
.colorama(0.0008)
.out(o0)
render(o0)
//d2 build
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.3
).out(o1)
src(o1)
.blend(
src(o0)
.scale(() => 1.003 + Math.sin(time * 0.4) * 0.0012)
.rotate(() => Math.sin(time * 0.25) * 0.001 + (cc[2]||0) * 0.003),
0.26
)
.modulate(noise(2, 0.02), () => 0.006 + (cc[2]||0) * 0.020)
.colorama(() => 0.002 + (cc[3]||0) * 0.005)
.out(o0)
render(o0)
//d6 filler / first rise
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.45
).out(o1)
src(o1)
.kaleid(() => 3 + Math.floor((cc[4]||0) * 5))
.blend(
src(o0)
.scale(() => 1.0035 + Math.sin(time * 0.5) * 0.002)
.rotate(() => Math.sin(time * 0.3) * 0.002 + (cc[3]||0) * 0.001),
0.30
)
.modulate(noise(3, 0.025), () => 0.008 + (cc[4]||0) * 0.030)
.colorama(() => 0.003 + (cc[4]||0) * 0.008)
.saturate(() => 1.15 + (cc[4]||0) * 0.40)
.out(o0)
render(o0)
//d3 main_groove
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.6
).out(o1)
src(o1)
.rotate(() => Math.sin(time * 0.2) * -0.002)
.blend(
src(o0)
.scale(() => 1.0038 + Math.sin(time * 0.5) * 0.0022)
.rotate(() => Math.sin(time * 0.3) * 0.0018 + (cc[3]||0) * 0.0008),
0.32
)
.modulate(noise(() => 2 + (cc[2]||0) * 4), () => 0.010 + (cc[0]||0) * 0.025)
.colorama(() => 0.003 + (cc[4]||0) * 0.007)
.contrast(() => 1.07 + (cc[0]||0) * 0.30)
.saturate(() => 1.10 + (cc[4]||0) * 0.30)
.out(o0)
render(o0)
// (d1 bd*4, d2 ~cp~cp, d3 hh*16, d4 bass*8, d5 supersquare)
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.78
).out(o1)
src(o1)
.pixelate(
() => 220 - (cc[4]||0) * 40,
() => 140 - (cc[0]||0) * 25
)
.modulateScale(noise(3, 0.03), () => 0.012 + (cc[4]||0) * 0.040)
.blend(
src(o0)
.scale(() => 1.0040 + Math.sin(time * 0.5) * 0.0025)
.rotate(() => Math.sin(time * 0.3) * 0.002 + (cc[3]||0) * 0.001),
0.34
)
.colorama(() => 0.005 + (cc[4]||0) * 0.009)
.contrast(() => 1.08 + (cc[0]||0) * 0.35)
.saturate(() => 1.10 + (cc[4]||0) * 0.35)
.out(o0)
render(o0)
//rise + d6 supersquare*8 + d9 supersaw climax
gloopFace(
() => cc[0]||0, () => cc[1]||0, () => cc[2]||0,
() => cc[3]||0, () => cc[4]||0, 0.95
).out(o1)
src(o1)
.kaleid(() => 4 + Math.floor((cc[4]||0) * 6))
.pixelate(
() => 180 - (cc[4]||0) * 40,
() => 110 - (cc[0]||0) * 25
)
.modulateScale(noise(3, 0.05), () => 0.015 + (cc[4]||0) * 0.060)
.blend(
src(o0)
.scale(() => 1.005 + Math.sin(time * 0.6) * 0.003)
.rotate(() => Math.sin(time * 0.35) * 0.0025 + (cc[3]||0) * 0.0012),
0.36
)
.colorama(() => 0.006 + (cc[4]||0) * 0.012)
.contrast(() => 1.10 + (cc[0]||0) * 0.40)
.saturate(() => 1.15 + (cc[4]||0) * 0.40)
.invert(() => (cc[0]||0) > 0.95 ? 1 : 0)
.out(o0)
render(o0)
hush()
Contributions:
Salem — Made the main visual shader (ritualBalls) and connected the music to the visuals so they react together.
Tewoflos — Came up with the visual idea and style that Salem built on.
Lincoln — Helped write the music in TidalCycles and helped build the second shader (gloopFace, the 3D face).
Reginald — Helped write the music in TidalCycles and helped build the second shader (gloopFace, the 3D face).