{
   "ancestor_list" : [
      "1-4Sp"
   ],
   "description" : "CloudGenMini for use with samples.\r\nReplaced all global variables to be members of the Tdef(\\cloud0)-own environment.\r\nThis should help to create several instances of CloudGenMiniBuf",
   "name" : "CloudGenMiniBuf streamlined",
   "author" : "LFSaw",
   "id" : "1-5ii",
   "is_private" : null,
   "code" : "//CmdPeriod at end of code is to be used to prevent filling all buffers\r\n//use shift-drag to change fadeTime by seconds\r\n//obviously replace ur own file pathNames into the variable y and re-execute code\r\n\r\ns.boot;\r\n(\r\nq = Tdef(\\cloud0).set.envir; // use Tdef's own envir for everything\r\n\r\n\r\nRoutine.run{\r\n\t\r\n\tq.soundPath = (Platform.resourceDir +/+ \"sounds/a11wlk01.wav\");\r\n\ts.sync;\r\n\tq.buffer = Buffer.readChannel(s, q.soundPath, channels: [0]);\r\n\ts.sync;\r\n\tq.bufFrames = q.buffer.numFrames;\r\n\ts.sync;\r\n\t\r\n\t(\r\n\t\tSynthDef(\\bufGab, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\t\t\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, q.buffer, Line.ar((rate*BufRateScale.kr(q.buffer)), (rate*BufRateScale.kr(q.buffer)*bend), sustain),\r\n\t\t\t\t1, pos, 0, 2)), 20000)),20);\r\n\t\t\tvar env = EnvGen.ar(Env.sine(sustain, amp * 0.5), doneAction: 2);\r\n\t\t\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n\t\t}, \\ir ! 5).add;\r\n\t\t\r\n\t\tSynthDef(\\bufWide, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan, width=0.5|\r\n\t\t\tvar holdT = sustain * width;\r\n\t\t\tvar fadeT = 1 - width * sustain * 0.5;\r\n\t\t\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, q.buffer, Line.ar((rate*BufRateScale.kr(q.buffer)), (rate*BufRateScale.kr(q.buffer)*bend), (fadeT*2+holdT)),\r\n\t\t\t\t1, pos, 0, 2)), 20000)),20);\r\n\t\t\tvar env = EnvGen.ar(Env([0, 1, 1, 0], [fadeT, holdT, fadeT], \\sin),\r\n\t\t\t\tlevelScale: amp * 0.5,\r\n\t\t\t\tdoneAction: 2);\r\n\t\t\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n\t\t}, \\ir ! 5).add;\r\n\t\t\r\n\t\tSynthDef(\\bufPerc, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\t\t\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, q.buffer, Line.ar((rate*BufRateScale.kr(q.buffer)), (rate*BufRateScale.kr(q.buffer)*bend), sustain),\r\n\t\t\t\t1, pos, 0, 2)), 20000)),20);\r\n\t\t\tvar env = EnvGen.ar(\r\n\t\t\t\tEnv.perc(0.1, 0.9, amp * 0.5),\r\n\t\t\t\ttimeScale: sustain, doneAction: 2\r\n\t\t\t);\r\n\t\t\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n\t\t}, \\ir ! 5).add;\r\n\t\t\r\n\t\tSynthDef(\\bufPercRev, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\t\t\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, q.buffer, Line.ar((rate*BufRateScale.kr(q.buffer)), (rate*BufRateScale.kr(q.buffer)*bend), sustain),\r\n\t\t\t\t1, pos, 0, 2)), 20000)),20);\r\n\t\t\tvar env = EnvGen.ar(\r\n\t\t\t\tEnv.perc(0.9, 0.1, amp * 0.5, 4),\r\n\t\t\t\ttimeScale: sustain, doneAction: 2\r\n\t\t\t);\r\n\t\t\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n\t\t}, \\ir ! 5).add;\r\n\t\t\r\n\t);\r\n\t\r\n\ts.sync;\r\n\t\r\n\t(\r\n\t\t(\r\n\t\t\t\r\n\t\t\tq.paramRNames = [\\posRange, \\rateRange, \\bendRange, \\durRange, \\densRange, \\ampRange, \\panRange];\r\n\t\t\tq.paramNames = [\\pos, \\rate, \\bend, \\grDur, \\dens, \\amp, \\pan];\r\n\t\t\tq.syndefNames = [\\bufGab, \\bufWide, \\bufPerc, \\bufPercRev];\r\n\t\t\t\r\n\t\t\tSpec.add(\\xfadeTime, [0.001, 1000, \\exp]);\r\n\t\t\tSpec.add(\\ring, [0.03, 30, \\exp]);\r\n\t\t\tSpec.add(\\grDur, [0.0001, (q.bufFrames/s.sampleRate), \\exp]);\r\n\t\t\tSpec.add(\\dens, [1, 1000, \\exp]);\r\n\t\t\tSpec.add(\\rate, [0.125, 8, \\exp]);\r\n\t\t\tSpec.add(\\bend, [0.5, 2, \\exp]);\r\n\t\t\tSpec.add(\\pos, [0, q.bufFrames-1, \\lin]);\r\n\t\t\t\r\n\t\t\tTdef(\\cloud0)\r\n\t\t\t.set(\r\n\t\t\t\t\\synName, \\bufGab,\r\n\t\t\t\t\\vol, 0.7,\r\n\t\t\t\t\\current, (\r\n\t\t\t\t\trateRange: [0.5, 2.0],\r\n\t\t\t\t\tbendRange: [1.0, 1.0],\r\n\t\t\t\t\tposRange: [0, 4000],\r\n\t\t\t\t\tampRange: [0.5, 1],\r\n\t\t\t\t\tdurRange: [0.001, 0.01],\r\n\t\t\t\t\tdensRange: [10, 1000],\r\n\t\t\t\t\tpanRange: [-1.0, 1.0]\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t\t\r\n\t\t\tTdef(\\cloud0, { |e|\r\n\t\t\t\t\r\n\t\t\t\tloop {\r\n\t\t\t\t\ts.sendBundle(s.latency, [\r\n\t\t\t\t\t\t\"/s_new\", e.synName ? \\bufGab,\r\n\t\t\t\t\t\t-1, 0, 0,\r\n\t\t\t\t\t\t\\rate, \tq.dirSwitch*(exprand(e.current.rateRange[0], e.current.rateRange[1])),\r\n\t\t\t\t\t\t\\bend, \texprand(e.current.bendRange[0], e.current.bendRange[1]),\r\n\t\t\t\t\t\t\\pos, \trrand(e.current.posRange[0], e.current.posRange[1]),\r\n\t\t\t\t\t\t\\amp,\texprand(e.current.ampRange[0], e.current.ampRange[1]) * e.vol,\r\n\t\t\t\t\t\t\\sustain,\texprand(e.current.durRange[0], e.current.durRange[1]),\r\n\t\t\t\t\t\t\\pan, \trrand(e.current.panRange[0], e.current.panRange[1])\r\n\t\t\t\t\t]);\r\n\t\t\t\t\texprand(e.current.densRange[0].reciprocal, e.current.densRange[1].reciprocal).wait;\r\n\t\t\t\t}\r\n\t\t\t}).quant_(0);\r\n\t\t);\r\n\t\t\r\n\t\t\r\n\t\t(\r\n\t\t\t\r\n\t\t\tq.randSet = {\r\n\t\t\t\tvar randSet = ();\r\n\t\t\t\tq.paramRNames.do { |pName, i|\r\n\t\t\t\t\trandSet.put(pName,\r\n\t\t\t\t\t\tq.paramNames[i].asSpec.map([1.0.rand, 1.0.rand].sort)\r\n\t\t\t\t\t);\r\n\t\t\t\t};\r\n\t\t\t\trandSet;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tq.setNames = (1..8).collect { |i| (\"set\" ++ i).asSymbol };\r\n\t\t\tq.setNames.do { |key| q[key] = q.randSet; }\r\n\t\t\t\r\n\t\t)\r\n\t);\r\n\t\r\n\ts.sync;\r\n\t\r\n\t(\r\n\t\tq.stopAfterFade = false;\r\n\t\tq.xfadeTime = 3;\r\n\t\t\r\n\t\tq.morphtask = TaskProxy({\r\n\t\t\tvar startSet = q[\\current], endSet = q[\\target];\r\n\t\t\tvar stepsPerSec = 20;\r\n\t\t\tvar numSteps = q.xfadeTime * stepsPerSec;\r\n\t\t\tvar blendVal, morphSettings;\r\n\t\t\t\r\n\t\t\tif (q.target.notNil) {\r\n\t\t\t\t(numSteps).do { |i|\r\n\t\t\t\t\t//\t[\"numSteps\", i].postln;\r\n\t\t\t\t\tblendVal = (i + 1) / numSteps;\r\n\t\t\t\t\tmorphSettings = endSet.collect({ |val, key|\r\n\t\t\t\t\t\t(startSet[key] ? val).blend(val, blendVal)\r\n\t\t\t\t\t});\r\n\t\t\t\t\tq.current_(morphSettings);\r\n\t\t\t\t\t(1/stepsPerSec).wait;\r\n\t\t\t\t};\r\n\t\t\t\tq.current_(q.target.copy);\r\n\t\t\t\t\"morph done.\".postln;\r\n\t\t\t\tif (q.stopAfterFade) { Tdef(\\cloud0).stop; };\r\n\t\t\t};\r\n\t\t}).quant_(0);\t\t\r\n\t\t\r\n\t\tq.fadeTo = { |q, start, end, time, autoStop|\r\n\t\t\tq.current = q[start] ? q.current;\r\n\t\t\tq.target = q[end];\r\n\t\t\tq.xfadeTime = time ? q.xfadeTime;\r\n\t\t\tif (autoStop.notNil) { q.stopAfterFade = autoStop };\r\n\t\t\tq.morphtask.stop.play;\r\n\t\t};\r\n\t\t\r\n\t);\r\n\t\r\n\tdefer{\r\n\t\tq.makeCloudGui = { |q, tdef, posPoint|\r\n\t\t\tvar win, ezRangers, fdBox;\r\n\t\t\tvar setMinis, skipjack;\r\n\t\t\t\r\n\t\t\tposPoint = posPoint ? 400@400;\t// where to put the gui window\r\n\t\t\t\r\n\t\t\twin = Window.new(\"CloudGenMiniBuf\",\r\n\t\t\t\tRect.fromPoints(posPoint, (posPoint + (400@410)))).front;\r\n\t\t\twin.view.decorator_(FlowLayout(win.bounds.copy.moveTo(0, 0)));\r\n\t\t\t\r\n\t\t\twin.view.decorator.nextLine;\r\n\t\t\t\r\n\t\t\t// a just in time - gui for the Tdef\r\n\t\t\tz = TdefGui(tdef, parent: win);\r\n\t\t\t\r\n\t\t\tfdBox = EZNumber.new(win, 78@18, \\Fade, ControlSpec(0.01, 100.0, \\exp, 0.01, 3, nil),\r\n\t\t\t\t{ |nbx| q.xfadeTime = nbx.value },\r\n\t\t\t\tq.xfadeTime, false, 35);\r\n\t\t\t\r\n\t\t\tq.recordButton = Button(win, 51@19);\r\n\t\t\tq.recordButton.states_([[\"rec\", Color.black, Color.white],[\"rec\", Color.white, Color.red]]);\r\n\t\t\tq.recordButton.action = {|view|\r\n\t\t\t\tif (view.value==1) {s.record} {s.stopRecording}};\r\n\t\t\tq.recordButton.value=0;\r\n\t\t\t\r\n\t\t\twin.view.decorator.nextLine;\r\n\t\t\t\r\n\t\t\tq.textView = StaticText(win, 125@45);\r\n\t\t\tq.textView.string = \"myGrains\";\r\n\t\t\tq.textView.align = \\center;\r\n\t\t\tq.textView.font = Font(\"Abadi MT Condensed Extra Bold\", 22);\r\n\t\t\tq.textView.stringColor = Color.white;\r\n\t\t\t\r\n\t\t\tq.soundFileView = SoundFileView.new(win, Rect(0,0,202,45)).gridOn_(false);\r\n\t\t\tq.soundFile = SoundFile.new;\r\n\t\t\tq.soundFile.openRead(q.soundPath);\r\n\t\t\t\r\n\t\t\tq.soundFileView.soundfile = q.soundFile;\r\n\t\t\tq.soundFileView.read(0, q.soundFile.numFrames);\r\n\t\t\tq.soundFileView.backColor = Color.new255(190, 190, 190);\r\n\t\t\tq.soundFileView.refresh;\r\n\t\t\t\r\n\t\t\tq.dirCtlButton = Button(win, 52@45);\r\n\t\t\tq.dirCtlButton.states_([[\">\"],[\"<\"]])\r\n\t\t\t.action_( {q.dirSwitch = q.directions.at(q.dirCtlButton.value)} );\r\n\t\t\tq.dirCtlButton.value = 0;\r\n\t\t\tq.directions = [1, -1];\r\n\t\t\tq.dirSwitch = q.directions.at(q.dirCtlButton.value);\r\n\t\t\t\r\n\t\t\twin.view.decorator.nextLine;\r\n\t\t\t\r\n\t\t\tezRangers = ();\r\n\t\t\t\r\n\t\t\tq.paramRNames.do { |name, i|\r\n\t\t\t\tezRangers.put(name,\r\n\t\t\t\t\tEZRanger(win, 400@20, name, q.paramNames[i],\r\n\t\t\t\t\t\t{ |sl| q.current[name] = sl.value; },\r\n\t\t\t\t\t\tq.current[name], labelWidth: 70, numberWidth: 50, unitWidth: 10)\r\n\t\t\t\t\t.round_([1, 0.001, 0.001, 0.00001, 0.0001, 0.0001, 0.01][i])\r\n\t\t\t\t);\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tButton.new(win, 126@20).states_([[\\randomize]])\r\n\t\t\t.action_({\r\n\t\t\t\tq.target_(d.randSet);\r\n\t\t\t\tq.morphtask.stop.play;\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tButton.new(win, 126@20).states_([[\\continuous], [\\fadeStops]])\r\n\t\t\t.value_(q.stopAfterFade.binaryValue)\r\n\t\t\t.action_({ |btn|\r\n\t\t\t\ttdef.set(\\stopAfterFade, btn.value == 1)\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tButton.new(win, 126@20).states_([[\\skipWatching], [\\skipWaiting]])\r\n\t\t\t.action_({ |btn|\r\n\t\t\t\t[ { skipjack.play }, { skipjack.stop }][btn.value].value\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\twin.view.decorator.nextLine;\r\n\t\t\t\r\n\t\t\tskipjack = SkipJack({\r\n\t\t\t\tq.paramRNames.do { |name| ezRangers[name].value_(q.current[name]) };\r\n\t\t\t\tfdBox.value_(q.xfadeTime);\r\n\t\t\t\t\r\n\t\t\t}, 0.5, { win.isClosed }, name: tdef.key);\r\n\t\t\t\r\n\t\t\twin.view.decorator.nextLine;\r\n\t\t\t\r\n\t\t\tq.setNames.do { |setname, i|\r\n\t\t\t\tvar minisliders, setMinis;\r\n\t\t\t\tvar zone = CompositeView.new(win, Rect(0,0,45, 96));\r\n\t\t\t\tzone.decorator = FlowLayout(zone.bounds, 0@0, 5@0);\r\n\t\t\t\tzone.background_(Color.white);\r\n\t\t\t\t\r\n\t\t\t\tButton.new(zone, Rect(0,0,45,20)).states_([[setname]])\r\n\t\t\t\t.action_({\r\n\t\t\t\t\tq.target = q[setname];\r\n\t\t\t\t\tq.morphtask.stop.play;\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tButton.new(zone, Rect(0,0,45,20))\r\n\t\t\t\t.states_([[\"save\" ++ (i + 1)]])\r\n\t\t\t\t.action_({\r\n\t\t\t\t\tq[setname] = q.current.copy;\r\n\t\t\t\t\tsetMinis.value;\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tminisliders = q.paramRNames.collect { |paramRname|\r\n\t\t\t\t\tRangeSlider.new(zone, 45@8).enabled_(false);\r\n\t\t\t\t};\r\n\t\t\t\tsetMinis = {\r\n\t\t\t\t\tq.paramRNames.do { |paramRname, i|\r\n\t\t\t\t\t\tvar paramName = q.paramNames[i];\r\n\t\t\t\t\t\tvar myrange = q[setname][paramRname];\r\n\t\t\t\t\t\tvar unmapped = paramName.asSpec.unmap(myrange);\r\n\t\t\t\t\t\tminisliders[i].lo_(unmapped[0]).hi_(unmapped[1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tsetMinis.value;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tEZSlider(win, 225@20, \"vol\", \\amp, { |sl|tdef.set(\\vol, sl.value) },\r\n\t\t\t\t0.7, false, 20, 36);\r\n\t\t\t\r\n\t\t\tStaticText.new(win, 60@20).string_(\"synthdef:\").align_(\\right);\r\n\t\t\tPopUpMenu.new(win, Rect(0,0,95,20))\r\n\t\t\t.items_([\\bufGab, \\bufWide, \\bufPerc, \\bufPercRev])\r\n\t\t\t.action_({ |pop| q.synName = pop.items[pop.value] });\r\n\t\t\t\r\n\t\t\t\r\n\t\t};\r\n\t\tq.makeCloudGui(Tdef(\\cloud0))\r\n\t};\r\n\t\r\n\t\r\n\t// remove buffer when pressing Cmd-.\r\n\tCmdPeriod.doOnce({q.buffer.free;});\r\n}\r\n)",
   "labels" : [
      "code fork"
   ]
}
