Each parameter has an oscillator (modulator) associated with it. The oscillator generates a repeating waveform (e.g. a sine wave), which is then used to *modulate* (change) the corresponding parameter's value. Oscillator waveforms are *normalized*, such that they always range from −1 to 1. An oscillator has the following properties:

Waveform | The type of waveform the oscillator generates: Triangle, Sine, Ramp Up, Ramp Down, Square, Pulse, or Random. |

Amplitude | The width of the modulation. The oscillator's waveform, which ranges from −1 to 1, is scaled (multiplied) by Amplitude before being added to its parameter. |

Frequency | The rate at which the oscillator's waveform is repeated, in Hertz (cycles per second). The frequency must be greater than zero, otherwise the oscillator has no effect. |

Pulse Width | When the oscillator's waveform is "Pulse", this value sets the pulse wave's duty cycle (ratio of low to high), ranging from 0 to 1. At .5, the result is identical to a square wave. For other waveforms, Pulse Width has no effect. |

In algebraic terms, an oscillator's behavior is:

Result = Parameter + (Waveform × Amplitude).

Note that when the amplitude is zero, the parameter is unchanged.

Since oscillators always swing both positive and negative, in some cases it may be necessary to offset a parameter to achieve the desired effect. For example, to make Ring Sides vary between 3 and 7, you would need to set Ring Sides to 5, and its oscillator's amplitude to 2:

5 + (−1 × 2) = 3

5 + (1 × 2) = 7

While programming oscillators, it may be helpful to view the numbers dialog, because it displays the modulated values of the parameters.