ftp.nice.ch/pub/next/unix/audio/sms.N.bs.tar.gz#/sms/tools/smsToLisp.c

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

#import <sms/sms.h>

/* program written by Celso Mendonca de Aguiar */

#define USAGE "Usage: smsToClm <smsFile> <outputFile>"

main (int ac, char *av[])
{
	SMSHeader *pSmsHeader;
	char *pData, *outfile, *inputFileName, *namedata;
	SMS_DATA smsData;
	int iError, havePhs, haveStoch, i, j, Ntrajet, NRec, counter;
	float amps, freqs, printfreqs, freqsm1, freqsp1, phs, gain, *freq_aver, Sum, min = 22050.0;
	FILE *fp;
  
	if (ac != 3) quit(USAGE);
	inputFileName = av[1];
	outfile = av[2];
	fp = fopen(outfile,"w");
	namedata = (char *)strtok (outfile,".");
	if((iError = readSmsFile (inputFileName, &pSmsHeader)) < 0)
	{ 
		if (iError == SMS_NOPEN)  printf("cannot open file");
		if (iError == SMS_RDERR)  printf("read error");
		if (iError == SMS_NSMS)   printf("not an SMS file");
		if (iError == SMS_MALLOC) printf("cannot allocate memory");
		printf("error");
	}
	havePhs = (!(pSmsHeader->iFormat == FORMAT_HARMONIC ||
               pSmsHeader->iFormat == FORMAT_INHARMONIC));
	haveStoch = (pSmsHeader->iStochasticType != STOC_NONE);
	Ntrajet = pSmsHeader->nTrajectories;
	NRec = pSmsHeader->nRecords;

	fprintf(fp,"#|\n");
	fprintf(fp, "This lisp was generated by smsToClm. \n\n");
	fprintf(fp, "HEADER INFORMATION:\n");
	fprintf(fp, "Number of records = %d\n", pSmsHeader->nRecords);
	fprintf(fp, "Frame rate = %d\n", pSmsHeader->iFrameRate);
	fprintf(fp, "Number of trajectories = %d\n", pSmsHeader->nTrajectories);
	fprintf(fp, "Number of coefficients = %d\n", pSmsHeader->nStochasticCoeff);
	fprintf(fp, "format = %d\n", pSmsHeader->iFormat);
	fprintf(fp, "stochastic type = %d\n", pSmsHeader->iStochasticType);
	fprintf(fp, "sampling rate = %.0f\n", pSmsHeader->fOriginalSRate);  
      
	if (pSmsHeader->nTextCharacters > 0) 
	{
		fprintf(fp, "\nANALYSIS ARGUMENTS:\n");
		fprintf(fp, "%s\n", pSmsHeader->pChTextCharacters);
	} 
	fprintf(fp,"|#\n\n");

	fprintf(fp, "(defparameter amp-%s (make-array %i :element-type 'array))\n", namedata, Ntrajet);
	fprintf(fp, "(defparameter frq-%s (make-array %i :element-type 'array))\n", namedata, Ntrajet);
	if (havePhs)
		fprintf(fp, "(defparameter pha-%s (make-array %i :element-type 'array))\n", namedata, 
		        Ntrajet);
	if (haveStoch)
	       fprintf(fp, "(defparameter coef-%s (make-array %i :element-type 'array))\n", namedata, NRec);
	fprintf(fp,"\n");

	for(j = 0; j < Ntrajet; j++) 
        {
		pData = (char *) pSmsHeader + pSmsHeader->iHeadBSize;
		fprintf (fp,"(setf (aref amp-%s %i) (make-array %i :initial-contents '(", namedata, j, NRec);
		for(i = 0; i < NRec; i++) 
		{
			setSmsRecord (pSmsHeader, pData, &smsData);
			amps = TO_MAG (smsData.pFMagTraj[j]);
			fprintf (fp,"%f ", amps);
			pData += pSmsHeader->iRecordBSize;
		}
		fprintf (fp,")))\n\n");
	}

	freq_aver = (float *) malloc(Ntrajet * sizeof(float));
	for(j = 0; j < Ntrajet; j++) 
	{
		pData = (char *) pSmsHeader + pSmsHeader->iHeadBSize;
		fprintf(fp,"(setf (aref frq-%s %i) (make-array %i :initial-contents '(", namedata, j, NRec);
		counter = 0;
		Sum = 0;
		freqsm1 = 0.0;
                setSmsRecord(pSmsHeader, pData, &smsData);
		freqs = smsData.pFFreqTraj[j];
		for(i = 0; i < NRec; i++) 
		{
			pData += pSmsHeader->iRecordBSize;
			setSmsRecord(pSmsHeader, pData, &smsData);
			freqsp1 = smsData.pFFreqTraj[j];
			printfreqs = freqs;
			if (freqs<0.000001 && freqsm1>0.0) printfreqs = freqsm1;
			if (freqs<0.000001 && freqsp1>0.0) printfreqs = freqsp1;
			Sum = Sum + freqs;
			if (freqs>0) counter++;
			fprintf(fp,"%f ", printfreqs);
			freqsm1 = freqs;
			freqs = freqsp1;			
		}
		freq_aver[j] = (float) (Sum / counter);
		fprintf(fp,")))\n\n");
	}

	fprintf (fp,"(defparameter freq-%s '(", namedata);
	for (j = 0; j < Ntrajet; j++) 
	{
		if (freq_aver[j] < min) min = freq_aver[j];
		fprintf (fp,"%f ", freq_aver[j]); 
	}
	fprintf (fp,"))\n\n(defparameter fund-%s %f)\n\n", namedata, min);

	if (havePhs) 
	{
		for (j = 0; j < Ntrajet; j++) 
		{
			pData = (char *) pSmsHeader + pSmsHeader->iHeadBSize;
			fprintf (fp,"(setf (aref pha-%s %i) (make-array %i :initial-contents '(", namedata, j, NRec);
			for (i = 0; i < NRec; i++) 
			{
				setSmsRecord (pSmsHeader, pData, &smsData);
				phs = smsData.pFPhaTraj[j];
				fprintf (fp,"%f ", phs);
				pData += pSmsHeader->iRecordBSize;
			}
			fprintf (fp,")))\n\n");
		}
	}

	if (haveStoch) 
	{		   
		pData = (char *) pSmsHeader + pSmsHeader->iHeadBSize;
		fprintf (fp,"(defparameter gain-%s (make-array %i :initial-contents '(", namedata, NRec);
		for (i = 0; i < NRec; i++)
		{
			setSmsRecord (pSmsHeader, pData, &smsData);
			gain = TO_MAG (*(smsData.pFStocGain));
			fprintf (fp,"%f ", gain);
			pData += pSmsHeader->iRecordBSize;
		}
		fprintf (fp,")))\n\n");

		pData = (char *) pSmsHeader + pSmsHeader->iHeadBSize;
		for(i = 0; i < NRec; i++) 
		{
			setSmsRecord (pSmsHeader, pData, &smsData);
			fprintf (fp,"(setf (aref coef-%s %i) (make-array %i :initial-contents '(0.00 ", namedata, i, 
			              2+pSmsHeader->nStochasticCoeff);
		        for (j = 0; j < smsData.nCoeff; j++)
			{
				fprintf (fp,"%f ", smsData.pFStocCoeff[j]);
			}
			fprintf (fp,"0.00)))\n\n");
			pData += pSmsHeader->iRecordBSize;
		}
	}
	exit(0);
}

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