ftp.nice.ch/pub/next/unix/audio/cmix.s.tar.gz#/cmix/lpc/lpcplay.c

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

#include "../macros/macros.h"
#define NPOLE        32 
#define FRAMSIZE     (NPOLE+4)
#define FPREC        22
#define RECSIZE      (FPREC*FRAMSIZE)
#define BPREC        (RECSIZE*FLOAT)
#define BPFRAME      (FRAMSIZE*FLOAT)

int anal;

float allpole(x,jcount,npoles,past,c)
float x,*past,*c;
int   *jcount,npoles;
{
	int j,nfint;
	for(j= *jcount, nfint=0;  nfint<npoles;  nfint++,j++)
		x += (*(c+nfint) * *(past+j));
	*(past+ *jcount) = *(past+*jcount+npoles) = x;
	*jcount = (*jcount + 1) % npoles;
	return(x);
}
float buzz(amp,si,hn,f,phs)
float amp,si,hn,*f,*phs;
{
	int j,k;
	float q,d,h2n,h2np1;
	j = *phs;
	k = (j+1) % 1024;
	h2n = 2. * hn; 
	h2np1 = h2n + 1.; 
	q = (int)((*phs - (float)j) * h2np1)/h2np1;
	d = *(f+j);
	d += (*(f+k)-d)*q;
	if(!d) q = amp;
          else { 
	    k = (long)(h2np1 * *phs) % 1024;
	    q = amp * (*(f+k)/d - 1.)/h2n;
	    } 
	*phs += si;
	while(*phs >= 1024.)  
		*phs -= 1024.;
	return(q);
}
/*
 *	ugens.h: define unit generator structure
 */
#define	UG_NSIZ	7	/*  Max len of UG name	*/
#define	UG_NULL	(struct ug_item *)0
#define NAMESIZE 128    /* Max size of file name */

#define FLOAT (sizeof(float))   /* nbytes in floating point word*/
#define INT   (sizeof(short))   /* nbytes in integer word */
#define SHORT (sizeof(short))
#define LONG  (sizeof(long))
#define NFILES       4    /* maximum number of opened files */
 
struct	ug_item	{
	struct	ug_item	*ug_next;
	int	(*ug_ptr)();	/*  Pointer to the function	*/
	char	*ug_name;
};
typedef	struct ug_item	ug_t;

extern	ug_t	*ug_list;
extern	addfunc();

#define	UG_INTRO(flabel,func)	\
	{ extern func();	\
		static ug_t this_ug = { UG_NULL, func, flabel }; \
		if (addfunc(&this_ug) == -1) merror(flabel);	}


#define      PI2    6.2831853
#define      PI     3.141592654
extern       float  SR;

#ifndef MAIN
extern int aargc;
extern char *aargv[];          /* to pass commandline args to subroutines */
#endif

 
/*  structure to pass to gen routines */
struct gen {
           int size;           /* size of array to load up */
           int nargs;          /* number of arguments passed in p array */
           float *pvals;       /* address of array of p values */
           float *array;       /* address of array to be loaded up */
           };
#ifndef SOUND
extern int (*addoutpointer[NFILES])();
extern int (*layoutpointer[NFILES])();
extern int (*wipeoutpointer[NFILES])();
extern int (*getinpointer[NFILES])();
extern int (*bwipeoutpointer[NFILES])();

#define ADDOUT(x,y)  (*addoutpointer[y])(x,y)
#define LAYOUT(x,l,y)  (*layoutpointer[y])(x,l,y)
#define WIPEOUT(x,y) (*wipeoutpointer[y])(x,y)
#define GETIN(x,y)   (*getinpointer[y])(x,y)
#define BWIPEOUT(x,y,z) (*bwipeoutpointer[y])(x,y,z)
#endif  SOUND

/* declarations of units */
long  setnot();
float reson(),oscil(),oscili(),osciln(),oscilni(),evp(),table(),tablei();
float cpspch(),pchcps(),cpsoct(),octcps(),pchoct();
float delget(),dliget(),boost(),rrand();
float octpch(),*floc();
play(p,n_args)
float *p;
{
	float buzzamp,ramp,xamp,amp,si,hn,phs,*f,out[4],srd2,magic;
	float c[FRAMSIZE],past[NPOLE*2],val,frames,frame1,frameno,ampmlt,errno;
	float *ballpole(),*bbuzz(),*brandf(),alpvals[2048],buzvals[2048];
	float buzz(),allpole();
	int jcount = 0;
	long seed,i,nsamps;
	int counter,flag;
	float thresh,randamp,randoff;
	float *cpoint;
	for(i=0; i<NPOLE*2; i++) past[i] = 0;

	anal = open("data/wasting13",0);
/* p0=start,p1=dur,p2=8ve.pch,p3=frame1,p4=frame2,p5=amp*/
	amp = p[5];
	si = cpspch(p[2])*512./SR;
	/* si just added now for counter */
	hn = (int)(SR * .5/cpspch(p[2]));	
	srd2 = SR/2.;
	magic = 512./SR;
	phs = 0;
	nsamps = setnote(p[0],p[1],0);
	frames = p[4] - p[3] + 1.;
	frame1 = p[3];
	randoff = 32767./2.;
	f = (float *)floc(1);
	randamp = .1/randoff;
	seed = 1;
	thresh = p[6];
	srand(1);  
	counter = 0; 
	cpoint = c + 4;
	ramp = ampmlt = errno = 0; /* to make tcc happy */
	i=nsamps;
	while(i--) {
		if(!counter--) {
			frameno = ((float)(nsamps - i)/nsamps)*frames + frame1;
			getfr(frameno,c);
			ampmlt = amp * c[0];
			errno = (c[2] > thresh) ? 0 : 1;  
			ramp = ampmlt * randamp;
			si = c[3] * magic;
			hn = (int)(srd2/c[3]);
			counter = (float)(SR/c[3]);
			counter = (counter > i) ? i : counter;
		}
		if(errno)
		val = buzz(ampmlt,si,hn,f,&phs);
		/*
		{BUZZ(val,ampmlt,si,hn,f,phs);}
		*/
		else
		val = (float)(rand()-randoff) * ramp;
		val = allpole(val,&jcount,NPOLE,past,cpoint);
		/*
		ALLPOLE(val,jcount,NPOLE,past,cpoint);
		*/
		WIPEOUT(&val,0);   
	}
	endnote(0);
}
getfr(frameno,c)
float frameno,*c;
{
	int frame,i,j;
	static float array[RECSIZE];
	float fraction;
	static int oldframe = 0;
	static int endframe = 0;
	frame = (int)frameno;
	fraction = frameno - (float)frame;
	if(!((frame >= oldframe) && (frame < endframe))) {
		lseek(anal,((long)frame*(long)BPFRAME),0); 
		read(anal,(char *)array,BPREC);
		oldframe = frame;
		endframe = oldframe + FPREC - 1;
		}

	for(i=(frame-oldframe)*FRAMSIZE,j=0; j<FRAMSIZE; i++,j++)  
		*(c+j) = *(array+i) + fraction * (*(array+i+FRAMSIZE) 
						- *(array+i));
}

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