download mixer.scm
Language: Scheme
LOC: 184
Project Info
Snd
Server: SourceForge
Type: cvs
SourceForge\s\snd\snd\cvs‑snd\
   _new_snd-test.rb
   _sndlib.h
   aclocal.m4
   analog-filter.scm
   audinfo.c
   audio.c
   autosave.scm
   bess.rb
   bess.scm
   bess1.rb
   bess1.scm
   bird.rb
   bird.scm
   clm-ins.rb
   clm-ins.scm
   clm-strings.h
   clm.c
   clm.h
   clm23.scm
   clm2xen.c
   clm2xen.h
   cmn-glyphs.lisp
   config.guess
   config.h.in
   config.rpath
   config.sub
   configure.ac
   debug.scm
   dlocsig.rb
   draw.rb
   draw.scm
   dsp.rb
   dsp.scm
   edit-menu.scm
   edit123.scm
   effects-utils.scm
   effects.rb
   env.rb
   env.scm
   enved.scm
   eval-c.scm
   event.scm
   examp.rb
   examp.scm
   extensions.rb
   extensions.scm
   fade.scm
   fft-menu.scm
   fix-optargs.scm
   fmv.scm
   freeverb.rb
   freeverb.scm
   gettext.h
   gl.c
   grani.scm
   gtk-effects.scm
   gtk-popup.scm
   gui.scm
   headers.c
   help-snd-fm.pd
   help-snd.pd
   HISTORY.Snd
   hooks.rb
   hooks.scm
   index.rb
   index.scm
   inf-snd.el
   io.c
   jcrev.scm
   ladspa-help.scm
   ladspa.scm
   makefile.in
   makefile.no-gettext
   maraca.rb
   maraca.scm
   marks-menu.scm
   marks.rb
   marks.scm
   maxf.rb
   maxf.scm
   midi.c
   misc.scm
   mix-menu.scm
   mix.rb
   mix.scm
   mixer.scm
   moog.scm
   musglyphs.rb
   musglyphs.scm
   nb.rb
   nb.scm
   new-backgrounds.scm
   new-buttons.scm
   new-effects.scm
   new-icons.scm
   noise.rb
   noise.scm
   old-mac-audio.c
   old-snd.spec
   oo.scm
   oscope.scm
   panic.scm
   pd-add.scm
   pd-any.scm
   pd-fm.scm
   pd-global.scm
   pd-inout.scm
   pd-local.scm
   pd-mozilla.scm
   pd-send_receive.scm
   peak-env.scm
   piano.rb
   piano.scm
   play.rb
   play.scm
   poly.rb
   poly.scm
   popup.rb
   popup.scm
   prc95.rb
   prc95.scm
   pvoc.rb
   pvoc.scm
   README.Snd
   rgb.rb
   rgb.scm
   rmsgain.scm
   rt-compiler.scm
   rt-engine.scm
   rt-examples.scm
   rt.tex
   rtio.rb
   rtio.scm
   rubber.rb
   rubber.scm
   saw.c
   singer.rb
   singer.scm
   snd-0.h
   snd-1.h
   snd-axis.c
   snd-chn.c
   snd-completion.c
   snd-dac.c
   snd-data.c
   snd-draw.c
   snd-edits.c
   snd-env.c
   snd-error.c
   snd-fft.c
   snd-file.c
   snd-file.h
   snd-find.c
   snd-g0.h
   snd-g1.h
   snd-gchn.c
   snd-gdraw.c
   snd-gdrop.c
   snd-genv.c
   snd-gfft.c
   snd-gfile.c
   snd-gfind.c
   snd-ghelp.c
   snd-gl.scm
   snd-glistener.c
   snd-gmain.c
   snd-gmenu.c
   snd-gmix.c
   snd-gprefs.c
   snd-gprint.c
   snd-grec.c
   snd-gregion.c
   snd-gsnd.c
   snd-gtk.scm
   snd-gutils.c
   snd-gxbitmaps.c
   snd-gxcolormaps.c
   snd-gxen.c
   snd-gxutils.c
   snd-help.c
   snd-hobbit.scm
   snd-io.c
   snd-kbd.c
   snd-ladspa.c
   snd-listener.c
   snd-main.c
   snd-marks.c
   snd-menu.c
   snd-menu.h
   snd-mix.c
   snd-motif.scm
   snd-nogui.c
   snd-nogui0.h
   snd-nogui1.h
   snd-prefs.c
   snd-print.c
   snd-rec.c
   snd-rec.h
   snd-region.c
   snd-run.c
   snd-select.c
   snd-sig.c
   snd-snd.c
   snd-strings.h
   snd-trans.c
   snd-utils.c
   snd-x0.h
   snd-x1.h
   snd-xchn.c
   snd-xdraw.c
   snd-xdrop.c
   snd-xen.c
   snd-xenv.c
   snd-xfft.c
   snd-xfile.c
   snd-xfind.c
   snd-xhelp.c
   snd-xlistener.c
   snd-xm.rb
   snd-xmain.c
   snd-xmenu.c
   snd-xmix.c
   snd-xprefs.c
   snd-xprint.c
   snd-xrec.c
   snd-xref.c
   snd-xregion.c
   snd-xsnd.c
   snd-xutils.c
   snd-xxen.c
   snd.1
   Snd.ad
   snd.c
   Snd.gtkrc
   snd.h
   snd.spec
   snd_conffile.scm
   snd_pd_external.c
   snd_pd_external.h
   snd4.scm
   snd5.scm
   snd6.scm
   snd7.scm
   sndctrl.c
   sndinfo.c
   sndlib-strings.h
   sndlib.h.in
   sndlib2xen.c
   sndlib2xen.h
   sndplay.c
   sndrecord.c
   sndwarp.scm
   sound.c
   special-menu.scm
   spectr.rb
   spectr.scm
   strad.rb
   strad.scm
   TODO.Snd
   track-colors.scm
   v.rb
   v.scm
   vct.c
   vct.h
   ws.rb
   ws.scm
   xen.c
   xen.h
   xg-x11.h
   xm-enved.rb
   xm-enved.scm
   zip.rb
   zip.scm

