I started this project with the music first and then creating and matching with the visuals.

At first, I followed Aaron’s instructions and just wrote some random blocks of compositions. Some of them are bright, some of them are creepy (is this the right word?) and they sounds irrelevant to each other. (Then I need to give credit to my amazing roommate that I got inspired from what she told me that it sounds like an agent lurking)

Then I basically applied three steps: I first adjust the samples to be the similar instruments, and then try to adjust the scale from major to minor, or other scales that I experiment to make them have similar styles. Lastly I fine-tuned some notes to make them more like a coherent whole. I also read through the documentation of the music structure and learned a bit of the power of silence between the build up and the drop so I kept it, but then to add relevance to the theme I added the female voice of “Warning”. Since this is like a story telling project to me, I added also a little bit of narrative samples and an opening ending to the structure.

For the visual part, I am always a fan of simple, red and black stuff, so I kept doing that. I have decided at a very early point to stick to one main visual and evolve different form over time. This cone-like visual gives me a sense of a tunnel/terminal where the agent is lurking around. Part of the visual evolution is due to how the sound sounds like, but an even bigger part of the visual is actually determined by the story in my mind (Agent enter the terminal -> terminal is like a maze with multiple entrance -> agent found the terminal and got in -> agent pull out the gun and break into the secret place -> the fight begin -> open ending) I made the visuals follow the basic plot and create them based on my imagination. Lastly, I tried to match them with the midi communication between Tidal and Hydra.

My Tidal Code

setcps(135/60/4)

hush

-- reset everything
do
  d11 $ ccv 0 # ccn 1 # s "midi"
  d12 $ ccv 1 # ccn 2 # s "midi"
  d13 $ ccv 0 # ccn 3 # s "midi"
  d14 $ ccv 0 # ccn 4 # s "midi"

do
  d1
    $ qtrigger $ filterWhen(>=0)
    $ struct "<[[t@3 t] t t@2]>" $ s "808hc"
    # cut 1
    # room 0.4
    # speed "<0.8 1 0.8 0.5>"
  d11 $ ccv 0 # ccn 1 # s "midi"

do
  d2
    $ qtrigger $ filterWhen(>=0)
    $ s "<hh(3,8,1) hh(5,8)>"
  d3 $ qtrigger $ filterWhen (>=0) $ s "~ 808hc*2 ~!2" # note (scale "minor" "<15 21 15 3>") # room 0.6
  d11 $ qtrigger $ ccv "<20 1>" # ccn 1 # s "midi"
  d12 $ ccv "1" # ccn 2 # s "midi"



