|
- ;;; Perry Cook's maraca from CMJ vol 21 no 3 (Fall 97) p 44
- ;;; translated from CLM's maraca.ins
-
- (provide 'snd-maraca.scm)
- (if (provided? 'snd)
- (require snd-ws.scm)
- (require sndlib-ws.scm))
-
- (define two-pi (* 2 pi))
-
- (definstrument (maraca beg dur (amp .1)
- (sound-decay 0.95)
- (system-decay 0.999)
- (probability .0625)
- (shell-freq 3200.0)
- (shell-reso 0.96))
- (let ((num-beans 64))
- (let ((st (seconds->samples beg))
- (nd (seconds->samples (+ beg dur)))
- (temp 0.0)
- (shake-energy 0.0)
- (snd-level 0.0)
- (input 0.0)
- (stop 0)
- (h20 (hz->radians 20.0))
- (sndamp (/ amp 16384.0))
- (srate4 (floor (/ *clm-srate* 4)))
- (gain (/ (* (log num-beans 4.0) 40) num-beans))
- (tz (make-two-pole 1.0 (* -2.0 shell-reso (cos (hz->radians shell-freq))) (* shell-reso shell-reso)))
- (oz (make-one-zero 1.0 -1.0))
- ;; gourd resonance filter
- )
- (do ((i st (+ i srate4)))
- ((>= i nd))
- (set! temp 0.0)
- (set! stop (min nd (+ i srate4)))
- (do ((k i (+ k 1)))
- ((= k stop))
- (if (< temp two-pi)
- (begin
- ;; shake over 50msec and add shake energy
- (set! temp (+ temp h20))
- (set! shake-energy (- (+ shake-energy 1.0) (cos temp)))))
- (set! shake-energy (* shake-energy system-decay))
- ;; if collision, add energy
- (if (< (random 1.0) probability)
- (set! snd-level (+ snd-level (* gain shake-energy))))
- ;; actual sound is random
- (set! input (mus-random snd-level))
- ;; compute exponential sound decay
- (set! snd-level (* snd-level sound-decay))
- ;; gourd resonance filter calc
- (outa k (* sndamp (one-zero oz (two-pole tz input)))))))))
-
- ;;; maraca: (with-sound (:statistics #t :play #t) (maraca 0 5 .5))
- ;;; cabasa: (with-sound (:statistics #t :play #t) (maraca 0 5 .5 0.95 0.997 0.5 3000.0 0.7))
-
- (definstrument (big-maraca beg dur (amp .1)
- (sound-decay 0.95)
- (system-decay 0.999)
- (probability .0625)
- (shell-freqs '(3200.0))
- (shell-resos '(0.96))
- (randiff .01)
- (with-filters #t))
- ;; like maraca, but takes a list of resonances and includes low-pass filter (or no filter)
- (let ((num-beans 64)
- (resn (length shell-freqs)))
- (let ((st (seconds->samples beg))
- (nd (seconds->samples (+ beg dur)))
- (temp 0.0)
- (shake-energy 0.0)
- (snd-level 0.0)
- (input 0.0)
- (sum 0.0)
- (last-sum 0.0)
- (tzs (make-vector resn))
- (h20 (hz->radians 20.0))
- (stop 0)
- (sndamp (/ amp (* 16384.0 resn)))
- (srate4 (floor (/ *clm-srate* 4)))
- (gain (/ (* (log num-beans 4) 40) num-beans))
- (oz (make-one-zero (/ amp (* resn 16384.0)) (/ amp (* resn 16384.0)))))
-
- ;; we need to fixup Perry's frequency dithering amount since we're going through our mus-frequency method
- (set! randiff (radians->hz randiff))
-
- ;; gourd resonance filters
- (do ((i 0 (+ i 1)))
- ((= i resn))
- (vector-set! tzs i (make-two-pole 1.0
- (* -2.0 (shell-resos i) (cos (hz->radians (shell-freqs i))))
- (* (shell-resos i) (shell-resos i)))))
-
- (do ((i st (+ i srate4)))
- ((>= i nd))
- (set! temp 0.0)
- (set! stop (min nd (+ i srate4)))
- (do ((k i (+ k 1)))
- ((= k stop))
-
- (if (< temp two-pi)
- (begin
- ;; shake over 50msec and add shake energy
- (set! temp (+ temp h20))
- (set! shake-energy (- (+ shake-energy 1.0) (cos temp)))))
-
- (set! shake-energy (* shake-energy system-decay))
- ;; if collision, add energy
- (if (< (random 1.0) probability)
- (begin
- (set! snd-level (+ snd-level (* gain shake-energy)))
- ;; randomize res freqs a bit
- (do ((j 0 (+ j 1)))
- ((= j resn))
- (set! (mus-frequency (vector-ref tzs j)) (+ (shell-freqs j) (mus-random randiff))))))
-
- ;; actual sound is random
- (set! input (mus-random snd-level))
- ;; compute exponential sound decay
- (set! snd-level (* snd-level sound-decay))
-
- ;; gourd resonance filter calcs
- (set! last-sum sum)
- (set! sum 0.0)
- (do ((j 0 (+ j 1)))
- ((= j resn))
- (set! sum (+ sum (two-pole (vector-ref tzs j) input))))
- (outa k (if with-filters
- (one-zero oz (- sum last-sum))
- (* sndamp sum))))))))
-
- ;;; tambourine: (with-sound (:play #t :statistics #t) (big-maraca 0 1 .25 0.95 0.9985 .03125 '(2300 5600 8100) '(0.96 0.995 0.995) .01))
- ;;; sleighbells: (with-sound (:play #t :statistics #t) (big-maraca 0 2 .15 0.97 0.9994 0.03125 '(2500 5300 6500 8300 9800) '(0.999 0.999 0.999 0.999 0.999)))
- ;;; sekere: (with-sound (:play #t :statistics #t) (big-maraca 0 2 .5 0.96 0.999 .0625 '(5500) '(0.6)))
- ;;; windchimes: (with-sound (:play #t :statistics #t) (big-maraca 0 2 .5 0.99995 0.95 .001 '(2200 2800 3400) '(0.995 0.995 0.995) .01 #f))
|