+ NodeDictionary { makeSourceNdef { | name | var internalName = if(name.isNil, {this[\name]}, {name}); Ndef(internalName, { var freq, signal, env, gate; var releaseNode = if ( this[\sustained].asBoolean, { 2 }, { nil } ); gate = \gate.tr(0); freq = \freq.kr(220); if(this[\useFreqLag].asBoolean, { freq = Lag.kr(freq, \freqLag.kr(0.5)); }); signal = SynthDef.wrap( func: this[\func], prependArgs: [freq, gate] ); if(this[\useLfo].asBoolean, { var lfo = switch(this[\lfoWave]) { \sin } { SinOsc } { \saw } { Saw } { \tri } { LFTri } { \pulse } { Pulse } ? SinOsc; signal = signal * lfo.kr( \lfoFreq.kr(1) ).range( 1 - \lfoGain.kr(0.5), 1 ); }); if(this[\useSaturation].asBoolean, { this[\saturationSteps].do { signal = signal.tanh; } }); if(this[\useEnv].asBoolean, { var att = this.getDefaultOr(\attack, 0.1); var rel = this.getDefaultOr(\release, 0.1); var curve = this.getDefaultOr(\curve, 1); var env = Env( [0, 0, 1, 0], [0, \attack.kr(att), \release.kr(rel)], [0, \attackCurve.kr(curve), \releaseCurve.kr(curve)], releaseNode: releaseNode, ).kr(0, gate: gate); signal = signal * env; }); if(this[\usePan].asBoolean, { switch(this[\panning], \splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); }, \splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); }, \pan, { signal = Pan2.ar(signal, \pan.kr(0)); } ); }); signal * \amp.kr(1); }); } }