Perry Cook's FMVoices Physical Model

The fmVoices suite (fmvoicesActor, fmvoicesHand, fmvoicesAlg) uses Perry Cook's STK synthesis toolkit.

It is a "singing-voice subclass of Algorithm 6 (TX81Z) subclass of 4-Operator FM Synth", according to Perry. Three carriers and a common modulator. You can control the vowel color, spectral tilt, LFO speed, and LFO amount. It sounds like Kraftwerk robot-voice "Au-to-bahn" and "Stop der Ra-di-o-ak-ti-vi-teit".

To use the fmVoices implementation, load perry.so and create an actor of type FMVoicesActor.

FMVoicesActor messages

In addition to the messages understood by all generator actors, the FMVoicesActor understands the following messages:
SetReverb hActor x
Turn on reverb for new instances created by this actor to x. (1 = ON, 0 = OFF)
SetAllReverb hActor x
Turn on reverb of all children to x, and set the default reverb flag for all future children. (1 = ON, 0 = OFF)
SetLoudness hActor x
Set the loudness for new instances created by this actor to x.
SetAllLoudness hActor x time
Set the loudness of all children to x, and set the default loudness for all future children. If time is specified, children will modulate to the new loudness over the specified duration. Default loudness is always set immediately regardless of time.
SetFreq hActor x
Set the frequency (in Hertz) for new instances created by this actor to x.
SetAllFreq hActor x time
Set the frequency (in Hertz) of all children to x, and set the default frequency (in Hertz) for all future children. If time is specified, children will modulate to the new frequency over the specified duration. Default frequency is always set immediately regardless of time.
SetVibGain hActor x
Set the vibrato gain for new instances created by this actor to x.
SetAllVibGain hActor x time
Set the vibrato gain of all children to x, and set the default vibrato gain for all future children. If time is specified, children will modulate to the new vibrato gain over the specified duration. Default vibrato gain is always set immediately regardless of time.
SetFormantQ hActor x
Set the formant Q for new instances created by this actor to x.
SetAllFormantQ hActor x time
Set the formant Q of all children to x, and set the default formant Q for all future children. If time is specified, children will modulate to the new formant Q over the specified duration. Default formant Q is always set immediately regardless of time.
SetVowel hActor x
Set the vowel for new instances created by this actor to x.
SetAllVowel hActor x time
Set the vowel of all children to x, and set the default vowel for all future children. If time is specified, children will modulate to the new vowel over the specified duration. Default vowel is always set immediately regardless of time.
SetVibFreq hActor x
Set the vibrato frequency for new instances created by this actor to x.
SetAllVibFreq hActor x time
Set the vibrato frequency of all children to x, and set the default vibrato frequency for all future children. If time is specified, children will modulate to the new vibrato frequency over the specified duration. Default vibrato frequency is always set immediately regardless of time.

fmvoices handler messages

In addition to the messages understood by all handlers, the handler for the fmvoices algorithm understands the following messages:
SetReverb hSound x
Toggle reverb (1 = on, 0 = off).
SetLoudness hSound x time
Set the loudness to x (0 to 127). This is simply an extra amplitude control, pre-reverb, in series with SetAmp. If time is specified, modulate to the new loudness over the specified duration.
SetFreq hSound x time
Set the frequency to x. 50 to 1000 gives good results. If time is specified, modulate to the new frequency over the specified duration.
SetVibGain hSound x time
Set the amount of vibrato to x (0 to 127). If time is specified, modulate to the new vibrato gain over the specified duration.
SetFormantQ hSound x time
Set the formant Q to x (0 to 127). 100 to 127 is best, otherwise peculiar discontinuities are audible when you smoothly change the frequency. If time is specified, modulate to the new formant Q over the specified duration.
SetVowel hSound x time
Set the vowel to x (0 to 127). I have no idea what the mapping from 0..127 to vowel color is. If time is specified, modulate to the new vowel over the specified duration.
SetVibFreq hSound x time
Set the vibrato frequency to x (0 to 127). Around 30 is nice. If time is specified, modulate to the new vibrato frequency over the specified duration.