On Fri, Sep 30, 2011 at 5:43 PM, Tomtom
I've just tried to reproduce something I've done some time ago with guitar pedals : a feedback loop.
input -> mixer -> delay -[wet]-> various effects -> back to the mixer `--> dekay -[dry]-> output
by controling the amount of feedback on the mixer and the parameters of the effects in the loop you can create funny things.
Now, for the ChucK part (not exactly the same, but quite similar) :
----
class MyDelay extends Delay { 1::second => max; }
// feedback loop MyDelay d => JCRev r => Gain g => d; d => dac;
fun void note() { SawOsc osc => Envelope e => d; 250 => osc.freq; 1 => e.value; e.keyOff(); 200::ms => e.duration => now; }
0.8 => g.gain; 0.2 => r.mix; 200::ms => d.delay;
note(); 10::second => now;
----
with these parameters I get a positive feedback: sound is getting louder and louder, clipping and then silence. Using d.last(), I see the samples computed get outside the range [-1;+1] (thus the clipping) and then divert from 0 exponentially.
To avoid this, I would like to truncate the sample values so they stay in the interval [-1;+1] :
if s > 1 then s = 1, if s < -1 s = -1
I tried to use Dyno as a limiter, but it seems to do something more clever than that.
That's all folks !
The lazy hacker in me would do it manually: SinOsc s => Gain clipper => blackhole; 100 => s.gain; fun void clippy() { Step steppy => dac; while(samp => now) { if(clipper.last() > 1) 1 => steppy.next; else if(clipper.last() < -1) -1 => steppy.next; else clipper.last() => steppy.next; } } spork ~ clippy(); day => now; But I felt guilty about hitting send after typing only that, so I looked at the docs for Dyno and I'm pretty sure this does the same thing: SinOsc s => Dyno d => dac; 100 => s.gain; 0 => d.slopeAbove; 1 => d.slopeBelow; 1 => d.thresh; 0::ms => d.attackTime; 0::ms => d.releaseTime; day => now; -- Tom Lieber http://AllTom.com/ http://infinite-sketchpad.com/