{
   "labels" : [
      "gui",
      "patterns",
      "synth"
   ],
   "id" : "1-5bk",
   "is_private" : null,
   "code" : "//evaluate this block first 1.  You need to add a path to a kick here...\r\n(\r\n~b=Bus.audio(s,2);\r\n\r\n\r\n\r\n ~path=\"\";\r\n~buff=Buffer.read(s,~path);\r\n\r\n)\r\n\r\n//tests....\r\n~path.value;\r\n\r\n~buff.play;\r\n~buff.plot;\r\n~buff.value;\r\n~buff.numFrames;\r\n\r\n//evaluate this block 2.  Synths....\r\n(\r\nSynthDef(\\PlayBufz, {| out = 0, bufnum = 0, amp = 1 |\r\n    Out.ar(out,\r\n        PlayBuf.ar(2, ~buff, BufRateScale.kr(1), doneAction: Done.freeSelf)*amp\r\n    )\r\n}).add;\r\n\r\n\r\n\r\n\r\n\r\nSynthDef(\\bass, { |out, freq = 440, gate = 1, amp = 0.4, slideTime = 0.17, ffreq = 1100, width = 0.15,\r\n        detune = 1.005, preamp = 4, freqHi|\r\n    var    sig,\r\n        env = Env.adsr(0.01, 0.3, 0.4, 0.1);\r\n    freq = Lag.kr(freq, slideTime);\r\n    sig = Mix(VarSaw.ar([freq, freq * detune], 0, width, preamp)).distort * amp\r\n        * EnvGen.kr(env, gate, doneAction: Done.freeSelf);\r\n\tsig = Resonz.ar(sig, VarLag.kr(ffreq,0.3));\r\n\t//freqHi = Linlin.ar(ffreq,20,2000,200,20000).poll;\r\n    Out.ar(out, sig ! 2)\r\n}).add;\r\n)\r\n\r\n\r\n\r\n//evaluate this block 3.\r\n(\r\n~ffreq= 200;\r\n~amp = 1;\r\n\r\nx = Pmono(\\bass,\r\n        \\midinote, Prand([36, 39, 36, 42], 4),\r\n        \\dur, Pseq([0.75,0.75], 4),\r\n        \\amp, 0.3, \\detune, 1.005,\r\n\t\t\\ffreq, Pfunc({~ffreq})\r\n    );\r\n\r\nt = Pmono(\\bass,\r\n        \\midinote, Prand([36, 42, 41, 33], 4),\r\n        \\dur, Pseq([0.25, 0.25, 0.25, 0.75], 4),\r\n        \\amp, 0.3, \\detune, 1.003,\r\n\t\\ffreq, Pfunc({~ffreq}*1.6)\r\n    );\r\n\r\nz = Pbind(\r\n        \\instrument, \\PlayBufz,\r\n\r\n        \\dur, Pseq([0.75,0.75], inf),\r\n\t\\amp, Pfunc({~amp})\r\n);\r\n\r\nTempoClock.default.tempo = 128/60;\r\n\r\n)\r\n\r\n//evaluate this last 4.  GUI.\r\n\r\n(\r\nvar bb,cc, dd, text, pt, r, u, mx=0, my=0;\r\n~amp = 1;\r\nTempoClock.default.tempo = 128/60;\r\n\r\n\r\n\r\nw = Window.new(\"buttontest\",Rect(100,100,450,350));\r\nw.view.background = Color(0.8,0.0,01);\r\n\r\nu = UserView(w, Rect(300, 200,100, 100));\r\nu.background = Color.black;\r\nu.animate = true;\r\npt = Point();\r\nr = Rect();\r\n\r\n//w.view.decorator = FlowLayout(w.view.bounds);\r\n\r\nbb = Button(w, Rect(60, 20, 40, 30))\r\n        .states_([\r\n            [\"on\", Color.black, Color.red],\r\n            [\"off\", Color.white, Color.black]\r\n\r\n        ])\r\n        .action_({ arg zz;\r\n\r\n\tzz.value.postln;\r\n\tif(zz.value == 1){c = Ppar([z,Prand([t,x],inf)],inf).play;};\r\n\tif(zz.value == 0){c.stop};\r\n        });\r\n\r\ng=EZSlider(w,Rect(10,80,390,20),\"Freq\",ControlSpec(20,2000,\\exp,0.001,200),{|ez| ~ffreq = ez.value;ez.value.postln},numberWidth: 60);\r\n\r\n\r\n\r\ntext = StaticText.new(w,Rect(100,200,200,200)).string_(\"kick on / off = kik\\ncutoff = freq\\nspeed = norm\");\r\ntext.font = Font(\"Monaco\", 13);\r\ncc = Button(w, Rect(200, 20, 40, 30))\r\n        .states_([\r\n            [\"kik\", Color.green, Color.red],\r\n            [\"off\", Color.blue, Color.white]\r\n\r\n        ])\r\n        .action_({ arg zz;\r\n\tif(zz.value == 0){~amp = 1};\r\n\tif(zz.value == 1){~amp = 0};\r\n        });\r\n\r\n\r\ndd = Button(w, Rect(60, 140, 40, 30))\r\n        .states_([\r\n            [\"norm\", Color.black, Color.green],\r\n            [\"slo\", Color.black, Color.green],\r\n\t[\"slo2\", Color.black, Color.green]\r\n\r\n        ])\r\n        .action_({ arg zz;\r\n\tif(zz.value == 0){TempoClock.default.tempo = 128/60;};\r\n\tif(zz.value == 1){TempoClock.default.tempo = 110/60;};\r\n\tif(zz.value == 2){TempoClock.default.tempo = 60/60;};\r\n        });\r\n\r\n\r\n\r\nu.drawFunc = {\r\n    Pen.fillColor = Color.red;\r\n\r\n    Pen.color = Color.white;\r\n    pt.x=mx;\r\n    pt.y=my;\r\n    100.do{|i|\r\n        Pen.moveTo(pt);\r\n        pt.x = sin(u.frame*0.1.neg+i)*(5*i)+mx; //use .frame to drive animation\r\n        pt.y = cos(u.frame*0.4+i)*(5*i)+my;\r\n        r.left=pt.x;\r\n        r.top=pt.y;\r\n\t\tr.width=sin(u.frame*0.1);\r\n        r.height=i;\r\n        Pen.lineTo(pt);\r\n        Pen.fillStroke;\r\n        Pen.addOval(r);\r\n        Pen.fillStroke;\r\n    };\r\n};\r\nw.front;\r\n)",
   "name" : "KickandBass",
   "author" : "Scott L Simon",
   "ancestor_list" : [],
   "description" : "Another small GUI performance module.  Builds on a 303 from the helpfiles with a few changes."
}
