{
   "ancestor_list" : [],
   "description" : "Simple interface to experiment with basic frequency modulation (big knobs!)",
   "author" : "Bruno Ruviaro",
   "name" : "Frequency Modulation GUI Demo 1",
   "code" : "// ************************************\r\n// Frequency Modulation (GUI)\r\n// Patch 1 - Simple Demo\r\n// Bruno Ruviaro, 2013-08-03\r\n// ************************************\r\n\r\n/*\r\n\r\nSimple interface to experiment with basic frequency modulation.\r\nFrequency Modulation (FM): one oscillator controls the frequency of another.\r\nImagine a note the frequency of which goes up and down at a given speed. (= vibrato!)\r\n\r\nSelect all (ctrl + A), then evaluate (ctrl + period).\r\nWatch the spectrum on the Frequency Analyzer window.\r\n\r\n*/\r\n\r\ns.waitForBoot({\r\n\r\n\tvar win, carrFreqKnob, carrFreqNumber, carrFreqLabel, modFreqKnob, modFreqNumber, modFreqLabel, freqDevKnob, freqDevNumber, freqDevLabel, volumeSlider, defaultFont, defaultColor, defaultAlpha, defaultStringColor, carrSpec, modSpec, devSpec, synth;\r\n\r\n\tdefaultFont = Font(\"Verdana\", 16, bold: true);\r\n\tdefaultColor = Color.red(0.8);\r\n\tdefaultAlpha = 0.87;\r\n\tdefaultStringColor = Color.white;\r\n\r\n\t// Main window\r\n\tWindow.closeAll;\r\n\tFreqScope.new;\r\n\twin = Window.new(\"Frequency Modulation\", Rect(20, 400, 820, 280));\r\n\twin.onClose = {s.freeAll; Window.closeAll; \"Frequency Modulation window closed.\".postln; \"\".postln};\r\n\twin.front;\r\n\twin.background = defaultColor;\r\n\twin.alpha = defaultAlpha;\r\n\r\n\t// Carrier Frequency Knob\r\n\tcarrSpec = ControlSpec(20, 20000, 'exp', 0, 440, \" Hz\");\r\n\tcarrFreqKnob = Knob.new(win, Rect(20, 20, 200, 200))\r\n\t.action = {arg v;\r\n\t\tvar freq = carrSpec.map(v.value);\r\n\t\tcarrFreqNumber.string = freq.round;\r\n\t\tsynth.set(\\carrFreq, freq)};\r\n\tcarrFreqKnob.value = carrSpec.unmap(carrSpec.default);\r\n\r\n\t// Carrier Frequency Number\r\n\tcarrFreqNumber = StaticText.new(win, Rect(80, 210, 80, 25));\r\n\tcarrFreqNumber.background = defaultColor;\r\n\tcarrFreqNumber.alpha = defaultAlpha;\r\n\tcarrFreqNumber.align = \\center;\r\n\tcarrFreqNumber.string = carrSpec.default;\r\n\tcarrFreqNumber.font = defaultFont;\r\n\tcarrFreqNumber.stringColor = defaultStringColor;\r\n\r\n\t// Carrier Frequency Label\r\n\tcarrFreqLabel = StaticText.new(win, Rect(20, 240, 200, 25));\r\n\tcarrFreqLabel.string = \"Carrier Frequency\";\r\n\tcarrFreqLabel.align = \\center;\r\n\tcarrFreqLabel.font = defaultFont;\r\n\tcarrFreqLabel.stringColor = defaultStringColor;\r\n\r\n\t// Modulator Frequency Knob\r\n\tmodSpec = ControlSpec(0.5, 5000, 'exp', 0, 5, \" Hz\");\r\n\tmodFreqKnob = Knob.new(win, Rect(260, 20, 200, 200))\r\n\t.action = {arg v;\r\n\t\tvar freq = modSpec.map(v.value);\r\n\t\tmodFreqNumber.string = freq.round(0.1);\r\n\t\tsynth.set(\\modFreq, freq)};\r\n\tmodFreqKnob.value = modSpec.unmap(modSpec.default);\r\n\r\n\t// Modulator Frequency Number\r\n\tmodFreqNumber = StaticText.new(win, Rect(320, 210, 80, 25));\r\n\tmodFreqNumber.background = defaultColor;\r\n\tmodFreqNumber.alpha = defaultAlpha;\r\n\tmodFreqNumber.align = \\center;\r\n\tmodFreqNumber.string = modSpec.default;\r\n\tmodFreqNumber.font = defaultFont;\r\n\tmodFreqNumber.stringColor = defaultStringColor;\r\n\r\n\t// Modulator Frequency Label\r\n\tmodFreqLabel = StaticText.new(win, Rect(260, 240, 200, 25));\r\n\tmodFreqLabel.string = \"Modulator Frequency\";\r\n\tmodFreqLabel.align = \\center;\r\n\tmodFreqLabel.font = defaultFont;\r\n\tmodFreqLabel.stringColor = defaultStringColor;\r\n\r\n\t// Frequency Deviation Knob\r\n\tdevSpec = ControlSpec(1, 5000, 'exp', 0, 20, \" Hz\");\r\n\tfreqDevKnob = Knob.new(win, Rect(500, 20, 200, 200))\r\n\t.action = {arg v;\r\n\t\tvar freq = devSpec.map(v.value);\r\n\t\tfreqDevNumber.string = freq.round;\r\n\t\tsynth.set(\\freqDev, freq)};\r\n\tfreqDevKnob.value = devSpec.unmap(devSpec.default);\r\n\r\n\t// Frequency Deviation Number\r\n\tfreqDevNumber = StaticText.new(win, Rect(560, 210, 80, 25));\r\n\tfreqDevNumber.background = defaultColor;\r\n\tfreqDevNumber.alpha = defaultAlpha;\r\n\tfreqDevNumber.align = \\center;\r\n\tfreqDevNumber.string = devSpec.default;\r\n\tfreqDevNumber.font = defaultFont;\r\n\tfreqDevNumber.stringColor = defaultStringColor;\r\n\r\n\t// Frequency Deviation Label\r\n\tfreqDevLabel = StaticText.new(win, Rect(500, 240, 200, 25));\r\n\tfreqDevLabel.string = \"Frequency Deviation\";\r\n\tfreqDevLabel.align = \\center;\r\n\tfreqDevLabel.font = defaultFont;\r\n\tfreqDevLabel.stringColor = defaultStringColor;\r\n\r\n\t// Volume Slider\r\n\tvolumeSlider = EZSlider(\r\n\t\tparent: win,\r\n\t\tbounds: Rect(730, 20, 70, 230),\r\n\t\tlabel: \"VOLUME\",\r\n\t\tcontrolSpec: ControlSpec(-40, 0, \\lin, 0.1, -40, \"dB\"),\r\n\t\taction: {|ez| synth.set(\\amp, ez.value.dbamp)},\r\n\t\tlabelWidth: 80,\r\n\t\tunitWidth: 30,\r\n\t\tlayout: 'vert')\r\n\t.setColors(\r\n\t\tstringColor: defaultStringColor,\r\n\t\tsliderBackground: Color.grey(0.9),\r\n\t\tnumNormalColor: Color.black)\r\n\t.font = Font(\"Verdana\", 14, bold: true);\r\n\r\n\tvolumeSlider.numberView.align = \\center;\r\n\tvolumeSlider.unitView.align = \\center;\r\n\r\n\t{\r\n\t\tSynthDef(\"freq-mod\", {\r\n\t\t\targ carrFreq = 440, modFreq = 5, freqDev = 20, amp = 0.01;\r\n\t\t\tvar carrier, modulator;\r\n\t\t\tmodulator = SinOsc.ar(freq: modFreq, mul: freqDev);\r\n\t\t\tcarrier = SinOsc.ar(freq: carrFreq + modulator, mul: amp);\r\n\t\t\tOut.ar(0, [carrier, carrier]);\r\n\t\t}).add;\r\n\r\n\t\ts.sync;\r\n\r\n\t\tsynth = Synth(\"freq-mod\");\r\n\r\n\t}.fork;\r\n\r\n\tCmdPeriod.doOnce({win.close});\r\n\r\n}); // end of waitForBoot",
   "is_private" : null,
   "id" : "1-4UA",
   "labels" : [
      "fm",
      "synthesis techniques",
      "frequency modulation"
   ]
}
