
Tweet Deconstruction: 2015-12-31
I have not posted much about Supercollider latley so I decided to take a couple minutes to break drown a recent tweet I posted.
play{a=SinOsc;y=CombC.ar(Dust.ar(1),1,a.ar(0.01,0,2e-3,3e-3),30,1);z=CombC.ar(y,1,[0.2,0.3],30,1,y);SelectX.ar(a.ar(0.1),[z,z*a.ar(99)])/3}
The first thing to do is to add some white space for readability. I also wrap the whole thing in parenthesis so it can still be executed as a single statement.
(
play{
a=SinOsc;
y=CombC.ar(Dust.ar(1),1,a.ar(0.01,0,2e-3,3e-3),30,1);
z=CombC.ar(y,1,[0.2,0.3],30,1,y);
SelectX.ar(a.ar(0.1),[z,z*a.ar(99)])/3
}
)
In order to save space when I wrote the tweet I made “a” point to SinOsc. Let’s undo that now for a little more clarity
(
play{
y=CombC.ar(Dust.ar(1),1,SinOsc.ar(0.01,0,2e-3,3e-3),30,1);
z=CombC.ar(y,1,[0.2,0.3],30,1,y);
SelectX.ar(SinOsc.ar(0.1),[z,z*SinOsc.ar(99)])/3
}
)
The meat of the sound is generated by creating a very short delay with a long decay time being feed a series of random impulses.
play{CombC.ar(Dust.ar(1),1,0.015,30,1)}
The delay time is modulated by a slow sine wave LFO in order to give the slow bend sound to the piece
(
play{
var dlyLFO = SinOsc.ar(0.01,0,2e-3,3e-3);
CombC.ar(Dust.ar(1),1,dlyLFO,30,1)
}
)
To make this even more readable I have removed the mul and add params and instead call the range method on the LFO.
(
play{
var dlyLFO = SinOsc.ar(0.01).range(0.003, 0.007);
CombC.ar(Dust.ar(1),1,dlyLFO,30,1)
}
)
Next we use put a longer delay with a long decay time to fill up our soundscape. The delay time is given as an array to cause our delays to be different in the left and right channels.
(
play{
var dlyLFO = SinOsc.ar(0.01).range(0.003, 0.007);
var string = CombC.ar(Dust.ar(1), 1, dlyLFO, 30, 1);
CombC.ar(string, 1, [0.2,0.3], 30, 1, string);
}
)
The SelectX command is crossfading between a clean and an amplitude modulated version of our signal. We divide the final results by 3 in order to lower the volume and avoid clipping.
(
play{
var dlyLFO = SinOsc.ar(0.01).range(0.003, 0.007);
var string = CombC.ar(Dust.ar(1), 1, dlyLFO, 30, 1);
var echo = CombC.ar(string, 1, [0.2,0.3], 30, 1, string);
SelectX.ar(SinOsc.ar(0.1), [echo, echo * SinOsc.ar(99)]) / 3;
}
)
After the last line is rewritten for readability we have our final result.
(
play{
var dlyLFO = SinOsc.ar(0.01).range(0.003, 0.007);
var string = CombC.ar(Dust.ar(1), 1, dlyLFO, 30, 1);
var echo = CombC.ar(string, 1, [0.2,0.3], 30, 1, string);
var echoAM = echo * SinOsc.ar(99);
var select = SelectX.ar(SinOsc.ar(0.1), [echo, echoAM]);
select / 3;
}
)
In the comments of the Soundcloud post Fredrik Olofsson pointed out that the tweet could be shortened by 8 charecters
play{a=LFCub;SelectX.ar(a.ar(0.1),[z=CombC.ar(y=CombC.ar(Dust ar:1,1,a.ar(0.01)*2e-3+3e-3,30,1),1,[0.2,0.3],30,1,y),z*a.ar(99)])/3}