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.