;;; maxf.scm -- CLM -> Snd/Scheme translation of maxf.ins ;; Translator/Author: Michael Scholz ;; Last: Tue Mar 25 04:32:23 CET 2003 ;; Version: $Revision: 1.2 $ ;; array -> vector functions added by Bill S, 18-Apr-11 ;; defgenerator changes (Bill 25-Jul-12) ;; It follows the original header by Juan Reyes. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; maxf.ins ;; This is Max Mathews (mvm) new filter (2002) ;; High-Q, 2-Integrator, filter with ;; Two Poles, and one Zero at the Origin ;; ;; It synthesizes equal-tempered frequencies ;; integer & just scales out of a wide-band input ;; signal. ;; Based on Max's code (filter.cpp) ;; ;; This heuristic might be called Modal Synthesis. ;; But as well it can also be additive synthesis in ;; which a resonator is initialized to generate the ;; exponentially decaying sinusoids at the desired ;; phase. ;; ;; This implementation written by Juan Reyes with dsp ;; assistance from JOS. ;; This version Oct-30, 2002 ;; ;; Change gain(att) of input file if clipping ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'snd-maxf.scm) (if (provided? 'snd) (require snd-ws.scm) (require sndlib-ws.scm)) (define *locsig-type* mus-interp-sinusoidal) (define (snd-msg frm . args) ((if (not (string=? "" (getenv "EMACS"))) display snd-print) (apply format #f frm args))) (defgenerator mvm sample pp1 pp2 pp3 yy1 yy2 zz1 zz2 out) (define (mvmfilt b sample0) (let-set! b 'sample sample0) (with-let b (set! yy2 (- (+ (* pp1 yy1) (* pp2 zz1)) (* pp3 sample))) (set! zz2 (- zz1 (* pp2 yy2))) (set! zz1 zz2) (set! yy1 yy2) (set! out yy1))) (define pi2s (/ (* 2.0 pi) *clm-srate*)) (define i2s (/ 2.0 *clm-srate*)) (define tper (/ 1.0 *clm-srate*)) (define (set-coeffs b famp ffreq fdecay) (let ((centerfreq (* ffreq pi2s))) (let ((maxdecay (/ (* 2.0 tper) (* centerfreq centerfreq))) (mindecay (/ tper centerfreq))) ;; Conditions for JOS constraints ;; maxdecay: Filter may be unstable ;; mindecay: Filter may not oscillate (set! fdecay (max mindecay (min fdecay maxdecay)))) (set! (b 'pp1) (- 1.0 (/ i2s fdecay))) (set! (b 'pp2) centerfreq) (set! (b 'pp3) (* (b 'pp2) famp)))) (define (make-array dim1) ; I'm guessing ... (make-vector (list dim1 3) 0.0)) (define (array-set! arr val i1 i2) (set! (arr i1 i2) val)) (define array-ref vector-ref) (define maxfilter (let ((documentation "(maxfilter file beg (att 1.0) (numf 1) (freqfactor 1.0) (amplitude 1.0) (amp-env '(0 1 100 1)) (degree (random 90.0)) (distance 1.0) (reverb-amount 0.2)) This is Max Mathews (mvm) new filter (2002) High-Q, 2-Integrator, filter with Two Poles, and one Zero at the Origin It synthesizes equal-tempered frequencies integer & just scales out of a wide-band input signal. Based on Max's code (filter.cpp) This heuristic might be called Modal Synthesis. But as well it can also be additive synthesis in which a resonator is initialized to generate the exponentially decaying sinusoids at the desired phase. (att 1) in-file attenuation (numf 1) 1 filter (numf 4) 4 filters (numf 9) 9 filters (numf 12) 12 filters (numf 13) 13 filters")) (lambda* (file beg (att 1.0) (numf 1) (freqfactor 1.0) (amplitude 1.0) (amp-env '(0 1 100 1)) (degree (random 90.0)) (distance 1.0) (reverb-amount 0.2)) (let ((beg (floor (* beg *clm-srate*))) (dur (mus-sound-framples file))) (let ((formfil (make-mvm)) (end (+ beg dur)) (rdA (make-readin :file file :channel 0)) (ampf (make-env :envelope amp-env :scaler amplitude :length dur)) (state-0 (make-array 1)) (state-1 (make-array 12)) (state-2 (make-array 9)) (state-3 (make-array 13)) (state-4 (make-array 4)) (state-5 (make-array 2)) (loc (make-locsig :degree degree :distance distance :reverb reverb-amount :type *locsig-type*))) (case numf ((1) (snd-msg ";;;; State 0 (default): One filter~%") (array-set! state-0 7.54e-002 0 0) (array-set! state-0 (* 2000 freqfactor) 0 1) (array-set! state-0 2.0 0 2)) ;; ((2) (snd-msg ";;;; State 5: Two filters~%") (array-set! state-5 7.54e-003 0 0) (array-set! state-5 (* 200.0 freqfactor) 0 1) (array-set! state-5 4.0 0 2) ;; (array-set! state-5 7.54e-004 1 0) (array-set! state-5 (* 800.0 freqfactor) 1 1) (array-set! state-5 1.0 1 2)) ;; ((4) (snd-msg ";;;; State 4: Four filters~%") (array-set! state-4 7.54e-002 0 0) (array-set! state-4 (* 1000.0 freqfactor) 0 1) (array-set! state-4 0.5 0 2) ;; (array-set! state-4 3.225e-002 1 0) (array-set! state-4 (* 400.0 freqfactor) 1 1) (array-set! state-4 3.0 1 2) ;; (array-set! state-4 1.14e-002 2 0) (array-set! state-4 (* 800.0 freqfactor) 2 1) (array-set! state-4 2.8 2 2) ;; (array-set! state-4 7.54e-002 3 0) (array-set! state-4 (* 1600.0 freqfactor) 3 1) (array-set! state-4 1.0 3 2)) ;; ((9) (snd-msg ";;;; State 2: Streached overtone string 9 filters~%") (array-set! state-2 1.07e-002 0 0) (array-set! state-2 100.0 0 1) (array-set! state-2 2.5 0 2) ;; (array-set! state-2 1.07e-002 1 0) (array-set! state-2 202.0 1 1) (array-set! state-2 0.75 1 2) ;; (array-set! state-2 1.07e-002 2 0) (array-set! state-2 305.0 2 1) (array-set! state-2 0.5 2 2) ;; (array-set! state-2 7.077e-003 3 0) (array-set! state-2 408.0 3 1) (array-set! state-2 0.4 3 2) ;; (array-set! state-2 1.07e-002 4 0) (array-set! state-2 501.0 4 1) (array-set! state-2 0.3 4 2) ;; (array-set! state-2 1.07e-002 5 0) (array-set! state-2 612.0 5 1) (array-set! state-2 0.25 5 2) ;; (array-set! state-2 1.07e-003 6 0) (array-set! state-2 715.0 6 1) (array-set! state-2 0.25 6 2) ;; (array-set! state-2 1.07e-002 7 0) (array-set! state-2 817.0 7 1) (array-set! state-2 0.2 7 2) ;; (array-set! state-2 1.07e-002 8 0) (array-set! state-2 920.0 8 1) (array-set! state-2 0.18 8 2)) ;; ((12) (snd-msg ";;;; State 1: Risset bell long 12 filters~%") (array-set! state-1 5.025e-002 0 0) (array-set! state-1 224.0 0 1) (array-set! state-1 3.7 0 2) ;; (array-set! state-1 5.025e-002 1 0) (array-set! state-1 225.0 1 1) (array-set! state-1 3.3 1 2) ;; (array-set! state-1 5.025e-002 2 0) (array-set! state-1 368.0 2 1) (array-set! state-1 2.8 2 2) ;; (array-set! state-1 5.025e-002 3 0) (array-set! state-1 369.0 3 1) (array-set! state-1 2.4 3 2) ;; (array-set! state-1 1.047e-002 4 0) (array-set! state-1 476.0 4 1) (array-set! state-1 1.9 4 2) ;; (array-set! state-1 5.025e-002 5 0) (array-set! state-1 680.0 5 1) (array-set! state-1 1.7 5 2) ;; (array-set! state-1 5.025e-002 6 0) (array-set! state-1 800.0 6 1) (array-set! state-1 1.5 6 2) ;; (array-set! state-1 4.05e-002 7 0) (array-set! state-1 1096.0 7 1) (array-set! state-1 1.1 7 2) ;; (array-set! state-1 4.05e-002 8 0) (array-set! state-1 1099.0 8 1) (array-set! state-1 0.9 8 2) ;; (array-set! state-1 4.05e-002 9 0) (array-set! state-1 1200.0 9 1) (array-set! state-1 0.6 9 2) ;; (array-set! state-1 3.78e-002 10 0) (array-set! state-1 1504.0 10 1) (array-set! state-1 0.4 10 2) ;; (array-set! state-1 4.05e-002 11 0) (array-set! state-1 1628.0 11 1) (array-set! state-1 0.3 11 2)) ;; ((13) (snd-msg ";;;; State 3: Open major chord with repeated octave 12 filters~%") (array-set! state-3 5.025e-002 0 0) (array-set! state-3 100.0 0 1) (array-set! state-3 2.0 0 2) ;; (array-set! state-3 5.025e-002 1 0) (array-set! state-3 251.0 1 1) (array-set! state-3 2.0 1 2) ;; (array-set! state-3 5.025e-002 2 0) (array-set! state-3 299.0 2 1) (array-set! state-3 2.0 2 2) ;; (array-set! state-3 5.025e-002 3 0) (array-set! state-3 401.0 3 1) (array-set! state-3 2.0 3 2) ;; (array-set! state-3 5.025e-002 4 0) (array-set! state-3 199.0 4 1) (array-set! state-3 2.0 4 2) ;; (array-set! state-3 5.025e-002 5 0) (array-set! state-3 501.0 5 1) (array-set! state-3 2.0 5 2) ;; (array-set! state-3 5.025e-002 6 0) (array-set! state-3 599.0 6 1) (array-set! state-3 2.0 6 2) ;; (array-set! state-3 5.025e-002 7 0) (array-set! state-3 801.0 7 1) (array-set! state-3 2.0 7 2) ;; (array-set! state-3 5.025e-002 8 0) (array-set! state-3 201.0 8 1) (array-set! state-3 2.0 8 2) ;; (array-set! state-3 5.025e-002 9 0) (array-set! state-3 749.0 9 1) (array-set! state-3 2.0 9 2) ;; (array-set! state-3 5.025e-002 10 0) (array-set! state-3 900.0 10 1) (array-set! state-3 2.0 10 2) ;; (array-set! state-3 5.025e-004 11 0) (array-set! state-3 1205.0 11 1) (array-set! state-3 2.0 11 2) ;; (array-set! state-3 5.025e-004 12 0) (array-set! state-3 1205.0 12 1) (array-set! state-3 2.0 12 2)) (else (snd-msg "Please leave default or enter [1] [2] [4] [9] [12] [13]~%") (set! numf 1))) (do ((run-state (case numf ((1) state-0) ((2) state-5) ((4) state-4) ((9) state-2) ((12) state-1) ((13) state-3))) (i beg (+ 1 i))) ((= i end)) (let ((outvalA (* att (readin rdA))) (add-fl 0.0)) (do ((j 0 (+ 1 j))) ((= j numf)) (set-coeffs formfil (array-ref run-state j 0) (array-ref run-state j 1) (array-ref run-state j 2)) (set! add-fl (+ add-fl (mvmfilt formfil outvalA)))) (locsig loc i (* (env ampf) add-fl))))))))) ;; (let* ((ifile "dog.snd") ;; (ofile "gmax_dog.snd") ;; (snd (find-sound ofile)) ;; (number-ary '(1 2 4 9 12 13))) ;; (if snd ;; (close-sound snd)) ;; (with-sound (:play 1 :statistics #t :channels 4 :output ofile :reverb jc-reverb ;; :comment ;; (format #f "maxfilter test, filters ~S, source ~A" number-ary ifile)) ;; (do ((i 0 (+ 1 i)) ;; (nary number-ary (cdr nary))) ;; ((null? nary)) ;; (maxfilter ifile i :numf (car nary) :degree (random 3454))))) ;; (with-sound () (maxfilter "dog.snd" 0)) ;; (with-sound (:srate 44100) (maxfilter "dog.snd" 0 :numf 12)) ;; (with-sound (:srate 44100) (maxfilter "dog.snd" 0 :numf 13 :att 0.75)) ;; (with-sound (:srate 44100) (maxfilter "dog.snd" 0 :numf 2 :att 0.25 :freqfactor 0.5)) ;; maxf.scm ends here