// gen17 chebyshev lookup table // // ported to ChucK from rtcmix by dan trueman // see luke's page: http://www.music.columbia.edu/cmix/makegens.html#06 // // like gen10, this is a series of weightings for successive partials // also http://www.music.columbia.edu/cmc/Rtcmix/docs/scorefile/gen17.html // and http://www.music.columbia.edu/cmc/Rtcmix/docs/scorefile/maketable.html (scroll down) // for nice documentation of this gen // see also: http://math.fullerton.edu/mathews/n2003/ChebyshevPolyMod.html // for info about chebyshev polynomials in general // // the main feature to be aware of is that these functions are primarily // useful for waveshaping, so in this case we drive it with a // SinOsc instead of a Phasor. see, for example: // http://crca.ucsd.edu/~msp/techniques/v0.08/book-html/node74.html // http://en.wikipedia.org/wiki/Distortion_synthesis // the patch SinOsc drive => Gen17 g17 => dac; // load up the coeffs [1., 0.5, 0.25, 0.125, 0.06, 0.03, 0.015] => g17.coefs; // some examples to try // [1., 0.5, 0.3, 0.2] => g17.coefs; // [1., 0.5, 0.25, 0.125, 0.06, 0.03, 0.015] => g17.coefs; // [1., 0.] @=> g17.coefs; // a simple one // make it quiet 0.1 => g17.gain; // set frequency for reading through table drive.freq( 440 ); // sounds better not going to extremes drive.gain( 0.99 ); // create an envelope to scan through the table values // so we can look at them as well as hear them Envelope e => blackhole; e.duration( 10000::ms ); 0. => e.value; e.keyOn(); // loop while (true) { // print <<< e.value(), g17.lookup(e.value()) >>>; // stop when envelope reaches 1 if( e.value() == 1. ) break; // advance time 10::ms => now; }