// TODO: connect MIDI CC knobs to an array of defined pos, also connect amp, possibly rate though probably not ( b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav"); ( SynthDef(\cantorial_tremolo, { |out, pan = 0, dur = 0.1, atk=0.3, dec=0.4, sus=0.1, rel=0, amp=1, crf=1100| var sig, rate, env, filter; env = EnvGen.ar( Env.new( [0, 1, 1, 0], [atk, dec, sus, rel], ), gate: 1, doneAction: 2 ); sig = GrainBuf.ar( numChannels: 2, trigger: Impulse.kr(10), dur: dur, sndbuf: b, rate: 1, pos: 0.1, interp: 2, pan: pan, envbufnum: -1, maxGrains: 512 ); sig = sig * env * amp; filter = MoogVCF.ar(sig, crf, 0.3); Out.ar(out, filter); }).play; ) ) ( // Becoming satisfactory granular synth b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Cantor_Samuel_Malavsky_Zechor.wav"); ( SynthDef(\cantorial_trill, { |out, pan = 0, dur = 0.5, atk=0.3, dec=0.4, sus=0.1, rel=0, amp=1, crf=1000, grainRate=5| var sig, rate, env, filt; env = EnvGen.ar( Env.new( [0, 1, 1, 0], [atk, dec, sus, rel], ), gate: 1, doneAction: 2 ); rate = (note.midicps / 60.midicps); sig = GrainBuf.ar( numChannels: 2, trigger: Impulse.kr(grainRate), dur: dur, sndbuf: b, rate: rate, pos: 0.01, interp: 2, pan: pan, envbufnum: -1, maxGrains: 512 ); sig = sig * env * amp; sig = LPF.ar(sig, crf); Out.ar(out, sig); }).play; ) ) ( // IMPORTANT! b = Buffer.read(s, "/home/lcoogan/snd/live/2025-04-26.Basic_City_Brewery/granular/Cantorial/Acheinu_Kol_Beit_Israel.wav"); ( SynthDef(\cantorial_reed , { arg amp = 0.3, pan = 0; var sig; sig = GrainBuf.ar( numChannels: 2, trigger: Dust.ar(40), dur: 0.8, sndbuf: b, rate: 1, pos: 1.25, // 1.25, 1.20 interp: 2, pan: pan, envbufnum: -1, maxGrains: 512 ); sig = sig * amp; Out.ar(0, sig); }).play; ) )