do
  d4
    $ qtrigger $ filterWhen (>=0)
    $ struct "t!6 f [t t@2 f]"
    $ whenmod 4 3 ((# note (scale "minor" "[0,2,4]!4 [0,2,6] [0,2,4]!3"-12)))
    $ s "808hc"
    # note ((scale "minor" "<[<<22 20> 15> 7 3 1]>")-12)
    # legato 0.6
    # gain (range 0.7 1.3 sine)
    # room 0.6
  d11 $ qtrigger $ filterWhen (>=0) $ ccv "<<40 60> <40 60>>" # ccn 1 # s "midi"
  d12 $ ccv "<1 <2 3>>" # ccn 2 # s "midi"

hush

do
  d5 $ stack [
    s "bass3*8" # speed ("<1.2 1>") # room 0.4,
    slow 2 $ s "glitch:3(3,8) glitch:2"
    ]
  d6 $ s "hh*8"
  d12
    $ qtrigger $ filterWhen (>=0)
    $ ccv "<127 20 60 [[50 35] [20 10] [40 10] 10]>" # ccn 1 # s "midi"


do
  d1 silence
  d6 silence
  d8 $ s "bass3(12,16)" # speed ("<1.2 1>") # room 0.4
  d5 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,8, s "sharp:2*4"
      # lpfbus 1 (segment 1000 (slow 8 (range 100 7000 saw)))
      # lpq 0.3
      # gain  (slow 8 (range 0.4 2 saw))
      -- # speed (range 0.3 4 saw),
      # room 0.3)
    ]
  d9 $ stack [
    slow 2 (s "~ glitch:3"),
    struct "t!2 [f t] [t f]" $ s "[909 sd]!2"  # room 0.6,
    qtrigger $ filterWhen (>=0) $ slow 4 $ s "hh*<4 8 16 32>"
    ]
  d6 $ s "~!3 <sharp:6 ~>" # room 0.3 # gain (slow 2 "<1 1.5>") # (slow 2 (lpf "<1000 10000>"))
  d11 $ qtrigger $ filterWhen (>=0) $ ccv (slow 8 (segment 8 (range 10 127 saw))) # ccn 1 # s "midi"
  d12 $ qtrigger $ filterWhen (>=0) $ ccv "<1 2 4 8 12 18 23 100>" # ccn 2 # s "midi"
  d13 $ qtrigger $ filterWhen (>=0) $ ccv "<0.1 1>" # ccn 3 # s "midi"


hush

do
  d2 silence
  d3 silence
  d9 silence
  d8 silence
  d7
    $ qtrigger $ filterWhen (>=0) $ seqP [
    (1,25, every 2 (fast 2) $ s "bass3(5,8)" # note ("1..2") # room 0.3),
    (25,30, every 2 (fast 2) $ s "bass3(5,8)" # note ("1..2") # room 0.3 # gain (slow 12 (range 1 0.1 saw)))
    ]
  d6
    $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,1, s "sharp:3" # gain 1.5 # room 1 # krush 5),
    (1,25, s "sharp:2*2" # speed "0.7" # gain (slow 25 (range 1.3 0.8 saw))),
    (1,17, slow 2 $ s "hardkick:5" # gain "<<2 1.3> 1.3 1.5 1.3>" # room 0.8 # lpf ("<10000 10000 800 10000>")),
    (1,20, s "909*4" # room 0.3 # gain 1.3),
    (1,25, s "hh*16" # gain (range 1 1.2 perlin)),
    (25,30, s "sharp:2*2" # speed "0.7" # gain (slow 8 (range 0.8 0 saw))),
    (31,33, s "<sharp:7 [~!3 sharp:9]>" # room "<1 1.5>" # gain "<1 1.2>")
    ] # room 0.5
  d4
    $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,30, slow 2 $ chop "<32 16>" $ "ade:6"
    # speed ("<2 3>")
    # room 0.2 # gain (range 1 1.8 saw))
    ]
  d11 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,25, ccv (segment 16 (range 100 1 saw))),
    (25,30, slow 5 $ ccv (segment 5 (range 100 0 saw))),
    (30,33, ccv "0")
    ] # ccn 1 # s "midi"
  d12
    $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,1, ccv "1 0!64"),
    (1,10, ccv "<1 4 10 20>"),
    (25,30, ccv "1"),
    (30,33, ccv "1")
    ] # room 0.5 # ccn 2 # s "midi"
  d14
    $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,1, ccv "1"),
    (1,2, ccv "0"),
    (3,17, slow 2 $ ccv "1 0!12")
    -- (25,33, ccv "1")
    ] # ccn 4 # s "midi"

hush

My Hydra Code

hush()

// intro
shape(30,()=>cc[1]*1.3)
.scale(1,()=>window.innerHeight/window.innerWidth,1)
.colorama(1)
.scrollY(0.1,0.1)
.diff(src(o1).scale(0.9),0.5)
// comment out for the 4th part
// .luma(0.12)
// .repeat(()=>ccActual[2],()=>ccActual[2])
.out(o1)
render(o1)

// build up
src(o1)
.repeat(()=>ccActual[2],()=>ccActual[2])
.modulate(noise(()=>ccActual[2]/3,()=>cc[2]*5))
.colorama(()=>ccActual[3])
.invert(()=>ccActual[4])
.out(o2)
render(o2)

//drop
src(o1)
.repeat(()=>ccActual[2],()=>ccActual[2])
.modulate(noise(()=>ccActual[2]/3,()=>cc[2]*5))
.hue(()=>cc[1]*50)
.colorama(()=>ccActual[3])
.modulateScale(noise(3,()=>cc[1]))
.invert(()=>ccActual[4])
.out(o2)



// final
shape(4,100).out(o0)
render(o0)



hush()

The hardest part of the composition for me was actually settling on what to include and what to exclude from the final piece. I had so many ideas but I only wanted to include ones that made sense together in my mind. My main goal for this project was to see how far I can push one single line of code (for visuals). I started with one line and then I manipulated it a bit to create the different sections that give off different vibes. I also tried to change little things within each section to make it feel different (live! and improvised-ish). As I mentioned earlier, the hardest part was to actually decide on what to include and what to tweak because I realized that there’s so much one can do with just a single line of code.

Initially I had a beat drop, but when I was going over my composition piece again I decided to remove it. I wanted my piece to have a more steady curve rather than a peak and a base line. 

My composition is structured in sections. Some sections are of similar vibes whereas other sections are contrasting. 

This is the general sequencing of the sections, however I tweak things around as I go so the sections aren’t very definite:

Visuals: A – B – C – D – B

Audio:  A – (A+B) – (A’+C) – C – A 

I am layering the sounds and slowly removing some of the layers towards the end. I am also editing the visuals in each section to create transitions.

The code:

Hydra:


osc(2,0.01,1).rotate(1.8).layer(osc(10,0,1).color(4,0,10).luma(()=>cc[0]*9,10)).modulate(noise(()=>(cc[0])*2,.2)).rotate(()=>cc[0]*0.2).out(o0)
// ......................................10.....................
//..4.................................................
//.................................................0...100....


osc(1,.01,1).layer(osc(5,.01,5).color(0,0,20).rotate(1.2)).modulate(noise(()=>(cc[0])*6,.9)).rotate(()=>cc[0]*.5).out(o0)
//play around with color end at 1,1,20

//.....................50
//.....................500


osc(2,0.1,1).layer(osc(20,0,1).color(1,1,4)).modulate(noise(()=>(cc[0])*10)).out()
//play around with color, end at 12,2,5


osc(4,0.01,1).color(1,1,0).rotate(1).layer(osc(5,0,1).color(1,1,10).luma(()=>cc[0]*8,9)).modulate(noise(2,.2)).out(o0)
//40
//400

hush()

Tidal:


d3 $ ccv "0 20 64 127" # ccn "0" # s "midi"
first

second

third
d2 silence

d4 silence

first
d1 silence

hush


second= do
  d1 $ qtrigger $ filterWhen (>=0) $ slow 2 $ s "peri:8"
    >| note (scale "<minor major enigmatic>" ("[<2 5 -3 8>]*8") + "[c5,c9]")

first = do
  d2 $ qtrigger $ filterWhen (>=0) $ s "bd sd bd"
  d4 $ qtrigger $ filterWhen (>=0) $ s "808bd:2 cp ~ cp" # speed 3

third = do
  d1 $ sound "[<techno:1 glitch(3,8) sundance:2>, ~ bd*2]" # room 1.2 # crush 8

Demo:

My project draws inspiration from the tragic beauty of human ambition and its inevitable unraveling. It mirrors the story of Itachi Uchiha and the Akatsuki—a tale of sacrifice, idealism, and the fragile line between unity and destruction.

The first act symbolizes Itachi’s life: a solitary figure burdened by impossible choices. Like a bird caged by duty, he sacrificed his own peace to protect others, yet became a villain in the eyes of those he loved. This duality—the hidden cost of “greater good”—fuels the emotional core of the piece.

The second act shifts to Akatsuki’s founding philosophy: a desperate belief that peace could be forced through control. Their vision wasn’t born from cruelty but from the scars of war—a distorted hope that unity might emerge if humanity was stripped of free will. It’s a reflection of how trauma can twist even noble intentions into something monstrous.

The third act honors the group’s origins—three orphans who dreamed of healing a broken world. Their early bonds were pure, a fragile alliance against suffering. But as power grew, so did divisions. Greed, ego, and conflicting ideologies poisoned their unity, mirroring how movements often lose their way when scale replaces purpose.

The final collapse isn’t just about failure—it’s a warning. Societies built on suppression, even with grand ideals, crumble when empathy dies.

Live Demo

TidalCycle Code

do
  d1 $ ccv "0 20 64 127" # ccn "0" # s "midi"
  d2 $ rotL 1 $ every 4 (# ccv (fast 2 (range 127 0 saw))) $ ccv (segment 128 (range 127 0 saw)) # ccn "1"  # s "midi"
  d3 $ ccv (segment 128 (slow 4 (range 127 0 saw))) # ccn "2" # s "midi"
  d10 $ ccv "10 40 80 127" # ccn "3" # s "midi"

hush

d11 $ s "birds:3" # gain 0.5

d4 $ slow 4 $ note "c'maj d'min a'min g'maj" # s "superpiano"
  # legato 1
  # djf 0.3
  # gain 0.85
  # sustain 1.75

d11 silence

d5 $ slow 4 $ note "c3*4 d4*4 a3*8 g3*4" # s "superhammond:5"
  # legato 0.5

xfade 4 $ "bd <hh hh*2 hh*4> sd <hh [hh bd]>"
  # room 0.2

d6 $ s "~ cp" # gain 1

once $ s "auto:3"

d7 $ jux rev $ slow 4 $ arp "up down diverge converge" $ note "c'maj'4*2 d'min'4*2 a4'min'4*2 g4'maj'4*2" # s "supervibe"

d8 $ hurry 2 $ s "bd hh sd hh"

do {
  d6 silence;
  d8 silence;
  d1 $ qtrigger $ filterWhen (>=0) $ seqP [
      (0,1, s "[bd*2] [hh cp]"),
      (1,2, s "[bd*4] [hh cp]")
  ] # gain (slow 4 (range 0.8 1 saw));
  once $ s "auto:3";
  d5 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0, 1, s "~ cp"),
    (1, 2, s "~ cp*2")
  ] # speed (slow 4 $ range 0.5 2 tri)
    # pan (slow 8 $ sine);
  d3 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0, 2, s "hh*8")
  ] # gain (slow 4 $ range 0.7 1.2 saw);
  d4 $ qtrigger $ filterWhen (>=0) $ seqP [
  (0, 1, s "~ arpy"),
  (1, 2, s "arpy(3,8)"),
  (2, 3, s "arpy(5,8)"),
  (3, 4, s "arpy(8,8)"),
  (4, 5, fast 0.5 $ s "superhoover" >| note (arp "updown" (scale "minor" ("<5,2,4,6>"+"[0 0 2 5]") + "c4")) # room 0.3)
] # note (scale "minor" $ run 8)
  # cutoff (slow 4 $ range 300 3000 sine)
  # resonance 0.2 # gain 1.2;
  hush
}

