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.