ftp.nice.ch/pub/next/unix/developer/_VoiceClass.s/VoiceClass/FOF/fof.c

This is fof.c in view mode; [Download] [Up]

/*
 *     Generated by the NeXT Interface Builder.
 */

#import <stdio.h>
#import <fcntl.h>
#import <string.h>
#include <sound/sound.h>
#include <math.h>

#define TWO_PI  6.28
#define SRATE 22050.0
#define FOF_LENGTH 100.0

/*  fof routine by Perry R. Cook
			Stanford CCRMA 1991.
	You specify formant centers and amplitudes,
	the program synthesizes a soundfile.
	See fofinstructions for details.
*/ 

main(ac,av) 
    int ac;
    char *av[]; 
{
    char *sound_file;
    double freq0,freq1,freq2,freq3,gain1,gain2,gain3;
    SNDSoundStruct *sound_out;
    short *data_out;
    double window,time,period,win_freq;
    int i,j,k,m,total_samples;
	
    if (ac==10)	{
	total_samples = atoi(av[1]);
	freq0 = atoi(av[2]);
	freq1 = atoi(av[3]) * TWO_PI / SRATE;
	freq2 = atoi(av[4]) * TWO_PI / SRATE;
	freq3 = atoi(av[5]) * TWO_PI / SRATE;
	gain1 = atoi(av[6]);
	gain2 = atoi(av[7]);
	gain3 = atoi(av[8]);
      	sound_file = av[9];
	SNDAlloc(&sound_out, total_samples * 2,SND_FORMAT_LINEAR_16, SRATE,1,20);
	data_out = (short *) sound_out + sound_out->dataLocation;
	time = 0;
	if (freq0>0) period = SRATE / freq0; else period = total_samples-1;
	win_freq = TWO_PI / FOF_LENGTH;
	while (time < total_samples - period)    {
	    j = time;
	    for (k=0;k<FOF_LENGTH;k++)	{
	        window = 1.0 - cos(win_freq * k);
		data_out[j+k] += gain1 * sin(k*freq1) * window;
		data_out[j+k] += gain2 * sin(k*freq2) * window;
		data_out[j+k] += gain3 * sin(k*freq3) * window;
	    }
	    time +=period;
	}
    	SNDWait(SNDWriteSoundfile(sound_file,sound_out));
	SNDFree(sound_out);
    }
    else
      printf("Format is fof numSamples f0 f1 f2 f3 gain1 gain2 gain3 soundfile.snd\n");
    return;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.