[chuck-users] function for creating 8 bit waveforms from expressions

Joel Matthys jwmatthys at yahoo.com
Fri Dec 27 19:13:02 EST 2013


On 12/27/2013 05:08 PM, Steve Morris wrote:
>
> It is a mystery to many of us exactly why users are not allowed to 
> know how to do this. Questions to this list are basically ignored 
> except by other users. I suspect that ChucK developers don't read this 
> list and the real point of this list is to hope users will support 
> each other and stop bothering the developers. It is also possible that 
> there are no real developers, that ChucK development consists of an 
> occasional  grad student who shows interest for a while then moves on 
> to more productive endeavors.
>

There is a ChuGen example in the examples/extend folder; it's extremely 
straight-forward. I know the devs read this list, but honestly this is 
exactly the kind of question we as a community should be able to help 
with. Let's light some candles rather than curse the darkness.

Now, ChuGen takes floats in the range [-1,1] for its calculations, but 
you want to work on 8-bit ints, so you'll have to have functions that 
convert itof and ftoi. Then you can write your expression to work on 
those samples directly. A Phasor UGen then provides the 0-1 samples in. 
Try this:

--
// ChuGen
// Create new UGens by performing audio-rate processing in ChucK

class MyFunc extends Chugen
{
     8 => int _b; // default 8 bits

     fun float tick(float in)
     {
         ftoi (in, _b) => int ival; // convert in sample to int
         my_expression(ival) % (1 << _b) => int fval; //calculate and 
mod into range
         return (itof (fval, _b)); // convert back to float
     }

     // your custom expression goes here
     fun int my_expression (int t)
     {
         return t * ( t >> 8 * ( t >>15 | t >> 8) & 20 | ( t >>19) * 5 
 >> t | t >> 3);
     }

     // helper function to convert float [0,1] to b bits
     fun int ftoi (float in, int b)
     {
         return (in * (1 << b)) $ int;
     }

     // helper function to convert b bit integer to float [-1,1]
     fun float itof (int in, int b)
     {
         return (in * 1.0 / (1 << (b-1))) - 1;
     }

     // allow user to set number of bits
     fun void bits (int b)
     {
         b => _b;
     }
}

// phasor powers the function with numbers ascending 0-1
Phasor p => MyFunc f => dac;
1 => p.freq;

while(true) 1::second => now;

/// END ///

Joel


More information about the chuck-users mailing list