{
   "description" : "When you understand that Ndef can be used to modulate pattern keys, it opens a whole new world",
   "ancestor_list" : [],
   "author" : "grirgz",
   "name" : "Real-time pattern morphing with Ndef",
   "code" : "(\r\n~name = \"saw\";\r\n\r\nSynthDef(~name, { arg out=0, amp=0.1, gate=1, pan=0, spread=0.8, freq=200, doneAction=2, ffreq=300, rq=0.3;\r\n\tvar sig;\r\n\tsig = LFSaw.ar(freq);\r\n\tsig = RLPF.ar(sig, ffreq, rq);\r\n\tsig = sig * EnvGen.ar(\\adsr.kr(Env.adsr(0.01,0.1,0.8,0.1)),gate,doneAction:doneAction);\r\n\tsig = Splay.ar(sig, spread, amp, pan);\r\n\tOut.ar(out, sig);\r\n}).add;\r\n\r\n\r\n~morph = { arg mainkey, lagtime, pat;\r\n\tvar base = pat.asStream.next(());\r\n\tvar bind = List.new;\r\n\tvar proxy;\r\n\tbase.keysValuesDo { arg key, val;\r\n\t\tvar ndefkey = \"%.%\".format(mainkey, key).asSymbol;\r\n\t\tNdef(ndefkey, { \r\n\t\t\tLine.kr(Ndef(ndefkey).kr, val, lagtime)\r\n\t\t});\r\n\t\tproxy = Ndef(ndefkey);\r\n\t\tbind.add(key);\r\n\t\tbind.add(proxy.bus.asMap);\r\n\t};\r\n\tPbind(*bind)\r\n};\r\n)\r\n\r\n\r\nPdef(~name).play;\r\n\r\n\r\n(\r\n// preset 1\r\n\r\n~a = Pdef(~name, ~morph.(\\bla, 2.1, Pbind(\r\n\t\\freq, 100,\r\n\t\\ffreq, 1300,\r\n)) <> Pbind(\r\n\t\\instrument, ~name,\r\n\t\\dur, 1,\r\n));\r\n\r\n);\r\n\r\n(\r\n// preset 2\r\n\r\n~a = Pdef(~name, ~morph.(\\bla, 1, Pbind(\r\n\t\\freq, 1500,\r\n\t\\ffreq, 200,\r\n)) <> Pbind(\r\n\t\\instrument, ~name,\r\n\t\\dur, 1,\r\n));\r\n\r\n);",
   "id" : "1-4UY",
   "is_private" : null,
   "labels" : [
      "pattern",
      "morphing"
   ]
}
