# Substractive Synthesis and Filters

## Lecture Slides

A series of gif images of the lecture slides... (only accesible from within Stanford University)

Basic concepts.

### Filters

Definition
input -> operation -> output; anything is a filter... usually applied to devices that boost or attenuate regions of the spectrum.
Characterization
amplitude versus frequency response curve
• lowpass
• highpass
• bandpass
• bandreject (notch)
• shelving
Cutoff Frequency
half power point (0.707 or -3dB)
Center Frequency
[maximum|minimum] amplitude in a [bandpass|bandreject]
Stopband vs Passband
Bandwidth
Slope
Q and Gain
Comb and Allpass Filters

## Examples

Here is a bunch of very simple instruments that use the stock filters that come with the clm distribution ("/usr/ccrma/lisp/src/clm").

### onepole.ins

A simple One Pole filter (filtering white noise)...

```(definstrument onepole(start-time duration amplitude
&key
(b1 '(0 0.5 1 0.5)))
(multiple-value-bind (beg end) (get-beg-end start-time duration)
(let* ((noise (make-randh :frequency (* 0.49 sampling-rate)
:amplitude amplitude))
(b1-env (make-env :envelope b1))
(opfilt (make-one-pole :a0 1.0 :b1 0.5)))
(Run
(loop for i from beg to end do
(setf (smpflt-b1 opfilt) (env b1-env))
(outa i (one-pole opfilt (randh noise))))))))
```

### onezero.ins

A simple One Zero filter (filtering white noise)...

```(definstrument onezero(start-time duration amplitude
&key
(a1 '(0 0.5 1 0.5)))
(multiple-value-bind (beg end) (get-beg-end start-time duration)
(let* ((noise (make-randh :frequency (* 0.49 sampling-rate)
:amplitude amplitude))
(a1-env (make-env :envelope a1))
(ozfilt (make-one-zero :a0 1.0 :a1 0.5)))
(Run
(loop for i from beg to end do
(setf (smpflt-a1 ozfilt) (env a1-env))
(outa i (one-zero ozfilt (randh noise))))))))
```

### ppolar.ins

A simple Two Pole filter with resonance based on the ppolar clm ug (filtering white noise)...

```(defmacro b1-from-r-freq (r freq) `(- (* 2.0 ,r (cos (in-hz ,freq)))))
(defmacro b2-from-r (r) `(* ,r ,r))

(definstrument twopole(start-time duration amplitude
&key
(freq '(0 20 1 10000))
(r '(0 0.5 1 0.5)))
(multiple-value-bind (beg end) (get-beg-end start-time duration)
(let* ((noise (make-randh :frequency (* 0.49 sampling-rate)
:amplitude amplitude))
(freq-env (make-env :envelope freq))
(r-env (make-env :envelope r))
(ppfilt (make-ppolar :r 0.5 :frequency 440.0)))
(Run
(loop for i from beg to end do
(let* ((freq0 (env freq-env))
(r0 (env r-env)))
(setf (smpflt-b1 ppfilt) (b1-from-r-freq r0 freq0))
(setf (smpflt-b2 ppfilt) (b2-from-r r0))
(outa i (ppolar ppfilt (randh noise)))))))))
```

### formnt.ins

A simple Two Pole / Two Zero formant filter (filtering white noise)...

```(defmacro set-formnt(filter freq r)
`(let* ((freq ,freq)
(r ,r))
(setf (smpflt-a2 (frmnt-tz ,filter)) (- r)
(smpflt-b1 (frmnt-tp ,filter)) (- (* 2.0 r (cos (in-hz freq))))
(smpflt-b2 (frmnt-tp ,filter)) (* r r))))

(definstrument simp-formnt(start-time duration amplitude
&key
(freq '(0 20 1 10000))
(r '(0 0.707 1 0.707)))
(multiple-value-bind (beg end) (get-beg-end start-time duration)
(let* ((noise (make-randh :frequency (* 0.5 sampling-rate) :amplitude amplitude))
(freq-env (make-env :envelope freq
:start-time start-time
:duration duration))
(r-env (make-env :envelope r
:start-time start-time
:duration duration))
(fmfilt (make-formnt :frequency 440 :r 0.99)))
(Run
(loop for i from beg to end do
(set-formnt fmfilt (env freq-env) (env r-env))
(outa i (formnt fmfilt (randh noise))))))))
```
All of these example instrument do some internal contortions to move through envelopes the center frequency, resonance and or assorted internal coefficients. Hope you can figure things out. Believe it or not everything that's being done is documented in the clm manual... :-)

### butterworth.cl

A pair of quite good low pass, high pass, band pass and reject filters from the clm distribution. Just copy the file butterworth.cl. Take a look at the docs. Here's an example instrument (butter.ins), courtesy of Juan.

### moog.ins

Tim Stilson's implementation of a 24db/octave Moog low pass filter, with variable resonance... back to that warm analog sound! Find the source in moog.ins. There's also a simple example instrument (moog-test.clm) that can filter white noise. If you really want to read all the gory details on how the magic works go to Tim Stilson's Home Page and follow the link that points to his papers.

Take a look at a more sophisticated example that is included in the clm distribution, a multiple resonante filter instrument called addflt.ins

### onezero-forever.ins

A real-time version of a simple one zero filter.

### onepole-forever.ins

A real-time version of a simple one pole filter.

### vowels.cl

Juan's real time implementation of a three formant filter, just the right approach to simulate the resonances of a human voice.