This is lpcresynth.c in view mode; [Download] [Up]
/* lpcresynth routine by Perry R. Cook
Stanford CCRMA 1991.
This resynthesizes a sound from lpc
data with optional modifications. See
lpcInstructions for details.
*/
#import <stdio.h>
#import <fcntl.h>
#import <string.h>
#import <math.h>
#import <sound/sound.h>
#define MAX_BLOCK 4096
#define MAX_ORDER 100
#define ONE_OVER_RANDLIMIT 9.313225e-10
main(ac,av)
int ac;
char *av[];
{
char *file_name_in,*source_file_in,*file_name_out;
float coeffs[MAX_ORDER],Zs[MAX_ORDER],output,input;
int fd,fd2,fdOut,n_read,n_read2,n_write;
int i,j,k=0,hop_size,order,ticker;
float pitch=100,last_pitch,pitchfactor=1.0,timemult=1.0;
int sourceIn = 0;
if (ac>=3) {
if (ac==3) {
file_name_in = av[1];
file_name_out = av[2];
}
if (ac>=5) {
if (!strcmp(av[1],"-t")) {
timemult = atof(av[2]);
}
if (!strcmp(av[1],"-p")) {
pitchfactor = atof(av[2]);
}
if (!strcmp(av[1],"-s")) {
sourceIn = 1;
source_file_in = av[2];
}
file_name_in = av[3];
file_name_out = av[4];
}
if (ac>=7) {
if (!strcmp(av[3],"-t")) {
timemult = atof(av[4]);
}
if (!strcmp(av[3],"-p")) {
pitchfactor = atof(av[4]);
}
if (!strcmp(av[3],"-s")) {
sourceIn = 1;
source_file_in = av[4];
}
file_name_in = av[5];
file_name_out = av[6];
}
if (ac==9) {
if (!strcmp(av[5],"-t")) {
timemult = atof(av[6]);
}
if (!strcmp(av[5],"-p")) {
pitchfactor = atof(av[6]);
}
if (!strcmp(av[5],"-s")) {
sourceIn = 1;
source_file_in = av[6];
}
file_name_in = av[7];
file_name_out = av[8];
}
fd = open(file_name_in,0);
if (sourceIn) {
fd2 = open(source_file_in,0);
if (fd2==-1) {
fprintf(stderr,"I can't find the sound input file!!\n");
exit(0);
}
}
if (fd!=-1) {
if (!strcmp(file_name_in,file_name_out)) {
fprintf(stderr,"Input and output files can't have same name!!\n");
exit(0);
}
fdOut = creat(file_name_out, 0666);
n_read = read(fd,&order,4);
for (i=0;i<order;i++) Zs[i] = 0.0;
n_read = read(fd,&hop_size,4);
last_pitch = pitch;
n_read = read(fd,&pitch,4);
n_read = read(fd,&input,4);
if (pitchfactor>0)
ticker = pitch / pitchfactor;
else
ticker = 100.0/ fabs(pitchfactor);
hop_size *= timemult;
n_read = read(fd,coeffs,order*4);
while (n_read>0) {
for (i=0;i<hop_size;i++) {
output = 0.0;
if (!sourceIn) {
if ((pitch==0 && pitchfactor>0) || pitchfactor==0)
output = input * 20.0 * (1.0 - random() * ONE_OVER_RANDLIMIT);
else {
ticker -= 1;
if (ticker <= 0) {
output = input * pitch * 3;
if (pitchfactor>0)
ticker = pitch / pitchfactor;
else {
output = input * last_pitch * 3;
ticker = last_pitch / fabs(pitchfactor);
}
}
}
}
else {
n_read2 = read(fd2,&output,4);
if (!n_read2) {
fprintf(stderr,"I'm out of input samples!!!\n");
sourceIn = 0;
}
}
for (j=0;j<order;j++) output += Zs[j]*coeffs[j];
for (j=order-1;j>0;j--) Zs[j] = Zs[j-1];
Zs[0] = output;
n_write = write(fdOut,&output,4);
}
k += hop_size;
printf ("%i \n",k);
if (pitch>0) last_pitch = pitch;
n_read = read(fd,&pitch,4);
n_read = read(fd,&input,4);
n_read = read(fd,coeffs,order*4);
}
close(fd);
close(fdOut);
}
else
printf("I couldn't find your input file!!!\n");
}
else
printf("Format is lpcresynth [-t timemult] [-p pitchmult] [-s soundfile] infile.lpc outfile\n");
return;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.