Hydra Code

s0.initVideo("birds.mp4")

src(s0)
  .thresh(0.3, 0.04)
  .invert()
  .blend(solid(0, 0, 0), () => {
    // Calculate the fade amount based on video progress
    const video = s0.src
    const fadeStartTime = video.duration - 5 // Start fading 5 seconds before the end
    const fadeAmount = Math.max(0, (video.currentTime - fadeStartTime) / 5)
    return fadeAmount
  })
  .rotate(() => Math.sin(time))
  .out()

osc(40,-0.01,1)
  .modulate(voronoi(3))
  .contrast(1)
  .kaleid(360)
  .mask(shape(40, .6).scale(1,1))
  .out(o0)
src(o0)
  .rotate(1.57, 0.2)
  .modulate(noise(() => cc[3] * 40, 0.1))
  .add(src(o0), () => 0.01 + cc[1])
  .scale(1 + .5, .7).saturate(-0.5)
  .scale(() => 1 + Math.sin(time / 15) * 0.2)
  .saturate(0.1)
  .rotate(0,-0.1)
  .out(o1)
render(o1)

voronoi(10,1,5)
  .brightness(()=>Math.random()*0.15)
  .modulatePixelate(noise(()=>cc[2]*20,()=>cc[0]),100)
  .out()

