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