This is fm.c in view mode; [Download] [Up]
#include "../H/ugens.h" #include "../macros/macros.h" double fm(p,n_args) float *p; { float sicar,simod,*xarray,*sine,val; float evals[6],tabs[4],modphs,carphs; float *risef,*decayf,index,amp,diff,val2; int len1,len2,z,j; int output,nsamps,i; output = 1; /* in Cmix pfields start with p0, which is the starting time */ /* p2 is pitch of carrier, p3 is pitch of mod, p4&5 index low&hi, p6&7 rise and decay times p8 is amp, p9 is duration of envelope on modulator index */ /* writes on cmix file 1 */ sine = floc(1); /* function 1 is sine wave */ xarray = floc(2); /* function 2 is index guide */ decayf = risef = floc(3); /*function 3 is envlp shape */ len1 = fsize(1); /* lookup size of f1 */ len2 = fsize(2); /* lookup size of f2 */ sicar = cpspch(p[2]) * len1/SR; /* convert cps to si */ simod = cpspch(p[3]) * len1/SR; p[4] *= simod; diff = (p[5] * simod) - p[4]; modphs = carphs = 0; nsamps = setnote(p[0],p[1],output); z = SR/200; /* interrupt 200 times per sec (control rate)*/ evset(p[1],p[6],p[7],3,evals); /* set overall envelope */ tableset(p[9],len2,tabs); /* set index envelope */ for(i=j=0; i<nsamps; i++) { if(!j--) { amp = evp(i,risef,decayf,evals) * p[8]; index = diff * tablei(i,xarray,tabs) + p[4]; j=z; } val= oscil(index,simod,sine,len1,&modphs); val2= amp * osciln(1.,sicar+val,sine,len1,&carphs); /* osciln allows negative sampling increment */ ADDOUT(&val2,output); /* additive writes */ } endnote(output); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.