For my composition project, I wanted to create an introduction/algo-rave-y promotion to the podcast my friend Nour and I have been recording. This podcast, “Thursday Night ‘Live’ Starring Nour & Juanma” is an effort to preserve some memories of our last semester in NYUAD. We’ve been interviewing our friends and sharing some memories in the hopes that when we’re 50, we can listen to this and show it to our families. Maybe I will show them this project as well!
Sound
Our first episode began with the song ‘Me and Michael,’ which also happens to be our song. My first step in the composition was to figure out its chords. Once I did, I spent a LOT of time in Tidal Cycles playing around with them; I did not want to recreate the song, but to create something new based on it. After various attempts and styles explored, I figured out that writing the chords myself in the super piano synth sounded really good! I used these chords as a base for the composition, and added percussion, custom samples, and other elements. All custom samples were taken from previous episodes of our podcast.
I initially built one loop with all of my elements. It had kick drums, high hats, snares, claps, a melodic percussion, a sequencer-like melody, phrases of ‘Me and Michael’s’ melody and the piano chords. I was happy with the result, and began assembling/adding parts for an actual structure.
I LOVE the sound of tuning forks, so I used the superfork synth as an alternative for super piano in the beginning. This, I believe, gave depth to my piece. I also used superpwm as an alternative when building up. For the latter, I added an effect to alter the pitch. I wanted this part to be quirky…I also tried to build an effective build up and a drop using techniques we learned in class.
its_ThursDAYYYY = do
d4 $ qtrigger $ filterWhen(>=0) $ slow 4 $ "superfork" >| note (scale "major" ("[0 -1 ~ -2][ -3 ~ -5 -3 ][~ -5 -3 -3][ -2 -3 ~ ~][ ~ 0 -3 -2 0][~] ") + "a5") # room 0.4 # sustain 3
d1 $ qtrigger $ filterWhen(>=0) $ slow 8 $ s "myCuts ~ ~ ~" # gain 0.7
nour_are_you_ready = do
d1 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superfork" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # pitch1 (fast 10 (range 0.1 1.5 rand)) # sustain 4 # gain 0.65
d11 $ qtrigger $ filterWhen(>=0) $ s "hh:13*4" # gain 0.7
d4 $ silence
d13 $ ccv "1" # ccn "0" # s "midi"
yes_yes_just_finishing_capstone = do
d1 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpwm" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # pitch1 (fast 10 (range 0.1 1.5 rand)) # sustain 2 # gain 0.65
d11 $ degradeBy 0.2 $ s "hh:1 hh:8 hh:8 hh:8 hh:8 hh:8 hh:8 hh:8"
d16 $ ccv "<25.4 38.1 50.8 63.5 >" # ccn "1" # s "midi"
d13 $ ccv "2" # ccn "0" # s "midi"
ok_ready_lets_record = do
d12 $ s "bd*4" # gain 0.9
d16 $ fast 4 $ ccv "<38.1 50.8 63.5 76.2 >" # ccn "1" # s "midi"
reADYYY = do
d1 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpwm" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # pitch1 (fast 10 (range 0.1 1.5 rand)) # sustain 2 # gain 0.65
d2 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # room 0.4 # sustain 4 # gain 0.8
d3 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7] ") + "a4") # room 0.4 # sustain 4 # gain 0.8
d15 $ fast 8 $ ccv "<50 127 20 0>" # ccn "2" # s "midi"
d13 $ ccv "3" # ccn "0" # s "midi"
play = do
d1 $ qtrigger $ filterWhen(>=0) $ slow 5 $ "superpiano" >| note (scale "major" ("[2 1 ~ ~][~ 2 1 ~][2 2 1 ~][~ 2 2 2][3 1 ~ 2] ") + "a5") # room 0.4 # sustain 4 # gain 0.76
d2 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # room 0.4 # sustain 4 # gain 0.8
d3 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7] ") + "a4") # room 0.4 # sustain 4 # gain 0.8
d15 $ fast 16 $ ccv "<50 127 20 0>" # ccn "2" # s "midi"
d13 $ ccv "4" # ccn "0" # s "midi"
but_MakeItCount = do
d10 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "bd:9*4" # room 0.6
d11 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.2 $ s "hh*16"
d12 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "sn:13*8"
d9 $ qtrigger $ filterWhen(>=0) $ s "~ <cp ~> ~ cp" # room 0.2
d16 $ fast 8 $ ccv "<38.1 50.8 63.5 76.2 >" # ccn "1" # s "midi"
fun_stuff = do {d3 $ degradeBy 0.05 $ qtrigger $ filterWhen (>=0) $ seqP [
(0, 6, s "bd:9*4"),
(1,6, s "hh*16" # room 0.6),
(1,6, s "sn:13*8"),
(3,6, s "~ <cp ~> ~ cp" # room 0.2)
];
d16 $ fast 4 $ ccv "<38.1 50.8 63.5 76.2 >" # ccn "1" # s "midi"
}
oops_lets_restart = do {d3 $ qtrigger $ filterWhen (>=0) $ seqP [
(0, 1, s "hh:2*32" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(1,2, s "hh:2*16" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(2,3, s "hh:2*8" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(3,4, s "hh:2*4" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(3,4, s "321")
];
d15 $ fast 8 $ ccv "<0 127 0 127>" # ccn "3" # s "midi";
d13 $ ccv "5" # ccn "0" # s "midi"}
go_go_go = do
d1 $ silence
d2 $ silence
d3 $ s "hh:2*4" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))
d4 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.1 $ s "superfork*8" # up "cs5 d5 e5 cs5 b45 cs5 cs5 <cs5 b5 a5>" # room 0.4 # gain 1.5
d13 $ ccv "6" # ccn "0" # s "midi"
welcome_to_tnl_featuringNourandJuanma = do
d3 $ silence
d2 $ qtrigger $ filterWhen(>=0) $ slow 4 $ s "Finally ~ ~ ~" # gain 1.5
d13 $ ccv "9" # ccn "0" # s "midi"
podcasting = do
d2 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7]") + "a5") # room 0.4 # sustain 4 # gain 0.8
d3 $ qtrigger $ filterWhen(>=0) $ slow 7 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7] ") + "a4") # room 0.4 # sustain 4 # gain 0.8
d13 $ ccv "7" # ccn "0" # s "midi"
senior_year = do
d5 $ degradeBy 0.003 $ slow 0.25 $ "superpwm" >| note (scale "major" ("[2 3 4 <2 1 0>] ") + "a4") # room 0.4 # gain 0.75
d13 $ ccv "7" # ccn "0" # s "midi"
nour_and_juanma woohoo = do
d6 $ slow woohoo $ s "nj" # gain 1.2
best_senior_podcast = do
d5 $ degradeBy 0.003 $ slow 0.25 $ "superpwm" >| note (scale "major" ("[7 6 5 4] ") + "a5") # room 0.4 # gain (slow 8(range 0.75 1 saw))
d13 $ ccv "7" # ccn "0" # s "midi"
d15 $ fast 4 $ ccv "<50 127 20 0>" # ccn "2" # s "midi"
climb = d6 $ qtrigger $ filterWhen (>=0) $ seqP [
(0, 1, s "bd*4" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(1,2, s "bd*8" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(2,3, s "bd*16" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(3,4, s "bd*32" # room 0.3 # hpf (slow 4 (1000*saw + 100)) # speed (slow 4 (range 1 2 saw))),
(4,5, s "vibe")
] # gain 1.3
shh = do
d1 $ silence
d2 $ silence
d3 $ silence
d4 $ silence
d5 $ silence
d7 $ silence
d8 $ silence
d9 $ silence
d10 $ silence
d11 $ silence
d12 $ silence
d13 $ ccv "9" # ccn "0" # s "midi"
boom = do
d3 $ qtrigger $ filterWhen(>=0) $ slow 14 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7] ") + "a3") # room 0.9 # gain 0.8
d4 $ qtrigger $ filterWhen(>=0) $ degradeBy 0 $ fast 2 $ s "superfork*4" # up "cs6 d6 e6 <b45 cs5> " # room 0.4 # gain 1.8
d5 $ degradeBy 0.003 $ slow 0.25 $ "superpwm" >| note (scale "major" ("[2 3 4 <2 1 0>] ") + "a4") # room 0.4 # gain 0.75
d10 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "bd:9*4" # gain 1.5 # room 0.6
d11 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.2 $ s "hh*16" # gain 1.5
d12 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "sn:13*16"
d9 $ qtrigger $ filterWhen(>=0) $ s "~ <cp ~> ~ cp" # room 0.2
d13 $ ccv "10" # ccn "0" # s "midi"
d16 $ fast 4 $ ccv "<115 0 50 100 >" # ccn "2" # s "midi"
boom_2 = do
d3 $ qtrigger $ filterWhen(>=0) $ slow 14 $ "superpiano" >| note (scale "major" ("[-9,0,2,5][-3,1,4,6][-5,2,4,6][-4,0,3,5][-6,1,3,5][-5,2,4,6][-7,2,4,7] ") + "a3") # room 0.9 # gain 0.8
d4 $ qtrigger $ filterWhen(>=0) $ degradeBy 0 $ fast 2 $ s "superfork*4" # up "d6 fs6 e6 <a6 cs6> " # room 0.4 # gain 1.8
d5 $ degradeBy 0.003 $ slow 0.25 $ "superpwm" >| note (scale "major" ("[2 3 4 <2 1 0>] ") + "a4") # room 0.4 # gain 0.75
d10 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "bd:9*4" # gain 1.5 # room 0.6
d11 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.2 $ s "hh*16" # gain 1.5
d12 $ qtrigger $ filterWhen(>=0) $ degradeBy 0.05 $ s "sn:13*16"
d13 $ ccv "11" # ccn "0" # s "midi"
d9 $ qtrigger $ filterWhen(>=0) $ s "~ <cp ~> ~ cp" # room 0.2
d15 $ fast 16 $ ccv "<0 20 50 100>" # ccn "2" # s "midi"
last_stretch = do
d1 $ degradeBy 0.003 $ slow 0.25 $ "superpwm" >| note (scale "major" ("[7 6 5 4] ") + "a5") # room 0.4 # gain 0.9
d13 $ fast 2 $ ccv "<11 7 4 10>" # ccn "0" # s "midi"
shh_2 = do
d1 $ degradeBy 0.003 $ slow 0.5 $ "superpwm" >| note (scale "major" ("[7 6 5 4] ") + "a5") # room 0.4 # gain (slow 8(range 0.9 0.5 saw))
d2 $ silence
d3 $ silence
d5 $ silence
d7 $ silence
d8 $ silence
d9 $ silence
d10 $ silence
d12 $ silence
d13 $ ccv "9" # ccn "0" # s "midi"
available_only_on_our_google_drives = do
d1 $ silence
d4 $ qtrigger $ filterWhen(>=0) $ degradeBy 0 $ fast 2 $ s "superfork*4" # up "d6 fs6 e6 <a6 cs6> " # room 0.4 # gain (slow 16 (range 1.8 0.5 saw))
d11 $ silence
d6 $ silence
d13 $ ccv "0" # ccn "0" # s "midi"
its_ThursDAYYYY
nour_are_you_ready
yes_yes_just_finishing_capstone
ok_ready_lets_record
reADYYY
play
oops_lets_restart
go_go_go
fun_stuff
but_MakeItCount
welcome_to_tnl_featuringNourandJuanma
podcasting
senior_year
nour_and_juanma 1
best_senior_podcast
climb
shh
boom
boom_2
last_stretch
shh_2
available_only_on_our_google_drives
hush
Composition Structure
Whenever we record, Nour and I always have one (or many) false starts. I thought this would be a good addition to the piece’s structure. If you look at my composition, you will see the piece build up once, go silent, build up again, and then drop. In the first build up, I used many more components from ‘Me and Michael’. Then using a sequenceP, slowing percussion, and a custom sample from one of our false starts, I constructed this transition. Then, for the second build up, I added a lot more percussion, and kept only the base chords from the song. After a transition using slow “bd”, there is silence. Nour says “umm, so that was the vibe” and the beat drops. The drop contains almost the same elements as the second buildup with altered speeds, tempos and octaves. For the end of the song, instruments are removed, leaving only the melody, and the melody fades out. I would imagine my piece to look something like this:
My composition structure is intended to follow the storyline of a Thursday evening: Nour finishes capstone, we meet to record, we have a couple of funny false starts, then we begin again, this time full force.
I used the code from the class example to toggle the visuals in Tidal Cycles.
loadScript('/Users/juanmanuelrodriguezzuluaga/Documents/LiveCoding_HW/launch.js')
s0.initVideo('/Users/juanmanuelrodriguezzuluaga/Documents/LiveCoding_HW/Composition_Vids/composite_S.mp4')
s1.initImage('/Users/juanmanuelrodriguezzuluaga/Documents/LiveCoding_HW/Composition_Vids/tittle-min.png')
s2.initVideo('/Users/juanmanuelrodriguezzuluaga/Documents/LiveCoding_HW/Composition_Vids/IMG_2673.mov')
visuals[0]()
// can use update and switch case with midi:
var whichVisual = 0
update = () =>{
// very important! only change source once, when necessary
if (whichVisual != ccActual[0]){
whichVisual = ccActual[0];
visuals[whichVisual]()
}
}
// clear update
hush()
// OR (without stopping visuals all together)
update = ()=> {}
Visuals
Whereas I was quite traditional with the sound structure, I wanted my visuals to be a bit more chaotic. I knew I wanted 3 main elements: Nour and I doing our podcast, Nour’s capstone cell imaging, and colors. I drew a title and added the aforementioned elements. Then, I played around with parameters and components to generate a visual for each part of the composition. My aim was to have a lot going on, but to have the piece be responsive to the beat & storyline. I tried my best to incorporate midi channels in the designs, and to transmit the same story as with the audio. In order to do so, I made sure that the visuals were triggered from Tidal Cycles. I had a lot of fun manipulating Nour’s capstone images. They had a natural pulse, which was difficult to adjust to the beat, but they also looked quite nice when in kaleidoscope.
visuals = [
()=>{src(s0)
.out()},// its_ThursDAYYYY
()=>{ src(s0)
.invert()
.layer(src(s1)
.mask(shape(4,0.99))
.scale(1.6,()=>window.innerHeight/window.innerWidth, 0.356)
.scrollX(0,-0.09))
.out()}, // nour_are_you_ready
()=>{src(s0)
.invert()
.kaleid(()=>(cc[1]*10))
.out()},//yes_yes_just_finishing_capstone & ok_ready_lets_record
()=>{src(s0)
.invert()
.kaleid(()=>(cc[1]*10))
.layer(src(s2)
.saturate()
.mask(shape(()=>(cc[1]*10),0.9))
.scale(0.7,()=>window.innerHeight/window.innerWidth,1)
.scrollX(0, -0.05)
.scrollY(9, ()=>cc[2]/6000+0.03))
.out()}, //reADYYY
()=>{src(s0).invert().kaleid(()=>(cc[1]*10)).layer(src(s2).saturate().mask(shape(()=>(cc[1]*10),0.9)).scale(0.7,()=>window.innerHeight/window.innerWidth,1).scrollX(0, -0.05).scrollY(9, ()=>cc[2]/6000+0.03)).kaleid(8).rotate(0,0.1).out()},//play
()=>{src(s0)
.invert()
.kaleid(()=>(cc[1]*10))
.layer(
src(s2)
.saturate()
.mask(shape(()=>(cc[1]*10),0.9))
.scale(0.7,()=>window.innerHeight/window.innerWidth,1)
.scrollX(0, -0.05)
.scrollY(9, ()=>cc[2]/6000+0.03))
.kaleid(8)
.rotate(0,-0.1)
.saturate(()=>cc[3])
.out()}, // oops_lets_restart
()=>{src(s2)
.scale(()=>cc[1],1)
.out()}, // go_go_go, fun_stuff, but_MakeItCount
()=>{osc(4,0.4)
.thresh(0.9,0)
.modulate(src(s2)
.sub(gradient()),1)
.out(o1)
src(o0)
.saturate(1.1)
.modulate(osc(6,0,1.5)
.brightness(-0.5)
.modulate(
noise(cc[1]*5)
.sub(gradient()),1),0.01)
.layer(src(s2)
.mask(o1))
.scale(1.01)
.out(o0)},
()=>{gradient(4).add(
src(s2)
.modulateRotate(
noise(()=>(cc[2]*3),0.9)
.luma()))
.out()},
()=>{src(s2) // tnl_featuring_nour_and_juanma
.out()},
()=> {shape(100,0.5,1.5)
.scale(0.5,0.5)
.color([0.5,2].smooth(1),0.3,0)
.repeat(2,2)
.modulateScale(osc(()=>(cc[2]),0.5),-0.6)
.add(o2,0.5)
.scale(0.9)
.out()},
()=>{gradient(1).
add(shape(100,0.5,1.5)
.scale(0.5,0.5)
.color([0.5,2].smooth(1),0.3,0)
.repeat(2,2)
.modulateScale(osc(()=>(cc[2]),0.5),-0.6)
.add(o2,0.5)
.scale(0.9))
.out()}
]
whichVisual = 0
Class Feedback & Updates
One change I made based on class feedback was the removal of one of the visuals during the main build-up. It was originally supposed to come prior to the fading of our video into red, orange and yellow, but I made a mistake when writing the code to trigger the visuals. Even through I would have liked to see the fading out or breaking down into a gradient (as the original plan), I believe this visual was significantly more effective in this part of the structure, and not later. Thus, I decided to remove the gradient all together. You can see on my code as visual number 8 (I believe).
LIVE Coding
For the in-person component, I practiced a LOT. I needed to make sure I knew exactly when to trigger all of the functions. Furthermore, I included a small explanation/in person introduction and ending to my project. By telling all about you about my podcast while “nour_are_you_ready” was displaying the tittle and saying that the podcast is only available in our google drives as the beat faded out I hoped to make the experience more immersive and engaging. This is not pictured in the video, so you’ll have to see me perform it again.
Final Product
I’m not sure if the video is working. In case it is not, see it here.