{
   "labels" : [
      "bell",
      "risset",
      "additive synthesis",
      "quneo"
   ],
   "code" : "// ************************************\r\n// Additive Synthesis Demo with QuNEO\r\n// Patch 4 - Risset Bell with Attack/Release controls\r\n// ************************************\r\n\r\n/*\r\n\r\nImplements Risset's Bell with option to change its envelope.\r\nUses QuNEO SCLOrk Preset #1 (but adaptable to any MIDI controller).\r\nEach pad plays a transposition of the bell.\r\nFirst vertical slider controls attack time.\r\nLong Slider controls release time.\r\n\r\nDefault MIDI channel: 12 (11 in SC)\r\nIncoming MIDI notes: 36-99\r\nSlider controlling attack: CC# 6\r\nSlider controlling release: CC# 10\r\n\r\n*/\r\n\r\ns.waitForBoot({\r\n\r\n\tvar padsArray = Array.newClear(64);\r\n\tvar release = 4;\r\n\tvar attack = 0.005;\r\n\tvar curve = -4.5;\r\n\tvar quneoChannel = 11;\r\n\r\n\t// MIDIIn.connectAll;\r\n\r\n\tMIDIdef.freeAll;\r\n\r\n\tMIDIdef.noteOn(\r\n\t\tkey: \\noteOn,\r\n\t\tfunc: {arg vel, note;\r\n\t\t\tvar index = note - 36; // start from 0\r\n\t\t\t\tpadsArray[index] = Synth(\"risset2\", [\r\n\t\t\t\t\\freq, (note+12).midicps,\r\n\t\t\t\t\\amp, vel.linlin(0, 127, 0.01, 0.1),\r\n\t\t\t\t\\att, attack,\r\n\t\t\t\t\\rel, release])},\r\n\t\tnoteNum: (36..99), // only pad notes (16 x 4 banks)\r\n\t\tchan: quneoChannel);\r\n\r\n\t// No need for noteOff responder, as bells are just attack-release\r\n\r\n\t// Attack (first Vertical Slider)\r\n\tMIDIdef.cc(\r\n\t\tkey: \\attack,\r\n\t\tfunc: {arg val, ccnum;\r\n\t\t\tattack = val.linexp(0, 127, 0.005, 4);\r\n\t\t\tcurve = if(attack < 0.01, { -4.5 }, { val.linlin(0, 127, -4, 1) });\r\n\r\n\t\t\t[\r\n\t\t\t\t\"Attack\",attack.round(0.001),\r\n\t\t\t\t\"Release\", release.round(0.01),\r\n\t\t\t\t\"Curve\", curve.round(0.01)\r\n\t\t].postln },\r\n\r\n\t\tccNum: 6, // Long Slider\r\n\t\tchan: quneoChannel);\r\n\r\n\t// Release (Long Slider)\r\n\tMIDIdef.cc(\r\n\t\tkey: \\release,\r\n\t\tfunc: {arg val, ccnum;\r\n\t\t\trelease = val.linlin(0, 127, 0.05, 10);\r\n\t\t\t[\r\n\t\t\t\t\"Attack\",attack.round(0.01),\r\n\t\t\t\t\"Release\", release.round(0.01)\r\n\t\t].postln  },\r\n\t\tccNum: 10, // Long Slider\r\n\t\tchan: quneoChannel);\r\n\r\n\r\n\r\n\tSynthDef(\\risset2, {|out = 0, pan = 0, freq = 400, amp = 0.1, att = 0.005, rel = 2, gate = 1|\r\n\t\tvar amps = #[1, 0.67, 1, 1.8, 2.67, 1.67, 1.46, 1.33, 1.33, 1, 1.33];\r\n\t\tvar durs = #[1, 0.9, 0.65, 0.55, 0.325, 0.35, 0.25, 0.2, 0.15, 0.1, 0.075];\r\n\t\tvar frqs = #[0.56, 0.56, 0.92, 0.92, 1.19, 1.7, 2, 2.74, 3, 3.76, 4.07];\r\n\t\tvar dets = #[0, 1, 0, 1.7, 0, 0, 0, 0, 0, 0, 0];\r\n\t\tvar doneActionEnv = EnvGen.ar(Env.linen(0, att+rel, 0), gate, doneAction: 2);\r\n\t\tvar src = Mix.fill(11, {|i|\r\n\t\t\tvar env = EnvGen.ar(Env.perc(att, rel * durs[i], amps[i], att.explin(0.005, 4, -4.5, 0)), gate);\r\n\t\t\tSinOsc.ar(freq*frqs[i] + dets[i], 0, amp*env);\r\n\t\t});\r\n\t\tsrc = src * doneActionEnv * 0.5; // make sure it releases node after the end.\r\n\t\tOut.ar(out, Pan2.ar(src, pan));\r\n\t}).add;\r\n\r\n\tFreqScope.new\r\n});",
   "id" : "1-4W8",
   "is_private" : null,
   "author" : "Bruno Ruviaro",
   "name" : "Additive Synthesis Demo with QuNeo - Patch 4 (Risset Bell)",
   "description" : "QuNeo controller playing Risset Bells (additive synthesis demo). This one adds controls for Attack and Release times.",
   "ancestor_list" : []
}
