; Homework #6 code
; Arvel Hernandez
; ===============

(define filterecho
      (lambda* (secs samps bz #&optional (att 1.0))
          (let ((echodel (make-delay (round (* secs (srate)))))
                  (filtdel (make-delay samps))
                  (yz 0.0)
                  (yy 0.0)
                  (yx 0.0)
                  (y0 0.0)
                  (a0 0.5))
          (lambda (x0)
                   (set! yz (tap echodel))
                   (set! yx (+ x0 (* att yz)))
                   (set! yy (tap filtdel))
                   (set! y0 (- (* a0 yx) (* bz yy)))
                   (delay echodel y0)
                   (delay filtdel yx)           ; feed into delayline
                   y0)
)))

;Tube like filter
(click 0.1)
(map-chan (filterecho 0.003 1 -0.5 0.680))
;String like filter
(click 1.0)
(map-chan (filterecho 0.003 1 -0.5 0.950))