This is cflt.c in view mode; [Download] [Up]
#include <stdio.h> #include <math.h> #include "lprev.h" #include "cflt.h" float *g1sav; /* saves state of comb section across calls */ float **cmbz; /* pointers to comb rev. buffers */ float **cmbs; /* output buffers for comb filters */ float Icmbdlys[] = CMBDLYS; /* delay times in seconds of comb filters */ float *cmbdlys = Icmbdlys; int *cmblens; /* delay lengths corresponding to delay times */ int *cmbi; /* indicies into delay tables for each comb */ float Icmbg1[] = CMBG1; /* comb g1 coefficients */ float *cmbg1 = Icmbg1; float *cmbg2; /* comb g2 coeffs. calculated from g1 */ float cg2 = CMBG; /* scales comb flt. decay time */ int mincmb = 017777777777; float cmbscale = 1.0; /* scales input to parallel combs */ extern float srate; /* from lprev.c */ cmbflt(ibuf, obuf, len, dly, zlen, zi, G1, G2, x) register float *ibuf, *obuf; int len; register float *dly; int zlen; int *zi; float G1, G2; int x; { register float g1sum = g1sav[x], g2sum; register int j; /* setup comb delay buffers from delay times */ for (j = 0; j < len; j++) { *(obuf+j) = *(dly+*zi); /* result */ g2sum = *(dly+*zi) + g1sum*G1; g1sum = g2sum; /* z**-1 delay */ *(dly+*zi) = *(ibuf+j) + g2sum*G2; if (--(*zi) < 0) *zi = zlen-1; } g1sav[x] = g1sum; } int ncmbs; cmbinit() { /* setup comb delay buffers from delay times */ register int i; for (ncmbs = 0; cmbdlys[ncmbs] != -1.0; ncmbs++) /* empty */ ; cmbscale /= ncmbs; cmbg2 = (float *) calloc(sizeof(float) * ncmbs, 1); for (i = 0; i < ncmbs; i++ ) cmbg2[i] = cg2 * (1.0 - cmbg1[i]); g1sav = (float *) calloc(sizeof(float) * ncmbs, 1); cmbz = (float **) calloc(sizeof(float **) * ncmbs, 1); cmblens = (int *) calloc(sizeof(int *) * ncmbs, 1); cmbi = (int *) calloc(sizeof(int *) * ncmbs, 1); cmbs = (float **) calloc(sizeof(float **) * ncmbs, 1); for (i = 0; i < ncmbs; i++) { /* get length of comb delay line */ cmblens[i] = srate * cmbdlys[i]; /* cmbz points to arrays used by comb reverb filters */ cmbz[i] = (float *) calloc(sizeof(float)*cmblens[i], 1); /* find shortest comb */ if (cmblens[i] < mincmb) mincmb = cmblens[i]; /* output buffers for multiple calls to cmbflt() */ cmbs[i] = (float *) calloc(sizeof(float) * BUFSIZ, 1); } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.