[CM] clm delay offset for tap?

Tito Latini tito.01beta at gmail.com
Wed Sep 28 06:33:07 PDT 2016


On Wed, Sep 28, 2016 at 11:45:11AM +0200, andersvi at notam02.no wrote:
> Hi Bill, others.
> 
> I'm confused about (positive) offset argument to tap.
> 
> Negative offsets yields perhaps expected results, but positive offsets
> starts pulling values from what seems an odd offset into the line.
> 
> (set! (*s7* 'print-length) 20)
> 
> (define d1 (make-delay 10))
> 
> (do ((i 0 (+ 1 i)))
>     ((= i 10))
>   (delay d1 i))
> 
> (mus-data d1)
> => (float-vector 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0)
> 
> (tap d1)
> => 0.0
> (tap d1 1)
> => 5.0
> (tap d1 -1)
> => 1.0
> 
> (map (lambda (i) (tap d1 i)) '(0 1 2 3 4 5 6 7 8 9))
> => (0.0 5.0 4.0 3.0 2.0 1.0 0.0 9.0 8.0 7.0)
> 
> (map (lambda (i) (tap d1 i)) '(-0 -1 -2 -3 -4 -5 -6 -7 -8 -9))
> => (0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0)

That's a bug with the modulus operator in c

(int)-1 % (unsigned int)10    => 5

(int)-1 % (int)10             => -1

The follow patch seems ok:

diff -ur snd-16~/clm.c snd-16/clm.c
--- snd-16~/clm.c       2016-09-28 15:21:57.567364000 +0200
+++ snd-16/clm.c        2016-09-28 15:22:15.075143897 +0200
@@ -4382,7 +4382,7 @@
   int taploc;
   if (gen->size == 0) return(gen->line[0]);
   if ((int)loc == 0) return(gen->line[gen->loc]);
-  taploc = (int)(gen->loc - (int)loc) % gen->size;
+  taploc = (int)(gen->loc - (int)loc) % (int)gen->size;
   if (taploc < 0) taploc += gen->size;
   return(gen->line[taploc]);
 }



More information about the Cmdist mailing list