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:

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

: 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 where is the global frequency (from the `r frequency` object), is the relative frequency of the partial, and is the detune frequency.

Next: Additive synthesis: spectral envelope Up: Examples Previous: Transfer functions for amplitude Contents Index