{
   "id" : "1-4Sp",
   "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\n(\r\nRoutine.run{\r\n\r\ny = (Platform.resourceDir +/+ \"sounds/a11wlk01.wav\");\r\n\ts.sync;\r\nb = Buffer.read(s, y);\r\n\ts.sync;\r\na = b.numFrames;\r\n\ts.sync;\r\n\r\n(\r\nSynthDef(\\bufGab, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, b, Line.ar((rate*BufRateScale.kr(b)), (rate*BufRateScale.kr(b)*bend), sustain),\r\n\t\t                                 1, pos, 0, 2)), 20000)),20);\r\n\tvar env = EnvGen.ar(Env.sine(sustain, amp * 0.5), doneAction: 2);\r\n\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n}, \\ir ! 5).add;\r\n\r\nSynthDef(\\bufWide, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan, width=0.5|\r\n\tvar holdT = sustain * width;\r\n\tvar fadeT = 1 - width * sustain * 0.5;\r\n\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, b, Line.ar((rate*BufRateScale.kr(b)), (rate*BufRateScale.kr(b)*bend), (fadeT*2+holdT)),\r\n\t\t                                 1, pos, 0, 2)), 20000)),20);\r\n\tvar env = EnvGen.ar(Env([0, 1, 1, 0], [fadeT, holdT, fadeT], \\sin),\r\n\t\tlevelScale: amp * 0.5,\r\n\t\tdoneAction: 2);\r\n\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n}, \\ir ! 5).add;\r\n\r\nSynthDef(\\bufPerc, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, b, Line.ar((rate*BufRateScale.kr(b)), (rate*BufRateScale.kr(b)*bend), sustain),\r\n\t\t                                 1, pos, 0, 2)), 20000)),20);\r\n\tvar env = EnvGen.ar(\r\n\t\tEnv.perc(0.1, 0.9, amp * 0.5),\r\n\t\t\ttimeScale: sustain, doneAction: 2\r\n\t\t);\r\n\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n}, \\ir ! 5).add;\r\n\r\nSynthDef(\\bufPercRev, { |out, amp=0.1, rate=1.0, bend=1.0, pos=1, sustain=0.01, pan|\r\n\tvar snd = HPF.ar((LPF.ar((PlayBuf.ar(1, b, Line.ar((rate*BufRateScale.kr(b)), (rate*BufRateScale.kr(b)*bend), sustain),\r\n\t\t                                 1, pos, 0, 2)), 20000)),20);\r\n\tvar env = EnvGen.ar(\r\n\t\tEnv.perc(0.9, 0.1, amp * 0.5, 4),\r\n\t\t\ttimeScale: sustain, doneAction: 2\r\n\t\t);\r\n\tOffsetOut.ar(out, Pan2.ar(snd * env, pan));\r\n}, \\ir ! 5).add;\r\n\r\n);\r\n\r\ns.sync;\r\n\r\n(\r\n(\r\nq = q ? ();\r\n\r\nq.paramRNames = [\\posRange, \\rateRange, \\bendRange, \\durRange, \\densRange, \\ampRange, \\panRange];\r\nq.paramNames = [\\pos, \\rate, \\bend, \\grDur, \\dens, \\amp, \\pan];\r\nq.syndefNames = [\\bufGab, \\bufWide, \\bufPerc, \\bufPercRev];\r\n\r\nSpec.add(\\xfadeTime, [0.001, 1000, \\exp]);\r\nSpec.add(\\ring, [0.03, 30, \\exp]);\r\nSpec.add(\\grDur, [0.0001, (a/s.sampleRate), \\exp]);\r\nSpec.add(\\dens, [1, 1000, \\exp]);\r\nSpec.add(\\rate, [0.125, 8, \\exp]);\r\nSpec.add(\\bend, [0.5, 2, \\exp]);\r\nSpec.add(\\pos, [0, a-1, \\lin]);\r\n\r\nTdef(\\cloud0)\r\n\t.set(\r\n\t\\synName, \\bufGab,\r\n\t\\vol, 0.7,\r\n\t\\current, (\r\n\t\trateRange: [0.5, 2.0],\r\n\t\tbendRange: [1.0, 1.0],\r\n\t\tposRange: [0, 4000],\r\n\t\tampRange: [0.5, 1],\r\n\t\tdurRange: [0.001, 0.01],\r\n\t\tdensRange: [10, 1000],\r\n\t\tpanRange: [-1.0, 1.0]\r\n\t)\r\n);\r\n\r\nTdef(\\cloud0, { |e|\r\n\r\n\tloop {\r\n\t\ts.sendBundle(s.latency, [\r\n\t\t\t\"/s_new\", e.synName ? \\bufGab,\r\n\t\t\t-1, 0, 0,\r\n\t\t\t\\rate, \t~dirSwitch*(exprand(e.current.rateRange[0], e.current.rateRange[1])),\r\n\t\t\t\\bend, \texprand(e.current.bendRange[0], e.current.bendRange[1]),\r\n\t\t\t\\pos, \trrand(e.current.posRange[0], e.current.posRange[1]),\r\n\t\t\t\\amp,\texprand(e.current.ampRange[0], e.current.ampRange[1]) * e.vol,\r\n\t\t\t\\sustain,\texprand(e.current.durRange[0], e.current.durRange[1]),\r\n\t\t\t\\pan, \trrand(e.current.panRange[0], e.current.panRange[1])\r\n\t\t]);\r\n\t\texprand(e.current.densRange[0].reciprocal, e.current.densRange[1].reciprocal).wait;\r\n\t}\r\n}).quant_(0);\r\n);\r\n\r\n\r\n(\r\nd = Tdef(\\cloud0).envir;\r\n\r\nd.randSet = { |d|\r\n\tvar randSet = ();\r\n\tq.paramRNames.do { |pName, i|\r\n\t\trandSet.put(pName,\r\n\t\t\tq.paramNames[i].asSpec.map([1.0.rand, 1.0.rand].sort)\r\n\t\t);\r\n\t};\r\n\trandSet;\r\n};\r\n\r\nd.setNames = (1..8).collect { |i| (\"set\" ++ i).asSymbol };\r\nd.setNames.do { |key| d[key] = d.randSet; }\r\n\r\n)\r\n);\r\n\r\ns.sync;\r\n\r\n(\r\nd.stopAfterFade = false;\r\nd.xfadeTime = 3;\r\n\r\nd.morphtask = TaskProxy({\r\n\tvar startSet = d[\\current], endSet = d[\\target];\r\n\tvar stepsPerSec = 20;\r\n\tvar numSteps = d.xfadeTime * stepsPerSec;\r\n\tvar blendVal, morphSettings;\r\n\r\n\tif (d.target.notNil) {\r\n\t\t(numSteps).do { |i|\r\n\t\t//\t[\"numSteps\", i].postln;\r\n\t\t\tblendVal = (i + 1) / numSteps;\r\n\t\t\tmorphSettings = endSet.collect({ |val, key|\r\n\t\t\t\t(startSet[key] ? val).blend(val, blendVal)\r\n\t\t\t});\r\n\t\t\td.current_(morphSettings);\r\n\t\t\t(1/stepsPerSec).wait;\r\n\t\t};\r\n\t\td.current_(d.target.copy);\r\n\t\t\"morph done.\".postln;\r\n\t\tif (d.stopAfterFade) { Tdef(\\cloud0).stop; };\r\n\t};\r\n}).quant_(0);\t\t\r\n\r\nd.fadeTo = { |d, start, end, time, autoStop|\r\n\td.current = d[start] ? d.current;\r\n\td.target = d[end];\r\n\td.xfadeTime = time ? d.xfadeTime;\r\n\tif (autoStop.notNil) { d.stopAfterFade = autoStop };\r\n\td.morphtask.stop.play;\r\n};\r\n\r\n);\r\n\r\ndefer{\r\nq.makeCloudGui = { |q, tdef, posPoint|\r\n\tvar w, ezRangers, fdBox;\r\n\tvar setMinis, skipjack;\r\n\r\n\tposPoint = posPoint ? 400@400;\t// where to put the gui window\r\n\r\n\tw = Window.new(\"CloudGenMiniBuf\",\r\n\t\tRect.fromPoints(posPoint, (posPoint + (400@410)))).front;\r\n\tw.view.decorator_(FlowLayout(w.bounds.copy.moveTo(0, 0)));\r\n\r\n\tw.view.decorator.nextLine;\r\n\r\n\t\t// a just in time - gui for the Tdef\r\n\tz = TdefGui(tdef, parent: w);\r\n\r\n\tfdBox = EZNumber.new(w, 78@18, \\Fade, ControlSpec(0.01, 100.0, \\exp, 0.01, 3, nil),\r\n\t\t{ |nbx| tdef.envir.xfadeTime = nbx.value },\r\n\t\t tdef.envir.xfadeTime, false, 35);\r\n\r\n~recordButton = Button(w, 51@19);\r\n~recordButton.states_([[\"rec\", Color.black, Color.white],[\"rec\", Color.white, Color.red]]);\r\n~recordButton.action = {|view|\r\n\t                    if (view.value==1) {s.record} {s.stopRecording}};\r\n~recordButton.value=0;\r\n\r\n\tw.view.decorator.nextLine;\r\n\r\n~text = StaticText(w, 125@45);\r\n~text.string = \"myGrains\";\r\n~text.align = \\center;\r\n~text.font = Font(\"Abadi MT Condensed Extra Bold\", 22);\r\n~text.stringColor = Color.white;\r\n\r\n~view = SoundFileView.new(w, Rect(0,0,202,45)).gridOn_(false);\r\n~viewFile = SoundFile.new;\r\n~viewFile.openRead(y);\r\n\r\n~view.soundfile = ~viewFile;\r\n~view.read(0, ~viewFile.numFrames);\r\n~view.backColor = Color.new255(190, 190, 190);\r\n~view.refresh;\r\n\r\n~dirControl = Button(w, 52@45);\r\n~dirControl.states_([[\">\"],[\"<\"]])\r\n           .action_( {~dirSwitch = ~dir.at(~dirControl.value)} );\r\n~dirControl.value = 0;\r\n~dir = [1, -1];\r\n~dirSwitch = ~dir.at(~dirControl.value);\r\n\r\n\tw.view.decorator.nextLine;\r\n\r\n\tezRangers = ();\r\n\r\n\tq.paramRNames.do { |name, i|\r\n\t\tezRangers.put(name,\r\n\t\tEZRanger(w, 400@20, name, q.paramNames[i],\r\n\t\t\t{ |sl| tdef.envir.current[name] = sl.value; },\r\n\t\t\ttdef.envir.current[name], labelWidth: 70, numberWidth: 50, unitWidth: 10)\r\n\t\t\t.round_([1, 0.001, 0.001, 0.00001, 0.0001, 0.0001, 0.01][i])\r\n\t\t);\r\n\t};\r\n\r\n\r\n\r\n\r\n\tButton.new(w, 126@20).states_([[\\randomize]])\r\n\t\t.action_({\r\n\t\t\ttdef.envir.target_(d.randSet);\r\n\t\t\ttdef.envir.morphtask.stop.play;\r\n\t\t});\r\n\r\n\r\n\r\n\tButton.new(w, 126@20).states_([[\\continuous], [\\fadeStops]])\r\n\t\t.value_(tdef.envir.stopAfterFade.binaryValue)\r\n\t\t.action_({ |btn|\r\n\t\t\ttdef.set(\\stopAfterFade, btn.value == 1)\r\n\t\t});\r\n\r\n\tButton.new(w, 126@20).states_([[\\skipWatching], [\\skipWaiting]])\r\n\t\t.action_({ |btn|\r\n\t\t\t[ { skipjack.play }, { skipjack.stop }][btn.value].value\r\n\t\t});\r\n\r\n\tw.view.decorator.nextLine;\r\n\r\n\tskipjack = SkipJack({\r\n\t\tq.paramRNames.do { |name| ezRangers[name].value_(tdef.envir.current[name]) };\r\n\t\tfdBox.value_(tdef.envir.xfadeTime);\r\n\r\n\t}, 0.5, { w.isClosed }, name: tdef.key);\r\n\r\n\tw.view.decorator.nextLine;\r\n\r\n\ttdef.envir.setNames.do { |setname, i|\r\n\t\tvar minisliders, setMinis;\r\n\t\tvar zone = CompositeView.new(w, Rect(0,0,45, 96));\r\n\t\tzone.decorator = FlowLayout(zone.bounds, 0@0, 5@0);\r\n\t\tzone.background_(Color.white);\r\n\r\n\t\tButton.new(zone, Rect(0,0,45,20)).states_([[setname]])\r\n\t\t\t.action_({\r\n\t\t\t\ttdef.envir.target = tdef.envir[setname];\r\n\t\t\t\ttdef.envir.morphtask.stop.play;\r\n\t\t\t});\r\n\r\n\t\tButton.new(zone, Rect(0,0,45,20))\r\n\t\t\t.states_([[\"save\" ++ (i + 1)]])\r\n\t\t\t.action_({\r\n\t\t\t\td[setname] = tdef.envir.current.copy;\r\n\t\t\t\tsetMinis.value;\r\n\t\t\t});\r\n\r\n\t\tminisliders = q.paramRNames.collect { |paramRname|\r\n\t\t\tRangeSlider.new(zone, 45@8).enabled_(false);\r\n\t\t};\r\n\t\tsetMinis = {\r\n\t\t\tq.paramRNames.do { |paramRname, i|\r\n\t\t\t\tvar paramName = q.paramNames[i];\r\n\t\t\t\tvar myrange = d[setname][paramRname];\r\n\t\t\t\tvar unmapped = paramName.asSpec.unmap(myrange);\r\n\t\t\t\tminisliders[i].lo_(unmapped[0]).hi_(unmapped[1]);\r\n\t\t\t}\r\n\t\t};\r\n\t\tsetMinis.value;\r\n\t};\r\n\r\n\tEZSlider(w, 225@20, \"vol\", \\amp, { |sl|tdef.set(\\vol, sl.value) },\r\n\t\t0.7, false, 20, 36);\r\n\r\n\tStaticText.new(w, 60@20).string_(\"synthdef:\").align_(\\right);\r\n\tPopUpMenu.new(w, Rect(0,0,95,20))\r\n\t\t.items_([\\bufGab, \\bufWide, \\bufPerc, \\bufPercRev])\r\n\t\t.action_({ |pop| tdef.envir.synName = pop.items[pop.value] });\r\n\r\n\r\n};\r\nq.makeCloudGui(Tdef(\\cloud0))\r\n\t};\r\n\r\n\r\n\r\n\tCmdPeriod.doOnce({b.free;});\r\n}\r\n)",
   "labels" : [],
   "description" : "CloudGenMini for use with samples",
   "ancestor_list" : [],
   "author" : "bateslewis",
   "name" : "CloudGenMiniBuf"
}
