[CM] Finding the duration of a time-varying resampled sound.
Bill Schottstaedt
bil@ccrma.Stanford.EDU
Tue, 28 Oct 2003 08:16:45 -0800
Ok, here's my final entry!
;;; find new duration of sound after using env as srate (src-sound)
;;; the envelope gives the per-sample increment, so the "tempo"
;;; is the inverse of that. To get the total new duration,
;;; we need to integrate the inverse envelope, but a straight
;;; line in the increment envelope becomes a 1/x curve in the
;;; tempo curve, so we use log(x) as integral of 1/x and
;;; take into account the local notion of "x".
(define (src-duration e)
(let* ((len (length e))
(ex0 (car e))
(ex1 (list-ref e (- len 2)))
(all-x (- ex1 ex0))
(dur 0.0))
(do ((i 0 (+ i 2)))
((>= i (- len 2)) dur)
(let* ((x0 (list-ref e i))
(x1 (list-ref e (+ i 2)))
(xy0 (list-ref e (+ i 1))) ; 1/x x points
(y0 (/ 1.0 xy0)) ; related y value
(xy1 (list-ref e (+ i 3)))
(y1 (/ 1.0 xy1))
(area (if (< (abs (- xy0 xy1)) .0001) ; don't divide by 0
(* y0 (/ (- x1 x0) all-x))
(* (/ (- (log y1) (log y0))
(- xy0 xy1))
(/ (- x1 x0) all-x)))))
(set! dur (+ dur (abs area)))))))
(define (new-dur orig-dur src-env)
(* orig-dur (src-duration src-env)))
:(src-duration '(0 1 .5 1))
1.0
:(src-duration '(0 1 1 2))
0.693147180559945
:(src-duration '(0 1 1 .5))
1.38629436111989
:(src-duration '(0 2 1 1))
0.693147180559945
:(src-duration '(0 1 1 .5 2 1))
1.38629436111989
:(src-duration '(0 .5 .5 3 .6 1 .7 .1 .8 1.5 1 1))
1.02474349685432