1 2declare name "karplus -- Karplus-Strong string synth"; 3declare author "Yann Orlarey"; 4declare version "1.0"; 5 6import("music.lib"); 7 8// control variables 9 10// master volume and pan 11vol = hslider("vol", -10, -96, 96, 0.1); // dB 12pan = hslider("pan", 0, -1, 1, 0.01); // % 13 14// excitator and resonator parameters 15size = hslider("samples", 512, 1, 1024, 1); // #samples 16dtime = hslider("decay time", 4, 0, 10, 0.01);// -60db decay time 17 18// voice parameters 19freq = nentry("freq", 440, 20, 20000, 1); // Hz 20gain = nentry("gain", 1, 0, 10, 0.01); // % 21gate = button("gate"); // 0/1 22bend = hslider("pitch bend", 0, -2, 2, 0.01);// semitones 23 24/* The excitator: */ 25 26upfront(x) = (x-x') > 0.0; 27decay(n,x) = x - (x>0)/n; 28release(n) = + ~ decay(n); 29trigger(n) = upfront : release(n) : >(0.0) : +(leak); 30leak = 1.0/65536.0; // avoid denormals on Pentium 31excitator = trigger(size); 32 33/* The resonator: */ 34 35average(x) = (x+x')/2; 36att(d,t) = 1-1/pow(db2linear(60), d/(SR*t)); 37comb(d,a) = (+ : fdelay(4096, d-1.5)) ~ (average : *(1.0-a)); 38resonator(d) = comb(d,att(d,dtime)); 39 40/* DC blocker (see http://ccrma.stanford.edu/~jos/filters/DC_Blocker.html): */ 41 42dcblocker(x) = (x-x') : (+ ~ *(0.995)); 43 44/* Karplus-Strong string synthesizer: */ 45 46process = vgroup("1-excitator", noise*gain : *(gate : excitator)) 47 : vgroup("2-resonator", resonator(SR/(freq*pow(2,bend/12)))) 48 : dcblocker 49 : vgroup("3-master", *(db2linear(vol)) : panner((pan+1)/2)); 50