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.