This is multicomb.m in view mode; [Download] [Up]
#import "../H/ugens.h" #import <objc/objc.h> #import "../objc/Comb.h" #import "../objc/Reson.h" #import "../H/sfheader.h" #define SIZE 1024 #define MAXDEL 8192 int NBYTES = 32768; #define NCOMBS 12 extern SFHEADER sfdesc[NFILES]; int ncombs=0; float maxrev; float zero = 0.; float array[SIZE],wait[NCOMBS],combtime[NCOMBS],combrevtime[NCOMBS],amp[NCOMBS]; double multicomb(p,n_args) float *p; { id combl[NCOMBS]; int k,j,count,input,output,nsamps,save_nsamps,i; int nchans; float atten,tabs[2],xin[2],out[2]; float sig,oldl[NCOMBS],gain,envelope; double pow(); /* p0=start, p1=dur, p2=inskip p3=input gain, p4=overall rvt*/ for(i=0; i<ncombs; i++) { combl[i] = [Comb create]; [combl[i] loopt:combtime[i] sRate:SR revTime:combrevtime[i]]; } input = 0; output = 1; nsamps = setnote(p[0],p[1],output); setnote(p[2],p[1],input); gain = p[3]; tableset(p[1]+p[4],SIZE,tabs); count = SR/200; zero = 0; for(j=i=0; i<nsamps; i++) { while(!j--) { j=count; envelope = tablei(i,array,tabs); } if(!GETIN(xin,input)) break; for(out[0]=k=0; k<ncombs; k++) out[0] += [combl[k] bang:xin[0]] * amp[k]; out[0] += xin[0] * gain; out[0] *= envelope; ADDOUT(out,output); } save_nsamps = i; nsamps = p[4] ? p[4] * SR : maxrev * SR; for(j=i=0; i<nsamps; i++) { while(!j--) { j=count; envelope = tablei(i+save_nsamps,array,tabs); } for(out[0]=k=0; k<ncombs; k++) out[0] += [combl[k] bang:zero] * amp[k]; out[0] *= envelope; ADDOUT(out,output); } endnote(output); } double setcombs(p,n_args) float *p; { int j; if(n_args > (NCOMBS*3)) { printf("You can specify a maximum of NCOMBS combs\n"); closesf(); } for(maxrev=j=ncombs=0; j<n_args; ncombs++,j += 3) { combtime[ncombs] = p[j]; if(combtime[ncombs] > 10) { printf("you have to specify the comb frequencies in 1/hz, not hz (or cps). Try again\n"); closesf(); } combrevtime[ncombs] = p[j+1]; if(combrevtime[ncombs] > maxrev) maxrev = combrevtime[ncombs]; amp[ncombs] = p[j+2]; } for(j=0; j<ncombs; j++) printf("comb:%d, looptime=%g(%g),\t reverbtime=%g, amp=%g\n",j,combtime[j],1/combtime[j],combrevtime[j],amp[j]); return(ncombs); } double sl(p,n_args) float *p; { int i; setline(p,n_args,SIZE,array); } profile() { int i; for(i=0; i<SIZE; i++) array[i]=1; UG_INTRO("setcombs",setcombs); UG_INTRO("setcomb",setcombs); UG_INTRO("envelope",sl); UG_INTRO("multicomb",multicomb); UG_INTRO("multicombs",multicomb); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.