## 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.