Live Coding Reference · Strudel
by Brian Ellis, arranged for the Flash Laptop And Phone Orchestra
A collection of layered patterns for live performance and exploration. Each line is a self-contained voice that you can copy and paste into strudel.cc.
Beginning: To start, choose a line at random from the first section and paste it into Strudel. Let it repeat a few times, then swap it out for a different one. Do this by copying a new line, pasting it into Strudel, and pressing "stop" then "play".
Ending: Once everyone has gotten through all 6 sections, go back to using code from just the first section. Listen to this space for a little while, then stop your Strudel instance and find silence.
Section 01
Pink, white, and brown noise bursts shaped by long ADSR envelopes. When we combine them together, we should create an ocean of sound we can sink into, with the waves coming in and out.
sound("[pink ~ ~ ]/4").adsr("4:0.1:2:4").room(1).roomsize(10)
sound("[white ~ ~ ]/4").adsr("5:0.1:2:7").gain(0.4).room(1).roomsize(10)
sound("[brown ~ ~ ~ ]/6").adsr("6:0.1:2:6").gain(4).room(1).roomsize(10)
sound("[pink ~ ~ ]/5").adsr("3:0.1:2:3").room(1).roomsize(10)
sound("[white ~ ~ ~ ~]/5").adsr("4:0.1:2:9").gain(0.4).room(1).roomsize(10)
sound("[brown ~ ~ ]/4").adsr("5:0.1:2:6").gain(4).room(1).roomsize(10)
/4 at the end of the pattern sets how many cycles it takes to complete. Try changing it: /2 is faster, /8 or /12 is slower and more spacious. Larger numbers stretch the silence out further.
sound("[pink ~ ~ ]/2").adsr("4:0.1:2:4").room(1).roomsize(10)
sound("[pink ~ ~ ]/8").adsr("4:0.1:2:4").room(1).roomsize(10)
sound("[pink ~ ~ ]/12").adsr("6:0.1:2:8").room(1).roomsize(10)
Section 02
This next section introduces our pitch material, variations on C3 at different rhythmic subdivisions and decay lengths to create an evolving pad. These should be combined interchangeably with the previous noise pads.
note("[c3 ~ ~ ]/4").sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[c3 ~ ~ ]/5").sound("sawtooth").lpf(600).adsr("4:0.1:2:2").room(1).roomsize(10)
note("[c3 ~ ~ ]/6").sound("sawtooth").lpf(600).adsr("5:0.1:2:6").room(1).roomsize(10)
note("[c3 ~ ~ ~ ]/4").sound("sawtooth").lpf(600).adsr("3:0.1:2:4").room(1).roomsize(10)
note("[c3 ~ ~ ~ ]/5").sound("sawtooth").lpf(600).adsr("4:0.1:2:5").room(1).roomsize(10)
note("[c3 ~ ~ ~ ]/6").sound("sawtooth").lpf(600).adsr("5:0.1:2:6").room(1).roomsize(10)
.lpf(600) is a low-pass filter — it cuts out high frequencies. Try different values: .lpf(200) is dark and muffled, .lpf(2000) is brighter. Or replace it entirely with a vowel filter: .vowel("a") — try "a", "e", "i", "o", or "u" for very different timbres.
note("[c3 ~ ~ ]/4").sound("sawtooth").lpf(200).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[c3 ~ ~ ]/4").sound("sawtooth").lpf(2000).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[c3 ~ ~ ]/4").sound("sawtooth").vowel("e").adsr("3:0.1:2:2").room(1).roomsize(10)
Section 03
Same pulse-drone approach as Section 02, voiced on the third and fifth. As we all layer these with the root drones and noise pads, it should produce a slowly evolving major chord that breathes across cycle boundaries.
note("[e3 ~ ~ ]/4".transpose(0)).sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[g3 ~ ~ ]/5".transpose(0)).sound("sawtooth").lpf(600).adsr("4:0.1:2:2").room(1).roomsize(10)
note("[e3 ~ ~ ]/6".transpose(0)).sound("sawtooth").lpf(600).adsr("5:0.1:2:6").room(1).roomsize(10)
note("[g3 ~ ~ ~ ]/4".transpose(0)).sound("sawtooth").lpf(600).adsr("3:0.1:2:4").room(1).roomsize(10)
note("[e3 ~ ~ ~ ]/5".transpose(0)).sound("sawtooth").lpf(600).adsr("4:0.1:2:5").room(1).roomsize(10)
note("[g3 ~ ~ ~ ]/6".transpose(0)).sound("sawtooth").lpf(600).adsr("5:0.1:2:6").room(1).roomsize(10)
.transpose(0) shifts the pitch in semitones. Try 12 (up an octave), 24 (up two octaves), -12 (down an octave), or -24 (down two). Stick to multiples of 12 to stay in C major — highly recommended until the last section.
note("[e3 ~ ~ ]/4".transpose(12)).sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[e3 ~ ~ ]/4".transpose(-12)).sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[e3 ~ ~ ]/4".transpose(24)).sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
note("[e3 ~ ~ ]/4".transpose(-24)).sound("sawtooth").lpf(600).adsr("3:0.1:2:2").room(1).roomsize(10)
Section 04
Short two- or three-note figures — neighbor-tone ornaments and stepwise motion — spread across different subdivisions. Each voice should loop at a slightly different length, causing the phrases to drift in and out of phase.
note("[e3 f3 e3 ~ ~ ]/4".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[e3 d3 e3 ~ ~ ]/5".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[c3 d3 c3 ~ ~ ]/6".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[c3 a2 c3 ~ ]/4".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[g3 a3 g3 ~ ]/5".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[g3 f3 g3 ~ ]/6".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
c d e f g a b (add a number for octave, e.g. c3, e4). Use ~ for rests. A short phrase works best — 3 to 5 notes, then some silence. I'd strongly recommend staying in C major until all sections are introduced.
note("[c3 e3 g3 ~ ]/4".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[g3 ~ a3 ~ g3 e3 ]/6".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("[c4 b3 ~ a3 g3 ~ ]/5".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
Section 05
These chords walk a single line in harmonic motion while different voices hold common tones. When we add several of these together, we should create a dense rich texture.
note("<[c3 e3 g3]*4 [c3 f3 g3]*4 [c3 g3 g3]*4 [c3 f3 g3]*4>*0.7".transpose(0)).sound("piano").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [c3 e3 a3]*4 [c3 e3 g3]*4 [c3 e3 f3]*4>*0.78".transpose(0)).sound("gm_voice_oohs").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [b2 e3 g3]*4 [a2 e3 g3]*4 [g2 e3 g3]*4 [a2 e3 g3]*4>*0.8".transpose(12)).sound("gm_blown_bottle").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [a2 e3 g3]*4 [g2 e3 g3]*4 >*0.9".transpose(0)).sound("gm_acoustic_bass").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [c3 d3 g3]*4 [c3 f3 g3]*4 [c3 e3 g3]*4>*0.73".transpose(0)).sound("gm_electric_guitar_muted").adsr("0.1:0.1:1:1")
.sound() name to hear the same chord pattern through a completely different timbre. Try any of these: gm_electric_guitar_muted, gm_acoustic_bass, gm_voice_oohs, gm_blown_bottle, sawtooth, square, triangle
note("<[c3 e3 g3]*4 [c3 f3 g3]*4 [c3 g3 g3]*4 [c3 f3 g3]*4>*0.7".transpose(0)).sound("sawtooth").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [c3 f3 g3]*4 [c3 g3 g3]*4 [c3 f3 g3]*4>*0.7".transpose(0)).sound("square").adsr("0.1:0.1:1:1")
note("<[c3 e3 g3]*4 [c3 f3 g3]*4 [c3 g3 g3]*4 [c3 f3 g3]*4>*0.7".transpose(0)).sound("triangle").adsr("0.1:0.1:1:1")
Section 06
Longer, non-repeating melodic lines using angle-bracket sequences at non-integer speeds (×1.2 – ×1.7). Each voice cycles at a prime-ish rate relative to the others, producing slowly evolving counterpoint that rarely lands in the same alignment twice.
note("<c3 d3 e3 ~ ~ e f e ~ e d c ~ ~ >*1.4".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("<c3 a2 c3 ~ c d c ~ ~ c e d e ~ e f g ~ ~ g a g ~ g f g ~ ~ g f e ~ e d e ~ ~ >*1.7".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("<g3 a3 c4 ~ ~ c4 d4 c4 ~ c4 a3 c4 g3 ~ ~ >*1.2".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("<e3 f3 g3 ~ ~ g3 a3 g3 ~ g3 f3 e3 ~ ~ e3 d3 c3 e3 ~ >*1.3".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
note("<c4 a3 c4 ~ c4 d4 e4 d4 c4 ~ ~ c4 a3 g3 c4 ~ c4 g3 f3 e3 ~ ~ e3 f3 g3 ~ g3 a3 c4 ~ ~ >*1.5".transpose(0)).sound("sawtooth").lpf(600).adsr("1:0.1:1:1").room(1).roomsize(10)
*1.4 → something between 0.5 and 3.0), swapping out the filter (.lpf() or .vowel()), adjusting .transpose(), rewriting the note sequence, or changing the cycle length. There are no rules here.
note("<c3 d3 e3 ~ ~ e f e ~ e d c ~ ~ >*2.1".transpose(12)).sound("sawtooth").vowel("e").adsr("1:0.1:1:1").room(1).roomsize(10)
note("<g3 a3 c4 ~ ~ c4 d4 c4 ~ c4 a3 c4 g3 ~ ~ >*0.7".transpose(-12)).sound("sawtooth").lpf(400).adsr("1:0.1:1:1").room(1).roomsize(10)