[CM] [Snd] Guile newbie help?

Bill Schottstaedt bil@ccrma.Stanford.EDU
Mon, 5 Mar 2007 04:03:50 -0800


Your code returns the value of the last sample (you're integrating
the differences, so you end up re-making the original).
The following is perhaps what you're aiming at:

(let ((prev 0.0)
       (sum 0.0))
  (scan-channel
     (lambda (next)
       (set! sum (+ sum (- next prev)))
       (set! prev next)
       #f))
  sum)

But, I think the confusion comes from the question of when the reader
sets its "at-end" flag. Since the reader returns 0.0 when it hits the
end (and then notices that it has hit the end), your code always
ends with a 0.0 sample, and that becomes the value of the sum.
One (slightly bizarre) way around this is:

(let ((prev 0.0)
      (sum 0.0)
      (next 0.0)
      (rdr (make-sample-reader 0)))
  (while (let ()
           (set! next (rdr))
           (not (sample-reader-at-end? rdr)))
    ;(snd-print (format #f "~%;sum: ~A, ~A ~A" sum next prev))
    (set! sum (+ sum (- next prev)))
    (set! prev next))
  sum)

Anyway, I think reader-at-end? probably should be true one sample
earlier -- I'll look at this later today.