;;; mixer and frame stuff, mostly oriented toward linear algebra (see also snd-test)
;;;
;;; frame-reverse, make-zero-mixer, mixer-diagonal?, mixer-transpose, mixer-determinant,
;;; mixer-solve, mixer-inverse, invert-matrix, mixer-trace, mixer-poly, mixer-copy, frame-copy

(provide 'snd-mixer.scm)

(define (frame-reverse fr)
  (let ((len (mus-length fr)))
    (do ((i 0 (1+ i))
	 (j (1- len) (1- j)))
	((>= i (/ len 2)))
      (let ((temp (frame-ref fr i)))
	(frame-set! fr i (frame-ref fr j))
	(frame-set! fr j temp)))
    fr))

(define (frame-copy fr)
  (let* ((len (mus-length fr))
	 (nfr (make-frame len)))
    (do ((i 0 (1+ i)))
	((= i len))
      (frame-set! nfr i (frame-ref fr i)))
    fr))



(define (mixer-copy umx)
  (let* ((size (mus-length umx))
	 (mx (make-mixer size)))
    (do ((i 0 (1+ i)))
	((= i size))
      (do ((j 0 (1+ j)))
	  ((= j size))
	(mixer-set! mx i j (mixer-ref umx i j))))
    mx))

(define (make-zero-mixer n) (make-mixer n))

(define mat
  (make-procedure-with-setter
   (lambda (m i j)
     (mixer-ref m i j))
   (lambda (m i j x)
     (mixer-set! m i j x))))

(define (mixer-diagonal? m)
  (let ((n (mus-length m)))
    (or (= n 1)
	(call-with-current-continuation
	 (lambda (return)
	   (do ((i 0 (1+ i)))
	       ((= i n) #t)
	     (do ((j 0 (1+ j)))
		 ((= j n))
	       (if (and (not (= i j))
			(not (= (mat m i j) 0.0)))
		   (return #f)))))))))
	   
(define (mixer-transpose mx)
  (let* ((n (mus-length mx))
	 (nmx (make-zero-mixer n)))
    (do ((i 0 (1+ i)))
	((= i n))
      (do ((j 0 (1+ j)))
	  ((= j n))
	(set! (mat nmx j i) (mat mx i j))))
    nmx))

(define (sub-matrix mx row col)
  (let* ((old-n (mus-length mx))
	 (new-n (1- old-n))
	 (nmx (make-zero-mixer new-n)))
    (do ((i 0 (1+ i))
	 (ni 0))
	((= i old-n))
      (if (not (= i row))
	  (begin
	    (do ((j 0 (1+ j))
		 (nj 0))
		((= j old-n))
	      (if (not (= j col))
		  (begin
		    (set! (mat nmx ni nj) (mat mx i j))
		    (set! nj (+ nj 1)))))
	    (set! ni (1+ ni)))))
    nmx))

(define (mixer-determinant mx)
  (let ((n (mus-length mx)))
    (if (= n 1) 
	(mat mx 0 0)
	(if (= n 2)
	    (- (* (mat mx 0 0) (mat mx 1 1))
	       (* (mat mx 0 1) (mat mx 1 0)))
	    (if (= n 3)
		(- (+ (* (mat mx 0 0) (mat mx 1 1) (mat mx 2 2))
		      (* (mat mx 0 1) (mat mx 1 2) (mat mx 2 0))
		      (* (mat mx 0 2) (mat mx 1 0) (mat mx 2 1)))
		   (+ (* (mat mx 0 0) (mat mx 1 2) (mat mx 2 1))
		      (* (mat mx 0 1) (mat mx 1 0) (mat mx 2 2))
		      (* (mat mx 0 2) (mat mx 1 1) (mat mx 2 0))))
		(let ((sum 0.0)
		      (sign 1))
		  (do ((i 0 (1+ i)))
		      ((= i n))
		    (let ((mult (mat mx 0 i)))
		      (if (not (= mult 0.0))
			  (set! sum (+ sum (* sign mult (mixer-determinant (sub-matrix mx 0 i))))))
		      (set! sign (- sign))))
		  sum))))))

(define* (mixer-poly mx #:rest coeffs)
  (let* ((n (length coeffs))
	 (nmx (make-scalar-mixer (mus-length mx) (list-ref coeffs (1- n))))
	 (x (mixer* mx 1.0)))
    (do ((i (- n 2) (1- i)))
	((< i 0))
      (set! nmx (mixer+ nmx (mixer* x (list-ref coeffs i))))
      (set! x (mixer* mx x)))
    nmx))

;;; (define (vct-norm v1) (sqrt (dot-product v1 v1)))

(define (mixer-trace mx)
  (let ((sum 0.0)
	(n (mus-length mx)))
    (do ((i 0 (1+ i)))
	((= i n) sum)
      (set! sum (+ sum (mat mx i i))))))


(define* (invert-matrix matrix :optional b (zero 1.0e-7))
  ;; translated from Numerical Recipes (gaussj)
  (call-with-current-continuation
   (lambda (return)
     (let* ((n (mus-length matrix))
	    (cols (make-vector n 0))
	    (rows (make-vector n 0))
	    (pivots (make-vector n 0)))
       (do ((i 0 (1+ i)))
	   ((= i n))
	 (let ((biggest 0.0)
	       (col 0)
	       (row 0))
	   (do ((j 0 (1+ j)))
	       ((= j n))
	     (if (not (= (vector-ref pivots j) 1))
		 (begin
		   (do ((k 0 (1+ k)))
		       ((= k n))
		     (if (= (vector-ref pivots k) 0)
			 (let ((val (abs (mat matrix j k))))
			   (if (> val biggest)
			       (begin
				 (set! col k)
				 (set! row j)
				 (set! biggest val))))
			 (if (> (vector-ref pivots k) 1)
			     (return #f)))))))
	   (if (< biggest zero) (return #f)) ; this can be fooled (floats...): (invert-matrix (make-mixer 3 1 2 3 3 2 1 4 5 6))
	   (vector-set! pivots col (+ (vector-ref pivots col) 1))
	   (if (not (= row col))
	       (let ((temp (if b (frame-ref b row) 0.0)))
		 (if b
		     (begin
		       (frame-set! b row (frame-ref b col))
		       (frame-set! b col temp)))
		 (do ((k 0 (1+ k)))
		     ((= k n))
		   (set! temp (mat matrix row k))
		   (set! (mat matrix row k) (mat matrix col k))
		   (set! (mat matrix col k) temp))))
	   (vector-set! cols i col)
	   (vector-set! rows i row)
	   ;; round-off troubles here
	   (if (< (abs (mat matrix col col)) zero)
	       (return #f))
	   (let ((inverse-pivot (/ 1.0 (mat matrix col col))))
	     (set! (mat matrix col col) 1.0)
	     (do ((k 0 (1+ k)))
		 ((= k n))
	       (set! (mat matrix col k) (* inverse-pivot (mat matrix col k))))
	     (if b (frame-set! b col (* inverse-pivot (frame-ref b col)))))
	   (do ((k 0 (1+ k)))
	       ((= k n))
	     (if (not (= k col))
		 (let ((scl (mat matrix k col)))
		   (set! (mat matrix k col) 0.0)
		   (do ((m 0 (1+ m)))
		       ((= m n))
		     (set! (mat matrix k m) (- (mat matrix k m) (* scl (mat matrix col m)))))
		   (if b (frame-set! b k (- (frame-ref b k) (* scl (frame-ref b col))))))))))
       (do ((i (1- n) (1- i)))
	   ((< i 0))
	 (if (not (= (vector-ref rows i) (vector-ref cols i)))
	     (do ((k 0 (1+ k)))
		 ((= k n))
	       (let ((temp (mat matrix k (vector-ref rows i))))
		 (set! (mat matrix k (vector-ref rows i)) (mat matrix k (vector-ref cols i)))
		 (set! (mat matrix k (vector-ref cols i)) temp)))))
       (list matrix b)))))

;;; it would be faster to use invert-matrix to calculate the determinant, but that
;;;   really forces us to use doubles throughout -- probably should anyway...

(define (mixer-solve A b)
  (let ((val (invert-matrix A b)))
    (and val (cadr val))))

(define (mixer-inverse A)
  (let ((val (invert-matrix A)))
    (and val (car val))))

About Koders | Resources | Downloads | Support | Black Duck | Submit Project | Terms of Service | DMCA | Privacy Policy | Site Map| Contact Us