summaryrefslogtreecommitdiff
path: root/leslie.cms
diff options
context:
space:
mode:
Diffstat (limited to 'leslie.cms')
-rw-r--r--leslie.cms173
1 files changed, 79 insertions, 94 deletions
diff --git a/leslie.cms b/leslie.cms
index c6d721b..e2b64b8 100644
--- a/leslie.cms
+++ b/leslie.cms
@@ -19,92 +19,49 @@
;;
;; juanig@ccrma
;;
-;; First version March 20, 2004
-;; Last update September 12, 2014
;;
;; NOTES:
;; Get Leslie effect on a pulse-train waveshape. Try acceleration with the vel-envelope.
;; It can also be used to apply a Leslie effect to a soundfile. Just switch to the
;; 'make-readin', readin ug.
;;
+;; First version: Sat 20 Mar 2004 11:22:47 AM PST
+;; Last update: Wed 13 Nov 2019 04:13:30 PM PST
+;;
+;; HISTORY:
;; 06/20/2014 fixed delays and delay lines length
;; 09/10/2014 added reflection delay lines
-;; 09/12/2014 added lowport baffle section using a lowpass butterworth
+;; 09/12/2014 added lowport baffle section
;; 09/18/2014 S7 .cms version
+;; 11/13/2019 Fixed delay line lengths and added a two-pole for the baffle part.
+;; Removed butterworth in exchange for a two-pole frequency shifting.
+;;
;;
-;;
+;;
(define sspeed 345.12) ;; Velocity of sound
(define twopi (* 2 pi))
(define oneturn (* pi 2))
-
-
-;; We need a Lowpass filter for the lower part, low frequency (baffle)
-;; of the Leslie cabinet
-
-
-;; A butterworth Lowpass filter (as in dsp.scm).
-
-(define (make-butter-low-pass fq)
- (let* ((r (/ 1.0 (tan (/ (* pi fq) *clm-srate*))))
- (r2 (* r r))
- (c1 (/ 1.0 (+ 1.0 (* r (sqrt 2.0)) r2)))
- (c2 (* 2.0 c1))
- (c3 c1)
- (c4 (* 2.0 (- 1.0 r2) c1))
- (c5 (* (+ (- 1.0 (* r (sqrt 2.0))) r2) c1))
- (arra (make-float-vector 3 ))
- (arrb (make-float-vector 3 )))
- (set! (arra 0) c1)
- (set! (arra 1) c2)
- (set! (arra 2) c3)
- (set! (arrb 0) 0.0)
- (set! (arrb 1) c4)
- (set! (arrb 2) c5)
- (make-filter 3 arra arrb) ))
-
-
-;;; Macros to handle Lowpass filter
;;
-
-(define (butter f sample0)
- (filter f sample0))
-
-
-;; macro to sweep frequencies
+;;;
;;
-
-(define (sweep-butterfq b freq)
- `(let* ((fq ,freq)
- (r (/ 1.0 (tan (/ (* pi fq) *srate*))))
- (r2 (* r r))
- (c1 (/ 1.0 (+ 1.0 (* r (sqrt 2.0)) r2))))
- (set! (mus-xcoeff ,b 0) c1)
- (set! (mus-xcoeff ,b 1) (* 2.0 c1))
- (set! (mus-xcoeff ,b 2) c1)
- (set! (mus-ycoeff ,b 1) (* 2.0 (- 1.0 r2) c1))
- (set! (mus-ycoeff ,b 2) (* (+ (- 1.0 (* r (sqrt 2.0))) r2) c1))
- ))
-
-
-
-(definstrument (rotates start dur freq
+(definstrument (rotates start dur freq
(speedsl 3.33) ;; Speed source listener mts/sec
(velenv '(0 1 100 1)) ;; Velocity envelope
- (gain 0.125) ;; scales output
- ;; (onset 0.0) ;; onset values in case of reading a soundfile
+ (gain 0.35) ;; scales output
+ ;; (onset 0.0) ;; onset duration (secs) in case of reading a soundfile
(rev-amount 0.025)) ;; very short reverb
(let* ((beg (seconds->samples start))
(sig (make-pulse-train :frequency freq))
- ;;; (rdA (make-readin :file file ;; just in case you want to read
- ;;; :start (seconds->samples onset)) ;; a soundfile instead
+ ;; (rdA (make-readin :file infile ;; just in case you want to read
+ ;; :start (seconds->samples onset))) ;; a soundfile instead
;;;
- (maxddelayl (if (= *clm-srate* 44100) (values 96)
- (values 104)))
- (startddelay (if (= *clm-srate* 44100) (values 48)
- (values 52)))
+ (maxddelayl (if (= *clm-srate* 44100) (values 160)
+ (values 192)))
+ (startddelay (if (= *clm-srate* 44100) (values 48)
+ (values 52)))
(m2samp (/ *clm-srate* sspeed))
(vel-env (make-env velenv :duration (* dur 0.5)))
;;;
@@ -125,10 +82,9 @@
(fshift (make-vector 4))
(baffleout (make-vector 4))
;;
- (bfila (make-butter-low-pass 200))
- (bfilb (make-butter-low-pass 200))
- (bfilc (make-butter-low-pass 200))
- (bfild (make-butter-low-pass 200))
+ ;;
+ (lpf (make-vector 4))
+ ;;
;;
(growf0 0.0)
(growf1 0.0)
@@ -156,8 +112,18 @@
((= i 4 ))
(set! (dpdelays i) (make-delay :size startddelay
:max-size maxddelayl
- :type mus-interp-linear))
- (set! (refldelays i) (make-delay )))
+ :type mus-interp-linear
+ ))
+ (set! (refldelays i) (make-delay :size startddelay
+ :max-size (ceiling (* cabinetlen 2 m2samp))
+ )) )
+ ;;
+ ;; Make filters
+ ;;
+ (do ((i 0 (1+ i)))
+ ((= i 4 ))
+ (set! (lpf i) (make-two-pole :a0 0.304 :b1 0.62986 :b2 0.825))
+ )
;;
;;
;;;
@@ -167,23 +133,27 @@
((= i end ))
;;
(let ((sample (pulse-train sig))
- ;;; (sample (readin rdA)) switch in case of reading a soundfile
+ ;; (sample (readin rdA)) ;; switch in case of reading a soundfile
(deltavel (env vel-env))
- (sigouta 0.0) (sigoutb 0.0) ;; horn
- (sigoutc 0.0) (sigoutd 0.0) ;; reflections
+ (sigouta 0.0) (sigoutb 0.0) ;; horn
+ (sigoutc 0.0) (sigoutd 0.0) ;; reflections
(woofera 0.0) (wooferb 0.0)) ;; low baffle output
;;
- ;; set acceleration of horn
+ ;;; set acceleration of horn
+ ;;
(set! hornangvel (* speedsl deltavel))
(set! hornangle (+ hornangle (* twopi (/ hornangvel *clm-srate*))))
- ;; baffle lower port
- (set! baffleangvel (* 0.98 speedsl ))
+ ;;
+ ;;; set motion parameter for baffle lower port
+ ;;
+ (set! baffleangvel (* 0.895 speedsl )) ;; 0.98
(set! baffleangle (+ baffleangle (* twopi (/ baffleangvel *clm-srate*))))
;;
(if (> hornangle twopi) (set! hornangle (- hornangle twopi)))
(if (> baffleangle twopi) (set! baffleangle (- baffleangle twopi)))
;;
- ;; calculate grow functions for delay line size (horn Doppler shifts)
+ ;;; calculate grow functions for delay line size (horn Doppler shifts)
+ ;;
(set! growf0 (/ (*(* (- twopi) hornradius) (* hornangvel (cos hornangle))) sspeed))
(set! growf1 (/ (*(* (- twopi) hornradius) (* hornangvel (sin hornangle))) sspeed))
;;
@@ -197,7 +167,7 @@
(set! (hornout j ) (delay (dpdelays j) sample (dshift j)))
)
;;
- ;; Reflections
+ ;;; Reflections
;;
(set! xdev (* hornradius (cos hornangle)))
(set! ydev (* hornradius (sin hornangle)))
@@ -207,6 +177,7 @@
(set! (reflectlen 3) (* (+ cabinetlen xdev) m2samp))
;;
;; Need to add these reflections to *reverb*
+ ;;
(do ((j 0 (1+ j)))
((= j 4))
(set! (reflections j) (delay (refldelays j)
@@ -218,45 +189,59 @@
(set! sigoutc (+ (reflections 0) (reflections 2)))
(set! sigoutd (+ (reflections 1) (reflections 3)))
;;
+ ;;
;; Grow functions baffle low port section
(set! growfa (* (- twopi) baffleradius baffleangvel (cos baffleangle)))
(set! growfb (* (- twopi) baffleradius baffleangvel (sin baffleangle)))
;;
- (set! (fshift 0) (+ 250 (* growfa 50)))
- (set! (fshift 1) (+ 250 (* growfb 50)))
- (set! (fshift 2) (+ 250 (* (- growfa) 50)))
- (set! (fshift 3) (+ 250 (* (- growfb) 50)))
+ (set! (fshift 0) (+ 200 (* growfa 250)))
+ (set! (fshift 1) (+ 200 (* growfb 250)))
+ (set! (fshift 2) (+ 225 (* (- growfa) 250)))
+ (set! (fshift 3) (+ 225 (* (- growfb) 250)))
+ ;;
+ ;;; Filter for baffle low port section
+ ;;
+ (do ((k 0 (1+ k)))
+ ((= k 4))
+ (set! (mus-frequency (lpf k)) (fshift k))
+ (set! (mus-scaler (lpf k)) 0.938987)
+ )
+ ;;
+ ;;
+ (do ((k 0 (1+ k)))
+ ((= k 4))
+ (set! (baffleout k) (two-pole (lpf k) sample))
+ )
;;
- (sweep-butterfq bfila (fshift 0))
- (sweep-butterfq bfilb (fshift 1))
- (sweep-butterfq bfilc (fshift 2))
- (sweep-butterfq bfild (fshift 3))
;;
- (set! (baffleout 0) (butter bfila sample))
- (set! (baffleout 1) (butter bfilb sample))
- (set! (baffleout 2) (butter bfilc sample))
- (set! (baffleout 3) (butter bfild sample))
+ (set! woofera (* 0.175 (+ (baffleout 0) (baffleout 2))))
+ (set! wooferb (* 0.175 (+ (baffleout 1) (baffleout 3))))
;;
- (set! woofera (+ (baffleout 0) (baffleout 2)))
- (set! wooferb (+ (baffleout 1) (baffleout 3)))
;;
(outa i (* gain (+ sigouta sigoutc woofera)))
(outb i (* gain (+ sigoutb sigoutd wooferb)))
- ;;;
+ ;;
+ ;;; in case of reverb
+ ;;
(if *reverb*
(progn
- (outa i (* (* 0.5 gain) (+ sigoutc woofera) rev-amount) *reverb*)
- (outb i (* (* 0.5 gain) (+ sigoutd wooferb) rev-amount) *reverb*) ))
+ (outa i (* (* 0.5 gain) (+ sigouta woofera) rev-amount) *reverb*)
+ (outb i (* (* 0.5 gain) (+ sigoutb wooferb) rev-amount) *reverb*) ))
))
))
+
;;; (with-sound (:channels 2) (rotates 0 1 800))
;;; (with-sound (:channels 2) (rotates 0 3 200))
;;; (with-sound (:channels 2) (rotates 0 8 300 :speedsl 1.0))
;;; (with-sound (:channels 2) (rotates 0 3 500 :speedsl 1.0))
-;;; (with-sound (:channels 2) (rotates 0 3 500 :velenv '(0 0 100 1)))
+;;; (with-sound (:channels 2) (rotates 0 3 800 :velenv '(0 0.05 100 1)))
;;; (with-sound (:channels 2) (rotates 0 3 500 :velenv '(0 1 100 0.25)))
+;;; (with-sound (:channels 2) (rotates 0 5 1000 :velenv '(0 0.25 50 1 100 0.3)))
+
+
;;; (load "nrev.ins")
;;; (with-sound (:channels 2 :reverb nrev :reverb-channels 2) (rotates 0 5 500 :velenv '(0 1 100 0.25)))
+