This is comb.c in view mode; [Download] [Up]
#include <stdio.h> #include <carl/carl.h> #include <math.h> main(narg,argv) int narg; char *argv[]; { register int i, j, delay, iter; register float *buf, scale; float input, gain; float thresh = 1e-6; /* cutoff threshhold for reverb tail (-60dB) */ if (narg < 3) { fprintf(stderr,"Usage: comb gain delay\n"); exit(-1); } sscanf(argv[1],"%f",&gain); if (fabs( (double) gain) >= 1.0) { fprintf(stderr,"Illegal gain = %f\n",gain); exit(-1); } delay = atoi(argv[2]); if (delay<1 || delay>100000) { fprintf(stderr,"Illegal delay = %d\n",delay); exit(-1); } if (isatty(0)) { fprintf(stderr,"comb input must be a file or pipe.\n"); exit(-1); } buf = (float *) calloc(delay, sizeof(float)); /* allocate delay buffer */ i = -1; scale = 1./(1.+gain); if (isatty(1)) { /* output in ASCII on screen */ while ( getfloat(&input) > 0 ) { if (++i >= delay) i -= delay; printf("%f\n",*(buf+i)); *(buf+i) = *(buf+i) * gain + input * scale; } iter = delay * log( (double) thresh)/log( (double) gain); for (j = 0; j < iter; j++) { if (++i >= delay) i -= delay; printf("%f\n",*(buf+i)); *(buf+i) = *(buf+i) * gain; } } else { /* output in binary to stdout */ while ( getfloat(&input) > 0) { if (++i >= delay) i -= delay; putfloat(buf+i); *(buf+i) = *(buf+i) * gain + input * scale; } iter = delay * log( (double) thresh)/log( (double) gain); for (j = 0; j < iter; j++) { if (++i >= delay)i -= delay; putfloat( (buf+i)); *(buf+i) = *(buf+i) * gain; } flushfloat(); } exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.