{
   "id" : "1-5ft",
   "is_private" : null,
   "code" : "a go at making something like metaphysical function from NI reaktor in SC\r\noriginal instrument design by mike daliot\r\nbased on ScopeView helpfile and\r\nhttps://www.youtube.com/watch?v=l-uuPlAk_FY\r\n\r\nhow to use:\r\nthis instrument generates harsh drones and visuals.\r\nuse with caution! protect your hearing! dist goes loud!\r\n\r\n1. add a little spin with spin t1, t2 and/or fine\r\n2. detune one of the oscillators using tune/fine\r\n\r\na and b is a bank of 4 sine oscs and 2 pulse oscs with pw 0.5 and 0.2\r\n\r\n(\r\nvar w, ctr = IdentityDictionary[], gui = IdentityDictionary[];\r\nvar syn, scopeSyn, scope, func, bus, buffer;\r\n\r\nw = Window(\"Scope\", Rect(0, 0, 800, 500));\r\n\r\nctr[\\defaultfreqs] = 60 ! 6;\r\nctr[\\defaultfine] = 0.0 ! 6;\r\nctr[\\defaultamps] = [-12] ++ (-120 ! 5);\r\n\r\ngui[\\views] = [\\topBar, \\scopeView, \\zoomView, \\lowBar];\r\ngui[\\basicView] = { View().background_(Color.gray).layout_(HLayout()) };\r\n\r\ngui[\\views].do({ |view| gui[view] = gui[\\basicView].value });\r\n\r\n[\\a, \\b].do({ |ab|\r\n\t[\\Top, \\Mid, \\Low].do({ |tier|\r\n\t\tgui[(ab++tier).asSymbol] = gui[\\basicView].value;\r\n\t})\r\n});\r\n\r\nfunc = {\r\n\targ view, synarg, spec, contr, defaults, i;\r\n\tvar sl, values;\r\n\tsl = Slider(gui[view]).action_({\r\n\t\tvalues = ctr[contr].collect({|sl| spec.asSpec.map(sl.value)});\r\n\t\tsyn.setn(synarg, values);\r\n\t\t//values.postln\r\n\t});\r\n\r\n\tsl.value_(spec.asSpec.unmap(ctr[defaults][i]))\r\n};\r\n\r\n// lazy labels\r\n[StaticText(gui[\\topBar]).string_(\"a tune  /  fine  /  amp\\t\\t       alvl\"), View(gui[\\topBar]).minWidth_(450), StaticText(gui[\\topBar]).string_(\"blvl\\t\\t       b tune  /  fine  /  amp\")];\r\n[View(gui[\\lowBar]).maxWidth_(163), StaticText(gui[\\lowBar], Rect(200, 0, 200, 20)).string_(\r\n\"a+b                    zoom                    spin t1                    t2                       fine                        fb                       dist                       a*b\")];\r\n\r\n// the 2 groups of 3 * 6 controls for a and b\r\nctr[\\atune] = {|i| func.(\\aTop, \\afreqs, [5, 125, \\lin, 1 ], \\atune, \\defaultfreqs, i)} !6;\r\nctr[\\btune] = {|i| func.(\\bTop, \\bfreqs, [5, 125, \\lin, 1 ], \\btune, \\defaultfreqs, i)} !6;\r\n\r\nctr[\\afine] = {|i| func.(\\aMid, \\afine, [-1, 1], \\afine, \\defaultfine, i)} !6;\r\nctr[\\bfine] = {|i| func.(\\bMid, \\bfine, [-1, 1], \\bfine, \\defaultfine, i)} !6;\r\n\r\nctr[\\aamp] = {|i| func.(\\aLow, \\aamps, [-120, -4, \\exp], \\aamp, \\defaultamps, i)} ! 6;\r\nctr[\\bamp] = {|i| func.(\\bLow, \\bamps, [-120, -4, \\exp], \\bamp, \\defaultamps, i)} ! 6;\r\n\r\ngui[\\layout] = VLayout(\r\n\tgui[\\topBar],\r\n\tHLayout(\r\n\t\tVLayout(\r\n\t\t\tgui[\\aTop],\r\n\t\t\tgui[\\aMid],\r\n\t\t\tgui[\\aLow],\r\n\t\t),\r\n\t\tVLayout(\r\n\t\t\tgui[\\scopeView],\r\n\t\t\tgui[\\zoomView].maxHeight_(100),\r\n\t\t),\r\n\t\tVLayout(\r\n\t\t\tgui[\\bTop],\r\n\t\t\tgui[\\bMid],\r\n\t\t\tgui[\\bLow],\r\n\t\t),\r\n\t),\r\n\tgui[\\lowBar]\r\n);\r\n\r\nSynthDef(\"scope\", {\r\n\tvar sig;\r\n\tsig = In.ar(\\in.kr(0), 2);\r\n\t// ScopeOut2 writes the audio to the buffer\r\n\t// IMPORTANT - ScopeOut2, not ScopeOut\r\n\tScopeOut2.ar(sig, \\bufnum.kr(0));\r\n\tOut.ar(0, sig*0.1);\r\n}).add;\r\n\r\nSynthDef(\"test3\", {\r\n\tvar a, b, f, sig;\r\n\tvar afreqs, bfreqs, aamps, bamps;\r\n\tafreqs = \\afreqs.kr(ctr[\\defaultfreqs]) + \\afine.kr(ctr[\\defaultfine]);\r\n\tbfreqs = \\bfreqs.kr(ctr[\\defaultfreqs]) + \\bfine.kr(ctr[\\defaultfine]);\r\n\r\n\taamps = \\aamps.kr(ctr[\\defaultamps]);\r\n\tbamps = \\bamps.kr(ctr[\\defaultamps]);\r\n\r\n\ta = SinOsc.ar(afreqs[0..3].midicps, 0.0, aamps[0..3].dbamp);\r\n\tb = SinOsc.ar(bfreqs[0..3].midicps, 0.0, bamps[0..3].dbamp);\r\n\r\n\ta = a + Pulse.ar(afreqs[4..].midicps, [0.5, 0.2], aamps[4..].dbamp);\r\n\tb = b + Pulse.ar(bfreqs[4..].midicps, [0.5, 0.2], bamps[4..].dbamp);\r\n\r\n\tsig = ((a+b) * \\absum.kr(0.5)) + ((a*b) * \\abmul.kr(0.5));\r\n\r\n\tsig = (sig * \\dist.kr(1.0)).tanh;\r\n\r\n\tf = LocalIn.ar(2, 0);\r\n\tf = f * \\fb.kr(0.0);\r\n\r\n\ta =  DelayL.ar(sig+f[0], 2, \\aspin.kr(0.0, 0.1));\r\n\tb =  DelayL.ar(sig+f[1], 2, \\bspin.kr(0.0, 0.1) + \\finespin.kr(0.0, 0.2));\r\n\r\n\tLocalOut.ar([a, b]);\r\n\r\n\ta = a * \\alvl.kr(0.5);\r\n\tb = b * \\blvl.kr(0.5);\r\n\r\n\tOut.ar(\\out.kr(0), [a, b]);\r\n}).add;\r\n\r\n// scope view with lvl controls\r\nSlider(gui[\\scopeView]).action_({|sl| syn.set(\\alvl, [0.0, 1.0].asSpec.map(sl.value))}).value_(0.5);\r\nscope = ScopeView(gui[\\scopeView], Rect(0,0,380,380)); // this is SCScope\r\nSlider(gui[\\scopeView]).action_({|sl| syn.set(\\blvl, [0.0, 1.0].asSpec.map(sl.value))}).value_(0.5);\r\n\r\n// controls below scope\r\nKnob(gui[\\zoomView]).action_({|sl| syn.set(\\absum, [0.0, 1.0].asSpec.map(sl.value))}).value_(0.5);\r\n\r\nSlider(gui[\\zoomView]).action_({|sl| scope.yZoom = ([0.125, 20, \\exp, 1/8, 1].asSpec.map(sl.value))}).valueAction_(0.0);\r\nSlider(gui[\\zoomView]).action_({|sl| syn.set(\\aspin, [0.0, 0.49].asSpec.map(sl.value))}).value_(0.0);\r\nSlider(gui[\\zoomView]).action_({|sl| syn.set(\\bspin, [0.0, 0.49].asSpec.map(sl.value))}).value_(0.0);\r\nSlider(gui[\\zoomView]).action_({|sl| syn.set(\\finespin, [0.0, 0.1, \\lin, 0.001].asSpec.map(sl.value))}).value_(0.0);\r\nSlider(gui[\\zoomView]).action_({|sl| syn.set(\\fb, [-0.2, 0.2].asSpec.map(sl.value))}).value_(0.5);\r\nSlider(gui[\\zoomView]).action_({|sl| syn.set(\\dist, [1, 50].asSpec.map(sl.value))}).value_(0.0);\r\n\r\nKnob(gui[\\zoomView]).action_({|sl| syn.set(\\abmul, [0.0, 1.0].asSpec.map(sl.value))}).value_(0.5);\r\n\r\nbuffer = Buffer.alloc(s, 1024,2);\r\nbus = Bus.audio(s, 1); // why 1?\r\n\r\nscope.bufnum = buffer.bufnum;\r\nscope.style = 2;\r\n​\r\n// IMPORTANT\r\nscope.server = s;\r\n\r\nscopeSyn = Synth.tail(RootNode(s), \"scope\", [\\in, bus.index, \\bufnum, buffer.bufnum]);\r\nsyn = Synth(\"test3\", [\\out, bus.index]);\r\n\r\nscope.start;\r\n\r\nw.onClose = {\r\n\tsyn.free; scopeSyn.free; buffer.free; bus.free;\r\n\tsyn = scopeSyn = scope = func = buffer = bus = nil };\r\n\r\nCmdPeriod.doOnce({w.close});\r\nw.layout = gui[\\layout];\r\nw.front;\r\n)",
   "labels" : [
      "drone gui visuals graphics"
   ],
   "ancestor_list" : [],
   "description" : "a go at making something like metaphysical function from NI reaktor in SC\r\n\r\noriginal instrument design by mike daliot\r\n\r\nbased on ScopeView helpfile and\r\n\r\nhttps://www.youtube.com/watch?v=l-uuPlAk_FY",
   "author" : "hamma",
   "name" : "hamma"
}
