{
   "is_private" : null,
   "id" : "1-57z",
   "code" : "(\r\ns.waitForBoot({\r\n\tvar visualizationFrequency = 100;\r\n\tvar impulsesPerSecond = 15;\r\n\tvar overallSpeedMod = 1;\r\n\tvar generator = Group.new;\r\n\tvar squiggleGroup = Group.before(generator);\r\n\t~allPoints = Array.fill(300, Point(0,0));\r\n\t~squiggleBus.free;\r\n\t~squiggleBus = Bus.control(s, 6);\r\n\r\n\tm = NetAddr(\"127.0.0.1\", NetAddr.langPort); // loopback\r\n\r\n\tSynthDef(\\genSeg1, {\r\n\t\t| controlOutBus, parameterrange, dur |\r\n\t\tvar time, xy, sc, env;\r\n\t\ttime = LFSaw.kr(freq:1/dur, iphase:1).range(0, parameterrange);\r\n\t\tenv = EnvGen.kr(Env.new([0,1,1,0], times:[0.001,dur-0.02,0.001]), doneAction:2);\r\n\t\txy = [time + sin(20*time), time, -1, 8, -0.8, 4]; // composed graph lies between -1,8 and between -0.8 and 4\r\n\t\tOut.kr(controlOutBus,env*xy);\r\n\t}).add;\r\n\r\n\tSynthDef(\\genSeg2, {\r\n\t\t| controlOutBus, parameterrange, dur |\r\n\t\tvar time, xy, sc, env;\r\n\t\ttime = LFSaw.kr(freq:1/dur, iphase:1).range(0, parameterrange);\r\n\t\txy = [(2*time) + 2.695, 3 + sin(20*time), -1, 8, -0.8, 4]; // composed graph lies between -1,8 and between -0.8 and 4\r\n\t\tenv = EnvGen.kr(Env.new([0,1,1,0], times:[0.001,dur-0.02,0.001]), doneAction:2);\r\n\t\tOut.kr(controlOutBus, env*xy);\r\n\t}).add;\r\n\r\n\tSynthDef(\\genSeg3, {\r\n\t\t| controlOutBus, parameterrange, dur |\r\n\t\tvar time, xy, sc, env;\r\n\t\ttime = LFSaw.kr(freq:1/dur, iphase:1).range(0, parameterrange);\r\n\t\txy = [((time+5)/5)*(6.695-time+sin(10*time)), 3.745-time, -1, 8, -0.8, 4]; // composed graph lies between -1,8 and between-0.8 and 4\r\n\t\tenv = EnvGen.kr(Env.new([0,1,1,0], times:[0.001,dur-0.02,0.001]), doneAction:2);\r\n\t\tOut.kr(controlOutBus, env*xy);\r\n\t}).add;\r\n\r\n\tSynthDef(\\genSeg4, {\r\n\t\t| controlOutBus, parameterrange, dur |\r\n\t\tvar time, xy, sc, env;\r\n\t\ttime = LFSaw.kr(freq:1/dur, iphase:1).range(0, parameterrange);\r\n\t\txy = [4.704 - (3.76*time) - sin(20*time), 0.245 - time, -1, 8, -0.8, 4]; // composed graph lies between -1,8 and between -0.8 and 4\r\n\t\tenv = EnvGen.kr(Env.new([0,1,1,0], times:[0.001,dur-0.02,0.001]), doneAction:2);\r\n\t\tOut.kr(controlOutBus, env*xy);\r\n\t}).add;\r\n\r\n\tSynthDef(\\genSeg5, {\r\n\t\t| controlOutBus, parameterrange, dur |\r\n\t\tvar time, xy, sc, env;\r\n\t\ttime = LFSaw.kr(freq:1/dur, iphase:1).range(0, parameterrange);\r\n\t\txy = [0, (time/1.3)-0.76, -1, 8, -0.8, 4]; // composed graph lies between -1,8 and between -0.8 and 4\r\n\t\tenv = EnvGen.kr(Env.new([0,1,1,0], times:[0.001,dur-0.02,0.001]), doneAction:2);\r\n\t\tOut.kr(controlOutBus, env*xy);\r\n\t}).add;\r\n\r\n\tSynthDef(\\squiggleTestAutomatic, {\r\n\t\t| out = 0, controlInBus |\r\n\t\tvar sig, xy, freqs, ringtimes, env;\r\n\t\t// read the xy control values in the form [ minx, maxx, x, miny, maxy, y ]\r\n\t\txy = Lag.kr(In.kr(controlInBus, 6));\r\n\r\n\t\tfreqs = [800, 1071, 1153, 1723] * Lag.kr(xy[0].linlin(xy[2],xy[3],0.5,2), 0.1); /* MouseX.kr(0.5, 2, 1); */\r\n\t\tringtimes = [1, 1, 1, 1] * Lag.kr(xy[1].linlin(xy[4], xy[5], 0.1, 10), 0.1); /* MouseY.kr(0.1, 10, 1); */\r\n\t\tsig = DynKlank.ar(`[freqs, nil, ringtimes ], Impulse.ar(impulsesPerSecond, 0, 0.1));\r\n\r\n\t\tSendReply.kr(Impulse.kr(visualizationFrequency), '/viz', [xy[0], xy[1]]); // impulse argument tells how often to update the display\r\n\t\tOut.ar(out, (0.3*sig)!2);\r\n\r\n\t}).add;\r\n\r\n\ts.sync;\r\n\r\n\to=OSCFunc({|msg|\r\n\t\t~allPoints[0] = (Point(msg[3] /* x */,msg[4] /* y */));\r\n\t\t~allPoints = ~allPoints.shift(1, Point(0,0));\r\n\t}, '/viz');\r\n\r\n\tw = Window(bounds: Rect(0, 0, 1920, 780));\r\n\tv = UserView(w, w.view.bounds);\r\n\tv.background_(Color.white);\r\n\tv.animate_(true);\r\n\tv.drawFunc_({\r\n\t\tvar startPoint = Point(~allPoints[0].x,~allPoints[0].y);\r\n\t\tPen.moveTo(startPoint);\r\n\t\t~allPoints.do({\r\n\t\t\t| pt, index |\r\n\t\t\tif ((index > 1), {\r\n\t\t\t\tvar prevPoint = ~allPoints[index-1];\r\n\t\t\t\tPen.fillColor = \"000000\";\r\n\t\t\t\tPen.alpha_(index.linlin(0, ~allPoints.size, 1, 0));\r\n\t\t\t\tPen.line(\r\n\t\t\t\t\tPoint((prevPoint.x.linlin(-1, 8, 0, 1920)), (prevPoint.y.linlin(-0.8,4,780,0))),\r\n\t\t\t\t\tPoint((pt.x.linlin(-1, 8, 0, 1920)),(pt.y.linlin(-0.8,4,780,0)))\r\n\t\t\t\t\t);\r\n\t\t\t\tPen.stroke;\r\n\t\t\t});\r\n\t\t});\r\n\t});\r\n\tw.onClose_({\r\n\t\tPdef(\\testSquiggle).stop;\r\n\t\tPdef(\\testSquiggle).clear;\r\n\t\t~squiggleBus.free;\r\n\t});\r\n\tw.front;\r\n\r\n\r\n\tSynth(\\squiggleTestAutomatic, [controlInBus: ~squiggleBus]);\r\n\tPdef(\\testSquiggle).play;\r\n\tPdef(\\testSquiggle,\r\n\t\tPbind(\\instrument, Pseq([\\genSeg1,\\genSeg2,\\genSeg3,\\genSeg4,\\genSeg5], 1),\r\n\t\t\t  \\parameterrange, Pseq([3,2,3.5,1,1], 1),\r\n\t\t\t  \\dur, Pfunc({|ev| ev[\\parameterrange] / overallSpeedMod; }),\r\n\t\t\t  \\group, squiggleGroup,\r\n\t\t\t  \\meh, Pfunc({|ev| (\"Switching to \" ++ ev[\\instrument]).postln; }),\r\n\t\t\t  \\controlOutbus, ~squiggleBus));\r\n});\r\n)",
   "labels" : [
      "osc",
      "visualization",
      "squiggle",
      "mousex",
      "mousey",
      "control signal",
      "parametric"
   ],
   "ancestor_list" : [],
   "description" : "A more extensive squiggle session. Construction is detailed in a blog post http://technogems.blogspot.be/2017/08/automating-squiggles-in-supercollider.html . This uses a pattern to switch between synths that do nothing but generate x,y control signals (each synth generates one squiggle, and the pattern glues all squiggles together). The control signals then are used in a synth that generates sound. The intention of the squiggles is to (mathematically) recreate the fun effects you can get when playing with MouseX and MouseY in supercollider. To show what is happening, the squiggles are also visualized while they are being generated. Increase the ~allPoints array size to get a longer visualization tail.",
   "name" : "Squiggle squiggle",
   "author" : "56228375"
}
