{
   "description" : "A pattern which do morphing between two event pattern (cross-fading synth arguments)",
   "ancestor_list" : [],
   "author" : "grirgz",
   "name" : "pattern morphing",
   "is_private" : null,
   "id" : "1-4QI",
   "code" : "(\r\n// example synthdef\r\nSynthDef(\\lead2, {\targ out=0, freq = 100, pan=0, amp=0.1, mdetune=1.004, gate=1, rq=0.1, fratio = 1, fbase=400, wet=1, fbfreq=100, fbamp=0.8, fbpamp=1, rt=0.4; \r\n\tvar fb, ou, filtenv;\r\n\tou = LFSaw.ar(freq * [1, mdetune]).sum;\r\n\tfiltenv = EnvGen.ar(Env.adsr(0.01,0.25,0.07,0.3), gate, freq * fratio, fbase, doneAction:0);\r\n\tou = RLPF.ar(ou, filtenv, rq);\r\n\tfb = LocalIn.ar(1) + ou;\r\n\tfb = HPF.ar(fb, fbfreq);\r\n\tLocalOut.ar(fb * fbamp);\r\n\tfb = Limiter.ar(fb, amp);\r\n\tfb = SelectX.ar(wet, [ou, fb*fbpamp]);\r\n\tfb = fb * EnvGen.ar(Env.adsr(0.001,0.4,0.9,rt), gate, doneAction:2);\r\n\tfb = Pan2.ar(fb, pan, amp);\r\n\tOut.ar(out, fb);\r\n}).store;\r\n)\r\n\r\n(\r\n// event morphing\r\n~morph = { arg ev_start, ev_end, time, repeat=1;\r\n\tvar ev_res;\r\n\r\n\tif(ev_start.isArray) { ev_start = Event.newFrom(ev_start) };\r\n\tif(ev_end.isArray) { ev_end = Event.newFrom(ev_end) };\r\n\r\n\tev_res = ();\r\n\tev_start.keys.do { arg key;\r\n\t\tev_res[key] = Pseg(Pseq([ev_start[key], ev_end[key]],repeat), time);\r\n\t};\r\n\tPbind(*ev_res.asKeyValuePairs);\r\n};\r\n\r\n// pattern morphing\r\n~morphpat = { arg pat1, pat2, mpat;\r\n\tvar spat1, spat2, smpat;\r\n\tvar ev1, ev2, morph;\r\n\tvar res_ev;\r\n\tvar rout;\r\n\tvar exclu = Set[\\dur, \\instrument];\r\n\tspat1 = pat1.asStream;\r\n\tspat2 = pat2.asStream;\r\n\tsmpat = mpat.asStream;\r\n\trout = Routine {\r\n\t\tblock { arg break;\r\n\t\t\tloop {\r\n\t\t\t\tev1 = spat1.next(Event.default);\r\n\t\t\t\tev2 = spat2.next(Event.default);\r\n\t\t\t\tmorph = smpat.next;\r\n\t\t\t\tif(ev1.isNil or: { ev2.isNil or: { morph.isNil }}) { \r\n\t\t\t\t\tbreak.value;\r\n\t\t\t\t} {\r\n\t\t\t\t\tres_ev = ();\r\n\t\t\t\t\tev1.keys.difference(exclu).do { arg key;\r\n\t\t\t\t\t\tres_ev[key] = (ev1[key] * morph) + (ev2[key] * (1 - morph));\r\n\t\t\t\t\t};\r\n\t\t\t\t\tres_ev.debug(\"res_ev\");\r\n\t\t\t\t\tres_ev.yield;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\trout\r\n};\r\n\r\n)\r\n\r\n// we want to morph from this pattern\r\n(\r\nPdef(\\plop, Pbind(\r\n\t\\instrument, \\lead2,\r\n\t\\degree, Pseq([0,2,4],inf),\r\n\t\\fratio, 9,\r\n\t\\sustain, 0.1,\r\n\t\\wet, 0.8,\r\n\t\\fbfreq, 4100,\r\n\t\\fbpamp, 4,\r\n\t\\rq, 0.2,\r\n\t\\dur, 0.25,\r\n\t\\amp, 0.1\r\n)).play;\r\n);\r\n\r\n// to this pattern\r\n(\r\nPdef(\\plop, Pbind(\r\n\t\\instrument, \\lead2,\r\n\t\\degree, Pseq([0,2,4],inf),\r\n\t\\fratio, 2.4,\r\n\t\\sustain, 0.21,\r\n\t\\wet, 0.1,\r\n\t\\fbfreq, 4180,\r\n\t\\fbpamp, 1,\r\n\t\\rq, 2.01,\r\n\t\\dur, 0.25,\r\n\t\\amp, 0.2\r\n)).play;\r\n);\r\n\r\n\r\n(\r\n// event morphing\r\nPdef(\\plop, Pbind(\r\n\t\\instrument, \\lead2,\r\n\t\\degree, Pseq([0,2,4,Prand([0,2,4,7,9,-5,-3])],inf),\r\n\t\\mtranspose, Pstep(Pseq([0,3,1,4, 0,2,1,3],inf),2),\r\n\t//\\mtranspose, Pstep(Pseq([0,2,1,3],inf),4),\r\n\t\\dur, 0.25,\r\n\t\\sustain, Pkey(\\sustain) * 4,\r\n\t\\amp, 0.1\r\n) <> ~morph.([ // work also with event notation\r\n\t\\fratio, 2.4,\r\n\t\\sustain, 0.21,\r\n\t\\wet, 0.1,\r\n\t\\fbfreq, 180,\r\n\t\\fbpamp, 1,\r\n\t\\rq, 2.01,\r\n], [\r\n\t\\fratio, 9,\r\n\t\\sustain, 0.1,\r\n\t\\wet, 0.8,\r\n\t\\fbfreq, 4800,\r\n\t\\fbpamp, 4,\r\n\t\\rq, 0.2,\r\n], 10,inf)).play; // third argument: duration of the morphing, 4th argument: repeat\r\n)\r\n\r\n\r\n(\r\n// pattern morphing\r\n~pat1 = Pbind(\r\n\t\\fratio, Pseq([10,2.4],inf),\r\n\t\\sustain, 0.21,\r\n\t\\wet, 0.1,\r\n\t\\fbfreq, Pseq([4000,180],inf),\r\n\t\\fbpamp, 1,\r\n\t\\rq, 2.01,\r\n);\r\n\r\n~pat2 = Pbind(\r\n\t\\fratio, 9,\r\n\t\\sustain, 0.1,\r\n\t\\wet, 0.8,\r\n\t\\fbfreq, Pseq([200,4800],inf),\r\n\t\\fbpamp, 4,\r\n\t\\rq, 0.2,\r\n);\r\np = ~morphpat.(~pat1, ~pat2, Pseg(Pseq([0, 1, 0.5],inf),10)); // third argument: 0 = first pattern, 1 = second pattern\r\n(Pbind(\r\n\t\\instrument,\\lead2,\r\n\t\\degree, Pseq([0,2,4,Prand([0,2,4,7,9,-5,-3])],inf),\r\n\t\\mtranspose, Pstep(Pseq([0,3,1,4, 0,2,1,3],inf),2),\r\n\t\\sustain, Pkey(\\sustain) * 4,\r\n\t\\dur, 0.25,\r\n) <> p).trace.play;\r\n)",
   "labels" : [
      "pattern",
      "morphing",
      "event"
   ]
}
