ftp.nice.ch/pub/next/unix/audio/Cmix.N.s.tar.gz#/cmix/fancier.instruments/iir.c

This is iir.c in view mode; [Download] [Up]

#include "../H/ugens.h"
#include "../macros/macros.h"

float rsnetc[64][5],amp[64];
int nresons;
#define SIZE 1024
float array[SIZE];

double inputsig(p,n_args)
float *p;
{
	int nsamps,input,output,inchan,outchan,i,j,jj,kontrol;
	float xin[4],out[4],val,q[9],ovamp,*evenv,tabs[3];
	/*start,dur,inskip */
	input=0; output=1;
	nsamps=setnote(p[0],p[1],output);
	setnote(p[2],p[1],input);
	inchan = 0;  outchan = 0;
	evset(p[1],.01,.1,2,q);
	evenv = floc(2);
	tableset(p[1],SIZE,tabs);

	kontrol = SR/500; jj=0;
	for(i=0; i<nresons; i++) rsnetc[i][3] = rsnetc[i][4] = 0;

	for(i=0; i<nsamps; i++) {
		if(!jj--) {
			jj=kontrol;
			ovamp = tablei(i,array,tabs);
			
		}
		if(!GETIN(xin,input)) break;
		for(out[outchan]=0,j=0; j<nresons; j++) {
			RESON(val,xin[inchan],rsnetc[j]);
			out[outchan] += val * amp[j];
		}
		out[outchan] *= ovamp;
		ADDOUT(out,output);
	}
	endnote(output);
}

double noise(p,n_args)
float *p;
{
	int nsamps,input,output,inchan,outchan,i,j;
	float ramp,sig,xin[4],out[4],val;
	float tabs[3],ovamp;
	int jj,kontrol;
	/* start,dur,amp */
	input=0; output=1;
	nsamps=setnote(p[0],p[1],output);
	outchan = 0;
	ramp=p[2];  if(!ramp) ramp=1;
	srrand(.1);
	kontrol = SR/500; jj=0;
	tableset(p[1],SIZE,tabs);

	for(i=0; i<nresons; i++) rsnetc[i][3] = rsnetc[i][4] = 0;

	for(i=0; i<nsamps; i++) {
		if(!jj--) {
			jj=kontrol;
			ovamp = tablei(i,array,tabs);
			
		}

		sig = rrand();
		for(out[outchan]=0,j=0; j<nresons; j++) {
			RESON(val,sig,rsnetc[j]);
			out[outchan] += val * amp[j];
		}
		out[outchan] *= ovamp;
		ADDOUT(out,output);
	}
	endnote(output);
}

double buzzit(p,n_args)
float *p;
{
	int nsamps,len,input,output,inchan,outchan,i,j;
	float hn,bamp,phase,si,*f1,sig,xin[4],out[4],val;
	float tabs[3],ovamp;
	int jj,kontrol;
	/* start,dur,amp,pitch (<15 8ve.pc) */ 
	input=0; output=1;
	nsamps=setnote(p[0],p[1],output);
	outchan = 0;
	bamp=p[2]; 
	si = p[3] < 15 ? cpspch(p[3])*512./SR : p[3] * 512./SR;
	hn = (int)(.5 / (si/512.));
	f1 = floc(1);
	phase = 0;
	kontrol = SR/500; jj=0;
	tableset(p[1],SIZE,tabs);

	srrand(.1);
	for(i=0; i<nresons; i++) rsnetc[i][3] = rsnetc[i][4] = 0;

	for(i=0; i<nsamps; i++) {
		if(!jj--) {
			jj=kontrol;
			ovamp = tablei(i,array,tabs);
			
		}

		BUZZ(sig,bamp,si,hn,f1,phase);
		for(out[outchan]=0,j=0; j<nresons; j++) {
			RESON(val,sig,rsnetc[j]);
			out[outchan] += val * amp[j];
		}
		out[outchan] *= ovamp;
		ADDOUT(out,output);
	}
	endnote(output);
}

double pulseit(p,n_args)
float *p;
{
	int nsamps,input,output,inchan,outchan,i,j;
	float pulse(),phase,pamp,si,sig,xin[4],out[4],val;
	float tabs[3],ovamp;
	int jj,kontrol;
	/* start,dur,pulseamp,pitch (<15 8ve.pc) */
	input=0; output=1;
	phase = 512;
	nsamps=setnote(p[0],p[1],output);
	outchan = 0;
	pamp = p[2];
	kontrol = SR/500; jj=0;
	tableset(p[1],SIZE,tabs);

	si = p[3] < 15 ? cpspch(p[3])*512./SR : p[3] * 512./SR;
	for(i=0; i<nresons; i++) rsnetc[i][3] = rsnetc[i][4] = 0;

	for(i=0; i<nsamps; i++) {
		if(!jj--) {
			jj=kontrol;
			ovamp = tablei(i,array,tabs);
			
		}

		sig = pulse(pamp,si,&phase);
		for(out[outchan]=0,j=0; j<nresons; j++) {
			RESON(val,sig,rsnetc[j]);
			out[outchan] += val * amp[j];
		}
		out[outchan] *= ovamp;
		ADDOUT(out,output);
	}
	endnote(output);
}

double setup(p,n_args)
float *p;
{
	int i,j;
	float first,bw,cf;
	
	first = (p[0] < 15) ? cpspch(p[0]) : p[0];
	bw = p[1] < 0 ? -p[1] * first : p[1];
	rsnset(first,bw,1.,0.,rsnetc[0]);
	printf("centerfreq    bandwidth  relative amp\n");
	amp[0] = p[2];
	printf("%10.4f %10.4f %10.4f\n",first,bw,amp[0]);
	for(i=3,j=1; i<n_args; i += 3)  {
		if(p[i] < 0.) cf = -p[i] * first;
		else  cf = (p[i] < 15) ? cpspch(p[i]) : p[i];
		bw = p[i+1] < 0 ? -p[i+1] * cf : p[i+1];
		amp[j] = p[i+2]; 
		rsnset(cf ,bw ,1.,0.,rsnetc[j]);
		printf("%10.4f %10.4f %10.4f\n",cf,bw,amp[j]); 
		j++;
	}
	nresons = j;
}
float pulse(amp,si,phase)
float amp,*phase,si;
{

	*phase += si;
	if(*phase > 512.) {
		*phase -= 512.;
		return(amp);
	}
	else return(0.);
}
double sl(p,n_args)
float *p;
{
	int i;
	setline(p,n_args,SIZE,array);
}


int NBYTES = 32768;
 
profile()
{
	float p[9];
	int i;
	for(i=0; i<SIZE; i++) array[i] = 1.;
	UG_INTRO("setup",setup);
	UG_INTRO("resons",setup);
	UG_INTRO("inputsig",inputsig);
	UG_INTRO("noise",noise);
	UG_INTRO("buzz",buzzit);
	UG_INTRO("pulse",pulseit);
	UG_INTRO("envelope",sl);
	
	p[0]=1; p[1]=10; p[2]=1024; p[3]=1;
	makegen(p,4);  /* store sinewave in array 1 */
	p[0]=2; p[1]=7; p[2]=512; p[3]=0; p[4]=512; p[5]=1; 
	makegen(p,6);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.