This is warplpc.c in view mode; [Download] [Up]
#include "../H/ugens.h" #include <stdio.h> #define RESIDAMP 0 #define RMSAMP 1 #define THRESH 2 #define PITCH 3 /* values in locs 0-3 of frame*/ #define NPOLE 32 #define NPOLEM1 31 #define FRAMSIZE (NPOLE+4) #define FPREC 22 #define RECSIZE (FPREC*FRAMSIZE) #define BPREC (RECSIZE*FLOAT) #define BPFRAME (FRAMSIZE*FLOAT) int anal; float cq,outold; lpcplay(p,n_args) float *p; { float amp,si,hn,phs,*f,srd2,magic,d,warpset(); float c[FRAMSIZE],past[NPOLE*2],frames,frame1,frameno,ampmlt,errno; float ballpole(),alpvals[2048],buzvals[2048],pchval[2048]; float thresh,randamp,randoff; float *cpoint; float x,transposition,newpch; int jcount,seed,i,nsamps,counter; float cps,tblvals[2],weight(); if(!n_args) { /* printf(" p[0]=starting time, p[1]=duration, p[2]=pitch,p[3]=frame1, p4=frame2 p[5]=amp, p[6]=thresh, p[7]=d\n"); */ return; } for(i=0; i<NPOLE*2; i++) past[i] = 0; if((anal = open("data/wasting13",0)) < 0) { printf("can't open analysis file\n"); return; } srd2 = SR/2.; magic = 512./SR; jcount = phs = counter = 0; randamp = .1; seed = .1; cpoint = c + 4; /* p0=start,p1=dur,p2=8ve.pch,p3=frame1,p4=frame2,p5=amp,p6=thresh,p7=d*/ nsamps = setnote(p[0],p[1],0); thresh = p[6]; frames = p[4] - p[3] + 1.; frame1 = p[3]; for(i=p[3]; i<= p[4]; i++) { d = i; getfr(d,c); pchval[i - (int)p[3]] = c[PITCH]; } if(ABS(p[2]) < 1.) transposition = octpch(p[2]); else transposition = octpch(p[2]) - octcps(weight(p[2],p[3],p[4],thresh)); printf("%f\n",transposition); tableset(p[1],(int)(p[4]-p[3]+1),tblvals); amp = p[5]; d = p[7]; f = (float *)floc(1); warpinit(); for(i=nsamps; i>0; i -=counter) { frameno = ((float)(nsamps - i)/nsamps)*frames + frame1; if(getfr(frameno,c) == -1) break; errno = (c[2] > thresh) ? 0 : 1; ampmlt = (errno) ? amp * c[0] : amp * c[0] * randamp; cps = tablei(nsamps-i,pchval,tblvals); newpch = cpsoct(octcps(cps)+transposition); si = newpch * magic; hn = (int)(srd2/newpch); counter = (float)(SR/newpch); counter = (counter > i) ? i : counter; if(counter <= 0) break; if(errno) bbuzz(ampmlt,si,hn,f,&phs,buzvals,counter); else brrand(ampmlt,buzvals,counter); if(d) { ampmlt *= warpset(d,cpoint); bwarppol(buzvals,past,d,cpoint,alpvals,counter); } else ballpole(buzvals,&jcount,NPOLE, past,cpoint,alpvals,counter); bwipeout(alpvals,0,counter); } endnote(0); } float warppol(sig,past,d,c) float sig,*past,d,*c; { float temp1,temp2; int n; temp1 = past[NPOLEM1]; past[NPOLEM1] = cq * outold - d * past[NPOLEM1]; for(n=NPOLE-2; n>=0; n--) { temp2 = past[n]; past[n] = d * (past[n+1] - past[n]) + temp1; temp1 = temp2; } for(n=0;n<NPOLE;n++) sig += c[n] * past[n]; outold = sig; return(sig); } float warpset(d,c) float d,*c; { int m; float cl; for(m=1; m<NPOLE; 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=NPOLE-2; n>=0; n--) { temp2 = past[n]; past[n] = d * (past[n+1] - past[n]) + temp1; temp1 = temp2; } for(n=0;n<NPOLE;n++) *sig += c[n] * past[n]; *out++ = outold = *sig++; } } 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))) { 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); } float table(nsample,array,tab) long nsample; float *array,*tab; { register loc = ((float)(nsample)/(*tab)) * *(tab+1); if(loc >= *(tab+1)) loc = *(tab+1); return(*(array + loc)); } float weight(newpch,frame1,frame2,thresh) float newpch,frame1,frame2; { float c[FRAMSIZE]; int i; float xweight,sum; xweight = sum = 0; for(i=(int)frame1; i<(int)frame2; i++) { getfr((float)i,c); if(c[THRESH] > thresh) continue; xweight += c[RMSAMP]; sum += (c[PITCH] * c[RMSAMP]); } return(sum/xweight); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.