voronoi(10,1,5).brightness(()=>Math.random()*0.15)
  .modulatePixelate(noise(()=>cc[2]*20,()=>cc[0]),100)
  .color(()=>0,5,3.4).contrast(1.4)
  .add(shape(7),[cc[0],cc[1]*0.25,0.5,0.75,1])
  .out(o0)

voronoi(10,1,5).brightness(()=>Math.random()*0.15)
  .modulatePixelate(noise(cc[0]+cc[1],0.5),100)
  .color(()=>0,0.5,0.4).contrast(1.4)
  .out(o0)

hush()

The theme I had for this composition project was recreating nature, or more specifically, a tropical jungle. The reason was pretty simple — I grew up in Taiwan, where we were always graced with sunlight and a hot, tropical climate, and this warm, happy feeling was what I missed the most during my time in Berlin and New York last year, so I wanted to recreate this atmosphere for all of us to enjoy. I also thought the idea of attempting to portray nature through technology — which is anything but natural — would be fun. 🙂

After a lot of fooling around, trying various audio samples, and playing with how each instrument will harmonize, I created a composition with a bright, happy, and somewhat dreamlike vibe, both in terms of its visuals and its audio. I first began by picking out some sounds that I found myself drawn to, such as the pelog scale, the sine instrument/audio, usage of claps, beats with unexpected irregular rhythms once in a while, etc., and then once I started assembling them together, I tweaked some parts to make them harmonize with each other.

