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.