ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/cmusic/ug.seg.c

This is ug.seg.c in view mode; [Download] [Up]

/* Table Lookup N-segment Generator */

#include "mm.head.h"
#include "ug.head.h"

#define	AMP	1
#define	TABLE	2
#define	SUM	3
#define	INCR	4

seg

UGHEAD{
    UGINIT;
    double p4, fac1, fac2;
    int nzero, nseg = narg-4;

    if(TYPE(TABLE) != 'f'){	/* Find start of function if number given */
	FORLIST(fp, next_fp, fplist) if(fp->f_index == (int) VAL(TABLE))break;
	if(!fp){
	    Error++;
	    PROUT("SEG: Function %.0f undefined\n",VAL(TABLE));
	    SEMIC; return;
	}
	LOC(TABLE) = fp->f_vals;
	LEN(TABLE) = fp->f_len;
	TYPE(TABLE) = 'f';
    }

/* Check for zero-valued increments */
    for(nzero = arg = 0; arg < nseg; arg++) if( VAL(INCR+arg) == 0.)nzero++;

/* Replace zeros with values */
    if(nzero){
	p4 = *(note->plist + 4); /* p4 is total note duration */
	for(arg = 0; arg < nseg; arg++){
	    if(VAL(INCR+arg) == 0.)continue;
/* Subtract nonzero segment durations */
	    p4 -= LEN(TABLE)/(Srate*VAL(INCR+arg)); 
	}
	for(arg = 0; arg < nseg; arg++)
	 if( VAL(INCR+arg) == 0.){
/* Evenly divide remaining duration over all zero values */
	     VAL(INCR+arg) = LEN(TABLE)/(Srate*(p4/nzero));
	}
    }

    fac1 = (double) LEN(TABLE)/nseg;
    fac2 = (double) 1/nseg;

    {
	double sum = VAL(SUM), len = LEN(TABLE);
	UGLOOP{

	    VAL(OUT)++ = VAL(AMP) * *(LOC(TABLE) + (long) sum ) ;
	    for(arg = 0; arg < nseg; arg++){
		if(sum < (arg + 1) * fac1)break;
	    }
	    sum += VAL(INCR + arg) * fac2;
	    if(sum >= len) sum = len-1;

	    UGEND(1)
	}
	VAL(SUM) = sum;
    }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.