Re: [CM] make-bandpass xcoeffs

2022-06-29 Thread bil

make-bandpass is a wrapper around make-fir-filter, returning
an fir-filter generator, so mus-xcoeffs does work with it;
there's an example in snd-test.scm around line 7706.
make-bandpass is not itself a generator; it returns one.
If you look at the code in dsp.scm you'll see
(define bandpass fir-filter) -- this says the
bandpass generator is an fir-filter.  In the
first case, I think you're setting a vector to the
output of the bandpass generator, and in the second
it looks like you've copied the make-bandpass code
to set the vector, so you're setting the vector to
two different things.

___
Cmdist mailing list
Cmdist@ccrma.stanford.edu
https://cm-mail.stanford.edu/mailman/listinfo/cmdist


[CM] make-bandpass xcoeffs

2022-06-29 Thread James Hearon
Hi,
It seems make-bandpass doesn't have the mus-xcoeffs feature as general 
make-filter does, but I was trying to get the numbers to do some comparisons 
all in one definstrument, define, or let.  It seems calling the make-bandpass 
function as a generator and trying to place the output into a vector is the 
wrong approach, or maybe I have the inp variable wrong?  Also it seems one can 
use a bandpass or fir-filter call interchangeably?

How can I best get accurate xcoeffs numbers in-line, so to speak, from the 
make-bandpass gen?

(define (gentest amp flo1 fhi1 order)
 (let ((flt1 (make-bandpass (hz->radians flo1) (hz->radians fhi1) order)) 
;flow, fhigh, order
 (v (make-float-vector order))
 )
   (do ((l 0 (+ l 1)))
   ((= l order))
(float-vector-set! v l (bandpass flt1 l))  ;or (fir-filter flt1 l)
(format #t "~%l: ~F bandpass: ~0,6F v: ~0,6F" l (bandpass flt1 l) (v l))
) ))

(with-sound (:srate 48000 :channels 2 :header-type mus-riff )
   (gentest .5 200 400 3 )
)

As a test, I modified make-bandpass from dsp.scm to be able to print the coeffs 
which makes me believe the float-vector-set! approach above doesn't give the 
coeffs I was hoping to see.

(define (mymake-bandpass flo fhi order)
   (let* (
  (len order)
  (arrlen (+ 1 (* 2 len)))
  (arr (make-float-vector arrlen))
  )
(do ((i (- len) (+ i 1))) ;-len to +len
   ((= i len)
(make-fir-filter arrlen arr)) ;order xcoeffs
 (let* ((k (+ i len))
(denom (* pi i))
(num (- (sin (* fhi i)) (sin (* flo i)
   (set! (arr k)
 (if (= i 0)
 (/ (- fhi flo) pi)
 (* (/ num denom)
(+ .54 (* .46 (cos (/ (* i pi) len)
   (do ((l 0 (+ l 1)))
   ((= l arrlen))
(format #t "~%l: ~F  xcoeffs: ~0,6F" l (arr l))
)) )

(mymake-bandpass (hz->radians 200)  (hz->radians 400) 3)


Thank you for any suggestions,
Jim
___
Cmdist mailing list
Cmdist@ccrma.stanford.edu
https://cm-mail.stanford.edu/mailman/listinfo/cmdist