( var sin_dict = BmDspAlgs.getDict("synths/distorted_sin.scd"); sin_dict.makeSourceNdef(\sin_bass); // TODO: use vars later ~granular_sampler_dict = BmDspAlgs.getDict("samplers/granular_sampler.scd"); ~granular_sampler_dict[\postAmp] = true; ~granular_sampler_dict.makeSourceSynthDef.add(); ~layered_grain = (); ~layered_grain[\name] = \layered_grain; ~layered_grain[\slots] = ( percussion: 1, percussion_2: 2, noises: 2, pad: 3, ambience: 4, ambience_2: 6, ambience2: 5 ); Ndef(~layered_grain[\name]).clear; Ndef(~layered_grain[\name]).ar(2); Ndef(~layered_grain[\name]).prime(~granular_sampler_dict[\name]); ~melodic_grain = (); ~melodic_grain[\name] = \melodic_grain; ~melodic_grain[\slots] = ( percussion: 1, noises: 2, pad: 3, ambience: 4, ambience2: 5 ); Ndef(~melodic_grain[\name]).clear; Ndef(~melodic_grain[\name]).ar(2); Ndef(~melodic_grain[\name]).prime(~granular_sampler_dict[\name]); // global fx chain Ndef(~layered_grain[\name]).put(148, \filter -> { | in | Compander.ar( in, in, \treshHold.kr(0.33), \slopeBelow.kr(1.5), \slopeAbove.kr(0.33), \clampTime.kr(0.15), \relaxTime.kr(0.6) ); }); Ndef(~layered_grain[\name]).put(149, \filter -> { | in | XFade2.ar(in, Convolution2.ar(in, ~sun_imp), \impulseDryWet.kr(-0.75)); }); Ndef(~layered_grain[\name]).put(150, \filter -> { | in | MiVerb.ar(in, \rTime.kr(0.2), \rDryWet.kr(0.1)); }); Ndef(~melodic_grain[\name]).put(149, \filter -> { | in | var d = in; 4.do({ | i | var it = i + 1; d = d + AllpassL.ar(d, 0.5, 0.1 * it, it.reciprocal, it.reciprocal); }); in + d; }); Ndef(~melodic_grain[\name]).set(\wet149, 0.33); Ndef(~melodic_grain[\name]).put(150, \filter -> { | in | MiVerb.ar(in, \rTime.kr(0.2), \rDryWet.kr(0.1)); }); Spec.add(\treshHold, [0.0, 1.0, \lin]); Spec.add(\slopeBelow, [1.0, 2.0, \lin]); Spec.add(\slopeAbove, [0.0, 1.0, \lin]); Spec.add(\clampTime, [0.01, 2.0, \lin]); Spec.add(\relaxTime, [0.01, 2.0, \lin]); Spec.add(\impulseDryWet, [-1.0, 1.0, \lin]); Spec.add(\attack, [0.01, 2.0, \lin]); Ndef(~layered_grain[\name]).play; Ndef(~melodic_grain[\name]).play; //Control nodes Ndef(\main_pad_amp).clear; Ndef(\main_pad_amp).kr(1); Ndef(\main_pad_amp).put(0, { var e = Env([0.0, \from.kr(-20.dbamp), \to.kr(-6.dbamp)], [0.0, \time.kr(10)], \curve.kr(1)); EnvGen.kr(e, \gate.tr(0)); }); Ndef(\main_pad_amp).play; Ndef(\percussion_amp).clear; Ndef(\percussion_amp).kr(1); Ndef(\percussion_amp).put(0, { var e = Env([0.0, \from.kr(-20.dbamp), \to.kr(-6.dbamp)], [0.0, \time.kr(10)]); EnvGen.kr(e, \gate.tr(0)); }); Ndef(\percussion_amp).play; Ndef(\pad1_pan_mod).clear; Ndef(\pad1_pan_mod).kr(1); Ndef(\pad1_pan_mod).put(0, { SinOsc.kr(\freq.kr(1), \phase.kr(0.0)).range(\from.kr(-0.25), \to.kr(0.0)); }); Ndef(\pad1_pan_mod).play; Ndef(\pad1_pan_mod).copy(\pad2_pan_mod); Ndef(\pad2_pan_mod).set([\from, 0.0, \to, 0.25, \phase, 1.5]); Ndef(\pad2_pan_mod).play; Ndef(\pad_dir_mod, { Pulse.kr(1).range(0.8, 1.0); }); Ndef(\pad_dir_mod).play; Ndef(\main_pad_amp).copy(\envMod4); Ndef(\envMod4).play; )