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

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

#include "../H/ugens.h"
#include "../H/sfheader.h"
#include <stdio.h>
#define RESIDAMP     0
#define RMSAMP       1
#define THRESH       2
#define PITCH	     3
			/* values in locs 0-3 of frame*/
#define MAXPOLES        50 
#define FPREC        22
int Npoles,Npolem1,Framsize,Recsize,Bprec,Bpframe;

int anal;
float cq,outold;
extern SFHEADER sfdesc[NFILES];
char dataset_name[80];

lpcplay(p,n_args)
float *p;
{
	float amp,si,hn,phs,*f,srd2,magic,d,warpset();
	float c[MAXPOLES+4],past[MAXPOLES*2],frames,frame1,frameno,ampmlt,errno;
	float ballpole(),alpvals[2048],buzvals[2048];
	float randamp,randoff;
	float *cpoint;
	float x,transposition,newpch;
	int jcount,seed,i,nsamps,counter;
	float tblvals[2];
	int nread,input, output, j,k;


	if(n_args != 7) {
printf(" incorrect argument list: p[0]=starting time, p[1]=duration,p[2]=frame1, p[3]=frame2 p[4]=amp,p[5]=d,p[6]=inputskip\n");
		return;
	}
	if(anal <= 0) { printf("No lpc dataset has been opened\n"); return;}
	input = 0; output=1;
	if(sfchans(&sfdesc[output]) != 1) { 
		printf("Output file must have 1 channel only\n");
		return;
		}
	if(sfchans(&sfdesc[input]) != 1) { 
		printf("Input file must have 1 channel only\n");
		return;
		}
	Npolem1 = Npoles-1;
	Framsize = (Npoles+4);
	Recsize = FPREC*Framsize;
	Bprec = Recsize*FLOAT;
	Bpframe = Framsize*FLOAT;

	for(i=0; i<Npoles*2; i++) past[i] = 0;

	srd2 = SR/2.;
	magic = 512./SR;
	jcount = phs = counter = 0; 
	randamp = .1;
	seed = .1;
	cpoint = c + 4;

	nsamps = setnote(p[0],p[1],output);
                 setnote(p[6],p[1],input);
	frames = p[3] - p[2] + 1.;
	frame1 = p[2];
	amp = p[4];
	d = p[5];

	if(anal <=0 ) {
		printf("No open dataset!");
		return;	
	}

	warpinit();
	for(i=nsamps; i>0; i -=counter) {
			frameno = ((float)(nsamps - i)/nsamps)*frames + frame1;
			if(getfr(frameno,c) == -1) break;
			ampmlt = c[0];
			newpch = c[3];
			counter = (float)(SR/newpch);
			counter = (counter > i) ? i : counter;
			if(counter <= 0) break;

			nread=bgetin(buzvals,input,counter*sfchans(&sfdesc[input]));
			if(d) {
                                ampmlt *=  warpset(d,cpoint);
                                bwarppol(buzvals,past,d,cpoint,alpvals,counter);
			}
			else
				ballpole(buzvals,&jcount,Npoles,
		               			past,cpoint,alpvals,counter);

			bmultf(alpvals,ampmlt,counter);
			bwipeout(alpvals,output,counter);   
		}
	endnote(output);
}
float warpset(d,c)     
float d,*c;
{
	int m;
	float cl;

	for(m=1; m<Npoles; m++)   c[m] += d * c[m-1];
	cl = 1./(1.-d * c[Npolem1]);
	cq = cl * (1. - d * d);
	return(cl);
}
warpinit()
{
	outold = 0;
}
bwarppol(sig,past,d,c,out,nvals)
float *sig,*past,d,*c,*out;
{
	float temp1,temp2;
	int i,n;
	for(i=0; i<nvals; i++) {
		temp1 = past[Npolem1];
		past[Npolem1] = cq * outold - d * past[Npolem1];
		for(n=Npoles-2; n>=0; n--) {
			temp2 = past[n];
			past[n] = d * (past[n+1] - past[n]) + temp1;
			temp1 = temp2;
			}
		for(n=0;n<Npoles;n++)  *sig += c[n] * past[n];
		*out++ = outold = *sig++;
	}
}
getfr(frameno,c)
float frameno,*c;
{
	int frame,i,j;
	static float array[(MAXPOLES+4)*FPREC];
	float fraction;
	static int oldframe = 0;
	static int endframe = 0;
	frame = (int)frameno;
	fraction = frameno - (float)frame;
	if(!((frame >= oldframe) && (frame < endframe))) {
		if(lseek(anal,((long)frame*(long)Bpframe),0) == -1) {
			fprintf(stderr,"bad lseek on analysis file \n");
			return(-1);
		} 
		if(read(anal,(char *)array,Bprec) <= 0) {
			fprintf(stderr,"reached eof on analysis file \n");
			return(-1);
		}
		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));
	return(0);
}
dataset(p,n_args)
/* p1=dataset name, p1=npoles */
float *p;
{
	char *name;
	int i;

	i=(int)p[0];
	name=(char *)i;
	if(strcmp(name,dataset_name)== 0) {
		printf("\n%s is already open.\n",name);
		return;
		}
	strcpy(dataset_name,name);
	if((anal = open(name,0)) <= 0) {
		printf("Can't open %s\n",name);
		closesf();
		}
	printf("\nOpened dataset %s.\n",name);
	Npoles = p[1];
}

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