[chuck-users] ChucK says "Chuck"

Perry R Cook prc at CS.Princeton.EDU
Sun Dec 16 14:06:12 EST 2007


In response to a couple of threads a while ago,
I present a short program that makes ChucK say
"Chuck."  I'm working on a complete Klatt-like
speech synthesizer that will take ARPABET as
input and render speech in ChucK in real time.
Don't hold your breath, but I'll try to post
something that does more than just say "chucK"
sometime over the holidays.

Best,

PRC
-------------- next part --------------
// Fairly silly program to synthesize the
// word "chuck" in ChucK.  Perry Cook, Nov. 2007

TwoPole r[3];	// Resonators
Noise n=> Envelope ne=>r[0]=> TwoZero z=>dac;
n=>r[1]=>z;n=>r[2]=>z; 
Impulse i=> Envelope ie=> OnePole o=>r[0]; o=>r[1]; o=>r[2];
0.99=>o.pole;10.0=>o.gain;1.0=>z.b0;0.0=>z.b1;-1.0=>z.b2;

4.0 => dac.gain;

doCh();
1 => int notDone;
doUhh();
doKay();

fun void doUhh()  {
    0.1=>ie.time;
    0.0 => n.gain;
    600.0 => r[0].freq; 0.995 => r[0].radius; 1.0 => r[0].gain;
    1500.0 => r[1].freq; 0.995 => r[1].radius; 0.5 => r[1].gain;
    3900.0 => r[2].freq; 0.99 => r[2].radius; 0.2 => r[2].gain;
    spork ~ doimpulse();
    0.4 => i.gain;
    1.0 => i.gain;
    1 => ie.keyOn;
    0.1 :: second => now;
    1 => ie.keyOff;
    0.1 :: second => now;
    0 => notDone;
}

fun void doCh()  {
    <<< "Ch" >>>;
    0.03=>ne.time;
    1900.0 => r[0].freq; 0.99 => r[0].radius; 1.0 => r[0].gain;
    2700.0 => r[1].freq; 0.99 => r[1].radius; 0.7 => r[1].gain;
    3200.0 => r[2].freq; 0.99 => r[2].radius; 0.8 => r[2].gain;
    0.0 => i.gain;
    0.02 => n.gain;
    1=>ne.keyOn;0.03 :: second => now;
    1=>ne.keyOff;0.03 :: second => now;
}

fun void doKay()  {
    <<< "KKK" >>>;
    0.0 => i.gain;
    0.05 :: second => now;
    0.005=>ne.time;
    0.007 => n.gain;
    380.0 => r[0].freq; 0.99 => r[0].radius; 0.7 => r[0].gain;
    1700.0 => r[1].freq; 0.99 => r[1].radius; 1.0 => r[1].gain;
    4500.0 => r[2].freq; 0.99 => r[2].radius; 0.7 => r[2].gain;
    1 => ne.keyOn; 0.005 :: second => now;
    1 => ne.keyOff;0.01=>ne.time; 0.01 :: second => now;
}

fun void doimpulse()  {
    150.0 => float freq;
    <<< "uhh" >>>;
    while (notDone)  {
        1.0 => i.next;
        (1.0 / freq) :: second => now;    
        freq * 0.98 => freq;
    }
}


More information about the chuck-users mailing list