The composition project was a really challenging one but also extremely fun and enjoyable at the same time. Initially, I struggled a lot with the audio and visuals, but slowly it all finally came together! :)) I started working with the sound first. I played around with multiple audio samples, layered them, added variations, and made a list of all the rhythms and patterns I liked. Then I worked on visuals, trying multiple different functions together to create unique and interesting patterns. After having a collection of various sounds and visuals I liked, it was time to get all these individual components into a whole composition.
Having no music knowledge, I started by reading about music and composition and different song structures. The first was to come up with a beat, a base rhythm on which my composition will be built. Then layer in and out sounds to make a composition. I listened to a lot of techno music, video games soundtracks, and other artists to understand how they build up and transition in their songs. The dramatic silence part of my composition is inspired by the song Dance Macabre – one of my favorites. The indie techno vibe and drums are inspired by Coke Studio music.
One very important thing I learned through this composition project is something my professor, Aaron Sherwood says, “Don’t force it.” I had to be very selective in my choices for the audio and visuals and only choose the ones that went with my theme. Some sounds and visuals looked good individually, but I did not use them if they did not add to the composition as a whole.
As I worked on this project, I took extensive notes – notes of what sounded nice, what needed improvement, which track I am playing and which ones to choose next, which sounds I like, and what is the structure and my thought process of getting it all together. Writing it all down was very helpful and I also recorded myself so that I could go back to these later if needed. (A few of my scribbled notes can be found above).
My final live composition project video can be found here:
The Tidal Code for my composition:
-- reset midi values reset_midi = do { d15 $ stack [ ccv "0*128" # ccn "0" # s "midi", ccv "0*128" # ccn "1" # s "midi", ccv "0*128" # ccn "2" # s "midi", ccv "0*128" # ccn "3" # s "midi", ccv "0*128" # ccn "4" # s "midi", ccv "0*128" # ccn "5" # s "midi", ccv "0*128" # ccn "6" # s "midi", ccv "0*128" # ccn "7" # s "midi", ccv "0*128" # ccn "8" # s "midi", ccv "0*128" # ccn "9" # s "midi", ccv "0*128" # ccn "10" # s "midi", ccv "0*128" # ccn "11" # s "midi" ] } reset_midi d15 silence hush d15 $ ccv "0*128" # ccn "11" # s "midi" d15 silence -- midi values segment128 = ccv (segment 128 (range 127 0 saw)) # ccn "0" # s "midi" alt0127 = ccv "0 127" # ccn "1" # s "midi" alt64127 = ccv "64 127" # ccn "2" # s "midi" segment4 = ccv (segment 4 (range 127 0 saw)) # ccn "3" # s "midi" triplehalf = ccv "127 127 127 64" # ccn "4" # s "midi" trigger = ccv "127" # ccn "5" # s "midi" trigger2 = ccv "127" # ccn "6" # s "midi" trigger3 = ccv "127" # ccn "7" # s "midi" ripOff = ccv "[0 127 0] [127 0 127] 0 127" # ccn "9" # s "midi" -- composition parts base_gtr = s "gtr" base_drum = s "~ 808bd:1" # room 1.5 # sustain 8 tabla1 = s "<tabla:24(3,8)? tabla:6(3,8)>" # gain "1.5 1" -- put gain for first one tabla2 = fast 2 $ s "<808ht:1(3,8) 808ht:3(5,8)?>" -- why does it have a weird beat in the beginning? acoustic = fast 2 $ s "<tabla2:8(3,8) sf(5,8)>" # gain "1 0.5" playful = sometimesBy 0.9 (fast 2) $ "pluck*4" <| n (run 4) # gain 1.3 honeyComb = sometimesBy 0.2 ( scramble 8 ) $ fast 2 $ s "pluck:2" >| note (arp "updown" (scale "pelog" ("[1,2]"+"<0 2 3>") + "c5")) # gain 1 andd_Beginnn = do { xfade 1 $ fast 2 $ s "moog:6" >| note (scale "major" "<[1@2 2 3] [1@2 2 1] [1@.5 1@1.5 2 1] [1@.5 1@1.5 2 3]>") # cut 6 # gain (range 0.6 0.75 rand); d8 $ qtrigger 8 $ seqP [ (0, 4, ccv (segment 128 (range 0 127 saw)) # ccn "11" # s "midi"), (4, 6, ccv "127" # ccn "11" # s "midi") ] } riseEE = do { d9 $ qtrigger 9 $ seqP [ (0, 2, sometimesBy 1 (fast 2) $ "pluck*2" <| n (run 2) # gain "<1 1.2>"), (2, 4, sometimesBy 1 (fast 2) $ "pluck*4" <| n (run 4) # gain "<1.4 1.5>" # room 0.2), (4, 8, sometimesBy 1 (fast 2) $ "pluck*8" <| n (run 8) # gain "<1.7 1.8 1.9 2>" # room 0.3) ]; d3 $ qtrigger 3 $ seqP [ (0, 2, s "bd*4" # gain "<1 1.2>"), (2, 4, s "bd:1*8" # gain "<1.4 1.5>" # room 0.2), (4, 8, s "bd:2*16" # gain "<1.7 1.8 1.9 2>" # room 0.3) --(6, 8, s "bd:4*32") ] # room 0.3 } dRAMAAATIC_SILENCE = do hush d12 $ trigger2 d2 $ segment128 d3 $ fast 1 $ segment4 attack = do d2 $ segment128 d3 $ fast 2 $ segment4 d8 $ trigger3 are_you_readyyyy = do { d6 silence ; d3 silence ; d1 silence; d2 silence ; d8 silence ; --d12 silence ; d4 silence ; d5 silence ; d11 $ qtrigger 11 $ seqP [ (0, 1, fast 1 $ "tabla2:24*4" # gain 1 # room 0.2), --(0, 1, fast 4 $ ccv "0 127" # ccn "8" # s "midi"), (1, 2, rotL 1 $ fast 1 $ palindrome $ degradeBy 0.1 $ s "tabla2:5" <| n "[20 23 22] [15 12 15] [20 12 15] [22 20 23]" # gain ((range 1.1 0.75 rand)) # room 0.3 # gain 1), (1, 3, rotR 1 $ fast 2 $ s "tabla2" <| n "[<17 ~@7>]" # room 0.1 # gain 1), --(1, 3, fast 32 $ ccv "0 127" # ccn "8" # s "midi"), --(2, 24, fast 32 $ ccv "127" # ccn "8" # s "midi"), (2, 16, fast 2 $ s "tabla2" <| n "[13 22 13 22,[~ 19]*2,[<17 ~@7>]]" # gain 1 # room 0.1) --(2, 24, attack) ]; d12 $ qtrigger 12 $ seqP [ (0, 1, fast 4 $ ccv "0 127" # ccn "8" # s "midi"), (1, 3, fast 32 $ ccv "0 127" # ccn "8" # s "midi"), (2, 24, fast 32 $ ccv "127" # ccn "8" # s "midi") --(2, 24, attack) ]; attack } finalleYYYY = do { d9 $ qtrigger 9 $ seqP [ (0, 8, ccv "0" # ccn "10" # s "midi"), (0, 2, sometimesBy 0.9 (fast 2) $ "pluck*2" <| n (run 2) # gain "<1 1.1>"), (2, 4, sometimesBy 0.9 (fast 2) $ "pluck*4" <| n (run 4) # gain "<1.2 1.3>"), (4, 6, sometimesBy 0.9 (fast 2) $ "pluck*6" <| n (run 6) # gain "<1.5 1.7>"), (0, 2, segment4), (2, 8, fast 2 $ segment4), (4, 6, ripOff), (6, 8, fast 2 $ ripOff), (4, 6, s "[bd gretsch:9] [bd gretsch:0] gretsch:1 gretsch:1" # gain 2), (4, 6, s "~ ~ ~ hh:1" # gain 1.5), (6, 8, fast 2 $ palindrome $ degradeBy 0.1 $ s "gretsch" <| n "[20 23 22] [15 12 15] [20 12 15] [22 20 23]" # gain ((range 1.1 0.75 rand)) # room 0.2 # gain 1.5), (7, 9, rotR 1 $ fast 2 $ s "gretsch" <| n "[<17 ~@7>]" # room 0.3 # gain 2), (8, 9, ccv (segment 128 (range 0 127 saw)) # ccn "10" # s "midi") ]; } ----------------------------------------------------------------------------- -- START PERFORMANCE do d1 $ base_gtr d2 $ segment128 d7 $ trigger3 do d3 $ base_drum d4 $ alt0127 do d5 $ acoustic d6 $ alt64127 do xfade 7 $ playful d8 $ segment4 d2 silence do clutch 5 $ tabla1 d9 $ tabla2 d10 $ triplehalf do clutch 7 $ honeyComb clutch 5 $ fast 2 $ "hh hh:5 hh:11 hh" d11 $ trigger clutch 9 $ degradeBy 0.2 $ someCyclesBy 0.8 (fast 1) $ fast 2 $ s "pluck:2" >| note (arp "updown" (scale "pelog" ("[1,2,5]"+"<0 6 1>") + "c5")) # gain 1 d3 $ "bd*8 bd*2" riseEE dRAMAAATIC_SILENCE andd_Beginnn xfade 4 $ fast 2 $ struct "t(5,8)" $ s "dr55" <| n (run (range 10 15 rand)) xfade 5 $ every 4 (fast 2) $ sound "drum*2" # room 0.1 xfade 6 $ fast 2 $ "hh hh:5? hh:11? hh" # room 0.2 xfade 7 $ fast 2 $ "pluck*8" <| n (run 8) # gain 1.2 are_you_readyyyy finalleYYYY d7 $ silence hush
The Hydra Code for my composition:
/////////////////////////////////////////// // Section 1 render(o0) solid().blend( osc(10,0.1,0).color(0.1,0.5,0.3) .modulateRotate( osc(10,0.1), ()=>cc[0] ) .hue( ()=>cc[2] ).kaleid(10) .modulate(o0, ()=>(cc[1]*0.5) ) .modulate( osc(1,()=>cc[2]*15) ) .repeat(()=>cc[3]*4+1,()=>cc[3]*4+1) .kaleid(5) .blend(shape(100) .rotate(() => Math.PI /180) .repeatX(3) .repeatY( ()=>Math.sin(time)*4 ) .scale(() => Math.PI/4) .repeat(()=>cc[3]*4,()=>cc[3]*4) .blend(src(o0).color(0.2,1,0)) .modulate(osc([4,15,25,50].fast(8), 0,.4)) .kaleid(10), ()=>cc[4]) .blend( shape( ()=> cc[3]+4 ,0.000001,[0.2,0.7].smooth(1)) .color(0.2,0.4,0.3) .scrollX(()=>Math.sin(time*0.27)) .add( shape( ()=> cc[3]+4, 0.000001,[0.2,0.7,0.5,0.3].smooth(1)) .color(0.6,0.2,0.5) .scrollY(0.35) .scrollX(()=>Math.sin(time*0.33))) .add( shape( ()=> cc[3]+4 ,0.000001,[0.2,0.7,0.3].smooth(1)) .color(0.2,0.4,0.6) .scrollY(-0.35) .scrollX(()=>Math.sin(time*0.41)*-1)) .modulate(voronoi(10,2,2)).rotate(()=>cc[3],2), ()=>cc[5] ) .modulateRotate(src(o0)).modulateRotate(src(o0)) .modulateRotate(src(o0)).modulateRotate(src(o0)) .blend(solid(), ()=>cc[6] ) ,()=>cc[7]) .out() /////////////////////////////////////////// // Section 2 solid().blend( osc( ()=>cc[3]*100 ,0.2,1) .mult(osc(20,-0.1,1).modulate(noise(3,1)).rotate(0.7)) .luma(()=>cc[0]) .mult(osc(5,2,1)) .modulateRotate( noise(1) ) .modulateRotate( o1,1 ) .blend(o0).blend(o0) .rotate(()=>cc[0],()=>cc[3]) .blend (osc(10,0.1,()=>cc[0]) .modulateRotate(osc(10,0.1).rotate(),()=>cc[3]) .hue(0.2).kaleid(4).modulateRotate(noise( ()=>cc[3]*10 )) .color(()=>cc[0],0,0.5) , ()=>cc[8]) , ()=>cc[11]) .out() /////////////////////////////////////////// // Finale osc(10,0.1,1) .modulateRotate(osc(10,0.1).rotate(),1) .hue(0.2).kaleid(4).modulateRotate(noise( 1*10 )) .color(1,0,0.5) .out() shape(30,0.3,1).invert(()=>cc[9]).out(o2) noise(()=>cc[3]*4,0.2,3) .thresh(0.3,0.03) .diff(o2).out(o1) gradient([0.3,3].fast(4)).mult(o0).blend(o1) .modulateRotate(o3).modulateRotate(o3).modulateRotate(o3) .blend(solid(), ()=>cc[10]) .out(o3) render(o3) hush() render(o0) ///////////////////////////////////////////