What I found most interesting in the reading is not just the claim that glitches reveal hidden structures, but the way it almost romanticizes breakdown as something inherently meaningful. I get why that’s appealing, especially when most of our interactions with technology are designed to feel seamless and unquestionable. But I’m not fully convinced that every disruption actually produces insight. Sometimes a glitch just feels like noise in the most literal sense, frustrating and empty rather than revealing. I think the manifesto leans heavily into the idea that opacity is always more honest than transparency, but I wonder if that’s just flipping one bias for another. There’s still a kind of aesthetic preference being imposed, where breakdown is treated as more authentic than functionality, and I’m not sure that always holds up outside of an artistic context.

At the same time, I did find the idea of glitches losing their meaning once they are recognized or reproduced much more convincing, because it points to something broader about how culture works. The moment something becomes legible, it becomes easier to package, repeat, and eventually normalize. That tension between the accidental and the intentional felt like the strongest part of the text for me, especially because it doesn’t fully resolve it. If a glitch only matters in the moment before it is understood, then any attempt to study or recreate it is already too late. That makes glitch art feel almost self-defeating, but also strangely honest about its own limits. I also liked that the manifesto doesn’t treat technology as neutral, but I think it sometimes overstates how much agency we gain through disruption. Not every break in a system leads to awareness or critique. Still, it made me think more carefully about how much I rely on smoothness and predictability, and how rarely I question what gets hidden in the process of making things “just work.”

This project explores a journey through different emotional and cultural states, inspired by the progression of a day and the feeling of returning home. I structured the composition as four distinct sections: Subah (morning), Dhak (rhythm and movement), Toofaan (chaos), and Ghar (homecoming). Each section combines both audio and visuals to reflect a specific mood — from the softness of sunrise to the intensity of a storm, and finally to a calmer, resolved ending.

I spent a lot of time experimenting with how to connect TidalCycles and Hydra through MIDI so that the visuals would respond meaningfully to the music. The hardest part was getting everything to sync and behave consistently took multiple attempts and debugging sessions. I also iterated a lot on the visuals, trying to move away from repetitive patterns and instead create distinct visual identities for each section. The final result is something that feels cohesive but still varied, where both the audio and visuals evolve together as the piece progresses.

Tidal code

setcps (85/60/4)

silence_all = do
  d1 silence
  d2 silence
  d3 silence
  d4 silence
  d5 silence
  d6 silence
  d7 silence
  d8 silence
  d9 silence

subah = do
  -- scene select: 0 = SUBAH
  d1 $ n "0*8" # s "midi" # midichan 0 # ccn 0 # ccv "0"


  d2 $ n "0*16" # s "midi" # midichan 0 # ccn 1 # ccv (range 0 45 $ slow 12 sine)
  d8 $ n "0*16" # s "midi" # midichan 0 # ccn 2 # ccv (range 10 50 $ slow 16 sine)

  d3 $ slow 4 $ s "sitar" # n "<0 5 3 7>"
    # room 0.95 # gain 0.75 # speed 0.8
    # lpf 2200 # pan (slow 5 sine) # cut 1

  d4 $ slow 4 $ s "supersaw"
    # note "c4 e4"
    # sustain 4 # gain 0.35 # lpf 600 # room 0.9 # lpq 0.12

  d5 $ struct "t(3,16)" $ slow 2 $ s "tabla2"
    # n (irand 46) # room 0.85 # gain 0.6
    # speed (range 0.85 1.15 rand)

  d6 silence
  d7 silence


