;;; -*- syntax: common-lisp; base: 10; mode: lisp -*- (defvar jc-reverb-volume 1.0) (defcinstrument jc-reverb (startime dur &key (low-pass nil) (volume jc-reverb-volume) (double nil) (delay1 .013) (delay2 .011) (delay3 .015) (delay4 .017) (amp-env nil)) (let* ((allpass1 (make-all-pass -0.700 0.700 1051)) (allpass2 (make-all-pass -0.700 0.700 337)) (allpass3 (make-all-pass -0.700 0.700 113)) (comb1 (make-comb 0.742 4799)) (comb2 (make-comb 0.733 4999)) (comb3 (make-comb 0.715 5399)) (comb4 (make-comb 0.697 5801)) (chan2 (or (stereo) (quad))) (chan4 (quad)) (outdel1 (make-delay (* delay1 sampling-rate))) (outdel2 (if chan2 (make-delay (* delay2 sampling-rate)))) (outdel3 (if (or double chan4) (make-delay (* delay3 sampling-rate)))) (outdel4 (if (or chan4 (and double chan2)) (make-delay (* delay4 sampling-rate)))) (allpass-sum 0.0) (comb-sum 0.0) (comb-sum-1 0.0) (comb-sum-2 0.0) (all-sums 0.0) (delA 0.0) (delB 0.0) (envA (if amp-env (make-env :envelope amp-env :scaler volume))) (vol volume) (beg (floor (* startime sampling-rate))) (end (+ beg (floor (* dur sampling-rate))))) (if (and double chan4) (warn "jc-reverb is not set up for doubled reverb in quad")) (run (loop for i from beg to end do (let ((ho (revin i))) (setf allpass-sum (all-pass allpass3 (all-pass allpass2 (all-pass allpass1 ho))))) (setf comb-sum-2 comb-sum-1) (setf comb-sum-1 comb-sum) (setf comb-sum (+ (comb comb1 allpass-sum) (comb comb2 allpass-sum) (comb comb3 allpass-sum) (comb comb4 allpass-sum))) (if low-pass (setf all-sums (+ (* .25 (+ comb-sum comb-sum-2)) (* .5 comb-sum-1))) (setf all-sums comb-sum)) ;; "modified least squares low pass filter" (setf delA (delay outdel1 all-sums)) (if double (incf delA (delay outdel3 all-sums))) (if envA (setf vol (env envA))) (outa i (* vol delA)) (when chan2 (setf delB (delay outdel2 all-sums)) (if double (incf delB (delay outdel4 all-sums))) (outb i (* vol delB)) (when chan4 (outc i (* vol (delay outdel3 all-sums))) (outd i (* vol (delay outdel4 all-sums))))))) (end-run))) #| another reverb from 1978 used: srate 12800: all-pass 347 .7 all-pass 113 .7 all-pass 37 .7 comb 1601 .802 comb 1856 .773 comb 2053 .753 comb 2251 .753 |#