{
   "ancestor_list" : [],
   "description" : "Experiment with FM by specifying contours for Carrier Frequency, Modulator Frequency, Modulation Index, and Amplitude Envelope. You can also choose duration of \"notes\".",
   "author" : "Bruno Ruviaro",
   "name" : "Frequency Modulation GUI Demo 3",
   "code" : "// ************************************\r\n// Frequency Modulation Fun (GUI)\r\n// Patch 3 - Using Envelopes\r\n// Bruno Ruviaro, 2013-08-12\r\n// ************************************\r\n\r\n/*\r\n\r\nExperiment with frequency modulation by specifying\r\ncontours for Carrier Frequency, Modulator Frequency,\r\nModulation Index, and Amplitude Envelope.\r\nYou can also choose duration of a \"note\".\r\n\r\nSelect all (ctrl + A), then evaluate (ctrl + period).\r\n\r\n*/\r\n\r\ns.waitForBoot({\r\n\r\n\tvar numberOfPoints, scaleEnv, win, subwin, evCarrFreq, evModFreq, evModIndex, evAmp, font, font2, labelColor, windowColor, ampEnv, carrFreqEnv, modFreqEnv, modIndexEnv, timeScale, volumeSlider, durationSlider, printEnvData, adjustEnv, masterOut, presetArray, presetButtons;\r\n\r\n\ttimeScale = 3; // total duration of a \"note\"\r\n\tnumberOfPoints = 8; // how many points in the breakpoint envelopes\r\n\tpresetArray = Array.newClear(12); // number of presets\r\n\r\n\tfont = Font(\"Verdana\", 16, bold: true);\r\n\tfont2 = Font(\"Verdana\", 84);\r\n\tlabelColor = Color.white;\r\n\twindowColor = Color.grey(0.1);\r\n\r\n\r\n\tcarrFreqEnv = Env.new(\r\n\t\tlevels: {1.0.rand}!numberOfPoints,\r\n\t\ttimes: ({1.0.rand}!(numberOfPoints-1)).normalizeSum\r\n\t);\r\n\r\n\r\n\tmodFreqEnv = Env.new(\r\n\t\tlevels: {1.0.rand}!numberOfPoints,\r\n\t\ttimes: ({1.0.rand}!(numberOfPoints-1)).normalizeSum\r\n\t);\r\n\r\n\tmodIndexEnv = Env.new(\r\n\t\tlevels: {1.0.rand}!numberOfPoints,\r\n\t\ttimes: ({1.0.rand}!(numberOfPoints-1)).normalizeSum\r\n\t);\r\n\r\n\tampEnv = Env.new(\r\n\t\t// using 'put' to make sure first and last are 0.0\r\n\t\tlevels: ({1.0.rand}!numberOfPoints).put(0, 0).put(numberOfPoints-1, 0),\r\n\t\ttimes: ({1.0.rand}!(numberOfPoints-1)).normalizeSum\r\n\t);\r\n\t/*\r\n\tcarrFreqEnv = Env.new([0.5, 0.5, 0.4, 0.5], [0.3, 0.3, 0.3, 0.1]);\r\n\tmodFreqEnv = Env.new([0.25, 0.25, 0.25, 0.25], [0.3, 0.3 ,0.4]);\r\n\tmodIndexEnv = Env.new([0, 0.3, 0.7, 1], [0.25, 0.25, 0.5]);\r\n\t*/\r\n\r\n\r\n\tWindow.closeAll;\r\n\r\n\twin = Window.new(\"Frequency Modulation Fun\", Rect(50, 50, 915, 400), resizable: false);\r\n\twin.front;\r\n\twin.background = windowColor;\r\n\twin.alpha = 0.95;\r\n\twin.onClose = {s.freeAll};\r\n\tCmdPeriod.doOnce({Window.closeAll});\r\n\r\n\tsubwin = FlowView.new(\r\n\t\tparent: win,\r\n\t\tbounds: Rect(710, 230, 185, 150),\r\n\t\tmargin: 10@10,\r\n\t\tgap: 10@10;\r\n\t);\r\n\r\n\t///////////////////////////////\r\n\t// Envelope Sliders (3)\r\n\t///////////////////////////////\r\n\r\n\t// carrFreq\r\n\tSlider(win, Rect(20, 21, 20, 148))\r\n\t.action_({arg slider;\r\n\t\tvar v = slider.value;\r\n\t\tcarrFreqEnv = Env.new(\r\n\t\t\tlevels: v!numberOfPoints, // straight line\r\n\t\t\ttimes: (0.1!(numberOfPoints-1)).normalizeSum);\r\n\t\tevCarrFreq.setEnv(carrFreqEnv);\r\n\t\tevCarrFreq.action.value(evCarrFreq); // does all the stuff\r\n\t});\r\n\r\n\t// modFreq\r\n\tSlider(win, Rect(360, 21, 20, 148))\r\n\t.action_({arg slider;\r\n\t\tvar v = slider.value;\r\n\t\tmodFreqEnv = Env.new(\r\n\t\t\tlevels: v!numberOfPoints, // straight line\r\n\t\t\ttimes: (0.1!(numberOfPoints-1)).normalizeSum);\r\n\t\tevModFreq.setEnv(modFreqEnv);\r\n\t\tevModFreq.action.value(evModFreq); // does all the stuff\r\n\t});\r\n\r\n\t// modIndex\r\n\t// Slider(win, Rect(20, 210, 20, 148));\r\n\tSlider(win, Rect(20, 210, 20, 148))\r\n\t.action_({arg slider;\r\n\t\tvar v = slider.value;\r\n\t\tmodIndexEnv = Env.new(\r\n\t\t\tlevels: v!numberOfPoints, // straight line\r\n\t\t\ttimes: (0.1!(numberOfPoints-1)).normalizeSum);\r\n\t\tevModIndex.setEnv(modIndexEnv);\r\n\t\tevModIndex.action.value(evModIndex); // does all the stuff\r\n\t});\r\n\r\n\t///////////////////////////////\r\n\t// EnvelopeViews (4)\r\n\t///////////////////////////////\r\n\r\n\tevCarrFreq = EnvelopeView(win, Rect(40, 20, 300, 150))\r\n\t// .thumbWidth_(30.0)\r\n\t// .thumbHeight_(15.0)\r\n\t.setEnv(carrFreqEnv)\r\n\t.drawLines_(true)\r\n\t.selectionColor_(Color.red)\r\n\t.drawRects_(true)\r\n\t.step_(0.01)\r\n\t.keepHorizontalOrder_(true)\r\n\t.action_({arg b;\r\n\t\t// [\"GOT IT\", b.value].postln;\r\n\t\t// evCarrFreq.setString(0, 100.rand.asString);\r\n\t\tcarrFreqEnv.levels = b.value[1];\r\n\t\tcarrFreqEnv.times = b.value[0].differentiate.drop(1);\r\n\t\tscaleEnv.value(carrFreqEnv, 50, 1000);\r\n\t})\r\n\t.thumbSize_(18);\r\n\r\n\tevModFreq = EnvelopeView(win, Rect(380, 20, 300, 150))\r\n\t.setEnv(modFreqEnv)\r\n\t.drawLines_(true)\r\n\t.selectionColor_(Color.red)\r\n\t.drawRects_(true)\r\n\t.step_(0.01)\r\n\t.keepHorizontalOrder_(true)\r\n\t.action_({arg b;\r\n\t\tmodFreqEnv.levels = b.value[1];\r\n\t\tmodFreqEnv.times = b.value[0].differentiate.drop(1);\r\n\t\tscaleEnv.value(modFreqEnv, 50, 1000);\r\n\t})\r\n\t.thumbSize_(18);\r\n\r\n\tevModIndex = EnvelopeView(win, Rect(40, 210, 300, 150))\r\n\t.setEnv(modIndexEnv)\r\n\t.drawLines_(true)\r\n\t.selectionColor_(Color.red)\r\n\t.drawRects_(true)\r\n\t.step_(0.01)\r\n\t.keepHorizontalOrder_(true)\r\n\t.action_({arg b;\r\n\t\tmodIndexEnv.levels = b.value[1];\r\n\t\tmodIndexEnv.times = b.value[0].differentiate.drop(1);\r\n\t\tscaleEnv.value(modIndexEnv, 0, 10);\r\n\t})\r\n\t.thumbSize_(18);\r\n\r\n\tevAmp = EnvelopeView(win, Rect(360, 210, 320, 150))\r\n\t.setEnv(ampEnv)\r\n\t.drawLines_(true)\r\n\t.selectionColor_(Color.red)\r\n\t.drawRects_(true)\r\n\t.step_(0.01)\r\n\t.keepHorizontalOrder_(true)\r\n\t.action_({arg b;\r\n\t\tampEnv.levels = b.value[1];\r\n\t\tampEnv.times = b.value[0].differentiate.drop(1);\r\n\t\tampEnv.duration_(timeScale);\r\n\t})\r\n\t.thumbSize_(18);\r\n\r\n\t/////////////////////////////////////\r\n\t// Volume and Duration EZSliders (2)\r\n\t/////////////////////////////////////\r\n\r\n\tvolumeSlider = EZSlider(\r\n\t\tparent: win,\r\n\t\tbounds: Rect(830, 10, 50, 170),\r\n\t\tlabel: \"volume\",\r\n\t\tcontrolSpec: ControlSpec(-60, 0, \\lin, 1, -40, \"dB\"),\r\n\t\taction: {|ez| masterOut.set(\\amp, ez.value.dbamp)},\r\n\t\tunitWidth: 30,\r\n\t\tlabelWidth: 80,\r\n\t\tlayout: 'vert')\r\n\t.setColors(\r\n\t\tstringColor: labelColor,\r\n\t\t// sliderBackground: Color.grey,\r\n\t\tnumNormalColor: Color.black);\r\n\r\n\tvolumeSlider.numberView.align = \\center;\r\n\tvolumeSlider.unitView.align = \\center;\r\n\r\n\tdurationSlider = EZSlider(\r\n\t\tparent: win,\r\n\t\tbounds: Rect(665, 184, 240, 40),\r\n\t\tlabel: \"dur\",\r\n\t\tcontrolSpec: ControlSpec(1, 13, \\lin, 0.1, timeScale, \"sec\"),\r\n\t\taction: {|ez|\r\n\t\t\ttimeScale = ez.value;\r\n\t\t\tevCarrFreq.action.value(evCarrFreq);\r\n\t\t\tevModFreq.action.value(evModFreq);\r\n\t\t\tevModIndex.action.value(evModIndex);\r\n\t\t\tevAmp.action.value(evAmp)},\r\n\t\tnumberWidth: 35,\r\n\t\tunitWidth: 30,\r\n\t\tlayout: 'horz')\r\n\t.setColors(\r\n\t\tstringColor: labelColor,\r\n\t\t// sliderBackground: Color.grey,\r\n\t\tnumNormalColor: Color.black);\r\n\r\n\tdurationSlider.numberView.align = \\center;\r\n\r\n\t///////////////////////////////\r\n\t// Static Texts (4)\r\n\t///////////////////////////////\r\n\r\n\tStaticText(win, Rect(20, 165, 200, 40))\r\n\t.string_(\"Carrier Frequency\")\r\n\t.font_(font)\r\n\t.stringColor = labelColor;\r\n\r\n\tStaticText(win, Rect(360, 165, 250, 40))\r\n\t.string_(\"Modulator Frequency\")\r\n\t.font_(font)\r\n\t.stringColor = labelColor;\r\n\r\n\tStaticText(win, Rect(20, 355, 250, 40))\r\n\t.string_(\"Modulation Index\")\r\n\t.font_(font)\r\n\t.stringColor = labelColor;\r\n\r\n\tStaticText(win, Rect(360, 355, 250, 40))\r\n\t.string_(\"Amplitude Envelope\")\r\n\t.font_(font)\r\n\t.stringColor = labelColor;\r\n\r\n\t///////////////////////////////\r\n\t// Buttons\r\n\t///////////////////////////////\r\n\r\n\t// Play\r\n\tButton(win, Rect(710, 21, 100, 147))\r\n\t.states_([[\"PLAY\", Color.black]])\r\n\t.action_({\r\n\t\t// All Envs arrive here already scaled (levels and times)!\r\n\t\t// Custom function \"scaleEnv\" is used elsewhere every time\r\n\t\t// a change is made (EnvViews or Sliders).\r\n\t\tSynth.new(\"freq-mod-with-envs\", [\r\n\t\t\t\\carrFreqEnv, carrFreqEnv,\r\n\t\t\t\\modFreqEnv, modFreqEnv,\r\n\t\t\t\\modIndexEnv, modIndexEnv,\r\n\t\t\t\\ampEnv, ampEnv\r\n\t\t]);\r\n\t})\r\n\t.font_(Font(\"Verdana\", 20));\r\n\r\n\t// Presets\r\n\tpresetButtons = Array.fill(12, {arg i;\r\n\t\tButton(subwin, 30@30)\r\n\t\t.states_([[i.asString]])\r\n\t\t.action_({presetArray[i].value; \"Preset % recalled\".postf(i); \"\".postln});\r\n\t});\r\n\r\n\t// Print current settings\r\n\tButton(subwin, 150@20)\r\n\t.states_([[\"print current settings\"]])\r\n\t.action_({\r\n\t\t\"**************************\".postln;\r\n\t\t\"**************************\".postln;\r\n\t\t\"To save the settings below as a Preset,\".postln;\r\n\t\t\"copy all lines and paste them into\".postln;\r\n\t\t\"one of the existing preset functions\".postln;\r\n\t\t\"For instance,\".postln;\r\n\t\t\"\".postln;\r\n\t\t\"presetArray[9] = { <copy settings here> };\".postln;\r\n\t\t\"\".postln;\r\n\t\t\"**************************\".postln;\r\n\t\tprintEnvData.value;\r\n\t\t\"**************************\".postln;\r\n\t});\r\n\r\n\t/*\r\n\r\n\tAfter hitting the \"print current settings\" button, you can copy the entire result from the Post window and overwrite an existing preset with it.\r\n\tSimply paste all the contents into one of the preset functions like\r\n\r\n\tpresetArray[9] = { <copy settings here> };\r\n\r\n\t*/\r\n\r\n\r\n\t//////////////////////////////////////////\r\n\t// General functions to scale envelopes\r\n\t//////////////////////////////////////////\r\n\r\n\t// This simple custom function just scales an Envelope\r\n\t// to desired ranges (levels, times) so that it is\r\n\t// ready to go when a Synth uses them.\r\n\r\n\tscaleEnv = {arg thisEnv, minVal, maxVal;\r\n\r\n\t\tthisEnv.levels = thisEnv.levels.linlin(0, 1, minVal, maxVal);\r\n\t\tthisEnv.duration_(timeScale);\r\n\t\tthisEnv.duration_(timeScale);\r\n\t\t// \"scaling done!\".postln;\r\n\t};\r\n\r\n\t// Ugly\r\n\tadjustEnv = {arg anEnv, inMin = 50, inMax = 1000;\r\n\t\tvar anotherEnv = Env.newClear(numberOfPoints);\r\n\t\tanotherEnv.levels = anEnv.levels.linlin(inMin, inMax, 0, 1);\r\n\t\tanotherEnv.times = anEnv.times;\r\n\t};\r\n\r\n\t// Initialize very first envelopes (at time of first eval)\r\n\tevCarrFreq.action.value(evCarrFreq);\r\n\tevModFreq.action.value(evModFreq);\r\n\tevModIndex.action.value(evModIndex);\r\n\tevAmp.action.value(evAmp);\r\n\r\n\r\n\t////////////////\r\n\t// SynthDefs\r\n\t////////////////\r\n\r\n\t{\r\n\r\n\t\tSynthDef(\"freq-mod-with-envs\", {\r\n\r\n\t\t\tvar carrFreq, carrFreqEnv, carrFreqCtl, modFreq, modFreqEnv, modFreqCtl, modIndex, modIndexEnv, modIndexCtl, carrier, modulator, amp, ampEnv, ampCtl;\r\n\r\n\t\t\t// note: variable 'numberOfPoints' is defined\r\n\t\t\t// at very beginning of the page.\r\n\r\n\t\t\tcarrFreqEnv = Env.newClear(numberOfPoints);\r\n\t\t\tcarrFreqCtl = \\carrFreqEnv.kr(carrFreqEnv.asArray);\r\n\t\t\tcarrFreq = EnvGen.kr(carrFreqCtl);\r\n\r\n\t\t\tmodFreqEnv = Env.newClear(numberOfPoints);\r\n\t\t\tmodFreqCtl = \\modFreqEnv.kr(modFreqEnv.asArray);\r\n\t\t\tmodFreq = EnvGen.kr(modFreqCtl);\r\n\r\n\t\t\tmodIndexEnv = Env.newClear(numberOfPoints);\r\n\t\t\tmodIndexCtl = \\modIndexEnv.kr(modIndexEnv.asArray);\r\n\t\t\tmodIndex = EnvGen.kr(modIndexCtl);\r\n\r\n\t\t\tampEnv = Env.newClear(numberOfPoints);\r\n\t\t\tampCtl = \\ampEnv.kr(ampEnv.asArray);\r\n\t\t\tamp = EnvGen.kr(ampCtl, doneAction: 2);\r\n\r\n\t\t\tmodulator = SinOsc.ar(freq: modFreq, mul: modIndex * modFreq);\r\n\t\t\tcarrier = SinOsc.ar(freq: carrFreq + modulator, mul: amp);\r\n\r\n\t\t\tOut.ar(0, [carrier, carrier]);\r\n\r\n\t\t}).add;\r\n\r\n\r\n\t\tSynthDef(\\amp, {arg inbus=0, amp = 0.1;\r\n\t\t\tReplaceOut.ar(inbus, In.ar(inbus, 2) * amp);\r\n\t\t}).add;\r\n\r\n\t\t// Wait for SynthDefs to be added...\r\n\t\ts.sync;\r\n\r\n\t\t// Now call the Master Out Synth:\r\n\t\tmasterOut = Synth(\"amp\", [\\amp, volumeSlider.value.dbamp], addAction: \\addToTail);\r\n\r\n\t}.fork;\r\n\r\n\r\n\t///////////////////////////\r\n\t//////// 12 PRESETS ///////\r\n\t///////////////////////////\r\n\r\n\tpresetArray[0] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 50, 50, 50, 50, 50, 50, 50, 50 ],[ 0.14, 0.15, 0.14, 0.14, 0.14, 0.15, 0.14 ]);\r\n\t\tmodFreqEnv = Env.new([ 192.5, 192.5, 192.5, 192.5, 192.5, 192.5, 192.5, 192.5 ],[ 0.14, 0.15, 0.14, 0.14, 0.14, 0.15, 0.14 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 6.8, 10, 9.4, 6.5, 4.1, 2.3, 0 ],[ 0.12244897959184, 0.14285714285714, 0.18367346938776, 0.14285714285714, 0.14285714285714, 0.081632653061225, 0.18367346938776 ]);\r\n\t\tampEnv = Env.new([ 0, 1, 1, 0.92, 0.53, 0.27, 0.08, 0 ],[ 0, 0.11, 0.21, 0.16, 0.17, 0.19, 0.16 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1;\r\n\t\tdurationSlider.value = 1;\r\n\t};\r\n\r\n\tpresetArray[1] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 895.5, 895.5, 895.5, 895.5, 895.5, 895.5, 895.5, 895.5 ],[ 0.14, 0.15, 0.14, 0.14, 0.14, 0.15, 0.14 ]);\r\n\t\tmodFreqEnv = Env.new([ 876.5, 876.5, 876.5, 876.5, 876.5, 876.5, 876.5, 876.5 ],[ 0.14, 0.15, 0.14, 0.14, 0.14, 0.15, 0.14 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 5.2, 5.7, 5.9, 5.2, 4.1, 2.3, 0 ],[ 0.12, 0.2, 0.16, 0.17, 0.08, 0.09, 0.18 ]);\r\n\t\tampEnv = Env.new([ 0, 0.51, 0.55, 0.5, 0.53, 0.27, 0.08, 0 ],[ 0.03, 0.14, 0.19, 0.12, 0.17, 0.19, 0.16 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1;\r\n\t\tdurationSlider.value = 1;\r\n\r\n\t};\r\n\r\n\tpresetArray[2] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 962, 962, 962, 962, 962, 962, 962, 962 ],[ 0.644, 0.69, 0.644, 0.644, 0.644, 0.69, 0.644 ]);\r\n\t\tmodFreqEnv = Env.new([ 857.5, 857.5, 857.5, 857.5, 857.5, 857.5, 857.5, 857.5 ],[ 0.644, 0.69, 0.644, 0.644, 0.644, 0.69, 0.644 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 1.6, 4.3, 7.3, 3.5, 4.1, 2.3, 0 ],[ 0.79795918367347, 0.46938775510204, 0.84489795918367, 0.61020408163265, 0.65714285714286, 0.37551020408163, 0.84489795918367 ]);\r\n\t\tampEnv = Env.new([ 0, 0.31, 0.4, 0.3, 0.32, 0.27, 0.14, 0 ],[ 0.23, 0.506, 0.414, 0.92, 0.92, 1.058, 0.552 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 4.6;\r\n\t\tdurationSlider.value = 4.6;\r\n\r\n\t};\r\n\r\n\tpresetArray[3] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 173.5, 154.5, 173.5, 202, 173.5, 173.5, 154.5, 126 ],[ 0.196, 0.21, 0.21, 0.182, 0.196, 0.21, 0.196 ]);\r\n\t\tmodFreqEnv = Env.new([ 420.5, 563, 620, 658, 857.5, 857.5, 819.5, 743.5 ],[ 0.14, 0.308, 0.196, 0.154, 0.196, 0.21, 0.196 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 3.5, 4.9, 4.2, 3.5, 4.8, 2.3, 0 ],[ 0.21428571428571, 0.22857142857143, 0.15714285714286, 0.22857142857143, 0.22857142857143, 0.085714285714286, 0.25714285714286 ]);\r\n\t\tampEnv = Env.new([ 0, 0.31, 1, 0.61, 0.91, 0.36, 0.14, 0 ],[ 0.07, 0.126, 0.098, 0.126, 0.042, 0.77, 0.168 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1.4;\r\n\t\tdurationSlider.value = 1.4;\r\n\r\n\t};\r\n\r\n\tpresetArray[4] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 69, 69, 69, 69, 69, 69, 69, 69 ],[ 0.154, 0.165, 0.154, 0.154, 0.154, 0.165, 0.154 ]);\r\n\t\tmodFreqEnv = Env.new([ 905, 905, 905, 905, 905, 905, 905, 905 ],[ 0.154, 0.165, 0.154, 0.154, 0.154, 0.165, 0.154 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 7.1, 4.9, 6.2, 6.6, 6.6, 4.7, 0 ],[ 0.165, 0.176, 0.154, 0.143, 0.176, 0.088, 0.198 ]);\r\n\t\tampEnv = Env.new([ 0, 0.31, 0.75, 0.61, 0.91, 0.36, 0.14, 0 ],[ 0.055, 0.066, 0.11, 0.099, 0.033, 0.605, 0.132 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1.1;\r\n\t\tdurationSlider.value = 1.1;\r\n\r\n\t};\r\n\r\n\tpresetArray[5] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 50, 50, 50, 50, 50, 50, 50, 50 ],[ 1.022, 1.095, 1.022, 1.022, 1.022, 1.095, 1.022 ]);\r\n\t\tmodFreqEnv = Env.new([ 50, 50, 50, 50, 50, 50, 50, 50 ],[ 1.022, 1.095, 1.022, 1.022, 1.022, 1.095, 1.022 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 7.1, 10, 8.1, 7.1, 5.7, 3.9, 2.5 ],[ 1.095, 2.044, 0.949, 0.73, 0.657, 0.876, 0.949 ]);\r\n\t\tampEnv = Env.new([ 0, 0.31, 0.75, 0.81, 0.91, 0.53, 0.14, 0 ],[ 0.365, 0.438, 0.876, 0.511, 2.482, 1.752, 0.876 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 7.3;\r\n\t\tdurationSlider.value = 7.3;\r\n\r\n\t};\r\n\r\n\tpresetArray[6] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 506, 506, 506, 506, 506, 506, 515.5, 373 ],[ 0.196, 0.21, 0.196, 0.196, 0.196, 0.14, 0.266 ]);\r\n\t\tmodFreqEnv = Env.new([ 221, 221, 221, 221, 221, 221, 221, 221 ],[ 0.196, 0.21, 0.196, 0.196, 0.196, 0.21, 0.196 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 4.7, 2.8, 4.1, 6.2, 5.7, 3.9, 2.5 ],[ 0.224, 0.28, 0.224, 0.168, 0.154, 0.168, 0.182 ]);\r\n\t\tampEnv = Env.new([ 0, 0.31, 0.75, 0.81, 0.91, 0.53, 0.14, 0 ],[ 0.07, 0.084, 0.168, 0.098, 0.476, 0.336, 0.168 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1.4;\r\n\t\tdurationSlider.value = 1.4;\r\n\r\n\t};\r\n\r\n\tpresetArray[7] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 838.5, 838.5, 838.5, 838.5, 838.5, 838.5, 838.5, 857.5 ],[ 1.230303030303, 1.3181818181818, 1.230303030303, 1.230303030303, 1.230303030303, 1.3181818181818, 1.1424242424242 ]);\r\n\t\tmodFreqEnv = Env.new([ 230.5, 230.5, 230.5, 230.5, 211.5, 202, 183, 211.5 ],[ 1.218, 1.305, 1.218, 1.131, 1.131, 1.479, 1.218 ]);\r\n\t\tmodIndexEnv = Env.new([ 8.5, 7.8, 5, 4.1, 7, 2.8, 9, 2.7 ],[ 1.914, 1.479, 1.131, 0.783, 1.392, 0.957, 1.044 ]);\r\n\t\tampEnv = Env.new([ 0, 1, 0.55, 0.29, 0.24, 0.19, 0.09, 0 ],[ 0, 1.044, 1.131, 1.74, 1.653, 1.044, 2.088 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 8.7;\r\n\t\tdurationSlider.value = 8.7;\r\n\r\n\t};\r\n\r\n\tpresetArray[8] = {\r\n\r\n\t\tcarrFreqEnv = Env.new([ 268.5, 268.5, 268.5, 268.5, 268.5, 268.5, 268.5, 268.5 ],[ 0.336, 0.36, 0.336, 0.336, 0.336, 0.36, 0.336 ]);\r\n\t\tmodFreqEnv = Env.new([ 876.5, 838.5, 895.5, 876.5, 876.5, 876.5, 876.5, 876.5 ],[ 0.264, 0.24, 0.528, 0.336, 0.336, 0.36, 0.336 ]);\r\n\t\tmodIndexEnv = Env.new([ 1.1, 2.2, 1.4, 2.8, 1.6, 1.1, 1.9, 0.4 ],[ 0.12, 0.096, 0.072, 0.096, 1.68, 0.144, 0.192 ]);\r\n\t\tampEnv = Env.new([ 1, 0.36, 0.55, 0.34, 0.5, 0.3, 0.14, 0 ],[ 0.072, 0.12, 0.024, 0.144, 1.08, 0.672, 0.288 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 2.4;\r\n\t\tdurationSlider.value = 2.4;\r\n\t};\r\n\r\n\tpresetArray[9] = {\r\n\t\tcarrFreqEnv = Env.new([ 1000, 50, 50, 50, 50, 50, 50, 553.5 ],[ 0.182, 0.195, 0.182, 0.182, 0.182, 0.195, 0.182 ]);\r\n\t\tmodFreqEnv = Env.new([ 1000, 287.5, 50, 50, 50, 50, 50, 50 ],[ 0.065, 0.312, 0.182, 0.182, 0.182, 0.195, 0.182 ]);\r\n\t\tmodIndexEnv = Env.new([ 0, 6.8, 10, 9.4, 6.5, 4.1, 2.3, 0 ],[ 0.156, 0.195, 0.234, 0.182, 0.182, 0.117, 0.234 ]);\r\n\t\tampEnv = Env.new([ 0, 1, 1, 0.92, 0.53, 0.27, 0.08, 0.08 ],[ 0, 0.143, 0.273, 0.208, 0.221, 0.247, 0.208 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 1.3;\r\n\t\tdurationSlider.value = 1.3;\r\n\t};\r\n\r\n\tpresetArray[10] = {\r\n\t\tcarrFreqEnv = Env.new([ 240, 240, 240, 240, 240, 240, 240, 240 ],[ 0.35, 0.375, 0.35, 0.35, 0.35, 0.375, 0.35 ]);\r\n\t\tmodFreqEnv = Env.new([ 563, 563, 563, 563, 563, 563, 563, 563 ],[ 0.35, 0.375, 0.35, 0.35, 0.35, 0.375, 0.35 ]);\r\n\t\tmodIndexEnv = Env.new([ 9.7, 8.9, 8.6, 7.9, 7.3, 7.2, 7.1, 6.3 ],[ 0.050505050505051, 0.65656565656566, 0.47979797979798, 0.45454545454545, 0.4040404040404, 0.25252525252525, 0.2020202020202 ]);\r\n\t\tampEnv = Env.new([ 1, 0.73, 0.49, 0.29, 0.18, 0.1, 0.04, 0 ],[ 0.05, 0.125, 0.35, 0.55, 0.4, 0.425, 0.6 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 2.5;\r\n\t\tdurationSlider.value = 2.5;\r\n\t};\r\n\r\n\tpresetArray[11] = {\r\n\t\tcarrFreqEnv = Env.new([ 116.5, 116.5, 116.5, 116.5, 116.5, 116.5, 116.5, 116.5 ],[ 0.812, 0.87, 0.812, 0.812, 0.812, 0.87, 0.812 ]);\r\n\t\tmodFreqEnv = Env.new([ 325.5, 325.5, 325.5, 325.5, 325.5, 325.5, 325.5, 325.5 ],[ 0.812, 0.87, 0.812, 0.812, 0.812, 0.87, 0.812 ]);\r\n\t\tmodIndexEnv = Env.new([ 3.2, 3.2, 3.2, 3.2, 3.2, 3.2, 3.2, 3.2 ],[ 0.812, 0.87, 0.812, 0.812, 0.812, 0.87, 0.812 ]);\r\n\t\tampEnv = Env.new([ 1, 0.53, 0.23, 0.16, 0.09, 0.06, 0.04, 0 ],[ 0.29, 0.406, 0.58, 1.218, 0.87, 1.044, 1.392 ]);\r\n\t\tevCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\r\n\t\tevModFreq.setEnv(adjustEnv.value(modFreqEnv));\r\n\t\tevModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\r\n\t\tevAmp.setEnv(ampEnv);\r\n\t\ttimeScale = 5.8;\r\n\t\tdurationSlider.value = 5.8;\r\n\t};\r\n\r\n\t/////////////////////////////////////////////\r\n\t// Function: \"Print Current Settings\" ///////\r\n\t/////////////////////////////////////////////\r\n\r\n\tprintEnvData = {\r\n\r\n\t\t(\"carrFreqEnv = Env.new(\" ++ carrFreqEnv.levels ++ \",\" ++ carrFreqEnv.times ++ \");\").postln;\r\n\r\n\t\t(\"modFreqEnv = Env.new(\" ++ modFreqEnv.levels ++ \",\" ++ modFreqEnv.times ++ \");\").postln;\r\n\r\n\t\t(\"modIndexEnv = Env.new(\" ++ modIndexEnv.levels ++ \",\" ++ modIndexEnv.times ++ \");\").postln;\r\n\r\n\t\t(\"ampEnv = Env.new(\" ++ ampEnv.levels ++ \",\" ++ ampEnv.times ++ \");\").postln;\r\n\r\n\t\t\"evCarrFreq.setEnv(adjustEnv.value(carrFreqEnv));\".postln;\r\n\t\t\"evModFreq.setEnv(adjustEnv.value(modFreqEnv));\".postln;\r\n\t\t\"evModIndex.setEnv(adjustEnv.value(modIndexEnv, 0, 10));\".postln;\r\n\t\t\"evAmp.setEnv(ampEnv);\".postln;\r\n\t\t(\"timeScale = \" ++ timeScale ++ \";\").postln;\r\n\t\t(\"durationSlider.value = \" ++ timeScale ++ \";\").postln;\r\n\r\n\t};\r\n\r\n\r\n}); // end of block",
   "is_private" : null,
   "id" : "1-4UC",
   "labels" : [
      "gui",
      "fm",
      "synthesis techniques",
      "frequency modulation",
      "envelopes"
   ]
}
