Tricky.
A limiter is a good idea in cases like this, but more as a emergency device. If your feedback loop keeps building a limiter won't prevent the cause, unless we set the limit so low that it'll also prevent the repeated echos that we do want. It will still cause a unpleasant result as long as the total amplification of the look is over 1.
What's odd here (at least to me) is that it still builds, despite the .8 factor in the loop. I have one theory about the cause; with a length of 200::ms the feedback of the delay will have a period of (1 / 200::ms = ) 5Hz (plus one sample for the feedback). The signal used (being 250 Hz) is a exact multiple of that. I think that would mean that the output at peaks would build up to 1 (for the original signal) plus .8 of a peak for the first iteration, plus .8 * .8 for the second, plus .8 ^ 3 for the third, etc. That would be a finite number, but might be above ChucK's headroom.
This, BTW, is also exactly what I experienced with some of the build-in reverbs; as those are based on networks of delay with feedback they'll heavily amplify the signal at some frequencies. That's not much of a issue with natural sounds like voice that fluctuate all the time, but often is with synthetic sounds that stay at the same frequency for a longer time.
Look into whether that's not what you are seeing.
BTW, unrelated to this issue, but rather exciting to me is that you wrote this;
class MyDelay extends Delay
{
1::second => max;
}
...and that worked! It's correct, the language specs imply that it should work, but for ages it didn't and the resultant class couldn't be chucked to a input. Apparently now this works for you, which makes me wonder what version of ChucK is being used here and how long it's been out. Did I miss a memo? That's rather exciting.
Yours,
Kas.