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.