Concept:
For this assignment, I tried so many things that were not coming together. I had some very interesting visuals and I spent so much time crafting melodies (even used the piano in class to try out new patterns), but they were not coming along together. Then last week I had a very deep reflection on water and how we usually associate the sounds of water as something relaxing, but water can be very dangerous and wild depending on the context. To me water can be very relaxing but also very anxiety-inducing under certain conditions. It was somewhat of a deeply personal moment of introspection that inspired me to create water-like visuals and then come up with a soundscape to match them.
I was really interested in exploring my relationship with water and I came up with a story for that. I decided to use lines of the story as a way to name my functions in Tidalcycles. I personally really enjoyed this idea and thought it was one of the most appealing aspects of my presentation.
Music:
For the music, I wanted to emphasize the calmness of the ocean and then build it up to a very chaotic place, reminiscent of a storm.
The music was the trickiest part of the assignment. I was very locked into the idea of traditional composition, but even though I was able to come up with very nice melodies, I could not come up with beats that matched the melody well. It was very hard to get those to match and I spent a lot of time working on sound elements that I ended up not incorporating into my presentation.
After narrowing down a theme for my performance and coming up with the story that I want to tell, I actually threw away my more traditional composition approach and just started playing around with sounds that I found appealing and how to merge them with the rest of my music.
I think music was where I spent the bulk of my time. It was very hard, but I tried to keep myself organized with the code and that really help me tailor the kind of sound experience that I wanted to create. I also loved the Mask function in Tidalcycles. I watched this performance by Dan Gorelick. He uses mask in a very playful way and I thought that it would be a nice way to live code but at the same time have an outcome that will be synced to the rest of the music. It was very fun to try mask out and come up with different beats.
I am very happy with the organization of my code. Maybe it won’t make much sense to someone seen the code, but I understand very well how I placed things together and how I use variables and functions in the code.
by_The_Ocean
lived_A_Man
who_Manned
d9 $ a_lighthouse 1 "t t t t"
but_he_didnt_like
the_Ocean
because_it_was_beautiful
but_dangerous
so_when_the
storm_hits
he_has_to
go_up
_the_lighthouse
and_sound
the_alarm
to_warn_people
when_the_storm_stops
the_man_repeats_this
until_the_ocean_is_silent
hush
-- Evaluate before performance
-- to send cc values
do
d11 $ ccv "20 40 64 127" # ccn "0" # s "midi"
d12 $ ccv "0 20 64 127" # ccn "2" # s "midi"
but_he_didnt_like = do
d1 $ slow 2 $ s "wind" <| note ("bf a g d") # room 0.5
d2 $ slow 2 $ s "newnotes" <| note ("bf a g d") # room 0.5
d3 $ slow 2 $ s "gtr" <| note ("bf a g d" + 12) # room 0.5
d13 $ ccv "2" # ccn "3" # s "midi"
the_Ocean = do
d1 $ every 4 (+ "c6 as a as")$ slow 2 $ s "wind" <| note "bf a g d"# room 0.5
d2 $ every 4 (+ "c6 as a as")$ slow 2 $ s "newnotes" <| note "bf a g d"# room 0.5
d3 $ every 4 (+ "c6 as a as")$ slow 2 $ s "pluck" <| note ("bf a g d" + 12)# room 0.5
d4 $ every 4 (+ "c6 as a as")$ slow 2 $ s "pluck" <| note ("bf a g d")# room 0.5
d11 $ ccv "20 40 64 127 [0 10] [70 50] [90] [100]" # ccn "0" # s "midi"
d13 $ ccv "3" # ccn "3" # s "midi"
because_it_was_beautiful = do
d5 $ slow 2 $ s "em2" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]") # gain 1.2
d6 $ slow 2 $ s "wind" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]")
d7 $ slow 2 $ s "newnotes" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]" + 12) # gain 1.2
d13 $ ccv "4" # ccn "3" # s "midi"
but_dangerous = do
d1 $ n (arpg "'major7 [0,4,7,11]") # sound "wind"
d2 $ n (arpg "'major7 [0,4,7,11]") # sound "newnotes"
d3 $ n (arpg "'major7 [0,4,7,11]" - 12) # sound "pluck"
d4 $ n (arpg "'major7 [0,4,7,11]" - 38) # sound "pluck"
xfade 5 silence
xfade 6 silence
xfade 7 silence
d13 $ ccv "5" # ccn "3" # s "midi"
-- cuerdas
so_when_the = do
xfade 3 $ slow 2 $
n (off 0.25 (+12) $ off 0.125 (+7) $ "c(3,8) a(3,8,2) f(3,8) e(3,8,4)")
# sound "pluck"
d7 $ s "hh*8"
-- storm is coming
storm_hits = do d1 $ jux rev $ s "sine*8" # note (scale "iwato" "0 .. 8" + "f3" ) # room 0.9 # gain 0.6
he_has_to = do
d1 $ n (arpg "'major7 [0,4,7,11]") # sound "trump"
d13 $ ccv "6" # ccn "3" # s "midi"
--storm
go_up = do
d1 $ slow 2 $ s "superpiano" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]")
d2 $ slow 2 $ s "pluck:2" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]" + 24) # gain 1.2
d4 $ slow 2 $ s "gtr" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]" + 24)
d5 $ slow 2 $ s "em2" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]") # gain 1.2
d6 $ slow 2 $ s "wind" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]")
d7 $ slow 2 $ s "newnotes" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]" + 12) # gain 1.2
d8 $ slow 2 $ s "notes" <| note ("[e5 d5 ~] [c5 b4 ~] [a4 g4 ~] [f4 e4 ~]"+ 12) # gain 1.2
d13 $ ccv "7" # ccn "3" # s "midi"
_the_lighthouse = do d1 $ fast 2 $ s "hh*2 hh*2 hh*2 <hh*6 [hh*2]!3>" # room 0.7 # gain (range 1 1.2 rand)
and_sound = do
d8 $ a_lighthouse 1 "t t t t"
d13 $ ccv "8" # ccn "3" # s "midi"
-- High Hat beat
the_alarm = do
xfade 5 $ alarm
d13 $ ccv "9" # ccn "3" # s "midi"
-- maybe the alarm
to_warn_people = do xfade 9 $ slow 2 $ n (off 0.25 (+12) $ off 0.125 (+7) $ "c(3,8) a(3,8,2) f(3,8) e(3,8,4)") # sound "trump"
-- After buildup
when_the_storm_stops = do
d1 silence
d2 silence
d3 $ s "sax" # note (arp "updown"(scale "major" ("[0,2,4,6]" +" <0 0 9 8>") + "f5"))
d4 silence
d5 silence
d6 silence
d7 silence
d8 silence
d9 silence
d13 $ ccv "10" # ccn "3" # s "midi"
alarm = stack[
s "~ trump" # room 0.5,
fast 2 $ s "gtr*2 gtr*2 gtr*2 " # room 0.7 # gain (range 1 1.2 rand)] # speed (slow 4 (range 1 2 saw))
-- Ending
the_man_repeats_this = do
xfade 1 $ s "em2:2" <| note ("c [d e] c")
d3 silence
d13 $ ccv "11" # ccn "3" # s "midi"
until_the_ocean_is_silent = do
xfade 1 silence
d13 $ ccv "12" # ccn "3" # s "midi"
-- Ambience
by_The_Ocean = do
xfade 15 $ slow 4 $ s "sheffield" # gain 0.7 -- ambience
d14 $ slow 8 $ s "pebbles" # gain 0.7 -- very long, maybe pebbles on a beach
d3 $ slow 8 $ s "birds" <| n (run 4)# legato 1.8
d13 $ ccv "0" # ccn "3" # s "midi"
lived_A_Man = do
d3 silence
d3 $ qtrigger 3 $ slow 8 $ s "em2:2" <| note ("[b ~] [a ~] [g ~] [e ~]")
who_Manned = do
d1 $ s "bd bd cp ~"
d13 $ ccv "1" # ccn "3" # s "midi"
a_lighthouse speed t = slow speed $ mask t $ sound "clubkick clubkick clubkick [clubkick clubkick clubkick]"
Visuals:
The visuals were very fun to make. Again, a lot of the things I made were not used, but I did notice a pattern in the types of animations I was creating, which were very similar to the way water behaves. I decided to narrow down my visuals to those that reflected water behaviour (both the calm and the storm).
While I was practising, I was struggling a lot between triggering things in Tidal and then going to the hydra and vice-versa. It was very overwhelming for me because of how much code I had. So, after trying to optimize my triggering skills, I decided to instead automize the visuals by using the update() function and controlling which visual is shown through one of the cc value arrays (channel 3). This took away the pressure of modifying things in both files, so I could just focus on the music and that would change the visuals without me having to do it into the js file.
To be honest, I really thought that I was been selective with my visuals because I got to narrow them down to a theme and even then, I did not use all of my water-related animations. However, I see now that it was not enough and I should have trimmed down on the visuals more. It would have been better to dedicate more time to how using the cc[] could modify the visual into something completely different.
update = () =>
{
if(ccActual[3] == 0) ocean() //by the ocean
if(ccActual[3] == 1) sparklingWater() // who Manned
if(ccActual[3] == 2) drop()// he didn't like
if(ccActual[3] == 3) honda() //ocean
if(ccActual[3] == 4) waterwheel() //beautifu;
if(ccActual[3] == 5) psychoWave() //dangerous
if(ccActual[3] == 6) wave()// he has to
if(ccActual[3] == 7) splash()//go up
if(ccActual[3] == 8) storm()//sound
if(ccActual[3] == 9) hurricane() // the alarm
if(ccActual[3] == 10) dripple() //sax
if(ccActual[3] == 11) ocean() // repeats
if(ccActual[3] == 12) hush() //silent
}
//THINGS THAT WORKED
//wavey water
// b = 0
// update = () => b += 0.001 * Math.sin(time)
wave = ()=> voronoi(()=>ccActual[0],0,0).color(.2,0.3,0.9)
.modulateScrollY(osc(10),0.5,0)
.out()
dripple()
//storm
storm = ()=> shape(2).mask(noise(10,0.1)).color(1,0,0).invert(1).rotate(()=>6+Math.sin(time)*cc[0]).out()
drop = ()=> shape(2).mask(noise(cc[0],0.1)).color(1,0,0).invert(1).rotate(()=>6+Math.sin(time)*cc[0]).out()
hurricane = ()=> voronoi()
.add(gradient().invert(1))
.rotate(({time})=>(time%360)/2)
.modulate(osc(25,0.1,0.5)
.kaleid(50)
.scale(({time})=>Math.sin(time*cc[0])*0.5+1)
.modulate(noise(0.6,0.5)),
0.5)
.out()
splash = ()=>gradient().color(1,0,1).invert(1).saturate(5)
.add(voronoi(50,0.3,0.3)).repeat(10,10).kaleid([3,5,7,9].fast(cc[0])).modulateScale(osc(4,-0.5,0),15,0).out()
dripple = ()=> gradient().invert(1).kaleid([3,5,7,9].fast(0.5))
.modulateScale(osc(cc[2],-0.5,1).kaleid(50).scale(0.5),10,0)
.out()
drippleActual = ()=> gradient().invert(1).kaleid([3,5,7,9].fast(0.5))
.modulateScale(osc(()=>ccActual[2],-0.5,1).kaleid(50).scale(ccActual[0]),10,0)
.out()
//wavy pattern
psychoWave = ()=>shape(4,0.95)
.mult(osc(0.75,1,0.65))
.hue(0.9)
.modulateRepeatX(
osc(10, 5.0, ({time}) => Math.sin(time*(cc[0])))
)
.scale(10,0.5,0.05) //first value could be a cc
.out()
// honda
honda = ()=> osc(10,-0.25,1)
.color(0,0.1,0.9)
.saturate(8).hue(0.9)
.kaleid(50)
.mask(
noise(25,2)
.modulateScale(noise(0.25,0.05))
)
.modulateScale(
osc(6,-0.5,()=>cc[2])
.kaleid(50)
)
.scale(()=>cc[2],0.5,0.75)
.out()
// background of house
waterwheel = ()=> noise(10, 0.1).color(1,0.5,0.5).invert([1]).add(shape(2,0.8).kaleid(()=>6+Math.sin(time)*4)).out()
sparklingWater = ()=> noise(25,2).invert(0).color(0.7, 0.9, 1).saturate(4).modulateScale(noise(()=>cc[2],0.05)).out()
ocean = ()=> osc(1,1,0).color(0,0,1).hue(0.9).modulatePixelate(noise(5,1),()=>cc[0]).out()
Performance:
Link to Performance
My computer slows down a lot when I try to record the audio from supercollider, so I decided to just screenrecord.
Reflection:
I felt like this assignment made me really grasp how things work in TidalCycles. I spent a lot of time going through the documentation and trying out things. Hydra was a bit more about experimenting, but I liked the idea of using Update as a way to automize certain things and not have to worry about both triggering things in Tidal and in Hydra. My understanding of both was really reinforced and expanded.
However, I do think that I could have been more selective on the visuals and maybe should have focused more on transitions. Because I tried so many things out that I ended up not using, I felt like as long as the visuals were coherent in themes and palette with each other then my performance would be good. I was a bit blinded by how much I did vs how much I should be doing on my presentation.
I really liked some of the visuals I created and I would have liked to maybe do more in the interaction of the visual with the cc values, not just triggering things and scaling but also transforming the visual. I also thought that automating certain things was something smart that I was doing to help myself but I think it ended up downgrading the overall experience of the performance.
I practised a lot for this assignment and I think that made me have certain thinking of how well the performance was working compared to my previous versions of the assignment, but now I see that just because the performance is better than when I previously practised, that doesn’t mean that it’s good overall. I think there were a lot of things I was lacking because I was worried about the wrong things. I think that now that I am looking back on the performance more clearly, I can definitely see that my concept was good but the execution was not as well planned as I had falsely thought and the result was not what I thought.
I think that maybe I should have put more of myself out there in the performance and though the topic was very mine, the execution could have been better. I really like the idea of using my artwork combined with hydra for the visuals of my performances and I think I really want to explore that this second half of the semester.