Creating a build-up as well as brainstorming what my big “drop” was going to be was a bit more difficult because I felt this “pressure” to make them “catchy” and carry impact. While I did want it to be somewhat pleasant to the vast majority of the audience’s ears, I also didn’t want them to be too generic because there seemed to be certain formulas for both the build-up and the drop that a lot of people use in their compositions. I did end up using the classic acceleration of rhythm and the pitch for my build-up, but my drop ended up straying a lot from what a classic “beat drop” might look like because I didn’t want to use any overpowering bass or beat but rather wanted to create a more full and rich harmony of all the instruments I’ve been using up to this point with an addition of sounds like birds chirping, multiple sine melodies that mimic the songbirds, etc.

For my visuals, I used a lot of vibrant colors and waves/rounded lines/circles. I also imported an image of the jungle at the end to match my beat drop as a “big reveal” of the composition’s final destination.

Here’s the video:

Here’s the Tidal code:

d1 $ s "~ ~ cp ~" # gain 1
d2 $ ccv "<127 50 127 50>" # ccn "0" # s "midi"

d1 $ s "bd [~bd] cp ~" # gain 1
d2 $ ccv "17 [~50] 100 ~" # ccn "0" # s "midi"

d5 $ scramble 4 $ s "sine" >| note ((scale "minor" "<[-4 [10 3]]>"))
d2 $ scramble 4 $ ccv "10 127 5 30" # ccn "0" # s "midi"

d1 $ s "bd bd sd bd cp odx mt <[bd*2]!8>" # gain 1
d2 $ struct "t(4,8)" $ ccv ((segment 128 (range 127 0 saw))) # ccn "0" # s "midi"

d5 $ struct "<t(2,4)>" $ s "sine" # note ((scale "pelog" "c'maj f'maj")) # room 0.3
d2 $ ccv (segment 8 "0 84 10 127") # ccn "0" # s "midi"

d7 $ s "sine*16" # note ((scale "pelog" "-5 .. 10"))
d2 $ ccv (segment 8 "0 20 64 127 60 30 127 ~") # ccn "0" # s "midi"

d3 $ struct "<t(3,8) t(3,8,1)>" $ s "sine" # note "<[1 3 1] [5 13 10]>" # room 0.4
d2 $ struct "<t(3,120) t(3,27,120)>" $ ccv ((segment 128 (range 127 0 saw))) # ccn "0" # s "midi"

d5 $ s "cp*4" # gain 1
d2 $ struct "<t(4,8)>" $ ccv ((segment 128 (range 127 0 saw))) # ccn "0" # s "midi"

d1 $ s "[bd bd bd bd] [sd cp] [bd bd] [cp bd]" # gain 1.1
d2 $ ccv "[127 20 70 0] [100 10] [80 ~] [0 ~]" # ccn "0" # s "midi"
d3 $ s "hh hh hh <hh*6 [hh*2]!3>" # gain 1.5

-- d7 $ s "sine*8" # note "[[1 1] 5 8 10 5 8]" # room 0.2

-- BUILDUP

do {
  d9 silence;
  d7 silence;
  d8 silence;
  d9 $ qtrigger $ filterWhen (>=0) $ s "808cy" <| n (run 16); -- 25 808 cymbals
  d10 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0,1, s "sine*2"),
    (1,2, s "sine*4"),
    (2,3, s "sine*8"),
    (3,4, s "sine*16")
  ] # gain (slow 4 (range 0.8 1.2 saw)) # speed (slow 4 (range 2 4 saw));
  d1 $ qtrigger $ filterWhen (>=0) $ seqP [
      (0,1, s "[bd bd] [sd cp]"),
      (1,2, s "[bd bd bd bd] [sd cp]"),
      (2,3, s "[bd bd bd bd bd bd] [sd cp]"),
      (3,4, s "[bd bd bd bd bd bd bd bd] [sd cp]")
  ] # gain (slow 4 (range 0.8 1 saw));
  d3 $ qtrigger $ filterWhen (>=0) $ seqP [
    (0, 1, s "cp:2*2"),
    (1, 2, s "cp:2*4"),
    (2, 3, s "cp:2*8"),
    (3, 4, s "cp:2*16")
  ] # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw));
}

