{
   "is_private" : null,
   "id" : "1-4UH",
   "code" : "// ************************************\r\n// Subtractive Synthesis Demo (GUI)\r\n// Patch 1 - Filtering a noise source\r\n// Bruno Ruviaro, 2013-07-26\r\n// ************************************\r\n\r\n/*\r\n\r\nUse the 2D slider to choose filter frequency (x-axis) and filter rq (y-axis). Use the menu to choose noise source: Pink Noise, White Noise, Gray Noise, Brown Noise, or Clip Noise.\r\n\r\nWatch the Frequency Analyzer window to see how the spectrum changes.\r\n\r\n*/\r\n\r\ns.waitForBoot({\r\n\tvar noise, win, slider2d, menu, controlX, controlY, volumeSlider, button;\r\n\tnoise = {arg whichNoise = 0, whichFilter = 0, amp = 0.06, ffreq = 1000, rq = 0.8;\r\n\t\tvar snd;\r\n\t\tamp = Lag.kr(amp, 1);\r\n\t\tsnd = Select.ar(\r\n\t\t\twhich: whichNoise,\r\n\t\t\tarray: [\r\n\t\t\t\tPinkNoise.ar(amp),\r\n\t\t\t\tWhiteNoise.ar(amp * 0.6),\r\n\t\t\t\tGrayNoise.ar(amp * 0.7),\r\n\t\t\t\tBrownNoise.ar(amp),\r\n\t\t\t\tClipNoise.ar(amp * 0.5)]);\r\n\t\tsnd = Select.ar(\r\n\t\t\twhich: whichFilter,\r\n\t\t\tarray: [\r\n\t\t\t\tBPF.ar(snd, ffreq, rq),\r\n\t\t\t\tBRF.ar(snd, ffreq, rq)]);\r\n\t\tOut.ar(0, [snd, snd]);\r\n\t}.play;\r\n\r\n\twin = Window(\r\n\t\tname: \"Subtractive Synthesis - Patch 1\",\r\n\t\tbounds: Rect(300, 100, 600, 560));\r\n\twin.background = Color.black;\r\n\r\n\t// Slider\r\n\tcontrolX = ControlSpec(\r\n\t\tminval: 100,\r\n\t\tmaxval: 10000,\r\n\t\twarp: \\exp,\r\n\t\tstep: 0.1);\r\n\tcontrolY = ControlSpec(\r\n\t\tminval: 1.0,\r\n\t\tmaxval: 0.001,\r\n\t\twarp: \\exp,\r\n\t\tstep: 0.001);\r\n\tslider2d = Slider2D(win, Rect(10, 10, 580, 500));\r\n\tslider2d.x = controlX.unmap(1000);\r\n\tslider2d.y = controlY.unmap(0.5);\r\n\tslider2d.background = Color.new255(255, 102, 255);\r\n\tslider2d.knobColor = Color.black;\r\n\tslider2d.action = {|slider|\r\n\t\tnoise.set(\r\n\t\t\t\\ffreq, controlX.map(slider.x),\r\n\t\t\t\\rq, controlY.map(slider.y))};\r\n\r\n\t// Noise Source menu\r\n\tmenu = PopUpMenu(win, Rect(10, 520, 120, 30));\r\n\tmenu.items = [\"Pink Noise\", \"White Noise\", \"Gray Noise\", \"Brown Noise\", \"Clip Noise\"];\r\n\tmenu.action = {arg menu;\r\n\t\tnoise.set(\\whichNoise, menu.value);\r\n\t\tcase\r\n\t\t{menu.value==0} {slider2d.background = Color.new255(255, 102, 255)}\r\n\t\t{menu.value==1} {slider2d.background = Color.new255(255, 255, 255)}\r\n\t\t{menu.value==2} {slider2d.background = Color.new255(192, 192, 192)}\r\n\t\t{menu.value==3} {slider2d.background = Color.new255(139, 69, 19)}\r\n\t\t{menu.value==4} {slider2d.background = Color.new255(0, 0, 0)}};\r\n\r\n\t// Filter Type button\r\n\tbutton = Button(win, Rect(140, 520, 40, 30));\r\n\tbutton.states = [[\"BPF\", Color.white, Color.black], [\"BRF\", Color.white, Color.red]];\r\n\tbutton.action = {arg button;\r\n\t\tif(button.value==0,\r\n\t\t\t{\r\n\t\t\t\tnoise.set(\\whichFilter, 0);\r\n\t\t\t\tslider2d.knobColor = Color.black;\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tvolumeSlider.valueAction = -24;\r\n\t\t\t\tSystemClock.sched(0.5, {noise.set(\\whichFilter, 1)});\r\n\t\t\t\tslider2d.knobColor = Color.red;\r\n\t\t\t});\r\n\t};\r\n\r\n\t// Volume slider\r\n\tvolumeSlider = EZSlider(\r\n\t\tparent: win,\r\n\t\tbounds: Rect(190, 520, 390, 30),\r\n\t\tlabel: \"VOLUME\",\r\n\t\tcontrolSpec: ControlSpec(-60, 0, \\lin, 0.1, -24, \"dB\"),\r\n\t\taction: {|ez| noise.set(\\amp, ez.value.dbamp)},\r\n\t\tinitVal: -24)\r\n\t.setColors(\r\n\t\tstringColor: Color.white,\r\n\t\tsliderBackground: Color.grey(0.9),\r\n\t\tnumNormalColor: Color.black);\r\n\r\n\tFreqScope.new;\r\n\twin.front;\r\n\tCmdPeriod.doOnce({Window.closeAll});\r\n\twin.onClose = {s.freeAll; Window.closeAll};\r\n\r\n}); // end of block",
   "labels" : [
      "noise",
      "gui",
      "filter",
      "synthesis techniques",
      "subtractive synthesis"
   ],
   "ancestor_list" : [],
   "description" : "Graphical interface to play with subtractive synthesis. Use the 2D slider to choose filter frequency (x-axis) and filter rq (y-axis). Use the menu to choose noise source: Pink Noise, White Noise, Gray Noise, Brown Noise, or Clip Noise.",
   "name" : "Subtractive Synthesis GUI Demo 1",
   "author" : "Bruno Ruviaro"
}
