Digital Sound & Music: Concepts, Applications, & Science, Chapter 6, last updated 6/25/2013
Figure 6.61 Oscillator block frequency control inputs
These control inputs are attached to several arithmetic objects, including addition and
multiplication. The “~” following the mathematical operator simply means this version of the
object is used for processing signal rate (audio) values. This is the sole purpose of the sig~
object also seen here; it takes the static numerical value of the frequency (shown at 440 Hz) and
outputs it as a signal rate value, meaning it is constantly streaming its output. In the case of these
two control inputs, we set one of them up as an additive control, and the other a multiplicative
control. The inlet on the left is the additive control. It adds to the oscillator frequency an
amount equal to some portion of the current oscillator frequency value. For example, if for the
frequency value shown it receives a control value of 1, it adds 440 Hz to the oscillator frequency.
If it receives a control value of 0.5, it adds 220 Hz to the oscillator frequency. If it receives a
control value of 0, it adds nothing to the oscillator frequency, resulting in no change.
At this point we should take a step back and ask ourselves, “What kind of control values
should we be expecting?” There is really no one answer to this, but as the designers of these
synth blocks we should perhaps establish a convention that is meaningful across all of our
different synthesizer elements. For our purposes, a floating-point range between 0.0 and 1.0
seems simple and manageable. Of course, we can’t stop someone from connecting a control
value outside of this range to our block if they really wanted. That’s just what makes modular
synthesis so fun.
Going back to the second control input (multiplicative), you can see that it scales the
output of the oscillator directly by this control value. If it receives a control value of 0, the
oscillator’s frequency is 0 and it outputs silence. If it receives a control value of 1, the signal is
multiplied by 1, resulting in no change. Notice that the multiplication object has been set to a
default value of 1 so that the initial oscillator without any control input behaves normally. The
addition object has been initialized for that behavior as well. It is also very important to include
the “.” with these initial values, as that tells the object to expect a floating-point value rather than
an integer (default). Without the decimal, the object may round or truncate the floating-point
value to the nearest integer, resulting in our case to a control value of either 0 or 1, which would
be rather limiting.
Let’s now take a look at what goes into an amplification block. The amplification block
is simply used to control the amplitude, or level, of the synthesized audio. Figure 6.50 shows
you our amplifier block file in programming mode. There isn’t much need to strip down the
non-essentials from this block, as there’s just not much to it.