+declare name "karplus32";
+declare version "1.0";
+declare author "Grame";
+declare license "BSD";
+declare copyright "(c)GRAME 2006";
+
+//-----------------------------------------------
+// karplus-strong
+// with 32 resonators in parallel
+//-----------------------------------------------
+
+import("music.lib");
+
+
+// Excitator
+//--------
+
+upfront(x) = (x-x') > 0.0;
+decay(n,x) = x - (x>0)/n;
+release(n) = + ~ decay(n);
+trigger(n) = upfront : release(n) : >(0.0) : +(leak);
+leak = 1.0/65536.0;
+
+size = hslider("excitation (samples)", 128, 2, 512, 1);
+
+
+
+
+// Resonator
+//-----------------
+
+dur = hslider("duration (samples)", 128, 2, 512, 1);
+att = hslider("attenuation", 0.1, 0, 1, 0.01);
+average(x) = (x+x')/2;
+
+resonator(d, a) = (+ : delay(4096, d-1.5)) ~ (average : *(1.0-a)) ;
+
+
+// Polyphony
+//-----------------
+
+detune = hslider("detune", 32, 0, 512, 1);
+polyphony = hslider("polyphony", 1, 0, 32, 1);
+
+
+
+output = hslider("output volume", 0.5, 0, 1, 0.1);
+
+
+process = vgroup("karplus32",
+ vgroup("noise generator", noise * hslider("level", 0.5, 0, 1, 0.1))
+ : vgroup("excitator", *(button("play"): trigger(size)))
+ <: vgroup("resonator x32", par(i,32, resonator(dur+i*detune, att) * (polyphony > i)))
+ :> *(output),*(output)
+ );