-- drop
nature_go_Crazy = do
  d8 $ qtrigger $ filterWhen (>=0) $ s "blip*8" # gain 1 # note "[[6 8] 13 10 18 6 10]"
  d3 $ qtrigger $ filterWhen (>=0) $ struct "<t(3,8) t(3,8,1)>" $ s "sine" # note "<[1 3 1] [5 13 10]>" # room 0.4
  d12 $ qtrigger $ filterWhen (>=0) $ s "sine*16"
      # note "[[15 17 10] [8 20] [27 8] 25]"
      # room 0.4
      # gain "0.8"
      # pan "<0.2 0.8 0.5>"
  d1 $ qtrigger $ filterWhen (>=0) $ s "[bd bd sd bd] [bd sd] [bd cp] [sd bd]" # gain 1
  d9 $ qtrigger $ filterWhen (>=0) $ s "birds"
  -- d14 $ slow 2 $ s "arpy" <| up "c'maj(3,8) f'maj(3,8) ef'maj(3,8,1) bf4'maj(3,8)"
  -- d15 $ s "bass" <| n (run 4) -- four short bass sounds, nasty abrupt release
  -- d15 $ slow 3 $ s "bassdm" <| n (run 24)
  d14 $ qtrigger $ filterWhen (>=0) $ s "can" <| n (run 8) # gain 2
  d16 $ qtrigger $ filterWhen (>=0) $ s "<808lt:6(3,8) 808lt:6(5,8,1)>" <| n (run 8) # squiz 2 # gain 2 # up "-2 -12 -14"
  d10 $ qtrigger $ filterWhen (>=0) $ s "[bd bd cp bd bd cp bd bd] [sd cp]"

d2 $ ccv "127 ~ 70 20 [120] [40] [90]" # ccn "0" # s "midi"

nature_go_Crazy

d8 silence
d1 silence
d2 $ ccv "20 ~ 80 40 [120 ~] [20 ~] 127" # ccn "1" # s "midi"
    d16 silence

d10 silence
d3 silence
d14 silence
d2 $ ccv "0 ~ [50 127] ~ 20 ~" # ccn "0" # s "midi"
d5 silence
d9 silence

hush

And here’s the Hydra code:

//start!!

// first shape
shape(999, 0.3, 0.01).modulate(noise(2, 0.5)).luma(()=>cc[0],0.0).modulate(noise(()=>(cc[0]+cc[1])*1,0.3)).out(o0)

// 2nd
osc(10, 0.1, 1)
  .modulate(noise(2, 0.5))
  .mask(shape(999, 0.3, 0.3))
  .scale(1.5)
  .luma(()=>cc[0],0.0).modulate(noise(()=>(cc[0]+cc[1])*1,0.3)).out(o0)

// 3rd shape; later add .repeat(2,2), and then change to .repeat(2,2)
osc(10, 0.1, 1).modulate(noise(20, 0.9)).mask(shape(99, 0.2, 1)).luma(() => cc[0] / 127, 0.2).modulate(noise(()=>(cc[0]+cc[1])*1,0.3)).repeat(2,2).rotate(() => cc[2] * 0.1, 0.6).out(o0)

// 5th shape --> at first noise (30), then change to 10
osc(10,0.1,1).rotate(2).layer(osc(30,0,1)).modulate(noise (10,0.03),.5).luma(()=>cc[0],0.0).modulate(noise(()=>(cc[0]+cc[1])*1,0.3)).out(o0)

// 6th
osc(10, 0.1, 1).modulate(noise(2,0.5).luma(0.4,.03)).modulate(noise(()=>(cc[0]+cc[1])*1,0.3)).out(o0)

