// title: waveset resynthesis effect // author: LFSaw // description: // A WaveSet resynthesis engine to be used within the [MeTA framework](http://3dmin-code.org/instrument-sketching/MeTA) // code: // this uses RTWaveSet and MeTA // http://3dmin-code.org/instrument-sketching/MeTA // http://3dmin-code.org/instrument-sketching/RTWaveSets // closed source for now // the data resource // goes into 3_helperNdefs/wsData.scd m.helpers[\wsData] = RTWaveSetData(server: m.server); // waveset recorder // goes into 3_efx/aux/wsAux.scd Ndef(\ws).addSpec(\active, ControlSpec(0, 1, 'linear', 1, 0)); Ndef(\ws).addSpec(\leak, ControlSpec(0.9, 1, 'exp', 0, 0)); m.aux[\ws] = Ndef(\ws, { var in = \in.ar(0!m.config.numChans).sum; in = LeakDC.ar(in, \leak.kr(0.995)); RTWaveSetAnalysis.ar(m.helpers[\wsData], in, \active.kr(1))//.poll }); // goes into 3_generators/wsResynth.scd Ndef(\ws); // return value ( Ndef(\wsResynth).ar(2); // specs // useful ranges for controls Ndef(\wsResynth).addSpec(\trig, [0.5, 100, \exp]); Ndef(\wsResynth).addSpec(\rateIdx, [0, 5, \lin, 1]); Ndef(\wsResynth).addSpec(\gSize, [1, 40, \lin, 1]); Ndef(\wsResynth).addSpec(\repeat, [1, 10, \lin, 1]); Ndef(\wsResynth).addSpec(\lpFreq, [100, 20000, \exp]); Ndef(\wsResynth).addSpec(\amp, [0, 1]); // amplitude Ndef(\wsResynth).addSpec(\on, [0, 1, \lin, 1]); // on/off Ndef(\wsResynth, { var snd; var pan; // slow automated panning pan = LPF.kr(BrownNoise.kr, 1); snd = RTWaveSetPlayerTriggered.ar( // data input m.helpers[\wsData], // regular trigger, // rate changed each time rChange is called from the language // 5 * (0.125, 0.25 .. 2) // << possible rates // slowly adapting from previous level within 5 seconds Impulse.ar( \trig.kr(5) * TRand.kr(0.125, 2, \rChange.tr(0)) .round(0.125).lag(5) ), // just the last index RTWaveSetSelector.ar(m.helpers[\wsData]), // playback rate fixed to a bunch of values // [0.125, 0.25, 0.5, 0.75, 1, 2] that are slightly off Select.kr(\rateIdx.kr(4), [0.125, 0.25, 0.5, 0.75, 1, 2]) * LFNoise0.kr(0.2).range(0.95, 1.05), // group size between 1..40 \gSize.kr(1), // repeat between 1..10 \repeat.kr(1)); // oh yeah, this is my personal phase-panning snd = m.utils[\phasePan].value(snd, pan); // turn-on-the-sound-mechanism (snd * \amp.kr(1)).tanh * \on.kr(0, 0.2); }).play; ); ////////////// MAPPING /////////////////////// // on/off Ndef(\wsResynth).addHalo(\offFunc, { Ndef(\wsResynth).set(\on, 0); }); Ndef(\wsResynth).addHalo(\onFunc, { Ndef(\wsResynth).set(\on, 1); }); // knobs used to set rate, groupSize and repeat Ndef(\wsResynth).addHalo(\sndA, {|value| Ndef(\wsResynth).setUni(\rateIdx, value) }); Ndef(\wsResynth).addHalo(\sndB, {|value| Ndef(\wsResynth).setUni(\gSize, value) }); Ndef(\wsResynth).addHalo(\pan, {|value| Ndef(\wsResynth).setUni(\repeat, value) }); // button triggers new arbitrary rate Ndef(\wsResynth).addHalo(\fcs, {|value| Ndef(\wsResynth).set(\rChange, 1.postln) });