[chuck-users] I like alias-noise and 8bit

Kassen signal.automatique at gmail.com
Sun May 18 08:29:54 EDT 2008


2008/5/18 Atte André Jensen <atte.jensen at gmail.com>:

> Hi
>

Hey, Atte!


>
> I'd like to resample a 44100 signal to something like 10K *and* hear the
> alias noise. Also I'd like to resample to lower bitdepth, something like 8
> or 6 bit.
>

Cool, me too. Morning coffee is a bit late today but it's a Sunday and
there's a nice ChucK puzzle to go with it. Oh, and it's nice coffee :¬)


>
> 1) How it that most efficiently done with chuck?
>

Well, quantising in time (sample rate) is without any doubt done most easily
by writing the .last() of some signal to the .next of a Step at the required
period.

Quantising in amplitude (bit depth) means rounding. I think my proposal
below might be quite efficient but I'm not 100% sure there. It does work
fine though and Std has several other rounding schemes you may wish to try
for CPU performance and/or sound quality.

Here you go; This example should be quite clear and suitable for extending
for your own purposes, I think, but if I'm wrong please do shout.
=============================
//replace with more interesting signal.
SinOsc my_signal => blackhole;

Step resampled => dac;

resample();
//remove shred to quit....


fun void resample()
    {
    //8 KHz
    ms / 8 => dur re_samp_rate;

    //set bits here
    8 => int bits;

    //calculate the maximum integer value of the signal's amplitude at this
bitdepth
    Math.pow(2, bits) * .5 => float scale;
    //division is expensive and we only need to do it once
    1/scale => float downscale;

    while(true)
        {
        //digital clipping
        if (my_signal.last() > 1) 1 => resampled.next;
        else if (my_signal.last() < -1) -1 => resampled.next;

        else
            {
            //cast to int for cheep&cheerful rounding
            //then multiply back into the range
            //write result to output
            downscale * ( (my_signal.last() * scale) $ int) =>
resampled.next;

            }

        //samplerate is implicid in controll-rate
        re_samp_rate => now;
        }
    }
===================



>
> 2) I event thought it might be possible for me to implement this as a real
> UGen. My plan would be to start from one of the simple UGens (gain), and
> expand/modify from there, but before even looking into the chuck source, is
> there any documentation about doing this? Should I expect this to be more
> effective in implenenting in chuck-code, and if so about how much? Also.
> supposed I actually succed in making something that works, could it be
> included in future chuck-releases?
>

Me too!

I'd also like the following to work but it seems like I can extend Step but
the result will -for some strange reason- not be a Ugen. I'm not the
greatest OOP wizard but I really feel that if I extend  Ugen the result
should be a Ugen as well. Right now we can extend it but not actually do
anything with the result.

========================
//example code, doesn't actually work

//this is the offending line
LowRezNoise n => dac;

minute => now;


class LowRezNoise extends Step
    {

    ms => dur rate;

    spork ~ fakeTick();

    fun void freq( float input)
        {
        second / input => rate;
        }

    fun void fakeTick()
        {

        while(1)
            {
            Std.rand2f(-1,1) => this.next;

            rate => now;
            }
        }

    }
====================

Hope that helps?

Yours,
Kas.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cs.princeton.edu/pipermail/chuck-users/attachments/20080518/0acc43e0/attachment.html>


More information about the chuck-users mailing list