Customize oscillator behavior

The canonical way to get cyclic "oscillator" behavior is, for every sample number (n), take a step of a certain size (increment) at a certain rate of speed (sample rate) wrapping around to stay within a specific range (length) such that you complete a certain number of cycles (frequency). What you get is an index (x) that you can use to look up values in a table, or as input to an equation, to get a result (y). What should the step size (the increment) be? It’s determined by the formula “increment = n * frequency * length/sample rate”.

In this example patch, the counter object produces the sample number (n). This is triggered by the metro object, which is producing the desired number of bangs per second (the sample rate). We arbitrarily may choose a "length" of 1000 because it gives a reasonable degree of precision and makes the math simple.

Set a desired LFO rate (e.g., 0.25 for a cycle every four seconds) and sample rate (e.g. 20 samples per second). The expr object calculates a sine, but you could use any formula. As shown on the right side of the patch, buffer~ and peek~ may be used to create a lookup table of floats for a signal (This example is filled with one cycle of a sine wave on load, then used as a 1000-element lookup table.)