Music
Supercollider
Intro
// Harmonics adjusted
(
{
(
SinOsc.ar(400, mul: 1) + SinOsc.ar(800, mul: 1/2) +
SinOsc.ar(1200, mul: 1/3) + SinOsc.ar(1600, mul: 1/4) +
SinOsc.ar(2000, mul: 1/5) + SinOsc.ar(2400, mul: 1/6) +
SinOsc.ar(2800, mul: 1/7) + SinOsc.ar(3200, mul: 1/8) +
SinOsc.ar(3600, mul: 1/9) + SinOsc.ar(4000, mul: 1/10) +
SinOsc.ar(4400, mul: 1/11) + SinOsc.ar(4800, mul: 1/12)
)*0.1
}.scope)
(
{
f = 100;
[
SinOsc.ar(f*1, mul: 1), SinOsc.ar(f*2, mul: 1/2),
SinOsc.ar(f*3, mul: 1/3), SinOsc.ar(f*4, mul: 1/4),
SinOsc.ar(f*5, mul: 1/5), SinOsc.ar(f*6, mul: 1/6),
SinOsc.ar(f*7, mul: 1/7), SinOsc.ar(f*8, mul: 1/8),
SinOsc.ar(f*9, mul: 1/9), SinOsc.ar(f*10, mul: 1/10),
SinOsc.ar(f*11, mul: 1/11), SinOsc.ar(f*12, mul: 1/12)
]
}.scope(12)
)
(
{
var speed = MouseY.kr(1, 50);
f = MouseX.kr(50, 880, 'exponential');
t = Impulse.kr(1/3);
Mix.ar([
SinOsc.ar(f*1, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/1),
SinOsc.ar(f*2, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/2),
SinOsc.ar(f*3, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/3),
SinOsc.ar(f*4, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/4),
SinOsc.ar(f*5, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/5),
SinOsc.ar(f*6, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/6),
SinOsc.ar(f*7, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/7),
SinOsc.ar(f*8, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/8),
SinOsc.ar(f*9, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/9),
SinOsc.ar(f*10, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/10),
SinOsc.ar(f*11, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/11),
SinOsc.ar(f*12, mul: LFNoise1.kr(rrand(speed, speed*2), 0.5, 0.5)/12)
])*0.5
}.scope(1)
)
(
{
f = 220;
t = Impulse.kr(1/6);
Mix.ar([
SinOsc.ar(f*1, mul: EnvGen.kr(Env.perc(0, 6.4), t)/1),
SinOsc.ar(f*2, mul: EnvGen.kr(Env.perc(0, 4.1), t)/2),
SinOsc.ar(f*3, mul: EnvGen.kr(Env.perc(0, 2), t)/3),
SinOsc.ar(f*4, mul: EnvGen.kr(Env.perc(0, 1), t)/4),
SinOsc.ar(f*5, mul: EnvGen.kr(Env.perc(0, 1.8), t)/5),
SinOsc.ar(f*6, mul: EnvGen.kr(Env.perc(0, 2.9), t)/6),
SinOsc.ar(f*7, mul: EnvGen.kr(Env.perc(0, 4), t)/7),
SinOsc.ar(f*8, mul: EnvGen.kr(Env.perc(0, 0.3), t)/8),
SinOsc.ar(f*9, mul: EnvGen.kr(Env.perc(0, 1), t)/9),
SinOsc.ar(f*10, mul: EnvGen.kr(Env.perc(0, 3.6), t)/10),
SinOsc.ar(f*11, mul: EnvGen.kr(Env.perc(0, 2.3), t)/11),
SinOsc.ar(f*12, mul: EnvGen.kr(Env.perc(0, 1.1), t)/12)
])*0.5
}.scope(1)
)
({
f = 110;
// f = [60, 64, 67, 71, 74, 78].midicps + 12;
t = Impulse.kr(1/3);
Mix.ar(
SinOsc.ar(
f*(1..12),
// f,
mul: EnvGen.kr(
Env.perc(0, 1),
t,
levelScale: 1/(1..12),
timeScale: [6.4, 4.1, 2, 1, 1.8, 2.9, 4, 0.3, 1, 3.6, 2.3, 1.1]/(1+(f*0.002))
)
)
)*0.5
}.scope(1))
({
t = Impulse.kr(1/3);
Mix.ar(
SinOsc.ar(
[60, 64, 67, 71, 74, 78].midicps,
mul: EnvGen.kr(
Env.perc(0, 1),
t,
levelScale: 1/(1..6),
timeScale: rrand(1.0, 3.0).dup
)
)
)*[0.3, 0.3]
}.scope(1))
({
Mix.ar(
Pan2.ar(
SinOsc.ar(
[60, 62, 63, 65, 67, 68, 71, 72].midicps,
mul: LFNoise1.kr(rrand(0.1, 0.5).dup(8), 0.5, 0.5)
),
1.0.rand2.dup(8)
)
)*0.2
}.scope(1))
// Additive saw wave, separate decays
({
var gate, fund;
gate = Impulse.kr(1/3);
fund = MouseX.kr(50, 1000);
Mix.ar(
Array.fill(16,
{arg counter;
var partial;
partial = counter + 1;
SinOsc.ar(fund*partial) *
EnvGen.kr(Env.adsr(0, 0, 1.0, TRand.kr(0.2, 2.0, gate)),
gate, 1/partial)
})
)*0.2 //overall volume
}.scope(1))
// Additive saw wave, same decays
({
var gate, fund, env;
gate = MouseButton.kr(0, 1, 0);
fund = MouseX.kr(50, 1000);
env = Env.adsr(0, 0, 1.0, 2.0);
Mix.ar(
Array.fill(16,
{arg counter;
var partial;
partial = counter + 1;
SinOsc.ar(fund*partial) *
EnvGen.kr(env, gate, 1/partial)
})
)*0.2 //overall volume
}.scope(1))
{SinOsc.ar(400, mul: SinOsc.ar(1/3, mul: 0.5, add: 0.5))}.scope
({
var harmonics = 16, fund = 50;
Mix.fill(harmonics,
{ arg count;
Pan2.ar(
FSinOsc.ar(
fund * (count + 1), // calculates each harmonic
mul: FSinOsc.kr(rrand(1/3, 1/6), mul: 0.5, add: 0.5 )),
1.0.rand2)
}
) / (2*harmonics)
}.play;)
// Inharmonic spectrum
({Mix.ar(
SinOsc.ar(
[72, 135, 173, 239, 267, 306, 355, 473, 512, 572, 626],
0, //phase
[0.25, 0.11, 0.12, 0.04, 0.1, 0.15, 0.05, 0.01, 0.03, 0.02, 0.12]
))}.scope(1))
(
thisThread.randSeed = 3;
{100.rand}.dup(3)
)
// different every time
{SinOsc.ar(LFNoise0.kr(7, 12, 72).midicps, mul: 0.5)}.play
// same every time
({
RandSeed.kr(1, 1956);
SinOsc.ar(LFNoise0.kr(7, 12, 72).midicps, mul: 0.5)
}.play)
// resets every 5 seconds
({
RandSeed.kr(Impulse.kr(1/2), 1956);
SinOsc.ar(LFNoise0.kr(4, 12, 72).midicps, mul: 0.5)
}.play)
// Let it run for a while, the strikes are random
({
var trigger, partials = 12;
trigger = Dust.kr(3/7);
// thisThread.randSeed = 2534563;
Pan2.ar(
Mix.ar(
{
SinOsc.ar(rrand(50.0, 4000)) *
EnvGen.kr(
Env.perc(0, rrand(0.2, 3.0)),
trigger,
1.0.rand
)
}.dup(partials)
)/partials,
1.0.rand2
)
}.play)
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
({
var trigger, fund;
trigger = Dust.kr(3/7);
fund = rrand(100, 400);
Mix.ar(
Array.fill(16,
{arg counter;
var partial;
partial = counter + 1;
Pan2.ar(
SinOsc.ar(fund*partial) *
EnvGen.kr(Env.adsr(0, 0, 1.0, 5.0),
trigger, 1/partial
) * max(0, LFNoise1.kr(rrand(5.0, 12.0))), 1.0.rand2)
})
)*0.5 //overall volume
}.play)
//Several of the above mixed down
({
var trigger, fund, flashInst;
flashInst = Array.fill(5,
{
trigger = Dust.kr(3/7);
fund = rrand(100, 400);
Pan2.ar(
Mix.ar(
Array.fill(16,
{arg counter;
var partial;
partial = counter + 1;
SinOsc.ar(fund*partial) *
EnvGen.kr(Env.adsr(0, 0, 1.0, 5.0),
trigger, 1/partial
) * max(0, LFNoise1.kr(rrand(5.0, 12.0)))
})
)*0.2,
1.0.rand2)
});
Mix.ar(flashInst)*0.6
}.play)
// Gaggle of sines varations
({
var harmonics = 16, fund = 50, speeds;
speeds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]/5;
Mix.fill(harmonics,
{ arg count;
Pan2.ar(
FSinOsc.ar(
fund * (count + 1),
mul: max(0, FSinOsc.kr(speeds.wrapAt(count)))),
1.0.rand2)
}
) / (2*harmonics)
}.play;)
({
var harmonics = 16, fund, speeds;
speeds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]/20;
fund = (MouseX.kr(0, 36).round(7) + 24).midicps;
Mix.fill(harmonics,
{ arg count;
Pan2.ar(
FSinOsc.ar(
fund * (count + 1),
mul: max(0, FSinOsc.kr(speeds.choose))),
1.0.rand2)
}
) / (2*harmonics)
}.play;)
({
var harmonics = 16, fund;
fund = (MouseX.kr(0, 36).round(7) + 24).midicps;
Mix.fill(harmonics,
{ arg count;
Pan2.ar(
FSinOsc.ar(
fund * (count + 1),
mul: max(0, FSinOsc.kr(rrand(1, 1/3), mul: 20).softclip)),
1.0.rand2)
}
) / (2*harmonics)
}.play;)
({
var harmonics = 16;
Mix.fill(harmonics,
{ arg count;
Pan2.ar(
FSinOsc.ar(
exprand(100, 2000),
mul: max(0, FSinOsc.kr(rrand(1/3, 1/6))*rrand(0.1, 0.9))),
1.0.rand2)
}
) / (2*harmonics)
}.play;)
// Dissipating and converging gongs illustrates how a patch can be built
// from duplicating one idea; classic additive synthesis. It also illustrates
// how additive synthesis can be used to control each harmonic independently.
// Listen in stereo to hear the harmonics diverge.
({
var dur = 6, base, aenv, fenv, out, trig;
base = Rand(40, 100);
trig = SinOsc.ar(1/10);
out = Mix.fill(15,{
var thisDur;
thisDur = dur * rrand(0.5, 1.0);
aenv = EnvGen.kr(Env.perc(0, thisDur), trig);
fenv = EnvGen.kr(Env.new([0, 0, 1, 0], [0.25*thisDur, 0.75*thisDur, 0]), trig);
Pan2.ar(SinOsc.ar( Rand(base, base * 12) *
LFNoise1.kr(10, mul: 0.02 * fenv, add: 1), // freq
mul: aenv // amp
), ([1, -1].choose) * fenv)
}) * 0.05;
out
}.play(s);)
({
var dur = 6, base, aenv, fenv, out, trig, detune;
base = Rand(40, 60);
detune = 0.1; // increase this number to detune the second bell
trig = SinOsc.ar(1/10, pi);
out = Mix.fill(15,
{ arg count;
var thisDur;
thisDur = dur * rrand(0.5, 1.0);
aenv = EnvGen.kr(Env.perc(0, thisDur), trig);
fenv = EnvGen.kr(Env.new([1, 1, 0, 1], [0.05*thisDur, 0.95*thisDur, 0]), trig);
Pan2.ar(SinOsc.ar( base*(count+1+ detune.rand) *
LFNoise1.kr(10, mul: 0.02 * fenv, add: 1), // freq
mul: aenv // amp
), ([1, -1].choose) * fenv)
}) * 0.05;
out
}.play(s);)
// Decaying bell
({
var aenv, fenv, out, trig, dur, base;
dur = rrand(1.0, 6.0);
base = exprand(100, 1000);
out = Mix.ar(
Array.fill(15,{
arg count;
var thisDur;
thisDur = dur * rrand(0.5, 1.0);
aenv = EnvGen.kr(Env.new([0, 1, 0.4, 1, 0], [0, 0.5, 0.5, 0]), 1,
timeScale: thisDur);
fenv = EnvGen.kr(Env.new([0, 0, 0.5, 0.5, 0], [0.25, 0.5, 0.25, 0]),
1, timeScale: thisDur);
Pan2.ar(SinOsc.ar( Rand(base, base * 12) *
LFNoise1.kr(10, mul: 0.1 * fenv, add: 1), // freq
mul: aenv // amp
), ([1, -1].choose) * fenv)
})
) * EnvGen.kr(Env.linen(0, dur, 0), timeScale: dur,
levelScale: 0.05, doneAction: 2);
out;
}.play;)
Contents: