«envio» by vividsnow
on 06 Jul'12 04:47 insynthdef based on morphing cycled envelope
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
( // synth
SynthDef(\envio, {| out=0, freq=80, dur=1, atk=0.1, amp=0.8, curve= #[2,-3], blend=0.1, from=1, to=0, rot=0, rot_freq=0.5 |
var ha = Harmonics((3,5..13).choose.debug('sub freq size'));
var i = 6.exprand(26).asInteger.debug('oscillators');
var sig = Pan2.ar(
EnvGen.ar(
Env(
[0] ++ SinOsc.kr(
NamedControl.kr(\in_freq, Array.exprand(i-2,0.1,10)),
NamedControl.kr(\in_phase, Array.rand(i-2,0,pi)),
NamedControl.kr(\in_mul, Array.rand(i-2,0,1)),
NamedControl.kr(\in_add, 0!(i-2)),
) ++ [0],
NamedControl.kr(\in_step, Array.exprand(i-1, 0.1,1.0).normalizeSum),
\sin
).circle,
timeScale: freq.reciprocal
* NamedControl.kr(\sub_freq, ha.formant(ha.size - 1 / 2, ha.size).pow(1.exprand(2))).reciprocal,
levelScale: AmpCompA.kr(NamedControl.kr(\sub_freq) * freq)
* NamedControl.kr(\sub_amp, ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).normalizeSum) // * Line.kr()
),
NamedControl.kr(\sub_pan, Array.interpolation(ha.size,-1,1))
* Line.kr(from,to,dur)
).sum * EnvGen.kr(Env.perc(atk, dur-atk, amp, curve).blend(Env.sine(dur), blend), doneAction:2);
sig = Rotate2.ar(sig[0],sig[1],rot*LFSaw.kr(rot_freq));
Out.ar(out, LPF.ar(HPF.ar(sig,20),2e4));
}).add.play
)
( // randomized usage
var lib = SynthDescLib.global,
size = lib.at(\envio).controls.detect({|i| i.name == \in_step }).numChannels,
ha = Harmonics(lib.at(\envio).controls.detect({|i| i.name == \sub_freq }).numChannels),
kind = [0,1,2].choose.debug('kind');
Synth(\envio,[
freq:(40 * (pi/2).pow((0.25,0.5..8)).choose).debug('base freq'),
dur:5.rrand(20.1).debug('dur'), rot:[0,1,0.1.exprand(0.9)].choose, rot_freq:0.1.exprand(10),
curve:[-2.rrand(2.0),-2.rrand(2.0)], from:[0,1].choose, to:[0,1].choose,
sub_freq: [
ha.geom((1.05,1.06..1.3).choose.perform(0.5.coin.if({\reciprocal},{\value}))), // up or down
ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).pow([1,-1].choose), // up or down
ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).clump(ha.size + 1 / 2).pow([1,-1]).flatten // up and down
][kind].debug('sub freq scale'),
sub_amp: [ha.decay].addAll(ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3))!2).at(kind).normalizeSum.debug('sub freq amp'),
sub_pan:[ha.decay - 1 * [1,-1]].addAll(Array.interpolation(ha.size,-1,1)!2).at(kind),
in_step:Array.exprand(size-1,0.05,0.3).normalizeSum,
in_freq:Array.exprand(size, [0.1,0.5].choose, [1,5,20].choose),
in_mul:Array.rand(size,0.1,0.3),
//in_mull:0!size
//in_add:Array.rand(size,-1.0,1)
])
)
( // noise pattern usage or supernova server performance test )
var lib = SynthDescLib.global,
size = lib.at(\envio).controls.detect({|i| i.name == \in_freq }).numChannels,
ha = Harmonics(lib.at(\envio).controls.detect({|i| i.name == \sub_freq }).numChannels);
PparGroup(Pbind(*[
instrument:\envio,
in_freq:Ptuple({Pseq({Array.exprand(size, 1, 2)}!4,inf)}!2),
in_mul:Ptuple({Pseq({Array.exprand(size, 0.1, 1)}!4,inf)}!2),
in_step:Ptuple({Pseq({Array.exprand(size-1,0.05,0.3.rrand(1)).normalizeSum}!4,inf)}!2),
sub_freq: Ptuple({Pseq([
ha.geom((1.05,1.06..1.3).choose.perform(0.5.coin.if({\reciprocal},{\value}))), // up or down
ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).pow([1,-1].choose), // up or down
ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3)).clump(ha.size + 1 / 2).pow([1,-1]).flatten // up and down
],inf)}!2),
sub_amp: Ptuple({Pseq([ha.decay].addAll(ha.formant(ha.size - 1 / 2, ha.size).pow(1.0.exprand(3))!2).collect({
|i| i.normalizeSum
}),inf)}!2),
sub_pan: Ptuple({Pseq([ha.decay - 1 * [1,-1]].addAll(Array.interpolation(ha.size,-1,1)!2), inf)}!2),
note:Ptuple([
Pseq(Array.rand(2.rrand(8),0,11), inf),
Pseq(Array.rand(4.rrand(8),12,35), inf)
]),
octave:Ptuple(Pseq((3..7).sputter.scramble.mirror2,inf)!2),
delta:Prand([1/4,1,2,4,8].stutter.sputter.wrapExtend(16).scramble,inf),
//delta:Pseq([4,8],inf),
//delta:2,
dur:Pfunc({ |e| e.delta * thisThread.clock.beatDur * 1.exprand(3) }),
scale:Scale.choose,
//curve:Ptuple(Pbrown(-2,2)!2),
amp:Pseq([[0.4,0.4]],inf) * Pseq(Array.rand(16,0,1)/2+Array.rand(16,0.25,0.5),inf),
rot:Ptuple(Pstutter(Pwhite(1,8), Prand([0,1],inf))!2),
rot_freq:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0.1,4))!2),
blend:Ptuple(Pbrown(0.1,0.9)!2),
from:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0,1.0))!2),
to:Ptuple(Pstutter(Pwhite(1,8), Pwhite(0,1.0))!2),
curve:Ptuple(Ptuple(Pbrown(-2,2,0.3)!2)!2)
])).play(TempoClock(1));
)
reception
Super cool!!! Sounds like a group o trombones!
The code ".blend(Env.sine(dur), blend)" on line 24 was throwing the following error "ERROR: LinXFade2 arg: 'inB' has bad input: sine" so I took it off an all worked well.