The following patch shows either a misbehaviour or a misuse of
CurveTable, dunno. Two different functions
(rand_coefs1 and rand_coefs2) are used to assign coefficients to
CurveTable.coefs(). While the first seems to do the job alright, the
latter
doesn't and throws the following error message:
[chuck](via CurveTable): usage:
size, time1, value1, curvature1, [ timeN-1, valueN-1,
curvatureN-1, ] timeN, valueN)
Maybe I'm doing something wrong that | don't see, but can't
understand why this happens. Could anyone explain?
Also, don't understand why the error message tells me the size needs
to be supplied. The examples say that coefs are arrays of the type
[time1, value1, curvature1, ..., timeN-1, valueN-1, curvatureN-1,
timeN, valueN] and Gen's size, if I'm not mistaken, is hard coded as
4096.
Thanks in advance,
eduard
The patch:
fun void rand_coefs1( CurveTable table )
{
[-1, 0, 1 ] @=> int curvature[];
[0., 0., curvature[ Std.rand2(0, 2)],
1, Std.rand2f(.5,1.), curvature[ Std.rand2(0, 2)],
2, Std.rand2f(.5,1.), curvature[ Std.rand2(0, 2)],
3, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
4, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
5, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
6, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
7, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
8, Std.rand2f(0.,1.), curvature[ Std.rand2(0, 2)],
9, 0] @=> float coefs[];
coefs => table.coefs;
<<<"\n", "CURVE 1:\n" >>>;
<<<"\t index", " value", " curvature">>>;
<<<"\t----------------------------------","\t">>>;
for( 0 => int i; i < 8; i++ )
<<<"\t",coefs[i++], coefs[i++], coefs[i]>>>;
<<<"\t", coefs[8], coefs[9] >>>;
<<<"\t----------------------------------","\t">>>;
}
fun void rand_coefs2( CurveTable table, int n_breakpoints )
{
// this function does not assign values stored in coefs
correctly to
// CurveTable.coefs(). Why? It also throws an error message.
[-1, 0, 1 ] @=> int curvature[];
n_breakpoints*3 - 1 => n_breakpoints;
float coefs[ n_breakpoints];
0. => coefs[0];
0. => coefs[1];
for( 2 => int i; i < n_breakpoints; i++ )
{
curvature[ Std.rand2(0, 2)] => coefs[i++];
i/3 => coefs[i++];
Std.rand2f(0.,1.) => coefs[i];
}
0 => coefs[n_breakpoints-1];
coefs => table.coefs;
<<<"\n", "CURVE 2:\n" >>>;
<<<"\t index", " value", " curvature">>>;
<<<"\t----------------------------------","\t">>>;
for( 0 => int i; i < n_breakpoints-2; i++ )
<<<"\t", coefs[i++], coefs[i++], coefs[i]>>>;
<<< "\t", coefs[n_breakpoints-2], coefs[n_breakpoints-1] >>>;
<<<"\t----------------------------------","\t">>>;
}
CurveTable curve1;
CurveTable curve2;
1024 => int size;
<<< "\n*Assigning coefs via rand_coefs1()","\t">>>;
rand_coefs1( curve1 );
0 => float sum;
for( 0 => int i; i < size; i++ )
{
curve1.lookup(i) +=> sum;
}
if( sum > 0 ) <<<"Ok", "sum[i=0,N=1023] =", sum>>>;
else <<< "Error:", "sum[i=0,N=1023] =", sum, ". Coefs were not
assigned. All values are 0." >>>;
<<< "\n*Assigning coefs via rand_coefs2()","\t">>>;
rand_coefs2( curve2, 10 );
0 => sum;
for( 0 => int i; i < size; i++ )
{
curve2.lookup(i) +=> sum;
}
if( sum > 0 ) <<<"Ok", "sum[i=0,N=1023] =", sum>>>;
else <<< "Error:", "sum[i=0,N=1023] =", sum, ". Coefs were not
assigned. All values are 0.\n">>>;