Gardner Reverb

The Schroeder reverb designs have been further developed in many variations, notably by James Moorer in the late seventies. One well known and fairly recent (1998) set of algorithms is known as the Gardner reverb., after its author Bill Gardner. This set consists of a different combination of allpass filters for each room size, in general nesting more filters for larger rooms. One example of this algorithm is the Gardner medium room:

Gardner medium room

One notable issue about this design is that the creation of a stereo room response is made simply by inverting the signal. This has also been done in earlier reverb designs, e.g.in the Schroeder SATREV as implemented by John Chowning in 1971. As an alternative, a short delay may be added to one of the output channels as a means of decorrelating the two.
The following sound examples shows the Gardner medium room. As this is a full reverb design, we have used a 50/50 dry/wet mix rather than just listening to the solo reverb signal.


Input sound 1: Short burst of white noise

Input sound 2: A short guitar phrase

Noise burst with Gardner medium room (50/50)

Guitar with Gardner medium room (50/50)

Csound code

The following is a Csound implementation of the Gardner medium room reverb. Original implementation by Hans Mikelson, as found on csounds.com

;***************************************************
; Medium Room Reverb 
; Implemented in Csound by Hans Mikelson
;***************************************************
	instr 99

iamp   =        1

adel71 init     0
adel11 init     0
adel12 init     0
adel13 init     0
adel31 init     0
adel61 init     0
adel62 init     0

; Initialize
asig0  in			 	; audio in 
aflt01 butterlp asig0, 6000              ; Pre-Filter
aflt02 butterbp .4*adel71, 1000, 500     ; Feed-Back Filter
asum01  =       aflt01+.5*aflt02         ; Initial Mix

; Double Nested All-Pass
asum11  =       adel12-.35*adel11        ; First  Inner Feedforward
asum12  =       adel13-.45*asum11        ; Second Inner Feedforward
aout11  =       asum12-.25*asum01        ; Outer Feedforward
adel11  delay   asum01+.25*aout11, .0047 ; Outer Feedback
adel12  delay   adel11+.35*asum11, .0083 ; First  Inner Feedback
adel13  delay   asum11+.45*asum12, .022  ; Second Inner Feedback

adel21  delay   aout11, .005             ; Delay 1

; All-Pass 1
asub31  =       adel31-.45*adel21        ; Feedforward
adel31  delay   adel21+.45*asub31,.030   ; Feedback

adel41  delay   asub31, .067             ; Delay 2
adel51  delay   .4*adel41, .015          ; Delay 3
aout51  =       aflt01+adel41

; Single Nested All-Pass
asum61  =       adel62-.35*adel61        ; Inner Feedforward
aout61  =       asum61-.25*aout51        ; Outer Feedforward
adel61  delay   aout51+.25*aout61, .0292 ; Outer Feedback
adel62  delay   adel61+.35*asum61, .0098 ; Inner Feedback

aout    =       .5*aout11+.5*adel41+.5*aout61 ; Combine Outputs

adel71  delay   aout61, .108                  ; Delay 4

aout	dcblock	(aout*0.8)+(asig0*0.8)

        outs    aout, -aout   ; Final Output

	endin
;***************************************************