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.

Here’s my progress so far with my composition piece! I’m pretty satisfied with my visual progression, but I’m thinking of adding many more layers for my audio because I didn’t quite have enough time to experiment and develop my audio enough by last Thursday’s class.

I also had a question regarding syncing the tidal/hydra together — is there a way for me to match/sync the audio to the visuals without me setting a certain rhythm in front of ccv/ccn? What I’m doing in my code is d2 $ struct “t(3,8)” $ ccv ((segment 128 (range 127 0 saw))) # ccn “0” # s “midi” because I found that it was the easiest for me to do this, but I realized that it might not be necessary for me to give such a complicated/long code for the ccv/ccn code line.

Thank you, professor! And happy belated birthday. 🙂