//7th; change noise 3 to 9, osc 20 to 40, and add  .posterize(5, 0.5)
osc(40, 0.2, 1)
  .kaleid(4)
  .modulateScale(noise(9, 0.5), 0.2)
  .blend(noise(3, 0.5))
  .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
  .out(o0)

      shape(2, 0.6, 0.4)
        .repeat(3, 3)
        .modulateScale(noise(2, 0.1))
        .mult(gradient().hue(0.5))
        .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
        .out(o0)

        s0.initImage("https://i.pinimg.com/736x/83/8c/d6/838cd6e2a27f7887e49d869f1857742c.jpg")

        noise(2, 0.5)
          .contrast(2)
          .modulate(noise(2, 0.1))
          .brightness(-0.3)
          .colorama(0.1)
          .diff(o0, 0.1)
          .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
          .out(o0)

  src(s0)
  .modulate(noise(4, 0.2))
  .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
  .kaleid(5)
  .out(o0)

  src(s0)
    .modulate(noise(2, 0.2))
    .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
    .modulate(osc(()=>(cc[0]*10+5), 0.1).rotate(()=>(cc[1]*0.5)))
    .out(o0)

  src(s0)
    .modulate(noise(3, 0.2))
    .modulate(noise(()=>(cc[0]+cc[1])*1,0.3))
    .blend(src(o0).scale(1.01), 0.7)
    .out(o0)

Tidal Cycles code:

--part 0
do
d4 $ s "insect*2 ~ ~"  # gain 2
d1 $ ccv "127 31 ~ ~" # ccn "0" # s "midi"

--part 1
do
d4 silence
d5 $ qtrigger $ filterWhen (>=0)$ s "jungbass:2"
d2 $ ccv "<120 100>" # ccn "1" # s "midi"

hush

--part 2

do
d5 $ s "can*4" <| n (shuffle 4 $ run 4)# gain 4
d1 $ ccv "127 30 100 10" # ccn "0" # s "midi"
d4 $ fast (range 1 4 $ slow 8 sine) $ s "cb"  # room (range 0 1 $ slow 4 $ saw)
d2 $ fast (range 1 4 $ slow 8 sine) $ ccv "<127 64 30 100>" # ccn "1" # s "midi"
d6 $ s "chin" <| n (shuffle 4 $ run 4) # gain (range 0 3 $ slow 4 $ saw)
d8 $ every 2 (fast 2) $ s "glasstap:1 glasstap:2"  #krush 30

do{
d4  $ fast 2 $  s  "click:2*2 ~ ~ click:2*2 ~ ~" #krush 20   # room (range 0 1 $ slow 4 $ saw);
d1 $ fast 2 $ ccv "127 64 ~ ~ 80 32 ~ ~" # ccn "0" # s "midi";
d7 $ fast 2 $ s "sine*4" # note(scale "<major minor shang chinese minor>" ("[0, 4, 7] [0, 5, 9] [0, 4, 9] [2, 5, 9]")+"<1 2 5>");
d5 $ qtrigger $ filterWhen (>=0) $ seqP [
  (0, 1, s "808mc" <| n (run 4)),
  (1,2, s "808mc" <| n (run 8)),
  (2,3, s  "808mc" <| n (run 16)),
  (3,4, s "808mc" <| n (run 8)),
  (4,5, s "808mc" <| n (run 4))
] #krush (range 0 9 $ slow 4 $ saw) #gain 2
}

do
d8 $ qtrigger $ filterWhen (>= 0) $ s "superhat*4"
    # note ("[6, 10, 2]" -"<1 1 2 5>")
    # gain 1.2
    # krush "<0 9 27>"
    # room 0.5
