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)
///////////////////////////////////////////


