next up previous contents index
Next: Additive synthesis: spectral envelope Up: Examples Previous: Transfer functions for amplitude   Contents   Index

Additive synthesis: Risset's bell

The abstraction mechanism of Pd, which we used above to make a reusable ADSR generator, is also useful for making voice banks. Here we will use abstractions to organize banks of oscillators for additive synthesis. There are many possible ways of organizing oscillator banks besides those shown here.

The simplest and most direct organization of the sinusoids is to form partials to add up to a note. The result is monophonic, in the sense that the patch will play only one note at a time, which, however, will consist of several sinusoids whose individual frequencies and amplitudes might depend both on those of the note we're playing, and also on their individual placement in a harmonic (or inharmonic) overtone series.

Example D07.additive.pd (Figure 4.16) uses a bank of 11 copies of an abstraction named partial (Figure 4.17) in an imitation of a well-known bell instrument by Jean-Claude Risset. As described in [DJ85, p. 94], the bell sound has 11 partials, each with its own relative amplitude, frequency, and duration.

Figure 4.16: A Pd realization of Jean-Claude Risset's bell instrument. The bell sound is made by summing 11 sinusoids, each made by a copy of the partial abstraction.

Figure 4.17: The partial abstraction used by Risset's bell instrument from Figure 4.16.

For each note, the partial abstraction computes a simple (quartic) amplitude envelope consisting only of an attack and a decay segment; there is no sustain or release segment. This is multiplied by a sinusoid, and the product is added into a summing bus. Two new object classes are introduced to implement the summing bus:

\fbox{ \texttt{catch\~}}: define and output a summing bus. The creation argument (``sum-bus" in this example) gives the summing bus a name so that throw~ objects below can refer to it. You may have as many summing busses (and hence catch~ objects) as you like but they must all have different names.

\fbox{ \texttt{throw\~}}: add to a summing bus. The creation argument selects which summing bus to use.

The control interface is crude: number boxes control the ``fundamental" frequency of the bell and its duration. Sending a ``bang" message to the s trigger object starts a note. (The note then decays over the period of time controlled by the duration parameter; there is no separate trigger to stop the note). There is no amplitude control except via the output~ object.

The four arguments to each invocation of the partial abstraction specify:

  1. amplitude. The amplitude of the partial at its peak, at the end of the attack and the beginning of the decay of the note.

  2. relative duration. This is multiplied by the overall note duration (controlled in the main patch) to determine the duration of the decay portion of the sinusoid. Individual partials may thus have different decay times, so that some partials die out faster than others, under the main patch's overall control.

  3. relative frequency. As with the relative duration, this controls each partial's frequency as a multiple of the overall frequency controlled in the main patch.

  4. detune. A frequency in Hertz to be added to the product of the global frequency and the relative frequency.

Inside the partial abstraction, the amplitude is simply taken directly from the ``$1" argument (multiplying by 0.1 to adjust for the high individual amplitudes); the duration is calculated from the r duration object, multiplying it by the ``$2" argument. The frequency is computed as $fp+d$ where $f$ is the global frequency (from the r frequency object), $p$ is the relative frequency of the partial, and $d$ is the detune frequency.

next up previous contents index
Next: Additive synthesis: spectral envelope Up: Examples Previous: Transfer functions for amplitude   Contents   Index
Miller Puckette 2006-12-30