// griot modeling (jmcc)
{
// maximum delay time
var maxdt = Server.default.sampleRate * 0.03;
// number of delay lines
var n = 5;
// allocate buffers for the delay lines
var buf = Array.fill(n, { LocalBuf.newFrom(Array.fill(maxdt,0)); });
// assign tap times which determine the string pitches
var tapTimes = Array.series(n, 0.003, 0.0005);
// excitation (brownian in place of jmcc melody function...)
var exc_env = Env.new([0,1,0], [0.01, 0.2], -2);
var exc_trig = Impulse.kr(n,0);
var exc_ch = Demand.kr(exc_trig,0,Dbrown(0,n-1,1,inf));
var exc_fr = MouseY.kr(10, 10000);
var exc_sg = LFNoise2.ar(exc_fr, EnvGen.kr(exc_env, exc_trig, 0.1.rand));
var exc = n.collect({arg i; exc_sg * ((exc_ch - i).abs < 1)});
// tap the delay lines
var del = n.collect({arg i; Tap.ar(buf[i], 1, tapTimes[i])});
// filter the taps
var flt = LPF.ar(del, MouseX.kr(10, 10000), 0.98);
// write to delay lines
n.do({arg i; RecordBuf.ar(flt[i] + exc[i],buf[i])});
Mix.ar(flt);
}.play