d6 $ qtrigger $ filterWhen (>= 0)  $ every 2 (const $ s  "super808*8" # note ("[6, 10, 2]" -"<1 1 2 5>")  # gain 1.2 # krush 15 # room 0.5  )
    $ s "~"
d2 $ qtrigger $ filterWhen (>= 0) $ ccv "<[100 10 60 30 100 10 60 30 ] ~>"#ccn "1" # s "midi"




hush

--part3
do
  d4 $ s "seawolf*2" <| n (slow 1 $ shuffle 2 $ run 2) #gain 2 #krush 9
  d2 $ ccv " 127 64" # ccn "1" # s "midi"

do
  d7 $ fast 0.5 $ s "sine*4" # note(scale "minor" ("[0, 4, 7] [0, 5, 9, 12] [0, 4, 9, 12] [2, 5, 9, 11, 14]")+"<1 2 3 4 5>")
  d3 $ fast 0.5 $ ccv "120 20 120 15" #ccn "3" #s "midi"
  d8 $ fast 0.5 $ s "ho?" <| n (shuffle 6 $ run 6)


do
d4 silence
d6 silence
d8 $  s "industrial" <| n (run 8)
d7 $ slow 4 $ s "sine*8" # note(scale "minor"("[0, 4, 7, 10, 14] [2, 5, 9, 12, 16] [0, 4, 7, 11, 14] [0, 5, 9, 12, 17]")-"<1 2 3 4 5>")#gain (range 1 0 $ slow 8 $ saw)
d1 $ slow 2 $ ccv " 127 64" # ccn "0" # s "midi" 
d3 $ slow 1 $ ccv "<40 ~>" # ccn "3" # s "midi"

hush

Hydra Code:

hush()

//part1
solid(0.11, 0.11, 0.58).
layer(solid(0.2,0.2,1)
.mask(noise(()=>cc[0]*5+2, 0.3)
  .posterize(10)
  .diff(noise(()=>cc[0]*5+2, 0.3).posterize(4).scrollX(0.01))
  .thresh(0.1, 0.1)
  .invert()
  .luma(0.1)))
  .layer(
  shape(99, ()=>cc[1]+Math.sin(time)*0.1)
  .diff(shape(99, ()=>cc[1]*0.99+Math.sin(time)*0.1))
  .thresh(0.1)
  .repeat(()=>cc[1]+1,()=>cc[1]+1)
  .scale(0.5,window.innerHeight/window.innerWidth,1)
  .luma(0.1))
  .out()


//part 2
solid(0.2, 0.2, 1)
.layer(
shape(4,0.5)
  .scale(1,0.1,2)
  .color(0.5,0.5,0.8)
  .luma(1,1)
  .scrollX(0.1,()=>cc[0]*-0.1)
  .kaleid(10)
  .scale(0.8,window.innerHeight/window.innerWidth,1))
  .layer(
    shape(4,0.5)
    .scale(1,0.1,2)
    .color(0,0,0.8)
    .luma(0.1,1)
    .scrollX(0.1,()=>cc[1]*-0.1)
    .kaleid(40)
    .scale(0.4,window.innerHeight/window.innerWidth,1))
  .modulate(noise(4,()=>cc[3]))
  .out()


// solid(0,0.6,1).out(o2)
//
// hush()
//
// shape(100, 0.1, 0.2).repeat(3)
//   .thresh(0.5)
//   .scrollX(0,()=>cc[0])
//   .scrollY(0,()=>cc[0])
//   .modulate(
//     noise(5,1))
//   .blend(o1,0.5)
//   .blend(o2,0.5)
//   .out()


  // src(o0).
  //   blend(o1,0.1).
  // out(o0)
  //
  // gradient([1,2,cc[1]]).
  // mask(shape(6,()=>cc[0]*0.3)).
  // modulate(osc()).
  // luma(0.5,0.1).
  // scrollX(() => Math.sin(time) * 0.5).
  // pixelate(cc[1]*300,()=>cc[1]*400).
  // repeat(()=>ccActual[0]/10,()=>ccActual[0]/10).
  // out(o1)

  // shape(5).
  // scale(4,window.innerHeight/window.innerWidth,1).
  // modulateScale(noise(() => Math.sin(time)*1.5)).
  // scrollX(0.1).
  // kaleid(100).
  // scale(4,window.innerHeight/window.innerWidth,1).
  // // rotate(() => Math.sin(time) * 0.5).
  // luma(0.5,0.1).
  // color(()=>cc[0]).
  // out(o1)


  // src(o0).
  //   blend(o1,0.1).
  // out(o0)
  //
  // hush()
  // //part 1
  //
  // gradient([1,2,cc[1]]).mask(voronoi(()=>ccActual[0]/10+1,1,ccActual[0]/100+0.1)).posterize(10, [0.1, 0.5, 1.0, 2.0]).kaleid(99).scale(1,window.innerHeight/window.innerWidth,1).
  // layer(
  //   shape(4,0.5).
  //   scale(1,0.01,2).
  //   luma(0.1,1).
  //   scrollX(()=>cc[2]-0.1).
  //   kaleid(50).
  //   repeat(()=>cc[2]*2).
  //   rotate(()=>cc[2]).
  //   scale(1.5,window.innerHeight/window.innerWidth,1)
  // ).
  // out()

Organization:

I want to describe the feeling of a sudden rain in this project.

The soundtrack is divided into 4 parts: introduction, beats, chords and additional sounds. Before the rain started, there were some sounds of insects, indicating it was a tranquil summer night. After the bass sounded, it started raining, and the raindrops fell onto different objects. The chord described the vibe of the rain. It started light and gentle, became harder and stronger, and finally diminished. The visuals also simulate the rain by using noise and circles to imitate how raindrops fall onto water.