
Disquiet Junto 0062: A Map To Everything

Current Assignment:
Disquiet Junto Project 0062: Life of Sine
This week’s project involves making music from the basic building block of sound: the sine wave.
You will compose and record a piece of music using just three different sine waves, and nothing else — well, nothing else in terms of source material, but the waves can, after the piece has gotten underway, be transformed by any means you choose.
These are the steps:
- Step 1: Devise which three sine waves you will employ. They should be different from each other in some evident way.
- Step 2: The track should open with just one of the sine waves.
- Step 3: Add the second sine wave at 5 seconds.
- Step 4: Add the third sine wave at 10 seconds.
- Step 5: Only at 15 seconds should you begin to in any way manipulate any of the source waves.
Frequencies Used: 125Hz, 237Hz, 1012Hz
My Process:
Coding up something quickly in Supercollider on lunch break and did final adjustments at home. I decided to see how much I could get out of the sound of just the three sines without any effects. The click is created by purposely cutting the waveform at non-zero crossings. Every other sound is made from adding or multiplying the three sines.
This is my 10th piece for the Disquiet Junto and the second piece I have created using only sine waves.
Source Code:
/*NOTE: I have not bothered to clean this code up after writing it. Don't take it as a good example ;) */
(
fork{
var pat = ();
SynthDef(addOfSine, {
|
out = 0, gate = 1, amp = 1, doneHandlerLength = 10,
freq0 = 125, phase0 = 0, amp0 = 1, attack0 = 0.1, decay0 = 0.1, sustain0 = 0.5, release0 = 0.3, pan0 = 0,
freq1 = 237, phase1 = 0, amp1 = 1, attack1 = 0.1, decay1 = 0.1, sustain1 = 0.5, release1 = 0.3, pan1 = 0,
freq2 = 1012, phase2 = 0, amp2 = 1, attack2 = 0.1, decay2 = 0.1, sustain2 = 0.5, release2 = 0.3, pan2 = 0
|
var doneHandler = Linen.kr(gate, 0, 1, doneHandlerLength, doneAction:5); //This guy is just here to handle the doneAction
var sine = [//Div by 3 to avoid clipping
Pan2.ar(SinOsc.ar(freq0, phase0 * 2pi, amp0) * EnvGen.ar(Env.adsr(attack0, decay0, sustain0, release0), gate), pan0) / 3,
Pan2.ar(SinOsc.ar(freq1, phase0 * 2pi, amp1) * EnvGen.ar(Env.adsr(attack1, decay1, sustain1, release1), gate), pan1) / 3,
Pan2.ar(SinOsc.ar(freq2, phase0 * 2pi, amp2) * EnvGen.ar(Env.adsr(attack2, decay2, sustain2, release2), gate), pan2) / 3,
];
var output = (sine[0] + sine[1] + sine[2]) * amp;
Out.ar(out, output);
}).add;
SynthDef(mulOfSine, {
|
out = 0, gate = 1, amp = 1, doneHandlerLength = 10,
freq0 = 125, phase0 = 0, amp0 = 1, attack0 = 0.1, decay0 = 0.1, sustain0 = 0.5, release0 = 0.3, pan0 = 0,
freq1 = 237, phase1 = 0, amp1 = 1, attack1 = 0.1, decay1 = 0.1, sustain1 = 0.5, release1 = 0.3, pan1 = 0,
freq2 = 1012, phase2 = 0, amp2 = 1, attack2 = 0.1, decay2 = 0.1, sustain2 = 0.5, release2 = 0.3, pan2 = 0
|
var doneHandler = Linen.kr(gate, 0, 1, doneHandlerLength, doneAction:5); //This guy is just here to handle the doneAction
var sine = [
Pan2.ar(SinOsc.ar(freq0, phase0 * 2pi, amp0) * EnvGen.ar(Env.adsr(attack0, decay0, sustain0, release0), gate), pan0),
Pan2.ar(SinOsc.ar(freq1, phase0 * 2pi, amp1) * EnvGen.ar(Env.adsr(attack1, decay1, sustain1, release1), gate), pan1),
Pan2.ar(SinOsc.ar(freq2, phase0 * 2pi, amp2) * EnvGen.ar(Env.adsr(attack2, decay2, sustain2, release2), gate), pan2),
];
var output = sine[0] * sine[1] * sine[2] * amp;
Out.ar(out, output);
}).add;
s.sync;
pat.intro =
Pseq([
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(5, 1),
sustain: 4,
amp0: 1, attack0: 4, decay0: 0, sustain0: 1, release0: 1,
amp1: 0,
amp2: 0
]),
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(5, 1),
sustain: 4,
amp0: 1, attack0: 4, decay0: 0, sustain0: 1, release0: 1,
amp1: 1, attack1: 4, decay1: 0, sustain1: 1, release1: 1,
amp2: 0
]),
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(5, 1),
sustain: 4,
amp0: 1, attack0: 4, decay0: 0, sustain0: 1, release0: 1,
amp1: 1, attack1: 4, decay1: 0, sustain1: 1, release1: 1,
amp2: 1, attack2: 4, decay2: 0, sustain2: 1, release2: 1,
]),
]);
pat.intro2 =
Pseq([
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(12.8 / 3, 1),
sustain: 4,
amp0: 1, attack0: 4, decay0: 0, sustain0: 1, release0: 1,
amp1: 0,
amp2: 0
]),
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(12.8 / 3, 1),
sustain: 4,
amp0: 0,
amp1: 1, attack1: 4, decay1: 0, sustain1: 1, release1: 1,
amp2: 0
]),
Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pn(12.8 / 3, 1),
sustain: 4,
amp0: 0,
amp1: 0,
amp2: 1, attack2: 4, decay2: 0, sustain2: 1, release2: 1,
]),
]);
pat.p0 = Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pseq([0.1], 16),
sustain: Pkey(dur),
doneHandlerLength: 1,
phase0: Pseq([0.2, 0, 0, 0], inf), amp0: 1, attack0: 0.001, decay0: 0.001, pan0: Pseq([-0.5, 0.5], inf),
phase1: 0, amp1: 0, attack1: 0.1, release1: 0,
phase2: 0, amp2: 0, attack2: 0,
]);
pat.p1 = Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pseq([0.1], 16),
sustain: Pkey(dur),
doneHandlerLength: 3,
phase0: Pseq([0.2, 0, 0, 0], inf), amp0: 1, attack0: 0.001, decay0: 0.001, pan0: Pseq([-1, 1], inf),
phase1: Pseq([0.2, 0.2, 0, 0], inf), amp1: Pseq([1,0,0], inf), attack1: 0.01, release1: 0.001, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
amp2: 0, phase2: 0, attack2: 0,
]);
pat.p2 = Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pseq([0.1], 16),
sustain: Pkey(dur),
doneHandlerLength: 3,
phase0: Pseq([0.2, 0, 0, 0], inf), amp0: 1, attack0: 0.001, decay0: 0.001, pan0: Pseq([-0.5, 0.5], inf),
phase1: 0, amp1: 0, attack1: 0.01, release1: 0.001, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
phase2: Pwhite(), amp2: 0.7, attack2: 0.001, release2: 0.001, decay2: Pseq([0.3, 0.1, 0.01, 0.01, 0.01], inf), sustain2: 0, pan2: Pseq([-1, 0, 1], inf)
]);
pat.p3 = Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pseq([0.1], 16),
sustain: Pkey(dur),
doneHandlerLength: 3,
phase0: Pseq([0.2, 0, 0, 0], inf), amp0: 1, attack0: 0.001, decay0: 0.001, pan0: Pseq([-1, 1], inf),
phase1: Pseq([0.2, 0.2, 0, 0], inf), amp1: Pseq([1,0,0], inf), attack1: 0.01, release1: 0.001, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
phase2: Pwhite(), amp2: 0.7, attack2: 0.01, release2: 0.01, decay2: Pseq([0.3, 0.1, 0.01, 0.01, 0.01], inf), sustain2: 0, pan2: Pseq([-1, 0, 1], inf)
]);
pat.p4 = Pbind(*[
instrument: addOfSine,
amp: 1,
dur: Pseq([0.17], 16),
sustain: Pkey(dur),
doneHandlerLength: 0.4,
phase0: Pseq([0.2, 0, 0, 0], inf), amp0: 1, attack0: 0, decay0: 0, pan0: Pseq([-1, 1], inf),
phase1: Pseq([0.2, 0.2, 0, 0], inf), amp1: Pseq([1,0,0], inf), attack1: 0, release1: 0, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
phase2: Pwhite(), amp2: 0.7, attack2: 0.17, release2: 0, decay2: Pseq([0.3, 0.1, 0.01, 0.01, 0.01], inf), sustain2: 0, pan2: Pseq([-1, 0, 1], inf)
]);
pat.p5 = Pbind(*[
instrument: addOfSine,
amp: Pseq([Pn(1,64), Pn(0, 64)], 4),
dur: 0.05,
sustain: Pkey(dur),
doneHandlerLength: 0.4,
phase0: 0, amp0: 0.25, attack0: 0.05, decay0: 0.001, sustain0: 0, release0: 0.001, pan0: Pseq([-1, 1], inf),
phase1: 0, amp1: 0.25, attack1: 0.05, decay0: 0.001, sustain0: 0, release0: 0.001, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
phase2: 0, amp2: 0.25, attack2: 0.05, decay0: 0.001, sustain0: 0, release0: 0.001, pan2: Pseq([-1, 0, 1], inf)
]);
pat.p6 = Pbind(*[
instrument: addOfSine,
amp: Pseq([Pn(1,64), Pn(0, 64)], 8),
dur: 0.025,
sustain: Pkey(dur),
doneHandlerLength: 1,
phase0: 0.5, amp0: 0.2, attack0: 0.001, decay0: 0.001, sustain0: 0, release0: 0.001, pan0: Pseq([-1, 1], inf),
phase1: 0.5, amp1: 0.2, attack1: 0.001, decay0: 0.001, sustain0: 0, release0: 0.001, pan1: Pseq([1, 1, -1, -1, 0, 0, 0, 0], inf),
phase2: 0.5, amp2: 0.2, attack2: 0.001, decay0: 0.001, sustain0: 0, release0: 0.001, pan2: Pseq([-1, 0, 1], inf)
]);
pat.hold = Pbind(*[
instrument: mulOfSine,
amp: 3,
dur: Pn(0.2, 64),
sustain: Pseq([Pkey(dur), Pkey(dur) / 2, Pkey(dur), Pkey(dur) / 4]),
amp0: Pseq([1,0.5,0.3,0.5], inf), attack0: 0.001, decay0: 0.001, pan0: 0, release0: 0.001,
amp1: Pseq([1,0.5,0.7], inf), attack1: 0.001, decay1: 0.001, pan1: 0, release1: 0.001,
amp2: Pseq([1,0.5,0.7,1,0.7], inf), attack2: 0.001, decay2: 0.001, pan2: 0, release2: 0.001
]);
//Sequence
Pseq([
pat.intro,
Pseq([Pn(pat.p0, 4), Pn(pat.p1, 4)], 2),
Pseq([Pn(pat.p2, 4), Pn(pat.p3, 4)], 2),
Pn(pat.hold, 1),
Ppar([Pn(pat.hold, 2), Pseq([Pn(pat.p0, 4), Pn(pat.p1, 4)], 2)]),
Ppar([pat.p5, Pn(pat.hold, 2), Pseq([Pn(pat.p2, 4), Pn(pat.p3, 4)], 2)]),
Ppar([pat.p5, pat.p6, Pn(pat.hold, 2), Pseq([Pn(pat.p0, 4), Pn(pat.p1, 4)], 2)]),
Ppar([pat.p5, pat.p6, pat.intro, Pn(pat.hold, 1)]),
]).play
}
)