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.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>