This is andylpcplay.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 MAXPOLES 32
int framsize;
int fprec;
int recsize;
int bprec;
int bpframe;
int npolem1;
int anal;
int i;
float cq,outold;
float FloatJunk;
float pow();
char dataset_name[80];
float thresh,randamp,randoff,unvoiced_rate;
int npoles,reson_is_on = 0;
int cf_fact,bw_fact;
lpcplay(p,n_args)
float *p;
{
float amp,si,hn,phs,*f,srd2,magic,d,warpset();
float c[MAXPOLES+4],past[MAXPOLES*2],frames,frameno,ampmlt,errno;
int frame1;
float ballpole(),alpvals[2048],buzvals[2048],pchval[2048];
float *cpoint;
float x,transposition,newpch;
int jcount,seed,i,nsamps,counter;
int nn,lastfr;
float transp,lasttr,tranincr;
float cps,tblvals[2],weight();
float rsnetc[5];
if(!n_args) {
printf(" p[0]=starting time, p[1]=duration, p[2]=pitch,p[3]=frame1, p4=frame2 p[5]=amp, p[6]=warp\n");
return;
}
sbrrand(.1);
for(i=0; i<npoles*2; i++) past[i] = 0;
if(anal <=0 ) {
printf("%d !!!No open dataset!",anal);
closesf();
}
srd2 = SR/2.;
magic = 512./SR;
jcount = phs = counter = 0;
seed = .1;
cpoint = c + 4;
printf("!!!\n");
p[1] = (p[1] > 0.) ? p[1] : ((p[4] - p[3] + 1.)/112.);
nsamps = setnote(p[0],p[1],0);
frames = p[4] - p[3] + 1.;
frame1 = (int)p[3];
for(i=p[3]; i<= p[4]; i++) {
d = i;
getfr(d,c);
pchval[i - (int)p[3]] = c[PITCH];
}
printf("pchval array is loaded!\n");
if(ABS(p[2]) < 1.) {
FloatJunk=(p[2]/.12);
FloatJunk=pow(2.0,FloatJunk);
transposition=FloatJunk;
transposition = (pow(2.0,(p[2]/.12)));
}
else transposition = cpspch(p[2])/weight(cpspch(p[2]),p[3],p[4],thresh);
printf("pchval array is loaded,transp=!\n,transposition");
if(n_args == 6) {
printf("\Overall transposition: %f\n",transposition);
for(i=frame1;i<=(int)p[4];i++) {
pchval[(i - frame1)] *= transposition;
}
}
else {
nn=5;
lastfr=frame1;
lasttr=transposition;
while((nn+=2)<n_args) {
if(ABS(p[nn+1]) < 1.) {
transp = pow(2.0,(p[nn+1]/.12));
}
else {
transp = cpspch(ABS(p[nn+1]))/weight(cpspch(ABS(p[nn+1])),(float)lastfr,(p[nn]+1.),thresh);
}
tranincr=(transp-lasttr)/(p[nn]-lastfr);
transp=lasttr;
for(i=lastfr;i<(int)p[nn];i++) {
pchval[i-frame1]*=transp;
transp+=tranincr;
}
lastfr=p[nn];
lasttr=transp;
}
if(p[n_args-2] < p[4]) {
/* last frame in couplets wasn't last frame in batch, so use
base value from there to the end */
transp = transposition;
for(i=lastfr;i<(int)p[4];i++) {
pchval[i-frame1]*=transp;
}
}
}
tableset(p[1],(int)(p[4]-p[3]+1),tblvals);
amp = p[5];
d = p[6];
f = (float *)floc(1);
for(i=0; i<5; i++) rsnetc[i]=0;
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 = cps;
if(reson_is_on) rsnset(cf_fact*cps, bw_fact*cf_fact*cps,
(errno ? 1 : 2),0.,rsnetc);
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,npoles,
past,cpoint,alpvals,counter);
if(reson_is_on) breson(alpvals,rsnetc,alpvals,counter);
}
baddout(alpvals,0,counter);
}
endnote(0);
}
reson_on(p,n_args)
float *p;
{
if(p[0]) reson_is_on = 1;
else {
reson_is_on = 0;
return;
}
/* p0 is multiple of pitch to use, p1 is bw as multiple of center freq */
cf_fact = p[0];
bw_fact = p[1];
printf(" reson turned on, cf_fact,bw_fact=%f %f\n",cf_fact,bw_fact);
return;
}
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=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];
outold = sig;
return(sig);
}
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[22*(MAXPOLES+4)];
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);
}
static long randx = 1;
/*
srrand(x)
unsigned x;
{
randx = x;
}
*/
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,throsh)
float newpch,frame1,frame2,throsh;
{
float c[MAXPOLES+4];
int i;
float xweight,sum;
xweight = sum = 0;
for(i=(int)frame1; i<(int)frame2; i++) {
getfr((float)i,c);
if(c[THRESH] <= throsh) {
xweight += c[RMSAMP];
sum += (c[PITCH] * c[RMSAMP]);
}
}
return(sum/xweight);
}
dataset(p,n_args)
/* p1=dataset name, p2=npoles */
float *p;
int n_args;
{
char *name;
int i;
fprec=22;
if(n_args>1) {
npoles=p[1];
npolem1=npoles-1;
framsize=npoles+4;
recsize=fprec*framsize;
bprec=recsize*FLOAT;
bpframe=framsize*FLOAT;
}
lpcinit();
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);
printf("anal is %d",anal);
}
lpcstuff(p,n_args)
/* p1=thresh, p2=random amp, p3=unvoiced rate */
float *p;
int n_args;
{
if(n_args>0)
thresh=p[0];
if(n_args>1)
randamp=p[1];
if(n_args>2)
unvoiced_rate=p[2];
printf("\nAdjusting settings for %s.\n",dataset_name);
printf(" --------------------------------------- \n");
printf("Thresh: %f Randamp: %f\n",thresh,randamp);
if(unvoiced_rate == 1)
printf("Unvoiced frames played at normal rate.\n\n");
else
printf("Unvoiced frames played at same rate as voiced 'uns.\n\n");
}
lpcinit()
{
recsize=framsize*fprec;
bprec=recsize*FLOAT;
bpframe=framsize*FLOAT;
}
/* block version of rrand */
/* a modification of unix rand() to return floating point values between
+ and - 1. */
sbrrand(x)
unsigned x;
{
randx = x;
}
brrand(am,a,j)
float am,*a;
{
int k;
for(k=0; k<j; k++) {
int i = ((randx = randx*1103515245 + 12345)>>16) & 077777;
*a++ = (float)(i/16384. - 1.) * am;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.