home 2023 TOPLAP Solstice Live Set

2023 TOPLAP Solstice Live Set

I did a 15-minute improvised set from a nearly blank screen for the TOPLAP Solstice Stream 2023. Here’s what I started with:

 do
  jm1 4 $ silence
  jm2 4 $ silence
  jm3 4 $ silence
  jm4 4 $ silence
  jm5 4 $ silence
jm1 2 $ (|* gain 0.7) $
  drumM "rolandtr909" [
    s "bd" # n 1
  ]

jm2 2 $ (|* gain 0.7) $
  drumM "rolandtr808" [
    s "perc"
  ]

jm3 2 $ (|* gain 0.7) $
  n "0" # s "plaits" # engine 2 # morph 0.5 # timbre 0.5 # harm 0.5
  # level 0.9 # lpg 0.5 0.5 # mode 0 # octave 3

jm4 2 $ (|* gain 0.7) $
  n "5" # s "supergong" # voice 0.5 # decay 0.2 # accelerate 0 # octave 2
  # verbwet 0.1 # verbtime 0.1 # verbdamp 0.2 # verbhp 0.2 # verbfreeze 0 # verbdiff 1
  |* gain 0.7

-- samples
jm5 2 $ (|* gain 0.7) $
  n "0" # s "rave"

do
  jm1 4 $ silence
  jm2 4 $ silence
  jm3 4 $ silence
  jm4 4 $ silence
  jm5 4 $ silence

and here’s what I finished with:

-- bd cp sd hh/oh
jm1 2 $ (|* gain 0.4) $
  drumM "rolandtr909" [
    every 4 (silent) $ fast 2 $ s "bd(<3 5 3 5>,8)" # n 1,
    juxBy (slow 4 sine) rev $ every 6 (silent) $ every 4 (# waveloss "<25 50 75>") $
      ghost $ fast 2 $ s "cp(<5 3>, 8, 2)" # n 1 # (speed $ slow 4 $ range 0.8 1.2 sine),
    s "hh oh hh hh . hh hh hh hh . oh hh oh hh . hh!4" # cut 2
  ]
  # verbgain 1.0 # verbwet 0.1 # verbtime 0.2 # verbdamp 0.2 # verbhp 0.2
  # verbfreeze 0 # verbdiff 0.1

-- perc, cb
jm2 2 $ silent $ (|* gain 0.7) $
  slow 4 $ drumM "rolandtr808" [
   echo 3 0.75 0.5 $ fast 2 $ s "perc(5,8)" # n (irand 8)
  ]
  hush

jm3 2 $ (|* gain 0.6) $
  ghost $
  every 3 (off 0.25 (+ n (-7))) $
  every 4 (off 0.5 (+ n 5)) $
  fast 2 $ n (scale "<lydian phrygian>" (segment 8 $ irand 10))
  # s "plaits" # engine 2 # morph (slow 6 saw) # timbre 0.5 # harm (slow 8 sine)
  # level 0.9 # lpg 0.5 0.5 # mode 0 # octave 3

jm4 2 $ (|* gain 0.5) $ silent $
  ghost $ n "3@6 _ 4@5" # s "supergong" # voice 1 # decay 0.6 # accelerate 0 # octave 2

jm5 2 $ (|* gain 0.7) $ every 4 (# waveloss 20) $
  timeLoop 8 $ rotL 16 $ ghost $ fast 4 $ randslice 4 $ n "1 2 3 4" # s "rave" # cut 1

jm1 2 $ silence
jm2 2 $ silence
jm3 2 $ silence
jm4 2 $ silence
jm5 2 $ silence

For this set I was happy to have some preselected samples, instruments and effects and see where it went from there so blank-screening (which I do appreciate) wasn’t worth it as I would waste time typing out boilerplate. There isn’t much custom code on top of vanilla tidal here apart from jm1 and friends which are convenient aliases for jumpMod n. I’m also using tidal-drum-machines for drum samples and drumM and mi-Ugens for verb and plaits.

There are some nice performance tricks used here that I found while preparing this set:

  • Using ghost with cut or legato gets you some really nice rhythmic effects. I use cut here but it does (and did) end up with a lot of clicks if you’re not careful - combining legato and fadeTime is safer and more amenable to patterning.
  • Use timeLoop and rotL in combination with a random pattern to deterministically play a subset of it. You can shift it around by varying the parameter passed to rotL and change the length of the loop by varying the parameter passed to timeLoop.
  • Apply transformations at different integer loop intervals with multiple uses of every to build up patterns on longer timescales. I find this works very nicely with silence!
  • (3,8) and (5,8) rhythms always sound great sped up.
  • Set a low default top-level gain on the channel with * gain x at the top so you don’t redline instantly when stacking effects. Arithmetic operators use sensible defaults if a value isn’t present in the pattern their combining with so if you do * gain x on a pattern without gain it’ll be as if the pattern without gain had gain 1.

Most importantly, you need to know the functions and parameters you want to use by heart so you can concentrate on expression during the performance. I also routed each channel out an audio track in Ableton so I could keep an eye on levels and set up a Launch Control XL to control a gain and EQ on each channel.

A few things went wrong:

  • The percs on track 2 and the gong on track 4 didn’t really gel how I wanted them to, so after a bit of experimentation I silenced the tracks.
  • I tried to start recording in OBS as well as streaming half way through which caused some horrible glitches.

This was my first live-streamed performance - overall I really enjoyed it and I highly recommend the experience to anyone learning Tidal. Here’s the recording of the performance: