1declare name "karplus32"; 2declare version "1.0"; 3declare author "Grame"; 4declare license "BSD"; 5declare copyright "(c)GRAME 2006"; 6 7//----------------------------------------------- 8// karplus-strong 9// with 32 resonators in parallel 10//----------------------------------------------- 11 12import("music.lib"); 13 14 15// Excitator 16//-------- 17 18upfront(x) = (x-x') > 0.0; 19decay(n,x) = x - (x>0)/n; 20release(n) = + ~ decay(n); 21trigger(n) = upfront : release(n) : >(0.0) : +(leak); 22leak = 1.0/65536.0; 23 24size = hslider("excitation (samples)", 128, 2, 512, 1); 25 26 27 28 29// Resonator 30//----------------- 31 32dur = hslider("duration (samples)", 128, 2, 512, 1); 33att = hslider("attenuation", 0.1, 0, 1, 0.01); 34average(x) = (x+x')/2; 35 36resonator(d, a) = (+ : delay(4096, d-1.5)) ~ (average : *(1.0-a)) ; 37 38 39// Polyphony 40//----------------- 41 42detune = hslider("detune", 32, 0, 512, 1); 43polyphony = hslider("polyphony", 1, 0, 32, 1); 44 45 46 47output = hslider("output volume", 0.5, 0, 1, 0.1); 48 49 50process = vgroup("karplus32", 51 vgroup("noise generator", noise * hslider("level", 0.5, 0, 1, 0.1)) 52 : vgroup("excitator", *(button("play"): trigger(size))) 53 <: vgroup("resonator x32", par(i,32, resonator(dur+i*detune, att) * (polyphony > i))) 54 :> *(output),*(output) 55 ); 56