This is timeshift.c in view mode; [Download] [Up]
#include <stdio.h>
#include <sound/sound.h>
#include <math.h>
/* ********************TIME SHIFT**************************************************/
main(int argc,char *argv[]) /* convolve two files */
{
short *data_in,*data_out;
unsigned char *codec_data_in,*codec_data_out;
char *file_in,*file_out;
SNDSoundStruct *sound_in, *sound_out, *sound_out2;
int num_samples,i,j,hopIn,hopOut,frame,num_frames;
int timeIn,timeInMax,timeOut,timeOutMax;
float factor;
double gain,delta;
if (argc<4) {
fprintf(stderr,"usage: timeshift factor [hopsize] filein fileout\n");
exit(0);
}
factor = atof(argv[1]);
if (argc==4) {
file_in = argv[2];
file_out = argv[3];
}
else {
file_in = argv[3];
file_out = argv[4];
}
if (SNDReadSoundfile(file_in,&sound_in)) {
fprintf(stderr,"Can't open first input file!!\n");
exit(0);
}
hopOut = 0.08 * sound_in->samplingRate;
if (argc>4) hopOut = atoi(argv[2]);
hopIn = hopOut / factor;
frame = 0.75 * hopOut;
delta = 0.5 / (double) frame / sound_in->channelCount;
SNDAlloc(&sound_out, (sound_in->dataSize + (hopOut + hopIn) * 2)* factor, sound_in->dataFormat,
sound_in->samplingRate, sound_in->channelCount, 12) ;
printf("Time shifting %s by %f to output file %s\n",file_in,factor,file_out);
if (sound_in->dataFormat==3) {
num_samples = sound_in->dataSize / 2 / sound_in->channelCount;
data_in = (short *) sound_in + sound_in->dataLocation;
data_out = (short *) sound_out + sound_out->dataLocation;
}
else {
SNDAlloc(&sound_out2, (sound_in->dataSize + (hopOut + hopIn)) * factor * 2, 3,
22050, 1, 12) ;
num_samples = sound_in->dataSize;
data_out = (short*) sound_out2 + sound_out2->dataLocation;
codec_data_in = (unsigned char*) sound_in + sound_in->dataLocation;
codec_data_out = (unsigned char*) sound_out + sound_out->dataLocation;
}
num_frames = (num_samples - hopOut) / hopIn;
printf("Number of Frames to do: %i\n",num_frames);
if (sound_in->dataFormat==3) {
for (i=0;i<num_samples * factor;i++) data_out[i] = 0;
if (sound_in->channelCount == 1) {
for (i=0;i<num_frames;i++) {
timeIn = hopIn * i;
timeInMax = timeIn + 3 * frame;
timeOut = hopOut * i;
timeOutMax = timeOut + 3 * frame;
gain = 0.0;
for (j=1;j<frame;j++) {
gain += delta;
data_out[j+timeOut] += gain * data_in[j + timeIn];
data_out[timeOutMax-j] += gain * data_in[timeInMax-j];
}
for (j=frame;j<=frame*2;j++) {
data_out[j+timeOut] += gain * data_in[j + timeIn];
}
printf("%i ",i);
}
}
else {
for (i=0;i<num_frames;i++) {
timeIn = hopIn * i;
timeInMax = timeIn + 3 * frame;
timeOut = hopOut * i;
timeOutMax = timeOut + 3 * frame;
gain = 0.0;
for (j=1;j<frame;j++) {
gain += delta;
data_out[2*(j+timeOut)] += gain * data_in[2*(j + timeIn)];
data_out[2*(timeOutMax-j)] += gain * data_in[2*(timeInMax-j)];
data_out[2*(j+timeOut)+1] += gain * data_in[2*(j + timeIn)+1];
data_out[2*(timeOutMax-j)+1] += gain * data_in[2*(timeInMax-j)+1];
}
for (j=frame;j<=frame*2;j++) {
data_out[2*(j+timeOut)] += gain * data_in[2*(j + timeIn)];
data_out[2*(j+timeOut)+1] += gain * data_in[2*(j + timeIn)];
}
printf("%i ",i);
}
}
}
else {
for (i=0;i<num_samples * factor;i++) codec_data_out[i] = SNDMulaw(0);
for (i=0;i<num_frames;i++) {
timeIn = hopIn * i;
timeInMax = timeIn + 3 * frame * sound_in->channelCount;
timeOut = hopOut * i;
timeOutMax = timeOut + 3 * frame * sound_in->channelCount;
gain = 0.0;
for (j=1;j<frame * sound_in->channelCount;j++) {
gain += delta;
data_out[j+timeOut] += gain * SNDiMulaw(codec_data_in[j + timeIn]);
data_out[timeOutMax-j] += gain * SNDiMulaw(codec_data_in[timeInMax-j]);
}
for (j=frame * sound_in->channelCount;j<=frame*2*sound_in->channelCount;j++) {
data_out[j+timeOut] += gain * SNDiMulaw(codec_data_in[j + timeIn]);
}
printf("%i ",i);
}
for (i=0;i<num_samples*factor;i++) codec_data_out[i] = SNDMulaw(data_out[i]);
SNDFree(sound_out2);
}
SNDWait(SNDWriteSoundfile(file_out,sound_out));
SNDFree(sound_in);
SNDFree(sound_out);
printf("Finished!!! \n\n");
return;
}These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.