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

Makefile
 
README
 
SMSSound.h
[View SMSSound.h] 
bin/
 
changes.txt
[View changes.txt] 
docs/
 
examples/
 
hybridMk/
 
library/
 
sms.h
[View sms.h] 
smsAnal/
 
smsClean/
 
smsEditor/
 
smsMk/
 
smsMod/
 
smsPrint/
 
smsResample/
 
smsSynth/
 
tools/
 

README

version of 4/7/95

-Overview of subdirectories

bin         - directory where the binaries will be installed.
docs		- various documents
examples    - examples of how to make the analysis and synthesis of different
              sounds.
hybridMk	- sound hybridization program based on the short-time Fourier
			  transform.
library     - library of common routines used in the sms programs.
smsAnal     - computes a .sms file from a .snd file. 
smsClean	- program to clean the .sms files. 
smsEditor   - NeXTSTEP application for displaying .sms files.
smsMk       - creates a .snd file from .score and .sms files.
smsMod      - modifies amplitude of the stochastic component in a .sms file.
smsPrint    - prints the contents of a .sms file.
smsResample - supports frame rate decimation in a .sms file.
smsSynth    - synthesizes a soundfile from a .sms file using IFFT.
tools       - several small programs:
		calcCorr:		compute the correlation of a sound
		printWindow:	print the windows used in smsAnal
		smsToLisp:      convert sms output to Lisp syntax
		smsToML:        convert sms output to MatLab format
		smsUnDb:        convert magnitudes in the sms file from dB to linear
		sndReverse:		reverse a sound
		smsSynthDet:	synthesize deterministic part of sms using table lookup 
						oscillators


- Standard way of using sms programs

.snd   -------->   .sms  ------------------> .snd
        smsAnal            smsMk, smsSynth

[the .sms file can be viewed with smsEditor.app and smsPrint]



-How to install

	Go the the main directory and do a "make install" on the Terminal. The 
binaries will be installed in the bin subdirectory.


-Description of the SMS file format

The SMS file includes a header of variable length and a set of records, each one of the same size.

The header is defined by the following structure:

typedef struct 
{
	/* fix part */
	int iSmsMagic;         /* magic number for SMS data file */
	int iHeadBSize;        /* size in bytes of header */
	int nRecords;	         /* number of data records */
	int iRecordBSize;      /* size in bytes of data record */
	int iFormat;           /* type of data format */
	int iFrameRate;        /* rate in Hz of data records */
	int iStochasticType;   /* representation of stochastic coefficients */
	int nTrajectories;     /* number of trajectoires in each record */
	int nStochasticCoeff;  /* number of stochastic coefficients in each	
 	                          record */
	float fAmplitude;      /* average amplitude of represented sound */
	float fFrequency;      /* average fundamental frequency */
	float fOriginalSRate;  /* sampling rate of original sound */
	int iBegSteadyState;   /* record number of begining of steady state */
	int iEndSteadyState;   /* record number of end of steady state */
	float fResidualPerc;   /* percentage of the residual with respect to the 
	                          original */
	int nLoopRecords;      /* number of loop records specified */
	int nSpecEnvelopePoints; /* number of breakpoints in spectral envelope */
	int nTextCharacters;   /* number of text characters */
	/* variable part */
	int *pILoopRecords;    /* array of record numbers of loop points */
	float *pFSpectralEnvelope; /* spectral envelope of partials */
	char *pChTextCharacters; /* Textual information relating to the sound */
	char *pChDataRecords;   /* pointer to data records */
} SMSHeader;


The header has two parts, one of fix length and another of variable length. The actual length of the variable part is specified in the fixed part.
The file sms.h has the macros that define some of the header parameters, such as the magic number of the different data formats. The file smsIO.c in the library has the functions that read and write this header structure.

After the header the file has the actual SMS data as a set of records. Each record includes the deterministic and stochastic representation of a given frame. The function setSmsRecord puts the data of a record into the following structure:

typedef struct 
{
	float *pFFreqTraj;         /* frequency of sinusoids */
	float *pFMagTraj;          /* magnitude of sinusoids */
	float *pFPhaTraj;          /* phase of sinusoids */
	int nTraj;                 /* number of sinusoids */
	float *pFStocGain;         /* gain of stochastic component */
	float *pFStocCoeff;        /* filter coefficients for stochastic component */
	int nCoeff;                /* number of filter coefficients */
} SMS_DATA;

This structure is the one generated by the analysis program and the one used by the synthesis program to generate a sound. This assumes equally spaced data. The data stored in the file is in a more compact form. In the file there is no need to store the number of trajectories and the number of coefficients in every record, since they are the same for every record in the file. There is also no need to store the pointers to the data since the arrays are stored in order. Thus when the file is actually used in the program the SMS_DATA structure is set to point to the appropiate places in the data record to be used.

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