{
   "name" : "Mono2eN - Ndef, slightly altered",
   "author" : "LFSaw",
   "ancestor_list" : [
      "1-4T6"
   ],
   "description" : "The ndef version of the mono2eN system, slightly adapted - a multichannel autospatilisation musical performance tool.",
   "labels" : [
      "code fork",
      "spatial",
      "performance tool"
   ],
   "code" : "// patch for benjolin spatialisation, original 2012 by Callum Goddard\r\n// adapted and altered by Till Bovermann\r\n\r\n(\r\nq = q ? ();\r\n\r\nq.inChannel   = 0;\r\nq.numOutChans = 4;\r\n\r\n\r\ns.waitForBoot{\r\n\tNdefMixer(s);\r\n\tNdef(\\for8).fadeTime = 10;\r\n\tSpec.add(\\rotSpeed, [-10, 10]);\r\n\tSpec.add(\\posLag, [0, 5, \\exp]);\r\n\tSpec.add(\\posLag, [0.001, 5, \\exp]);\r\n\tSpec.add(\\shifter, [0.25, 4]);\r\n\tSpec.add(\\drive, [0, 10, 4]);\r\n\r\n\r\n(\r\nNdef(\\for8, {|drive = 1, rotSpeed = 1, posLag = 0.1, shifter = 1|\r\n\tvar in, pos, width, sig, sig2, sig2pan, out, chain, centroid;\r\n\tvar freq, hasFreq, freq2, hasFreq2;\r\n\r\n\tvar numInternalChannels = 4;\r\n\r\n\tin = SoundIn.ar(q.inChannel);  // input\r\n\t\t\t\t\r\n\twidth = \\width.kr(4);\r\n\t\r\n\t\r\n\r\n\t// calculate spectral centroid (center of mass)\r\n\t// do some magic to scale it properly\r\n\tcentroid = ((\r\n\t\tSpecCentroid.kr(\r\n\t\t\tFFT(LocalBuf(2048, 1), in)\r\n\t\t) * 0.0005\r\n\t) - 0.3 ) * 10;\r\n\t\r\n\t// new position determined by centroid, linearly lagged\r\n\tpos = VarLag.ar(K2A.ar(centroid), posLag, 0) * rotSpeed;\r\n\r\n\tsig = PanAz.ar(\r\n\t     numInternalChannels,\r\n\t     in,\r\n\t     pos,\r\n\t     0.5,\r\n\t     width\r\n\t);\r\n\t\r\n\t\r\n\t// Freezr\r\n\t#freq, hasFreq = Pitch.kr(\r\n\t\tin, \r\n\t\tampThreshold: 0.09, \r\n\t\tmedian: 7\r\n\t);\r\n\tfreq = freq * hasFreq * 0.01;\r\n\r\n\r\n\tchain = FFT({LocalBuf(2048, 1)}.dup(q.numOutChans), sig);\r\n\tchain = PV_MagFreeze(\r\n\t\tchain, \r\n\t\tSinOsc.ar(\r\n\t\t\t(freq*100).lag2(\\laggin.kr(0.1), 0)\r\n\t\t)\r\n\t);\r\n\t\r\n\tsig2 = IFFT(chain);\r\n\tsig2pan = SplayAz.ar(\r\n\t\tnumInternalChannels,\r\n\t\tsig2,\r\n\t\tcenter: LFSaw.ar(0.125)\r\n\t);\r\n\t\r\n\tsig = PitchShift.ar(sig, 0.05, shifter, 0);\r\n\t\r\n\t(SplayAz.ar(\r\n\t\tq.numOutChans, \r\n\t\tMix([sig, sig2pan]).scramble\r\n\t) * drive).tanh;\r\n})\r\n);\r\n\r\n//Ndef('for8').set('shifter', 1.0, 'posLag', 0.82647347718014, 'fadeTime', 10, 'width', 2.0, 'laggin', 0.76778019328278, 'drive', 1.0, 'rotSpeed', 0.1);\r\n\r\nNdef('for8').set('shifter', 1.0, 'posLag', 0.27577667345515, 'fadeTime', 10, 'width', 2.0, 'laggin', 1.078391331802, 'drive', 4.4666739998668, 'rotSpeed', -0.1);\r\n\r\n\r\n//Ndef('for8').set('shifter', 1.0, 'posLag', 0.021611250555475, 'fadeTime', 10, 'width', 4.0, 'laggin', 0.17982121468705, 'drive', 6.9880842593118, 'rotSpeed', 0.4);\r\n\r\nNdef('for8').play(\r\n\tvol: 0.6914284026465\r\n\r\n);\r\n\r\n}\r\n)\r\nNdef(\\tester, {SoundIn.ar(0)})\r\nNdefMixer(s)",
   "is_private" : null,
   "id" : "1-4T8"
}
