This is ug.osc.c in view mode; [Download] [Up]
/* Table Lookup Truncating Oscillator */ #include "mm.head.h" #include "ug.head.h" #define AMP 1 #define INCR 2 #define TABLE 3 #define SUM 4 osc UGHEAD{ UGINIT; register float output; 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("OSC: Function %.0f undefined\n",VAL(TABLE)); SEMIC; return; } LOC(TABLE) = fp->f_vals; LEN(TABLE) = fp->f_len; TYPE(TABLE) = 'f'; } switch((INC(AMP)<<(1)) + (INC(INCR))){ case 0: { register float ss = VAL(SUM), ll = LEN(TABLE), ii = VAL(INCR), aa = VAL(AMP), *tt = LOC(TABLE), *oo = LOC(OUT); UGLOOP{ while ( ss >= ll ) ss -= ll; *oo++ = aa * tt[ (long) ss ]; ss += ii; } VAL(SUM) = ss; LOC(OUT) = oo; return; } case 1: { register float ss = VAL(SUM), ll = LEN(TABLE), *ii = LOC(INCR), aa = VAL(AMP), *tt = LOC(TABLE), *oo = LOC(OUT), ooo; UGLOOP{ while ( ss >= ll ) ss -= ll; while ( ss < 0.0 ) ss += ll; ooo = aa * tt[ (long) ss ]; ss += *ii++; *oo++ = ooo; } VAL(SUM) = ss; LOC(OUT) = oo; LOC(INCR) = ii; return; } case 2: { register float ss = VAL(SUM), ll = LEN(TABLE), ii = VAL(INCR), *aa = LOC(AMP), *tt = LOC(TABLE), *oo = LOC(OUT); UGLOOP{ while ( ss >= ll ) ss -= ll; *oo++ = *aa++ * tt[ (long) ss ]; ss += ii; } VAL(SUM) = ss; LOC(OUT) = oo; LOC(AMP) = aa; return; } case 3: { register float ss = VAL(SUM), ll = LEN(TABLE), *ii = LOC(INCR), *aa = LOC(AMP), *tt = LOC(TABLE), *oo = LOC(OUT), ooo; UGLOOP{ while ( ss >= ll ) ss -= ll; while ( ss < 0.0 ) ss += ll; ooo = *aa++ * tt[ (long) ss ]; ss += *ii++; *oo++ = ooo; } VAL(SUM) = ss; LOC(OUT) = oo; LOC(AMP) = aa; LOC(INCR) = ii; return; } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.