Ah, the digital world - never enough bits! My first reaction was to think
that this extra sample was a floating point truncation error in the
s.phase() and s.period() math, but then I came to think hmm... would those
minuscule fractions of samples make any difference to a zero crossing
timing? Furthermore, why would a truncation error be weighted? Your
declaration that "the value is on -average- lower in magnitude" started me
thinking 'okay, how average?' So I wrote up a little script:
TriOsc s => dac;
float one;
float two;
float three;
int count;
int count2;
int count3;
int signcount;
int signcount2;
for (int j;j<10000; j++)
{
Std.rand2f(10, 10000)=>s.freq;
10::ms=>now; // arbitrary offset of time
(1-s.phase())::s.period() => now; // a la Kassen
s.last()=>one;
samp=>now;
s.last()=>two;
samp=>now;
s.last()=>three;
if (Std.fabs(one) < Std.fabs(two) && Std.fabs(one) <
Std.fabs(three)) count++;
if (Std.fabs(one) > Std.fabs(two) && Std.fabs(three) >
Std.fabs(two)) count2++;
if (Std.fabs(two) > Std.fabs(three) && Std.fabs(one) >
Std.fabs(three)) count3++;
if ((one <0 && two > 0) || (one >0 && two <0)) signcount++;
if ((two <0 && three > 0) || (two >0 && three <0)) signcount2++;
}
<<
Dear list.
Suppose we have a SinOsc named "s", connected to the dac, that has been playing for some arbitrary amount of time at a arbitrary frequency. Suppose we'd like to disconnect this from the dac while minimising the "click".
One thing to try would be this;
(1 - s.phase() )::s.period() => now; //strong timing to the rescue! s =< dac;
Quite ChucKian, I thought, however this still clicks a bit. Some clickery is to be expected as not all frequencies will have a period that can be expressed in a integer number of samp's but this seemed like a bit much.
On a whim I tried;
(1 - s.phase() )::s.period() + samp => now; s =< dac;
This clicks less and when I print the s.last(), the value is on -average- lower in magnitude. I then tried lining up the shred's timing with the UGen graph's;
samp - (now % samp) => now; //yes; that's quite anal (1 - s.phase() )::s.period() => now; s =< dac;
This doesn't affect matters quite as much as simply adding a samp to the time advanced; waiting a extra sample generally seems (to me) to decrease the magnitude of the s.last() right before we disconnect it.
This would lead us to ask; "where does this samp come from?". I'm a bit at loss here, does anybody have any insights?
Yours, Kas.
_______________________________________________ chuck-users mailing list chuck-users@lists.cs.princeton.edu https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
-- _______________________________________ http://greyrockstudio.blogspot.com