// Listing 7.16 Building a simple formant (resonant filter) voice model
// Simple singing voice model
// by Enrico C., August 1921
SawOsc folds => ResonZ formant1 => dac; // (1) Sawtooth models vocal folds through formant filter
folds => ResonZ formant2 => dac; // (2) 2nd formant (vocal tract resonance)
folds => ResonZ formant3 => dac; // (3) 3rd formant
// hook up a modulation (vibrato) oscillator
SinOsc vibrato => folds; // (4) Adds vibrato to voice source
6.0 => vibrato.freq;
1.5 => vibrato.gain;
2 => folds.sync;
// Set up filter resonance amounts
20 => formant1.Q => formant2.Q => formant3.Q; // (5) Sets resonance of all three formant filters
// Sing forever, randomly
while (1) { // (6) Sings a random "song" forever
// (7) Random "vowel" (formant frequencies)
Math.random2f(200,750) => formant1.freq;
Math.random2f(900,2300) => formant2.freq;
Math.random2f(2400,3600) => formant3.freq;
if (Math.random2(0,3) == 0)
{ // (8) Random voice pitch
Math.random2f(60.0,200.0) => folds.freq;
}
Math.random2f(0.2,0.5) :: second => now;
}