dhak = do
  d1 $ n "1*8" # s "midi" # midichan 0 # ccn 0 # ccv "1"

  d9 $ n "0*4" # s "midi" # midichan 0 # ccn 3 # ccv "<0 64 0 64>"

  -- hydra motion
  d2 $ n "0*16" # s "midi" # midichan 0 # ccn 1 # ccv (range 20 85 $ slow 4 saw)
  d8 $ n "0*16" # s "midi" # midichan 0 # ccn 2 # ccv (range 20 90 $ slow 8 sine)

  d3 $ stack [
    s "tabla2*8"
      # n "<[20 8 8 20 20 8 3 12] [20 8 3 20 20 3 8 12]>"
      # room 0.5 # gain (range 0.95 1.1 rand),
    s "tabla:0(3,8)" # room 0.4 # gain 1.05 # speed 0.8,
    s "~ cp" # room 0.6 # gain 0.9
    ]

  d4 $ sometimesBy 0.25 (# speed 2)
    $ every 4 rev
    $ s "pluck"
    # note "<c5 e5 g5 e5 a5 g5 e5 d5>"
    # room 0.55 # gain 0.85 # speed 1.5

  d5 $ slow 2 $ s "supersaw"
    # note "<c3 e3 c3 d3>"
    # sustain 1.5 # gain 0.4 # lpf 550 # room 0.75

  d6 $ struct "t(1,8)" $ s "sitar"
    # n (irand 8) # room 0.65 # gain 0.7 # cut 1

  d7 silence


toofaan = do
  d1 $ n "2*8" # s "midi" # midichan 0 # ccn 0 # ccv "2"

  d9 $ n "0*8" # s "midi" # midichan 0 # ccn 3 # ccv "<0 64 100 64 0 100 64 0>"

  d2 $ n "0*16" # s "midi" # midichan 0 # ccn 1 # ccv (range 45 127 $ slow 2 saw)
  d8 $ n "0*16" # s "midi" # midichan 0 # ccn 2 # ccv (range 30 127 $ slow 4 saw)

  d3 $ s "[808bd:4(5,8), ~ 808:3, ~ cp ~ cp]"
    # room 0.6 # krush 7
    # speed (slow 4 "<1.5 1>") # gain 1.15

  d4 $ rotL 1 $ every 4 (fast 2)
    $ s "tabla2*8"
    # n "<[20 6 6 20 8 6 3 12] [20 3 6 20 8 12 6 3]>"
    # room 0.3 # gain 1.05
    # speed (range 0.95 1.15 rand)

  d5 $ fast 2 $ s "supersaw"
    # note "<c5 e5 g5 a5 g5 e5 d5 c5>"
    # sustain 0.12 # gain 0.5 # room 0.35
    # lpf (slow 4 $ range 1000 7000 saw) # lpq 0.25

  d6 $ slow 2 $ s "moog:2"
    # note "<c4 d#4 e4 c4>"
    # legato 1 # gain 0.6
    # lpf (segment 1000 $ slow 4 $ range 200 2200 saw) # lpq 0.3

  d7 $ fast 2 $ s "hh*2 hh*2 hh*2 <hh*6 [hh*2]!3>"
    # room 0.4 # gain (range 0.9 1.1 rand)


    ghar = do
      d1 $ n "3*8" # s "midi" # midichan 0 # ccn 0 # ccv "3"

      d9 $ n "0*4" # s "midi" # midichan 0 # ccn 3 # ccv "<0 64 0 64>"

      d2 $ n "0*16"
        # s "midi"
        # midichan 0
        # ccn 1
        # ccv (range 28 4 $ slow 16 sine)

      d8 $ n "0*16"
        # s "midi"
        # midichan 0
        # ccn 2
        # ccv (range 30 6 $ slow 16 sine)

      d3 $ slow 2 $ s "sitar"
        # n "<0 2 4 7 7 4 2 0>"
        # gain 0.9
        # room 0.95
        # speed 0.82
        # lpf 1800
        # cut 1

      d4 $ slow 4 $ s "pluck"
        # n "<4 ~ 2 ~ 0 ~ -2 ~>"
        # gain 0.38
        # room 0.9
        # sustain 0.4
        # lpf 1500

      d5 $ slow 4 $ s "supersaw"
        # note "c4 e4"
        # sustain 5
        # gain 0.16
        # room 0.98
        # lpf 320
        # lpq 0.15

      d6 $ struct "t(2,16)" $ s "tabla2"
        # n "<20 8>"
        # gain 0.38
        # room 0.8
        # lpf 1400

      d7 $ struct "t(1,16)" $ s "pluck"
        # n "<7 4>"
        # gain 0.14
        # room 0.95
        # sustain 0.25
        # lpf 2200


        
 subah
dhak
toofaan
ghar


hush

hydra code

window.cc = Array(128).fill(0)
window.ccActual = Array(128).fill(0)

navigator.requestMIDIAccess().then(function(access) {
  var inputs = Array.from(access.inputs.values())
  var input = inputs.find(i => i.name && i.name.indexOf("IAC") !== -1) || inputs[0]

  if (!input) { window.hydraText = "No MIDI input found"; return }
  window.hydraText = "MIDI: " + input.name

  input.onmidimessage = function(msg) {
    var status = msg.data[0]
    var ctrl   = msg.data[1]
    var val    = msg.data[2]
    window.hydraText = "cc" + ctrl + " → " + val
    if (status === 176) {
      cc[ctrl] = val / 127
      if (ctrl === 0) ccActual[0] = Math.min(3, Math.floor(val / 32))
      if (ctrl === 3) ccActual[3] = Math.min(2, Math.floor(val / 43))
    }
  }
})

window.DD = 0.008
window.c = (u, i, j) => {
  let segs = u.split("/"), cs = segs[segs.length - 1].split("-")
  return parseInt("0x" + cs[i].substring(2 * j, 2 + 2 * j)) / 255
}
window.b = (o, u, i, y, z) =>
  o().add(solid(1,1,1), DD)
    .thresh(i * 0.2 * (z - y) + y, 0.0001)
    .luma(0.5, 0.0001)
    .color(c(u,i,0), c(u,i,1), c(u,i,2))

window.colorize = (x, u, y=0, z=1) =>
  b(x,u,0,y,z).layer(b(x,u,1,y,z)).layer(b(x,u,2,y,z))
               .layer(b(x,u,3,y,z)).layer(b(x,u,4,y,z))

window.asp = () => innerHeight / innerWidth

window.madhubaniP = 'https://coolors.co/1b3fa6-c0341f-e8b832-2d6e2d-1a1a1a'
window.pichwaiP   = 'https://coolors.co/0d5c63-e87ca0-f0c040-fdf6e3-1b4f8a'
window.mughalP    = 'https://coolors.co/1b3d8f-c0251a-d4a017-f5f0e8-4a2c10'
window.toofaanP   = 'https://coolors.co/e0105f-ff6b00-ffe000-00d4aa-7b00e0'
window.gharP      = 'https://coolors.co/c0522a-d4803a-e8b060-f5dfc0-3d2b1f'

hush()

window.subah_A = () => {
  let hatch = () =>
    osc(60, 0.008, 0.5)
      .rotate(Math.PI / 4)
      .diff(osc(60, 0.008, 0.5).rotate(-Math.PI / 4))
      .kaleid(4)
      .scale(1, asp)

  let fishBody = () =>
    voronoi(6, 0.25, 0.1)
      .diff(voronoi(12, 0.2, 0.08))
      .kaleid(4)
      .rotate(0, () => 0.003 + cc[1] * 0.005)
      .scale(1, asp)

  colorize(() => fishBody(), madhubaniP, 0, 1)
    .layer(
      colorize(() => hatch(), madhubaniP, 0.2, 0.7)
        .luma(() => 0.5 - cc[1] * 0.1, 0.005)
    )
    .modulate(
      noise(() => cc[1] * 1.2 + 0.4, 0.015),
      () => cc[1] * 0.025 + 0.005
    )
    .saturate(() => 2.0 + cc[2] * 1.0)
    .contrast(() => 1.4 + cc[2] * 0.4)
    .hue(() => cc[2] * 0.08)
    .brightness(() => cc[1] * 0.04 - 0.01)
    .out(o0)
}

window.subah_B = () => {
  let petal = () =>
    osc(20, 0.02, 1.2)
      .mult(osc(20, 0.02, 1.2).rotate(Math.PI / 8))
      .kaleid(8)
      .rotate(0, () => 0.002 + cc[1] * 0.004)
      .scale(0.9, asp)

  let outerBuds = () =>
    osc(40, 0.01, 0.8)
      .mult(osc(40, 0.01, 0.8).rotate(Math.PI / 16))
      .kaleid(16)
      .rotate(0, () => -0.001 - cc[1] * 0.002)
      .scale(1, asp)

  colorize(() => petal(), pichwaiP, 0, 1).out(o1)
  colorize(() => outerBuds(), pichwaiP, 0.15, 0.85).out(o2)

  src(o1)
    .layer(src(o2).luma(0.4, 0.01))
    .add(src(o0).scale(0.998).brightness(-0.015), () => 0.08 + cc[2] * 0.12)
    .hue(() => cc[2] * 0.05 + time * 0.002)
    .saturate(() => 1.6 + cc[2] * 0.8)
    .contrast(() => 1.2 + cc[1] * 0.2)
    .out(o0)
}

window.dhak_A = () => {
  let stars = () =>
    osc(22, 0.04, 1.4)
      .rotate(Math.PI / 6, () => 0.01 + cc[1] * 0.02)
      .mult(osc(22, 0.04, 1.4).rotate(-Math.PI / 6, () => -0.01 - cc[1] * 0.015))
      .diff(osc(44, 0.02, 0.6).rotate(Math.PI / 12))
      .kaleid(12)
      .scale(1, asp)

  let inlay = () =>
    osc(66, 0.01, 0.4)
      .rotate(Math.PI / 4, () => 0.005 + cc[1] * 0.008)
      .kaleid(12)
      .scale(1.05, asp)

  colorize(() => stars(), mughalP, 0, 1)
    .layer(
      colorize(() => inlay(), mughalP, 0.3, 0.9)
        .luma(() => 0.45 + cc[2] * 0.15, 0.005)
    )
    .modulateRotate(
      osc(4, 0.02, 0),
      () => cc[1] * 0.3 + 0.02
    )
    .hue(() => time * 0.004 + cc[2] * 0.06)
    .saturate(() => 1.8 + cc[2] * 0.7)
    .contrast(() => 1.35 + cc[1] * 0.35)
    .out(o0)
}

window.dhak_B = () => {
  let vine = () =>
    noise(() => cc[1] * 2 + 1.5, 0.025)
      .mult(
        osc(12, 0.03, 1)
          .rotate(0, () => 0.008 + cc[1] * 0.01)
          .kaleid(6)
      )
      .scale(1, asp)

  let veins = () =>
    osc(50, 0.006, 0.6)
      .rotate(Math.PI / 3)
      .diff(osc(50, 0.006, 0.6).rotate(-Math.PI / 3))
      .kaleid(6)
      .rotate(0, () => 0.004 + cc[1] * 0.006)
      .scale(1, asp)

  colorize(() => vine(), madhubaniP, 0, 1)
    .layer(
      colorize(() => veins(), madhubaniP, 0.25, 0.75)
        .luma(() => 0.4 + cc[2] * 0.2, 0.005)
    )
    .modulate(noise(2, 0.02), () => cc[1] * 0.03 + 0.008)
    .hue(() => cc[2] * 0.1 + time * 0.003)
    .saturate(() => 2.2 + cc[2] * 0.8)
    .contrast(() => 1.3 + cc[1] * 0.3)
    .brightness(() => cc[1] * 0.05 - 0.02)
    .out(o0)
}

window.toofaan_A = () => {
  let yantra = () =>
    osc(28, 0.04, 2)
      .rotate(0, () => 0.025 + cc[1] * 0.04)
      .diff(
        osc(28, 0.04, 2)
          .rotate(Math.PI / 3, () => -0.025 - cc[1] * 0.03)
      )
      .kaleid(() => Math.floor(cc[1] * 10 + 3))
      .scale(1, asp)

  src(o0)
    .layer(
      colorize(() => yantra(), toofaanP, 0, 1)
        .luma(() => 0.3 - cc[1] * 0.1, 0.01)
    )
    .modulate(
      noise(() => cc[1] * 5 + 2, 0.04),
      () => cc[1] * 0.07 + 0.005
    )
    .scale(0.996)
    .rotate(0, () => cc[1] * 0.004)
    .colorama(() => cc[2] * 0.1 + 0.004)
    .hue(() => cc[2] * 0.03 + time * 0.006)
    .saturate(() => 1.8 + cc[2] * 1.2)
    .contrast(() => 1.3 + cc[1] * 0.4)
    .out(o0)
}

window.toofaan_B = () => {
  let powder = () =>
    noise(() => cc[1] * 10 + 4, 0.08)
      .mult(osc(40, 0.03, 2).kaleid(8))
      .pixelate(() => 8 + cc[1] * 300, () => 8 + cc[1] * 300)
      .scale(1, asp)

  let arcs = () =>
    osc(55, 0.025, 1.8)
      .rotate(0, () => 0.03 + cc[1] * 0.05)
      .kaleid(6)
      .pixelate(() => 32 + cc[2] * 150, 32)
      .scale(1, asp)

  colorize(() => powder(), toofaanP, 0, 1)
    .layer(
      colorize(() => arcs(), toofaanP, 0.1, 0.9)
        .luma(() => 0.4 - cc[1] * 0.15, 0.01)
    )
    .colorama(() => cc[2] * 0.15 + 0.005)
    .hue(() => cc[2] * 0.05 + time * 0.008)
    .saturate(() => 2.0 + cc[1] * 0.8)
    .contrast(1.25)
    .out(o0)
}

window.toofaan_C = () => {
  let tiles = () =>
    osc(32, 0.05, 1.6)
      .rotate(Math.PI / 8, () => 0.02 + cc[1] * 0.04)
      .mult(osc(32, 0.05, 1.6).rotate(-Math.PI / 8, () => -0.015 - cc[1] * 0.03))
      .kaleid(8)
      .scale(1, asp)

  src(o0)
    .layer(
      colorize(() => tiles(), mughalP, 0, 1)
        .luma(() => 0.35 - cc[1] * 0.1, 0.01)
    )
    .modulatePixelate(
      noise(() => cc[1] * 6 + 2, 0.05).pixelate(16, 16),
      () => cc[1] * 768 + 8
    )
    .scale(() => 0.994 + cc[1] * 0.006)
    .rotate(0, () => cc[1] * 0.005)
    .colorama(() => cc[2] * 0.06 + 0.002)
    .hue(() => time * 0.005 + cc[2] * 0.04)
    .saturate(() => 1.6 + cc[2] * 0.8)
    .contrast(() => 1.2 + cc[1] * 0.3)
    .out(o0)
}

window.ghar_A = () => {
  let petal = () =>
    osc(14, 0.015, 1.0)
      .mult(osc(14, 0.015, 1.0).rotate(Math.PI / 8))
      .kaleid(8)
      .rotate(0, () => 0.001 + cc[1] * 0.002)
      .scale(0.85, asp)

  let water = () =>
    voronoi(3, 0.05, 0.3)
      .diff(voronoi(6, 0.04, 0.25))
      .scrollY(() => time * 0.003)
      .scale(1, asp)

  colorize(() => water(), pichwaiP, 0, 0.8)
    .layer(
      colorize(() => petal(), pichwaiP, 0.1, 0.75)
        .luma(() => 0.25 + cc[1] * 0.15, 0.02)
    )
    .add(
      src(o0).scale(0.999).brightness(-0.025),
      () => 0.15 + cc[2] * 0.12
    )
    .hue(() => cc[2] * 0.04 + 0.001)
    .saturate(() => 1.2 + cc[2] * 0.5)
    .brightness(() => -0.04 + cc[1] * 0.04)
    .contrast(1.1)
    .out(o0)
}

window.ghar_B = () => {
  let warli = () =>
    shape(3, 0.55, 0.01)
      .scale(1, asp)
      .kaleid(6)
      .rotate(0, () => 0.003 + cc[1] * 0.005)
      .mult(
        osc(8, 0.015, 0.5)
          .kaleid(6)
          .rotate(Math.PI / 6, () => -0.002 - cc[1] * 0.003)
      )

  let alpana = () =>
    voronoi(4, 0.08, 0.18)
      .diff(voronoi(9, 0.07, 0.14))
      .scrollY(() => time * 0.004)
      .scale(1, asp)

  colorize(() => alpana(), gharP, 0, 1)
    .layer(
      colorize(() => warli(), gharP, 0.1, 0.7)
        .luma(() => 0.22 + cc[1] * 0.18, 0.02)
    )
    .modulateRotate(noise(1.5, 0.012), () => cc[1] * 0.035 + 0.003)
    .add(src(o0).scale(0.999).brightness(-0.018), () => 0.1 + cc[2] * 0.1)
    .hue(() => cc[2] * 0.05 + 0.001)
    .saturate(() => 1.1 + cc[2] * 0.4)
    .brightness(() => -0.03 + cc[1] * 0.04)
    .contrast(1.12)
    .out(o0)
}

window.launchSubah = () => {
  hush()
  var v = ccActual[3] || 0
  if (v === 0) subah_A()
  else         subah_B()
}

window.launchDhak = () => {
  hush()
  var v = ccActual[3] || 0
  if (v === 0) dhak_A()
  else         dhak_B()
}

window.launchToofaan = () => {
  hush()
  var v = ccActual[3] || 0
  if      (v === 0) toofaan_A()
  else if (v === 1) toofaan_B()
  else              toofaan_C()
}

window.launchGhar = () => {
  hush()
  var v = ccActual[3] || 0
  if (v === 0) ghar_A()
  else         ghar_B()
}

window.whichScene  = 0
window.whichSub    = 0

launchSubah()

update = () => {
  var nextScene = Math.max(0, Math.min(3, ccActual[0]))
  var nextSub   = Math.max(0, Math.min(2, ccActual[3]))

  if (window.whichScene !== nextScene || window.whichSub !== nextSub) {
    window.whichScene = nextScene
    window.whichSub   = nextSub
    switch (nextScene) {
      case 0: launchSubah();   break
      case 1: launchDhak();    break
      case 2: launchToofaan(); break
      case 3: launchGhar();    break
    }
  }
}

When I was working on my compositions with hydra and tidal, I found myself always leaning toward glitch sounds and the visual effects that matched them. Somehow, I found them to be clean and straightforward effects that everyone is familiar with. The reading was written in 2009-2010 by Rosa Menkman. I understand that at that time, people might have leaned toward “perfection” in technology by integrating sharper images, faster speeds, and invisible interfaces. However, since then, people have become more experimental with technology by playing around with glitches, noises, and colors. So, I believe that what she stated about bringing unfamiliarity and the unexpected through effects such as glitches is something we see very often today.

Menkman said that “The main subject of most glitch art is critical perception. Critical in this sense is twofold: either criticizing the way technology is conventionally perceived, or showing the medium in a critical state. Glitches release a critical potential that forces the viewer to actively reflect on the technology.” This made me realize that when I watch videos with glitches, they somehow make me concentrate more, as I start thinking about how and when the glitch is happening. I think this has a strong engagement effect on the audience. This solidifies that while watching glitch art, the audience perceives glitches without knowing how they came about, which gives them an opportunity to focus on their form to interpret their structures and learn more from what can actually be seen.

While reading, I also liked how the text was organized, with glitch effects added between sections and experiments with text indentation. This further reinforced what she is saying about breaking continuity and linearity. I also watched a video by the author where she experimented with glitch effects in many different ways. I realized that although I have used glitch effects before, I have never really explored them beyond simple techniques. This gave me new ideas on how I can use glitch effects in more creative ways.

Rosa Menkman’s Glitch Studies Manifesto is an interesting read but it can feel overwritten at times. That said one argument genuinely stuck with me and it was the idea that a glitch is not just a mistake but a moment that exposes what a technology actually is beneath its polished surface. When something breaks you suddenly see the system and its assumptions and limits. I think that framing makes a lot of sense.

Working in TidalCycles and Hydra I think about this a lot. When Im live coding and something goes wrong like a pattern fires off rhythm or a Hydra function produces something completely unexpected there is this brief moment of panic but also genuine curiosity. Like what just happened and why did it do that? Menkman would probably call that the acousmatic quality of glitch where you are confronted with an output you cannot fully trace back to a source. In my project I was deliberately layering tabla samples with glitchy electronic sounds and the tension between those two things felt like exactly what she was describing. I feel like the interruption becomes the point.

Where Im less convinced is her claim that intentional glitch art still counts as true glitch. I think once you are designing the error you have already domesticated it. There is a real difference between a glitch that surprises you and one that you planned. The shock is what makes it what it is.

I originally had a more culturally oriented idea in mind for this composition, which I hope to return to later, but I found myself lacking inspiration and direction at this time. To reset, I went back to the class materials, the dirt samples, and revisited the class basics by running patterns again. From there, the piece began to grow more naturally and shifted into an exploration of buildup. I initially wanted to construct everything from my own sampled slices, but ran into challenges shaping them into clean drops and transitions, so the work became a blend of templates and personal material. This led me to a more open and exploratory process building intensity, compressing into darker moments, and then opening back up again.


Tidal

setcps (135/60/4)



visSec = \n -&gt; ccv (pure $ fromIntegral n) # ccn "0" # s "midi"
visSpd = \p -&gt; ccv p # ccn "1" # s "midi"
visHit = \p -&gt; ccv p # ccn "2" # s "midi"
visDark = \p -&gt; ccv p # ccn "3" # s "midi"
visGeom = \p -&gt; ccv p # ccn "4" # s "midi"

visBus = \sec spd hit dark geom -&gt;
  stack
    [ visSec sec
    , visSpd spd
    , visHit hit
    , visDark dark
    , visGeom geom
    ]


introDrone =
  slow 8 $
  slice 40 "3" $ s "sudan"
  # speed 0.45
  # room 0.8
  # legato 2
  # gain 0.9

airPad =
  n (slow 4 "")
  # sound "supersaw"
  # legato 1.6
  # lpf (range 500 1800 $ slow 6 sine)
  # resonance 0.22
  # room 0.7
  # gain 0.45
  # shape 0.18

voiceLine = stack
  [ fast 2 $
      s "simplesine"
      &gt;| note (arp "updown" (scale "minor" ("[0,2,4,6]" + "") + "c4"))
      # gain 0.62
      # lpf 2600
      # room 0.55
  , s "simplesine"
      &gt;| note (scale "minor" ("[,0,2](3,8)") + "c4")
      # gain 0.58
      # room 0.6
  ]

versePerc =
  stack
    [ s "~ cp" # room 0.45 # gain 0.95
    , fast 2 $
        s "hh*2 hh*2 hh*2 "
        # room 0.65
        # gain (range 0.9 1.15 rand)
    ]

habeshaTop =
  slice 40 "18" $ s "habesha:1"
  # legato 1
  # room 0.55
  # gain 0.95

kickMain =
  s "[, ~ 808:3]"
  # room 0.35
  # gain 1.0

leadDrop =
  n (fast 2 "")
  # sound "supersaw"
  # legato 0.2
  # lpf (range 160 4200 $ slow 3 sine)
  # room 0.28
  # gain 0.72
  # krush 5
  # shape 0.3
  # pan (slow 2 sine)


buildHat =
  stack
    [ s "~ cp" # room 0.45 # gain 1.0
    , fast 2 $
        s "hh*2 hh*2 hh*2 "
        # room 0.65
        # gain (range 0.95 1.2 rand)
    ]
  # speed (slow 4 $ range 1 2 saw)

buildSnare =
  qtrigger $ filterWhen (&gt;=0) $ seqP
    [ (0,1, s "feel:2*4")
    , (1,2, s "feel:2*8")
    , (2,3, s "feel:2*16")
    , (3,4, s "feel:2*32")
    ]
  # room 0.25
  # hpf (slow 4 $ (1000 * saw + 200))
  # speed (slow 4 $ range 1 3 saw)
  # gain 0.95

buildPulse =
  s ""
  # gain 0.8
  # lpf (slow 4 $ range 300 2200 saw)
  # room 0.2

buildSynth =
  n (slow 2 "")
  # sound "supersaw"
  # legato 0.8
  # gain 0.5
  # hpf (slow 4 $ range 200 1600 saw)
  # lpf (slow 4 $ range 1200 5000 saw)
  # room 0.45
  # shape 0.25

kickFill =
  s "[808bd:1 [~ 808bd:1*3]] [808bd:1 ~ 808bd:1*2]"
  # room 0.45
  # speed (range 7.6 2.1 saw)
  # krush 10
  # gain 1.0



dropKick =
  s "[bd*2 ] [~ bd*2]"
  # gain 1.15
  # room 0.25
  # shape 0.32

dropBass =
  n ""
  # sound "supersaw"
  # octave 3
  # legato 1
  # gain 0.95
  # lpf (range 120 700 $ slow 2 sine)
  # room 0.2
  # krush 6

dropPerc =
  s ""
  # room 0.85
  # speed "2 1"
  # gain 1.2
  # squiz 1.05
  # up "-2"

dropMetal =
  s "[~ [hc*4 hc*8] ~ hc*16]"
  # gain 0.7
  # hpf 3500
  # room 0.15

dropStab =
  n ""
  # sound "supersaw"
  # legato 0.15
  # gain 0.7
  # room 0.25
  # lpf 1800
  # krush 8

silenceAll = do
  d1 silence
  d2 silence
  d3 silence
  d4 silence
  d5 silence
  d6 silence
  d7 silence
  d8 silence


section_intro = do
  d1 $ visBus
    0
    (slow 8 $ range 8 20 sine)
    (struct "t(3,8)" $ range 10 25 saw)
    (slow 8 $ range 95 70 sine)
    (slow 8 $ range 10 25 sine)
  d2 introDrone
  d3 airPad
  d4 silence
  d5 silence
  d6 silence
  d7 silence
  d8 silence

section_verse = do
  d1 $ visBus
    1
    (slow 6 $ range 18 35 sine)
    (struct "t(3,8)" $ range 20 45 saw)
    (slow 6 $ range 80 60 sine)
    (slow 4 $ range 18 40 saw)
  d2 voiceLine
  d3 versePerc
  d4 airPad
  d5 habeshaTop
  d6 silence
  d7 silence
  d8 silence

section_build1 = do
  d1 $ visBus
    2
    (slow 4 $ range 30 75 saw)
    (struct "t(3,8)" $ range 35 80 saw)
    (slow 4 $ range 65 40 saw)
    (slow 4 $ range 35 75 saw)
  d2 $ qtrigger $ filterWhen (&gt;=0) $ seqP
    [ (0,3, voiceLine)
    , (3,4, kickFill)
    ]
  d3 buildHat
  d4 buildSnare
  d5 buildPulse
  d6 buildSynth
  d7 silence
  d8 silence

section_build2 = do
  d1 $ visBus
    3
    (segment 128 $ range 65 120 $ saw)
    (segment 64 $ struct "" $ range 60 127 saw)
    (segment 64 $ range 45 20 saw)
    (segment 64 $ range 60 120 saw)
  d2 buildHat
  d3 buildSnare
  d4 buildPulse
  d5 buildSynth
  d6 $ qtrigger $ filterWhen (&gt;=0) $ seqP
    [ (0,1, s "feel:2*4")
    , (1,2, s "feel:2*8")
    , (2,3, s "feel:2*16")
    , (3,4, s "feel:2*32")
    ]
    # room 0.2
    # speed (slow 4 $ range 1 4 saw)
    # hpf (slow 4 $ range 1200 8000 saw)
  d7 kickFill
  d8 silence

section_drop = do
  d1 $ visBus
    4
    (slow 2 $ range 110 70 sine)
    (struct "" $ range 90 127 square)
    (slow 2 $ range 18 35 sine)
    (slow 2 $ range 85 45 saw)
  d2 dropKick
  d3 dropBass
  d4 dropPerc
  d5 dropStab
  d6 dropMetal
  d7 silence
  d8 silence

section_after = do
  d1 $ visBus
    5
    (slow 6 $ range 25 45 tri)
    (struct "t(3,8)" $ range 30 55 saw)
    (slow 6 $ range 70 55 sine)
    (slow 8 $ range 25 40 tri)
  d2 kickMain
  d3 voiceLine
  d4 airPad
  d5 habeshaTop 
  d6 silence
  d7 silence
  d8 silence

section_outro = do
  d1 $ visBus
    6
    (segment 128 $ slow 8 $ range 40 8 sine)
    (segment 128 $ slow 8 $ range 35 5 sine)
    (segment 128 $ slow 8 $ range 80 100 sine)
    (segment 128 $ slow 8 $ range 35 8 sine)
  d2 introDrone
  d3 silence
  d4 silence
  d5 silence
  d6 silence
  d7 silence
  d8 silence

goI  = section_intro
goV  = section_verse
goB1 = section_build1
goB2 = section_build2
goD  = section_drop
goA  = section_after
goO  = section_outro


goI
goB1
goB2
goD
goB1
goD
goA
goO

silenceAll
hush

Hydra

hush()

const ccv = (n, fallback = 0) =&gt; () =&gt; {
  try {
    return (cc[n] !== undefined ? cc[n] : fallback) / 127
  } catch (e) {
    return fallback / 127
  }
}

const SECTION = ccv(0, 0)   
const SPEED   = ccv(1, 20)  
const HIT     = ccv(2, 0)   
const DARK    = ccv(3, 80)  
const GEOM    = ccv(4, 20)  

const W = () =&gt; window.innerWidth
const H = () =&gt; window.innerHeight
const aspect = () =&gt; H() / W()

const colorFold = (src, n = 6) =&gt;
  new Array(n).fill().reduce(
    (a) =&gt; a.colorama(() =&gt; 0.002 + GEOM() * 0.02),
    src
  )

const triGrid = () =&gt;
  shape(3, 0.32, 0.001)
    .rotate(() =&gt; time * 0.04 + SPEED() * 0.4, () =&gt; 0.02 + HIT() * 0.08)
    .repeat(
      () =&gt; 2 + Math.floor(GEOM() * 6),
      () =&gt; 2 + Math.floor(GEOM() * 4)
    )
    .scrollX(() =&gt; 0.02 * Math.sin(time * 0.3))
    .scrollY(() =&gt; 0.02 * Math.cos(time * 0.2))
    .luma(0.15, 0.2)

const quadGrid = () =&gt;
  shape(4, 0.45, 0.0001)
    .repeat(
      () =&gt; 2 + Math.floor(GEOM() * 5),
      () =&gt; 2 + Math.floor(GEOM() * 5)
    )
    .rotate(() =&gt; time * 0.02 + SPEED() * 0.2)
    .scale(1, aspect(), 1)
    .luma(0.2, 0.15)

const movingOsc = () =&gt;
  osc(
    () =&gt; 8 + SPEED() * 65,
    () =&gt; 0.015 + SPEED() * 0.08,
    () =&gt; 0.4 + HIT() * 3.2
  )
    .posterize(() =&gt; 3 + Math.floor(GEOM() * 4))
    .kaleid(() =&gt; 3 + Math.floor(SECTION() * 8))
    .scale(1, aspect(), 1)
    .color(
      () =&gt; 0.5 + DARK() * 0.4,
      () =&gt; 0.15 + SECTION() * 0.35,
      () =&gt; 0.35 + GEOM() * 0.4
    )

const texture = () =&gt;
  noise(
    () =&gt; 1.5 + GEOM() * 8,
    () =&gt; 0.02 + SPEED() * 0.03
  )
    .pixelate(
      () =&gt; 8 + GEOM() * 50,
      () =&gt; 8 + GEOM() * 40
    )
    .luma(0.35, 0.25)

const darkWash = () =&gt;
  solid(0, 0, 0)
    .add(
      osc(
        () =&gt; 6 + SPEED() * 18,
        0.01,
        0
      )
      .rotate(() =&gt; time * 0.01)
      .luma(0.25, 0.25)
      .color(0,0,0),
      () =&gt; 0.15 + (1 - DARK()) * 0.55
    )

const accentLines = () =&gt;
  osc(
    () =&gt; 12 + HIT() * 35,
    0.01,
    1
  )
    .rotate(() =&gt; Math.PI/4 + time * 0.01)
    .luma(0.78, 0.18)
    .color(
      () =&gt; 0.15 + SECTION() * 0.18,
      () =&gt; 0.25 + DARK() * 0.2,
      () =&gt; 0.35 + DARK() * 0.25
    )
    .mult(quadGrid())
    .mult(
      osc(3,0.02,0)
        .rotate(Math.PI/2)
        .luma(0.6,0.2)
    )

const scene = () =&gt;
  colorFold(
    movingOsc()
      .modulate(
        texture(),
        () =&gt; 0.03 + GEOM() * 0.16
      )
      .mult(triGrid().add(quadGrid(), 0.5)),
    8
  )
  .add(texture(), () =&gt; 0.05 + GEOM() * 0.08)

src(o1)
  .modulateRotate(
    noise(
      () =&gt; 1 + GEOM() * 5,
      () =&gt; 0.01 + SPEED() * 0.02
    ),
    () =&gt; 0.003 + HIT() * 0.05
  )
  .scale(() =&gt; 1.0005 + HIT() * 0.01)
  .rotate(() =&gt; 0.0008 + SPEED() * 0.01)
  .blend(scene(), 0.82)
  .add(accentLines(), () =&gt; 0.04 + DARK() * 0.06)
  .add(darkWash(), () =&gt; 0.2 + (1 - DARK()) * 0.45)
  .saturate(() =&gt; 1 + DARK() * 1.2)
  .contrast(() =&gt; 1.0 + HIT() * 0.3)
  .brightness(() =&gt; -0.18 + DARK() * 0.18)
  .out(o1)

render(o1)

I gradually built up the piece from my first week’s demo and wanted to experiment combining acoustics with electronics. I used mostly built-in sound sources, and it mainly consists of two major parts, yet it does not follow a strict structure. Starting with a piano loop that kind of feels nostalgic, I started to add more electronic sounds that keep getting layered on top of one another. Then it transitions to the second stage where it felt like expanding, gradually getting more chaotic when some random piano is added. Eventually it vanishes into a supersine cluster sound.

tidal:


piano_opening1 = slow 1.5
  $ n "c4 g4 d5 ds5 [d5,bf5] ~ ~ ~ ~ ~ ~ ~ c6 ~ ~ ~"
  |+ n 7
  # s "superpiano"
  # velocity "0.8 0.6 0.75 0.45 0.5 ~ ~ ~ ~ ~ ~ ~ 0.7 ~ ~ ~"
  # detune 0.1
  # gain 0.7
  # lpf 2000
  # lpq 0.2         -- filter smooth
  # sustain 5
  # room 0.95
  # size 0.7
  # pan (slow 4 sine)

piano_opening2 = slow 1.5 $ n "f4 a4 d5 ds5 f5 ds5 d5 a4 g5 ~ ~ ~ a5 ~ ~ ~"
   |+ n 7
   # detune 0.1
    # s "superpiano"
    # velocity "0.8 0.6 0.55 0.45 0.5 0.45 0.35 0.6 ~ ~ ~ 0.7 ~ ~ ~"   --strike
    # gain 0.8
    # lpf 2000
    # lpq 0.2         -- filter smooth
    # sustain 5
    # room 0.95
    # size 0.7
    # pan (slow 4 sine)

hush

d1 $ piano_opening1
d1 $ piano_opening2

d1 $ qtrigger $ filterWhen (>=0) $ seqP [
   (0, 3, slow 1.5 $ n "c4 g4 d5 ds5 [d5,bf5] ~ ~ ~ ~ ~ ~ ~ c6? ~ ~ ~"
     |+ n 7 # velocity "0.8 0.6 0.75 0.45 0.5 ~ ~ ~ ~ ~ ~ ~ 0.7? ~ ~ ~"),
  (3, 6, slow 1.5 $ n "f4 a4 d5 ds5 f5 ds5 d5 a4 g5 ~ ~ ~ a5 ~ ~ ~"
     |+ n 7 # velocity "0.8 0.6 0.75 0.45 0.5 0.45 0.35 0.6 ~ ~ ~ 0.7 ~ ~ ~")
 ]
 # s "superpiano"
 # detune 0.1
 # gain 0.8
 # lpf 2000
 # lpq 0.2
 # sustain 2
 # room 0.8
 # size 0.9
 # pan (slow 4 sine)

d1 silence

hush

d1 silence

d2 $ slow 2 $ n "[a6|e6]*8"
  |+ n 5
  # detune 1.2
  # gain 0.4
  # s "supersaw"
  # decay 0.2
  # sustain 5
  # distort 1.2

d2 silence

d5 $ jux (rev) $
  struct "t*16?" $
  n (irand 36 + 24)
  # s "supervibe"
  # bandf (range 500 8000 $ rand) 
  # bandq 15
  # hpf (range 0 2000 $ rand)
  # sustain 0.05
  # detune 1.2
  # room 0.8 # size 0.9
  # gain (range 0.3 0.5 $ rand)
  # pan rand
  # squiz 5

d5 silence

d3 $ s "superstatic*16"
    # n (irand 12)
    # sustain 0.01
    # accelerate 20
    # pitch1 2000
    # room 0.9
    # gain (range 0.15 0.3 $ rand)

d3 silence

d4 $ slow 4 $
    n "c4 g4 d5 f5"
    |+ n 5
    # s "supersiren"
    # sustain 8
    # voice 0.3
    # hpf 500
    # lpf 2000
    # detune 0.2
    # room 0.9 # size 0.9
    # gain 0.4 
    # distort 2.0
    

d4 silence
d1 silence


d7 $ slow 4 $ s "moog:2"
  >| note (scale "<minor>" ("[<-7>,0,2]*<1>") + "[c5,c6]")
  # legato 1
  # lpf 500
  # lpfbus 1 (segment 64 (slow 4 (range 100 3000 saw)))
  # lpq 0.4
  # gain 0.4

d7 silence

d8 $ fast 4 $ sometimesBy 0.4 (shuffle 8) $ s "simplesine"
  >| note ((scale "pelog" "<-2 .. 10>"))
  # hpf 1200
  # lpf 3000
  # room 0.4
  # gain 0.5

d8 silence

hush

  d1 silence

 d10 $ qtrigger $ filterWhen (>=0)
   $ cat [
       repeatCycles 2 $ scramble 8 $ n "c4 g4 d5 ds5 [d5,bf5] ~ ~ ~ ~ ~ ~ ~ c6? ~ ~ ~"
         |+ n 7 # velocity "0.8 0.6 0.75 0.45 0.5 ~ ~ ~ ~ ~ ~ ~ 0.7? ~ ~ ~",
       repeatCycles 2 $ scramble 8 $ n "f4 a4 d5 ds5 f5 ds5 d5 a4 g5 ~ ~ ~ a5 ~ ~ ~"
         |+ n 7 # velocity "0.8 0.6 0.75 0.45 0.5 0.45 0.35 0.6 ~ ~ ~ 0.7 ~ ~ ~"
   ]
   # s "superpiano"
   # detune 0.1 # gain 0.7 # lpf 2500 # sustain 2 # room 0.9 # size 0.9 # pan 0.4

d10 silence

 d11 $ qtrigger $ filterWhen (>=0)
   $ cat [
       repeatCycles 2 $ scramble 8 $ fast 2 $ n "c4 g4 d5 ds5 [d5,bf5] ~ ~ ~ ~ ~ ~ ~ c6? ~ ~ ~"
         |+ n 19 # velocity "0.8 0.6 0.75 0.45 0.5 ~ ~ ~ ~ ~ ~ ~ 0.7? ~ ~ ~",
       repeatCycles 2 $ scramble 8 $ fast 4 $ n "f4 a4 d5 ds5 f5 ds5 d5 a4 g5 ~ ~ ~ a5 ~ ~ ~"
         |+ n 19 # velocity "0.8 0.6 0.75 0.45 0.5 0.45 0.35 0.6 ~ ~ ~ 0.7 ~ ~ ~"
   ]
   # s "superpiano"
   # detune 0.1 # gain 0.6 # lpf 2500 # sustain 2 # room 0.5 # size 0.6 # pan 0.7

d11 silence

hush

hydra:

	shape(4, 0.7, 0.01)
  .color(0.6, 0.7, 1)
  .repeat(2, 2)
	.modulateScale(osc(3, 0.1).rotate(1.5), 0.5)
  .layer(
    src(o0)
      .mask(shape(4, 0.9, 0.5))
			.scale(() => 1.01 + (0.5* 0.05))
      .rotate(() => Math.sin(time * 0.1) * 0.02)
      .luma(0.2, 0.1)
  )
  .modulatePixelate(
    noise(20, 0.5),
		() => 0.5 * 1024
  )
	.brightness(() => -0.15 + (0.5 * 0.1))
  .contrast(1.2)
  .scrollX(() => Math.sin(time * 0.2) * 0.05)
  .out();

	shape(4, 0.7, 0.01)
	  .color(0.6, 0.7, 1)
	  .repeat(2, 2)
	  .contrast(1.5)
	  .modulateScale(osc(3, 0.1).rotate(() => time * 0.2), 0.5)
	  .layer(
	    src(o0)
	      .mask(shape(4, 0.9, 0.5))
	      .scale(() => 1.01 + Math.sin(time) * 0.02)
	      .rotate(() => Math.sin(time * 0.1) * 0.05)
	      .luma(0.2, 0.1)
	  )
	  .modulatePixelate(
	    noise(20, 0.5),
	    () => [1024, 512, 128, 2048][Math.floor(time % 4)]
	  )
	  .brightness(() => -0.15 + Math.random() * 0.05)
	  .hue(() => Math.sin(time * 0.05) * 0.1)
	  .scrollX(() => Math.sin(time * 0.2) * 0.05)
	  .out();

hush()