/*
 * Copyright (c) 1983-2020 Trevor Wishart and Composers Desktop Project Ltd
 * http://www.trevorwishart.co.uk
 * http://www.composersdesktop.com
 *
 This file is part of the CDP System.
 
 The CDP System is free software; you can redistribute it
 and/or modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.
 
 The CDP System is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public
 License along with the CDP System; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 02111-1307 USA
 *
 */
#include <stdio.h>
#include <standalone.h>
#include <string.h>
#include <speccon.h>
#include <science.h>

#define RRRR_EXTEND (345)
#define SEMITONES_PER_OCTAVE (12)

static void RoomReverbFormat(void);
const char* cdp_version = "6.1.0";

/******************************** TKUSAGE_OTHER ********************************/

int main(int argc, char *argv[])
{
    int process, mode;
    if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
        fprintf(stdout,"%s\n",cdp_version);
        fflush(stdout);
        return 0;
    }
    if(argc!=3) {
        fprintf(stdout,"ERROR: Error in usage program tkusage_other\n");
        return -1;
    }
    if(sscanf(argv[1],"%d",&process)!=1) {
        fprintf(stdout,"ERROR: Failed to read process number in tkusage_other\n");
        return -1;
    }
    if(sscanf(argv[2],"%d",&mode)!=1) {
        fprintf(stdout,"ERROR: Failed to read process number in tkusage_other\n");
        return -1;
    }
    switch(process) {
    case(TAPDELAY):
        fprintf(stdout,"INFO: STEREO MULTI-TAPPED DELAY WITH SPATIAL POSITIONING OF DELAYS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DELAY TIMES AMPS (& POSITIONS). A Text Datafile.\n");
        fprintf(stdout,"INFO:       Each line has either 2 values (TIME , AMPLITUDE of one delay).\n");
        fprintf(stdout,"INFO:                    or 3 values (third value specifies spatial POSITION of this delay in the stereo space).\n");
        fprintf(stdout,"INFO:       TIMES (seconds) must be increasing. Duplicate times are ignored.\n");
        fprintf(stdout,"INFO:       A zero time (no delay) overrides the mix parameter,\n");
        fprintf(stdout,"INFO:       and determines the level and pan of the (effectively mono) input.\n");
        fprintf(stdout,"INFO:       AMP values must be in the range 0.0 to 1.0\n");
        fprintf(stdout,"INFO:       Empty lines and lines starting with a semi-colon (e.g. comments) are permitted.\n");
        fprintf(stdout,"INFO:       If a Position value is used in any line, outfile will be stereo.\n");
        fprintf(stdout,"INFO:       POSITION values are nominally in the range -1 to +1:     0 = centre.\n");
        fprintf(stdout,"INFO:       If all position values are 0, the output will be mono.\n");
        fprintf(stdout,"INFO:       Values beyond these limits result in attenuation according to the\n");
        fprintf(stdout,"INFO:       inverse-square law, to suggest distance beyond the speakers.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT GAIN ...........Gain applied to output signal.\n");
        fprintf(stdout,"INFO: FEEDBACK ..............Proportion of output signal fed back into input.\n");
        fprintf(stdout,"INFO:                                       (Negative values invert phase of feedback).\n");
        fprintf(stdout,"INFO: SOURCE SIGNAL IN MIX...Proportion of original src sound mixed with the delay-output.\n");
        fprintf(stdout,"INFO: DECAY TAIL DURATION....Time allowed for delays to decay to zero.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(RMRESP):
        fprintf(stdout,"INFO: GENERATE ROOM RESPONSE DATA SUITABLE FOR USE WITH REVERB PROGRAMS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LIVENESS...................... degree of reflection from each surface.\n");
        fprintf(stdout,"INFO: NUMBER OF REFLECTIONS......... number of reflections from each surface.\n");
        fprintf(stdout,"INFO:            (WARNING: high values will create extremely long data files!).\n");
        fprintf(stdout,"INFO: ROOM LENGTH, WIDTH, HEIGHT.... The size of the room, in metres.\n");
        fprintf(stdout,"INFO: SRC POSITION, LENGTHWAYS, WIDTHWAYS & HEIGHT within the room, in metres.\n");;
        fprintf(stdout,"INFO: LISTENER POSITION LENGTHWAYS, WIDTHWAYS, & HEIGHT within the room, in metres.\n");;
        fprintf(stdout,"INFO: PEAK AMPLITUDE OF DATA\n");
        fprintf(stdout,"INFO: REFLECTION TIME RESOLUTION (MS).\n");;
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT is a text datafile suitable for use with MULTIPLE-DELAYS, REVERB or ROOM REVERB processes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB: The first output time is non-zero.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(RMVERB):
        fprintf(stdout,"INFO: MULTI-CHANNEL REVERB WITH ROOM SIMULATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: An OPTIONAL Text Datafile. (Enter '0' to use preset values instead)......\n");
        RoomReverbFormat();
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ROOM SIZE......................1 small, 2 medium, 3 large.\n");
        fprintf(stdout,"INFO: DENSE REVERB GAIN..............level of the dense reverberation.\n");
        fprintf(stdout,"INFO: SOURCE SIGNAL IN MIX...........Proportion of original src sound mixed with the delay-output.\n");
        fprintf(stdout,"INFO: FEEDBACK ......................Proportion of output signal fed back into input.\n");
        fprintf(stdout,"INFO: AIR-ABSORPTION FILTER CUTOFF...Cutoff frq (Hz) of low pass filter modelling air absorption.\n");
        fprintf(stdout,"INFO:                                       (typically 2500Hz for Large room, 4200Hz for small: set to ZERO for NO absorption).\n");
        fprintf(stdout,"INFO: LOWPASS REVERB-INPUT CUTOFF....Cutoff frq (Hz) of low pass filter on input to reverb.\n");
        fprintf(stdout,"INFO:                                       (set to ZERO for NO filtering of input).\n");
        fprintf(stdout,"INFO: DECAY TAIL DURATION............Time allowed for delays to decay to zero.\n");
        fprintf(stdout,"INFO: LOWPASS INPUT CUTOFF...........Cutoff frq (Hz) of low pass filter on source.\n");
        fprintf(stdout,"INFO: HIGHPASS INPUT CUTOFF..........Cutoff frq (Hz) of high pass filter on source.\n");
        fprintf(stdout,"INFO: REVERB PREDELAY (MS)...........Force delay to start at specified time.\n");
        fprintf(stdout,"INFO: NUMBER OF OUTPUT CHANNELS......Defaults to stereo.\n");
        fprintf(stdout,"INFO: DOUBLE AIR-ABSORPTION.........(Reduces reverb time: Increase Feedback to compensate).\n");
        fprintf(stdout,"INFO: FLOATING POINT OUTPUT FILE.....or not.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MIXMULTI):
        fprintf(stdout,"INFO: MULTI-CHANNEL MIXING FOR UP TO 64-CHANNELS, WITH CHANNEL CROSS-THREADING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIXING STARTTIME...starttime in mix (to start mixing later than zero).\n");
        fprintf(stdout,"INFO: MIXING ENDTIME.....endtime in mix (to stop mix before its true end).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Note that the START and END params intended for mix TESTING purposes only.\n");
        fprintf(stdout,"INFO: If you want to keep output from such a testmix, you should TOPNTAIL it.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ATTENUATION.......reduce the mix level, if necessary.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIXFILE FORMAT FOR MULTICHANNEL MIXING:\n");
        fprintf(stdout,"INFO: The first line indicates the number of output channels.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The ensuing lines have the following format   e.g.\n");
        fprintf(stdout,"INFO: snd1.wav 0.0 4  1:1 .5 2:2 .5 3:3 .5 4:4 .5\n");
        fprintf(stdout,"INFO: snd2.wav 2.0 4  1:1 .25 2:1 .25 3:1 .25 4:1 .25\n");
        fprintf(stdout,"INFO: snd3.wav 2.0 16 2:3 .25 4:1 .25\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Each line consists of:\n");
        fprintf(stdout,"INFO: 1)  Name of a soundfile\n");
        fprintf(stdout,"INFO: 2)  Entry time of that sound in the mix\n");
        fprintf(stdout,"INFO: 3)  Channel count of the input sound\n");
        fprintf(stdout,"INFO: 4)  A ROUTING CODE for the input channels, followed by a level for that routing.\n");
        fprintf(stdout,"INFO: The code consists of a number indicating the input channel, a colon, and\n");
        fprintf(stdout,"INFO: a number indicating the output channel in the final mix.\n");
        fprintf(stdout,"INFO: In line 1 (1:1 2:2 3:3 4:4) each input channel goes to the corresponding output channel\n");
        fprintf(stdout,"INFO: In line 2 (1:1 2:1 3:1 4:1) all input channels are mixed into channel 1 of the output\n");
        fprintf(stdout,"INFO: In line 3 (2:3 4:1) channels 2 & 4 ONLY of input, are routed to chans 3 & 1 of the output\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: So the input channels can be threaded to any output channel desired.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ANALJOIN):
        fprintf(stdout,"INFO: SPLICE TOGETHER A SEQUENCE OF ANALYSIS FILES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NO PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PTOBRK):
        fprintf(stdout,"INFO: CONVERT BINARY PITCH DATA TO BRKPNT FILE, RETAINING NO-PITCH MARKERS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: TIME, IN MS, THAT ANY STRETCH OF PITCH-DATA MUST PERSIST, TO BE VALID.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_STRETCH):
        fprintf(stdout,"INFO: TIME-STRETCH A SOUND USING PITCH-SYNCHRONOUS ENVELOPED GRAINS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO: 2) STRETCH FACTOR\n");
        fprintf(stdout,"INFO: 3) NUMBER OF GRAINS PER BLOCK: Block preserved as-is during process.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Timestretching alters pitch: twice as long, down an octave.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_DUPL):
        fprintf(stdout,"INFO: DUPLICATE PITCH-SYNCHRONOUS ENVELOPED GRAINS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) NUMBER OF DUPLICATIONS.\n");
        fprintf(stdout,"INFO: 3) NUMBER OF GRAINS PER BLOCK: Block preserved as-is during process.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_DEL):
        fprintf(stdout,"INFO: DELETE PITCH-SYNCHRONOUS ENVELOPED GRAINS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) ONE IN HOW MANY BLOCKS TO KEEP.\n");
        fprintf(stdout,"INFO: 3) NUMBER OF GRAINS PER BLOCK: Block preserved as-is during process.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_STRFILL):
        fprintf(stdout,"INFO: TIME-STRETCH A SOUND USING PITCH-SYNCHRONOUS ENVELOPED GRAINS, AND GRAIN DUPLICATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) STRETCH FACTOR\n");
        fprintf(stdout,"INFO: 3) NUMBER OF GRAINS PER BLOCK: Block preserved as-is during process.\n");
        fprintf(stdout,"INFO: 4) TRANSPOSITION IN SEMITONES:\n");
        fprintf(stdout,"INFO: Only certain harmonics-related transpositions work.\n");
        fprintf(stdout,"INFO: and these interact in strange ways with the time-stretch parameter,");
        fprintf(stdout,"INFO: sometimes producing octaves.\n");
        fprintf(stdout,"INFO:         e.g. with a time-stretch of 2, these transpositions work...\n");
        fprintf(stdout,"INFO:         -12 (octave down), 12 (octave up)  24 (2 octaves up).\n");
        fprintf(stdout,"INFO:         7 (major 5th), 16 (octave + major 3rd) 19 (octave + 5th)  22 (octave + minor 7th).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_FREEZE):
        fprintf(stdout,"INFO: GRAB ONE OR MORE PITCH-SYNCHRONISED GRAINS AND USE TO CONSTRUCT A NEW SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) TIME IN SOURCE WHERE GRAIN(S) GRABBED.\n");
        fprintf(stdout,"INFO: 3) DURATION OF FILE TO BE CREATED.\n");
        fprintf(stdout,"INFO:       Duration oz ZERO will cause a single (block of) grain(s) to be grabbed,\n");
        fprintf(stdout,"INFO: 4) NUMBER OF GRAINS TO GRAB: IF more than 1, this set is used as a block.\n");
        fprintf(stdout,"INFO: 5) DENSITY (PITCH TRANSPOSITION)\n");
        fprintf(stdout,"INFO:       Density 2      Grains overlap so there are always 2 grains playing at once.\n");
        fprintf(stdout,"INFO:       Density 3      Grains overlap so there are always 3 grains playing at once.\n");
        fprintf(stdout,"INFO:       Density 0.5    One grain followed by one gap, of same duration.\n");
        fprintf(stdout,"INFO:       Density 0.25   One grain followed by a gap of three times the duration.\n");
        fprintf(stdout,"INFO:       With a single (or very few) grain(s), Density can be equivalent to transposition ratio.\n");
        fprintf(stdout,"INFO:       For pitched grains, the fundamental is transposed, but not the spectrum.\n");
        fprintf(stdout,"INFO:       Very high fixed densities produce a file with just 2 thumps (only).\n");
        fprintf(stdout,"INFO:       Glissandos through densities above c 2 produce pitch steps rather than a smooth glide.\n");
        fprintf(stdout,"INFO: 6) SPECTRAL TRANSPOSITION: transposes the spectrum but not the fundamental.\n");
        fprintf(stdout,"INFO:       The particular way in which Density and Spectral Transpositions operate\n");
        fprintf(stdout,"INFO:       depends on the size of segments (no of grains) you choose,\n");
        fprintf(stdout,"INFO:       and the particular nature of the grains (pitched, noisy etc.).\n");
        fprintf(stdout,"INFO: 7) RANDOMISATION of the position of the output grain(blocks).\n");
        fprintf(stdout,"INFO:       Randomisation adds noise to any clearly-pitched grain-source.\n");
        fprintf(stdout,"INFO: 8) OVERALL GAIN (If density is > 1.0, gain may need to be reduced).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_CHOP):
        fprintf(stdout,"INFO: REMOVE PITCH-SYNCHRONOUD GRAINS FROM A FILE, AT SPECIFIED TIMES,\n");
        fprintf(stdout,"INFO: AND KEEP THE REMAINING SEPARATED PARTS OF THE SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) TIME - GRAIN-COUNT FILE.\n");
        fprintf(stdout,"INFO:       Each pair specifies time at which grains are to be found\n");
        fprintf(stdout,"INFO:       and how many grains to omit between the cut sections.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Outputs are the sections of sound left behind once these grains are taken out.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_INTERP):
        fprintf(stdout,"INFO: INTERPOLATE BETWEEN PITCH-SYNCHRONOUS GRAINS,\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) Sustain Duration of first grain.\n");
        fprintf(stdout,"INFO: 2) Duration of Interpolation.\n");
        fprintf(stdout,"INFO: 3) Sustain Duration of final grain.\n");
        fprintf(stdout,"INFO: 4) VIBRATO FREQUENCY.\n");
        fprintf(stdout,"INFO: 5) VIBRATO DEPTH.\n");
        fprintf(stdout,"INFO: 6) TREMOLO FREQUENCY.\n");
        fprintf(stdout,"INFO: 7) TREMOLO DEPTH.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB This process assumes that the input files are single pitch-synchronous grains.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_FEATURES):
        fprintf(stdout,"INFO: ADD NEW FEATURES TO SOUND ANALYSED INTO PITCH-SYNCHRONOUS GRAINS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) PITCH SHIFTING IS ACCOMPANIED BY TIMEWARPING.\n");
        fprintf(stdout,"INFO:       If the pitch goes up, the sound gets shorter, if down, longer.\n");
        fprintf(stdout,"INFO: 2) PITCH SHIFTING IS ACCOMPANIED BY PITCH_DIVISION.\n");
        fprintf(stdout,"INFO:       Results in 2 pitches, the highest at the specified transposition.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  NUMBER OF GRAINS PER BLOCK: Block preserved as-is during process.\n");
        fprintf(stdout,"INFO: 3)  TRANSPOSITION (semitones).\n");
        fprintf(stdout,"INFO: 4)  VIBRATO FREQUENCY.\n");
        fprintf(stdout,"INFO: 5)  VIBRATO DEPTH (semitones).\n");
        fprintf(stdout,"INFO: 6)  SPECTRAL TRANSPOSITION (semitones).\n");
        fprintf(stdout,"INFO: 7)  HOARSENESS smaller values (c.0.04) are most effective.\n");
        fprintf(stdout,"INFO: 8)  ATTENUATION.\n");
        fprintf(stdout,"INFO: 9)  FOF-STRETCHING:    N.B. This TURNS OFF spectral transposition.\n");
        fprintf(stdout,"INFO: 10) SUBHARMONIC NUMBER: Divides pitch-frequency to produce subharmonic. Must be at least 2.\n");
        fprintf(stdout,"INFO: 11) SUBHARMONIC LEVEL:  Level of any subharmonic introduced.\n");
        fprintf(stdout,"INFO: 12) ALTERNATIVE ALGORITHM FOR FOF_STRETCH.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_SYNTH):
        fprintf(stdout,"INFO: USE VOCAL FOFS AS CONTOUR ON SYNTHESIZED SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WITH A FIXED BAND OF OSCILLATORS.\n");
        fprintf(stdout,"INFO:       Data file is exactly like that for a User-defined Filterbank.\n");
        fprintf(stdout,"INFO: 1)    BANDS AS FRQ (HZ):..Filter-pitches as frq in Hz.....paired with an amplitude.\n");
        fprintf(stdout,"INFO: 2)    BANDS AS MIDI:......Filter-pitches as MIDI values.....paired with an amplitude.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WITH A TIME-VARYING BANK OF OSCILLATORS.\n");
        fprintf(stdout,"INFO:       Data file is exactly like that for a User-defined Time-varying Filterbank.\n");
        fprintf(stdout,"INFO: 3)    BANDS AS FRQ (HZ):..Filter-pitches as frq in Hz.\n");
        fprintf(stdout,"INFO: 4)    BANDS AS MIDI:......Filter-pitches as MIDI values.\n");
        fprintf(stdout,"INFO:       For full details, see 'User-defined Time-varying Filterbank' information.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 5) WITH NOISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  TABLE OF FREQUENCIES AND AMPLITUDES, DEFINING A BANK OF OSCILLATORS.\n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 3)  DEPTH OF FOF CONTOURING (1 TOTAL .... 0, NONE AT ALL).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_IMPOSE):
        fprintf(stdout,"INFO: IMPOSE VOCAL FOFS IN 1ST SOUND ON A 2ND INPUT SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  DEPTH OF FOF CONTOURING (1 TOTAL .... 0, NONE AT ALL).\n");
        fprintf(stdout,"INFO: 3)  WINDOW SIZE (mS) FOR ENVELOPE TRACKING 2ND INPUT SOUND.\n");
        fprintf(stdout,"INFO: 4)  GATE LEVEL (dB) BELOW WHICH 2ND INPUT SIGNAL IS TO BE IGNORED.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_SPLIT):
        fprintf(stdout,"INFO: SPLIT VOCAL SOUND INTO SUBHARMONICS AND UPWARD-TRANSPOSED FEATURES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  SUBHARMONIC NUMBER (DIVIDES VOICE FREQUENCY).\n");
        fprintf(stdout,"INFO: 3)  UPWARD TRANSPOSITION (SEMITONES).\n");
        fprintf(stdout,"INFO: 4)  SUPPRESSION OF UPWARD-TRANSPOSED COMPONENTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_SPACE):
        fprintf(stdout,"INFO: SEPARATE FOFS OF A MONO VOCAL SOUND IN STEREO SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  SUBHARMONIC NUMBER (DIVIDES VOICE FREQUENCY).\n");
        fprintf(stdout,"INFO: 3)  SPATIAL SEPARATION.\n");
        fprintf(stdout,"INFO:           0  NO SEPARATION.\n");
        fprintf(stdout,"INFO:           1  SPLITS ALTERNATELY TO FULL RIGHT/LEFT.\n");
        fprintf(stdout,"INFO:           -1 SPLITS ALTERNATELY TO FULL LEFT/RIGHT.\n");
        fprintf(stdout,"INFO: 4)  LEFT/RIGHT RELATIVE LEVEL.\n");
        fprintf(stdout,"INFO:           RL = 1.0  LEFT & RIGHT LEVELS EQUAL.\n");
        fprintf(stdout,"INFO:           RL > 1.0  LEFT SIGNAL DIVIDED BY RL. BIAS TO RIGHT\n");
        fprintf(stdout,"INFO:           RL < 1.0  RIGHT SIGNAL MULTIPLIED BY RL. BIAS TO LEFT\n");
        fprintf(stdout,"INFO: 5)  SUPPRESS HIGH COMPONENTS.\n");
        fprintf(stdout,"INFO:           0 = NONE.\n");
        fprintf(stdout,"INFO:           1 = COMPLETE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_INTERLEAVE):
        fprintf(stdout,"INFO: INTERLEAVE FOFS OF 2 SOUNDS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE FOR 1ST SND, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE FOR 2ND SND, SIMILARLY.\n");
        fprintf(stdout,"INFO: 3)  NO OF FOFS TREATED AS A UNIT FOR THE PROCESS.\n");
        fprintf(stdout,"INFO: 4)  PITCH BIAS.\n");
        fprintf(stdout,"INFO:           0  NO BIAS.\n");
        fprintf(stdout,"INFO:           1  PITCH FORCED TOWARDS THAT OF 1ST SND.\n");
        fprintf(stdout,"INFO:           -1 PITCH FORCED TOWARDS THAT OF 2ND SND.\n");
        fprintf(stdout,"INFO: 5)  RELATIVE LEVEL.\n");
        fprintf(stdout,"INFO:           RL = 1.0  1ST & 2ND SOUNDS OF EQUAL LEVEL.\n");
        fprintf(stdout,"INFO:           RL > 1.0  2ND SOUND LEVEL DIVIDED BY RL. BIAS TO 1ST\n");
        fprintf(stdout,"INFO:           RL < 1.0  1ST SOUND LEVEL MULTIPLIED BY RL. BIAS TO 2ND\n");
        fprintf(stdout,"INFO: 6)  RELATIVE WEIGHT.\n");
        fprintf(stdout,"INFO:           RW = 1.0  1ST & 2ND SOUNDS ALTERNATE.\n");
        fprintf(stdout,"INFO:           RL > 1.0  1ST SOUND OCCURS RL TIMES MORE THAN 2ND\n");
        fprintf(stdout,"INFO:           RL < 1.0  2ND SOUND OCCURS 1/RL TIMES MORE THAN 1ST\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_REPLACE):
        fprintf(stdout,"INFO: COMBINE FOFS OF 1ST SOUND WITH PITCH OF 2ND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE FOR 1ST SND, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE FOR 2ND SND, SIMILARLY.\n");
        fprintf(stdout,"INFO: 3)  NO OF FOFS TREATED AS A UNIT FOR THE PROCESS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_EXTEND):
        fprintf(stdout,"INFO: EXTEND A SOUND BY FREEZING IT AT A SPECIFIED TIME, USING A PITCH-SYNCD GRAIN.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:        Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2)  TIME IN SOURCE WHERE GRAIN(S) GRABBED.\n");
        fprintf(stdout,"INFO: 3)  DURATION OF TOTAL FILE ONCE IT IS STRETCHED.\n");
        fprintf(stdout,"INFO: 4)  NUMBER OF GRAINS TO GRAB: IF more than 1, this set is used as a block.\n");
        fprintf(stdout,"INFO: 5)  VIBRATO FREQUENCY.\n");
        fprintf(stdout,"INFO: 6)  VIBRATO DEPTH (semitones).\n");
        fprintf(stdout,"INFO: 7)  GRAIN PITCH TRANSPOSITION (semitones).\n");
        fprintf(stdout,"INFO:        In any brkpntfiles used here, zero time refers to start of \n");
        fprintf(stdout,"INFO:        bring expanded, and NOT (necessarily) to start of sound.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 8)  SMOOTH FOFS.\n");
        fprintf(stdout,"INFO:        Imposes a smoothing window on the extracted FOF(s)\n");
        fprintf(stdout,"INFO:        attempting to remove any high frequency buzz effects.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_EXTEND2):
        fprintf(stdout,"INFO: EXTEND A SOUND BY FREEZING IT AT A SPECIFIED TIME, USING A PITCH-SYNCD GRAIN.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) TIME AT WHICH GRAIN STARTS.\n");
        fprintf(stdout,"INFO: 2) TIME AT WHICH GRAIN ENDS.\n");
        fprintf(stdout,"INFO: 3) DURATION OF TOTAL FILE ONCE IT IS STRETCHED.\n");
        fprintf(stdout,"INFO: 4)  VIBRATO FREQUENCY.\n");
        fprintf(stdout,"INFO: 5)  VIBRATO DEPTH (semitones).\n");
        fprintf(stdout,"INFO: 6)  NUDGE: GRAIN-TIMES MOVED FORWARD OR BACK BY 'NUDGE' ZERO-CROSSINGS.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_LOCATE):
        fprintf(stdout,"INFO: LOCATE EXACT TIME OF START OF GRAIN, NEAREST TO A GIVEN TIME.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) TIME.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_CUT):
        fprintf(stdout,"INFO: CUT SOUND AT GRAIN START NEAREST TO SPECIFIED TIME.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) KEEP SOUND BEFORE SPECIFIED GRAIN-TIME.\n");
        fprintf(stdout,"INFO: 2) KEEP SOUND AT AND AFTER SPECIFIED GRAIN-TIME.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 2) TIME.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ONEFORM_GET):
        fprintf(stdout,"INFO: EXTRACT FORMANT AT A SPECIFIED TIME, FROM A FORMANT FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) TIME AT WHICH TO EXTRACT FORMANT.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ONEFORM_PUT):
        fprintf(stdout,"INFO: IMPOSE ON SPECTRUM IN AN ANALYSIS FILE\n");
        fprintf(stdout,"INFO: THE SPECTRAL ENVELOPE IN A SINGLE-FORMANT FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: REPLACE FORMANTS......New formants REPLACE existing formant envelope.\n");
        fprintf(stdout,"INFO: SUPERIMPOSE FORMANTS..New formants IMPOSED ON TOP OF existing formants.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LOW FRQ LIMIT...frq, below which spectrum is set to zero.\n");
        fprintf(stdout,"INFO: HIGH FRQ LIMIT..frq, above which spectrum is set to zero.\n");
        fprintf(stdout,"INFO: GAIN............adjustment to spectrum loudness (normally < 1.0).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ONEFORM_COMBINE):
        fprintf(stdout,"INFO: GENERATE SPECTRUM FROM BINARY-PITCHFILE & SINGLE-FORMANT-DATA.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: outfile is analysis file which must be resynthesized to hear.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(NEWGATE):
        fprintf(stdout,"INFO: GATE A SIGNAL TO ZERO WHERE IT FALLS BELOW A CERTAIN LEVEL.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: GATE LEVEL...in decibels.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPEC_REMOVE):
        fprintf(stdout,"INFO: REMOVE SPECIFIC PITCH (AREA) FROM A SPECTRUM, OR REMOVE COMPONENTS NOT OF PITCH (AREA).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: 1) REMOVE PITCH.\n");
        fprintf(stdout,"INFO: 2) REMOVE NON_PITCH.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MINIMUM PITCH (MIDI).\n");
        fprintf(stdout,"INFO: MAXIMUM PITCH (MIDI).\n");
        fprintf(stdout,"INFO: MODE 1) FREQUENCY ABOVE WHICH HARMONICS ARE NOT REMOVED (HZ).\n");
        fprintf(stdout,"INFO: MODE 2) FREQUENCY ABOVE WHICH HARMONICS ARE NOT RETAINED (HZ).\n");
        fprintf(stdout,"INFO: ATENUATION OF SPECIFIED COMPONENTS.\n");
        fprintf(stdout,"INFO:          (1 = full attenuation, 0 = no attenuation).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Process removes all components, and their harmonics, in the given pitch range,\n");
        fprintf(stdout,"INFO: as far as the given frequency limit.\n");
        fprintf(stdout,"INFO: (Or, mode 2, removes all components which are NOT in the pitch range or that of its harmonics)\n");
        fprintf(stdout,"INFO: as far as the given frequency limit.\n");
        fprintf(stdout,"INFO: Pitch range of an octave or more will remove (retain) all spectral components\n");
        fprintf(stdout,"INFO: between the lower pitch and the upper frequency limit\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PREFIXSIL):
        fprintf(stdout,"INFO: ADD SILENCE AT START OF SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION of silence to add.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(STRANS):
        fprintf(stdout,"INFO: CHANGE SPEED & PITCH OF MULTICHANNEL SOURCE SOUND, OR CREATE VIBRATO.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) SPEED CHANGE...............also changing sound pitch.\n");
        fprintf(stdout,"INFO: 2) SPEED CHANGE IN SEMITONES..speed shift given in semitones.\n");
        fprintf(stdout,"INFO:    For BOTH these modes, brkpnt times are infiletimes, unless flagged as outfiletimes.\n");
        fprintf(stdout,"INFO: 3) ACCELERATE SOURCE TO GIVEN SPEED..speed shift given as multiplier.\n");
        fprintf(stdout,"INFO: 4) VIBRATO THE SOURCE....with given speed and depth (possibly time-varying).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1. Speed change as a speed multiplier.\n");
        fprintf(stdout,"INFO: MODE 2. Speed change in semitones.\n");
        fprintf(stdout,"INFO: MODE 3\n");
        fprintf(stdout,"INFO:      ACCELERATION as speed multiplier at the goal time.\n");
        fprintf(stdout,"INFO:      GOAL TIME is speed at which 'acceleration' speed is achieved.\n");
        fprintf(stdout,"INFO:      START TIME is time in source where acceleration begins.\n");
        fprintf(stdout,"INFO: MODE 4\n");
        fprintf(stdout,"INFO:      VIBRATO FREQUENCY is rate of vibrato, in Hz (can vary over time).\n");
        fprintf(stdout,"INFO:      VIBRATO DEPTH is depth of vibrato, in semitones (can vary over time).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PSOW_REINF):
        fprintf(stdout,"INFO: REINFORCE HARMONICS OR ADD INHARMONIC CONSTITUENTS IN SOUND WITH (VOCAL) FOFS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) REINFORCE HARMONICS.\n");
        fprintf(stdout,"INFO: 2) ADD INHARMONIC ELEMENTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  TABLE OF HARMONIC NUMBERS AND AMPLITUDES.\n");
        fprintf(stdout,"INFO:         These define which harmonics are added to the original source, (range 2 to 256)\n");
        fprintf(stdout,"INFO:         and what their relative-levels are (src assumed to be at level 1.0) (range >0  to 16).\n");
        fprintf(stdout,"INFO:         The output is scaled down in level, if clipping might occur.\n");
        fprintf(stdout,"INFO:         In MODE 2, these 'harmonics' can be FRACTIONAL.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in some places).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In MODE 1\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DON'T DUPLICATE HARMONICS : FOFs corresponding to higher harmonics which\n");
        fprintf(stdout,"INFO: coincide with FOFs corresponding to lower harmonics, are omitted.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In MODE 1\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DELAY OF HARMONICS: mS delay applied (progressively) to harmonics.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In MODE 2\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WEIGTH : Determines how long inharmonic constituents are sustained.\n");
        fprintf(stdout,"INFO: In some circumstances very high weights may cause the memory to overflow.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PARTIALS_HARM):
        fprintf(stdout,"INFO: EXTRACT RELATIVE AMPLITUDES OF PARTIALS IN A PITCHED SOURCE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) SINGLE-WINDOW ANALYSIS FILE -> FRQ DATA.\n");
        fprintf(stdout,"INFO: 2) SINGLE-WINDOW ANALYSIS FILE -> MIDI DATA.\n");
        fprintf(stdout,"INFO: 3) MULTI-WINDOW ANALYSIS FILE -> FRQ DATA.\n");
        fprintf(stdout,"INFO: 4) MULTI-WINDOW ANALYSIS FILE -> MIDI DATA.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  FUNDAMENTAL FREQUENCY:  Fundamental frequency of the window.\n");
        fprintf(stdout,"INFO: 2)  THRESHOLD AMPLITUDE:  Relative level below which partials are ignored.\n");
        fprintf(stdout,"INFO: 3)  TIME OF WINDOW:  (Modes 3 & 4 only) Time, in analysis file, where partials to be found.\n");
        fprintf(stdout,"INFO: 4)  OUTPUT IN VARIPARTIALS FILTER FORMAT:  Outputs data in file-format for varipartials filter.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input file is clearly pitched (at least in the relevant place).\n");
        break;
    case(SPECROSS):
        fprintf(stdout,"INFO: INTERPOLATE PARTIALS OF PITCHED SRC2 TOWARDS THOSE OF PITCHED SRC 1,\n");
        fprintf(stdout,"INFO: RETAINING THE DURATION OF SRC2, AND THE ATTACK LOCATION OF SRC1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: IN-TUNE RANGE:  Semitone range within which harmonics 'in tune'.\n");
        fprintf(stdout,"INFO: MIN WINDOWS TO CONFIRM PITCH:   Minimum number of adjacent windows that must be pitched,\n");
        fprintf(stdout,"INFO:                  for a pitch-value to be registered.\n");
        fprintf(stdout,"INFO: SIGNAL TO NOISE RATIO:  Signal to noise ratio, in decibels.\n");
        fprintf(stdout,"INFO:                  Windows which fall at or below this level, relative to the maximum level in the sound,\n");
        fprintf(stdout,"INFO:                  are assumed to be noise, & any detected pitch is ignored.\n");
        fprintf(stdout,"INFO: VALID HARMONICS COUNT:  Number of the 8 loudest peaks in spectrum which must be harmonics\n");
        fprintf(stdout,"INFO:                  to confirm that the sound is pitched: Default 5.\n");
        fprintf(stdout,"INFO: LOW PITCH LIMIT:  Lowest acceptable frequency (Hz) at which a pitch value is acceptable.\n");
        fprintf(stdout,"INFO: HIGH PITCH LIMIT:  Highest acceptable frequency (Hz) at which a pitch value is acceptable.\n");
        fprintf(stdout,"INFO: PARTIAL THRESHOLD AMPLITUDE:  The threshold amplitude is measured relative to the loudest partial in the window.\n");
        fprintf(stdout,"INFO:                  Any (possible) partial data which falls below this level is ignored.\n");
        fprintf(stdout,"INFO: OUTPUT LEVEL:  Level of the output spectrum. Vary only if reapplying src1 to several src2s,\n");
        fprintf(stdout,"INFO:                  when the relative levels of the src2s are important.\n");
        fprintf(stdout,"INFO: SPECTRAL_INTERPOLATION:  Degree of interpolation between Src2 and Src1.\n");
        fprintf(stdout,"INFO:                  Zero gives the original (cleaned) src 2, 1 gives src1 only.\n");
        fprintf(stdout,"INFO:                  The degree of interpolation may vary (with time) through the sound.\n");
        fprintf(stdout,"INFO:                  Times in any breakpoint file will be scaled to the duration of Src1.\n");
        fprintf(stdout,"INFO: RETAIN FILE2 CONTOUR UNDER FILE1 CONTOUR so amplitude fluctuations of File1 still apparent at max interpolation.\n");
        fprintf(stdout,"INFO: EXTEND 1ST STABLE PITCH OF FILE1 TO START so very start of File 1 is assumed to be pitched.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Assumes the input files are clearly pitched (at least in the relevant place).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: A typical application would use a (relatively) stable-pitched source for Src1,\n");
        fprintf(stdout,"INFO: while Src2 might vary in pitch (e.g. a speaking voice), but this is not essential.\n");
        break;
    case(LUCIER_GETF):
        fprintf(stdout,"INFO: EXTRACT ROOM-RESONANCE FROM A RECORDING AND CREATE A FILTER-DATA FILE FOR 'FILTER VARIBANK'.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIN ROOM DIMENSION (METRES):  Enter ZERO to ignore roomsize.\n");
        fprintf(stdout,"INFO: ROLLOFF INTERVAL: Interval (in semitones) over which resonance fades to zero, above the max resonance frq dictated by room dimensions.\n");
        fprintf(stdout,"INFO: LOW_FRQ_CUTOFF:      Ignore resonances below this frequency.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Longer recordings give better results.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(LUCIER_GET):
        fprintf(stdout,"INFO: EXTRACT ROOM-RESONANCE FROM A RECORDING AND CREATE A CORRESPONDING ANALYSIS DATA FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIN ROOM DIMENSION (METRES):  Enter ZERO to ignore roomsize.\n");
        fprintf(stdout,"INFO: ROLLOFF INTERVAL: Interval (in semitones) over which resonance fades to zero, above the max resonance frq dictated by room dimensions.\n");
        fprintf(stdout,"INFO: RESOLVE LOW FRQS: Attempt to resolve low frequency resonances more accurately.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(LUCIER_PUT):
        fprintf(stdout,"INFO: IMPOSE ROOM-RESONANCE FROM A RECORDING (EXTRACTED USING 'LUCIER GET') ONTO AN ANALYSIS FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RESONANCE COUNT:      Number of times the room resonance is (cumulatively) added to the sound.\n");
        fprintf(stdout,"INFO: OCTAVE DUPLICATION ROLLOFF:  If NOT set to zero (default), room resonance is duplicated at higher octaves,\n");
        fprintf(stdout,"INFO:          with resonance level multiplied (cumulatively) by this attenuation from 8va to 8va.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(LUCIER_DEL):
        fprintf(stdout,"INFO: ATTEMPT TO REMOVE ROOM-RESONANCE (EXTRACTED USING 'LUCIER GET') FROM A RECORDING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SUPPRESSION:   Degree of suppression of room acoustic.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECLEAN):
        fprintf(stdout,"INFO: REMOVE PERSISTENT NOISE FROM SPECTRUM, BY COMPARISON WITH AN EXTRACT OF THE NOISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PERSISTANCE (mS):   Time for which signal in a channel must exceed threshold defined by noise input before it is allowed to pass.\n");
        fprintf(stdout,"INFO: NOISE PREGAIN:          Threshold level for passing clean signal is level of noise signal times this pregain.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECTRACT):
        fprintf(stdout,"INFO: REMOVE PERSISTENT NOISE FROM SPECTRUM, BY SUBTRACTING AN EXTRACT OF THE NOISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PERSISTANCE (mS):   Time for which signal in a channel must exceed threshold defined by noise input before it is allowed to pass.\n");
        fprintf(stdout,"INFO: NOISE PREGAIN:          Threshold level for passing clean signal is level of noise signal times this pregain.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The noise-signal level is also subtracted from any signal exceeding the threshold.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PHASE):
        fprintf(stdout,"INFO: INVERT PHASE, OR ENHANCE STEREO IMAGE BY PHASE CANCELLATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) INVERT  PHASE OF MONO OR STEREO SIGNAL.\n");
        fprintf(stdout,"INFO: 2) ENHANCE STEREO IMAGE, BY PHASE CANCELLATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PHASE TRANSFER: (Mode 2 only) Amount of phase-inverted other-channel used to enhance stereo.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(BRKTOPI):
        fprintf(stdout,"INFO: CONVERT TEXT PITCH-DATA TO BINARY PITCH DATA.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Pitch data is written to a default format binary file.\n");
        break;
    case(SPECSLICE):
        fprintf(stdout,"INFO: SALAMI-SLICE SPECTRUM INTO (INTERLEAVED) FREQUENCY BANDS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) SLICE SPECTRUM BY ANALYSIS CHANNELS.\n");
        fprintf(stdout,"INFO: 2) SLICE SPECTRUM BY FREQUENCY BANDS.\n");
        fprintf(stdout,"INFO: 3) SLICE SPECTRUM BY PITCH BANDS.\n");
        fprintf(stdout,"INFO: 4) SLICE SPECTRUM BY HARMONICS OF EXTRACTED PITCH.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER_OF_SLICES : with 3 slices (and 1 channel per slice) Slice-1 = chans 1,4,7...etc   Slice-2 = chans 2,4,8.etc Slice-3 = chans 3,6,9.etc\n");
        fprintf(stdout,"INFO: ANALYSIS_CHANNEL_GROUPING : with 3 slices and grouping 2   Slice-1 = chans 1-2,7-8,13-14...etc   Slice-2 = chans 3-4,9-10..etc Slice-3 = chans 5-6,11-12..etc\n");
        fprintf(stdout,"INFO: SLICE_BANDWIDTH: width of slices in Hz: with Hz 100 and 2 slices: Slice-1 = 0-100Hz + 200-300Hz + 400-500Hz..etc Slice-2 = 100-200Hz + 300-400Hz ..etc\n");
        fprintf(stdout,"INFO: SLICE_WIDTH_IN_SEMITONES: width of slices in semitones.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(FOFEX_EX):
        fprintf(stdout,"INFO: EXTRACT AND ORGANISE FOFS IN A SOUND IN ORDER TO RE-USE THEM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)   EXTRACT ALL FOF(GROUP)S SUBJECT TO EXCLUSIONS, TO SPECIAL FOF-STORAGE SOUNDFILE.\n");     
        fprintf(stdout,"INFO: 2)   EXTRACT SINGLE FOF(GROUP) AT SPECIFIED TIME.\n");     
        fprintf(stdout,"INFO: 3)   EXTRACT ALL FOF(GROUP)S SUBJECT TO EXCLUSIONS, TO SEPARATE SOUNDFILES.\n");     
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES 1 & 3\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  LIST OF SECTIONS OF THE SOURCE (AS PAIRS OF SAMPLETIMES) FROM WHICH ~NO~ FOFS ARE TO BE TAKEN.\n");
        fprintf(stdout,"INFO:           IF THERE ARE NO SUCH AREAS, ENTER THE PARAMETER VALUE \"0\"\n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES,\n");
        fprintf(stdout,"INFO:     AND DERIVED FROM THE INPUT SOUNDFILE.\n");
        fprintf(stdout,"INFO:       Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 3)  A dB VALUE: FOFS WHICH ARE LESS THAN THIS LEVEL BELOW THE MAX FOF LEVEL ARE REJECTED.\n");
        fprintf(stdout,"INFO:       N.B. A value of ZERO, RETAINS ALL FOFS.\n");
        fprintf(stdout,"INFO: 4)  GROUPED FOFS: Extracts FOFs in (originally adjacent) pairs, triples, etc.\n");
        fprintf(stdout,"INFO: 5)  NO FOF WINDOWING: Cosine shaping is normally applied to starts and ends of FOFs. Set this flag for NO windowing.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: IN MODE 1: OUTPUT IS A SPECIAL SOUNDFILE CONTAINING A BANK OF FOFS,\n");
        fprintf(stdout,"INFO:            AND A TEXTFILE PROVIDING INFORMATION ABOUT THE 'FOFBANK'\n");
        fprintf(stdout,"INFO:            THESE CAN BE USED WITH 'FOF reconstruct'\n");
        fprintf(stdout,"INFO: IN MODE 3: OUTPUT IS A SET OF SOUNDFILES EACH CONTAINING A SINGLE (GROUP OF) FOF(S).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 2\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PITCH BREAKPOINT FILE, AS ABOVE\n");
        fprintf(stdout,"INFO: 2)  TIME IN FILE AT WHICH TO EXTRACT FOF(GROUP).\n");
        fprintf(stdout,"INFO: 3)  GROUPED FOFS: EXTRACT A GROUP OF N FOFs.\n");
        fprintf(stdout,"INFO: 4)  NO FOF WINDOWING: AS ABOVE.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(FOFEX_CO):
        fprintf(stdout,"INFO: USE A BANK OF FOFS EXTRACTED WITH 'FOF extract' TO SYNTHESIZE A NEW SOUND OVER A PITCHLINE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: INPUT FILE----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MUST BE A BANK OF FOFS DERIVED FROM A SOUND USING 'FOF extract'\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)   Use 1 FOF.\n");     
        fprintf(stdout,"INFO: 2)   All FOFs superimposed to make output FOF.\n");
        fprintf(stdout,"INFO: 3)   Low FOFs superimposed to make output FOF.\n");
        fprintf(stdout,"INFO: 4)   Midrange FOFs superimposed to make output FOF.\n");
        fprintf(stdout,"INFO: 5)   High FOFs superimposed to make output FOF.\n");
        fprintf(stdout,"INFO: 6)   2 FOFs whose balance varies with pitch.\n");
        fprintf(stdout,"INFO: 7)   3 FOFs whose balance varies with pitch and level.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  TEXTFILE DERIVED FROM 'FOF extract' WHEN YOU CREATED THE (INPUT) FOFBANK.\n");
        fprintf(stdout,"INFO: 2)  PITCH BREAKPOINT FILE, POSSIBLY CONTAINING 'NO-SIGNAL' MARKERS AT SPECIFIC TIMES.\n");
        fprintf(stdout,"INFO:          (But no NO-PITCH markers). Extract the pitch to a binary file, then do the conversion to text.\n");
        fprintf(stdout,"INFO: 3)  LOUDNESS CONTOUR BREAKPOINT DATA, AS TEXT.\n");
        fprintf(stdout,"INFO: 4)  OVERALL GAIN (FOFS may overlap one another).\n");
        fprintf(stdout,"INFO: 5)  THE FOF(S) TO BE USED (their number in the FOFBANK file, counting from 1) - USE \"SOUND VIEW\"\n");
        fprintf(stdout,"INFO: 6)  EQUALISE FOF LEVELS: Adjusts all FOFs to same level before synthesizing output.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(GREV_EXTEND):
        fprintf(stdout,"INFO: LOCATE AND EXTEND 'GRAINS', USING ENVELOPE TROUGHS AND ZERO-CROSSING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: This process locates elements of a sound by searching for troughs in the envelope.\n");
        fprintf(stdout,"INFO: and extends the segment in a coherent way.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (MS) .... This determines the size of grains that might be found..\n");
        fprintf(stdout,"INFO: DEPTH OF TROUGHS AS PROPORTION OF PEAK HEIGHT .... e.g. with value .5, troughs between peaks\n");
        fprintf(stdout,"INFO:                    which do not fall to half the peak-height, are ignored\n");
        fprintf(stdout,"INFO: EXTEND_BY_HOW_MUCH .... How much time to add to file, by extending specified grain area\n");
        fprintf(stdout,"INFO: TIME_WHERE_GRAINS_START\n");
        fprintf(stdout,"INFO: TIME_WHERE_GRAINS_END\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PEAKFIND):
        fprintf(stdout,"INFO: LIST TIMES OF PEAKS IN A SOUNDFILE (ESPECIALLY FOR SPEECH).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Locates prominent peaks, separated by troughs, and save a list of their timings.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (MS) .... This determines the width of peaks that might be found..\n");
        fprintf(stdout,"INFO: THRESHOLD .... any window falling entirely below this level is assumed to contain no peaks.\n");
        fprintf(stdout,"INFO: Peaks must have a level greater than the  threshold, and be separated by signal lower than the threshold.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If \"threshold\" is set to ZERO, program searches for threshold values appropriate to the local level,\n");
        fprintf(stdout,"INFO: by finding the local maximum in %d windows around the immediate window\n",LOCALMAX_WINDOW);
        fprintf(stdout,"INFO: and then divides this by a factor of %d\n",LOCALPEAK_DECIMATE);
        fprintf(stdout,"INFO: \n");
        break;
    case(CONSTRICT):
        fprintf(stdout,"INFO: SHRINK THE DURATION OF ANY ZERO-LEVEL SEGMENTS IN A SOUND, BY A GIVEN PERCENTAGE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Works only with sounds having segments of (completely) zero level.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PERCENTAGE DECIMATION .... Percentage of zero-level segments to delete\n");
        fprintf(stdout,"INFO: Values greater than 100 cause the separated segments to be overlaid.\n");
        fprintf(stdout,"INFO: e.g. 102 overlays very slightly, 200 overlays completely.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(EXPDECAY):
        fprintf(stdout,"INFO: CURTAIL SOUND USING A TRUE EXPONENTIAL ENVELOPE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECAY START TIME\n");
        fprintf(stdout,"INFO: DECAY END TIME.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PEAKCHOP):
        fprintf(stdout,"INFO: ISOLATE PEAKS IN SOURCE, AND PLAY THEM BACK AT A SPECIFIED TEMPO.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  PLAY BACK PEAKS AT SPECIFIED TEMPO\n");
        fprintf(stdout,"INFO: 2)  OUTPUT PEAK-ISOLATING ENVELOPE\n");
        fprintf(stdout,"INFO: 3)  PLAY BACK PEAKS IN SPECIFIED RHYTHMIC CELLS AT SPECIFIED TEMPO\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RHYTHM CELL .... rhythm-cell speficied in integers = relative durations of rhythmic units.\n");
        fprintf(stdout,"INFO:                                           Rhythmic units DIVIDE beat, so e.g. \"3 1 2\" becomes \"1/2 1/6 1/3\".\n");
        fprintf(stdout,"INFO: WINDOW SIZE (MS) .... windowsize (in mS) for creating envelope.\n");
        fprintf(stdout,"INFO: PEAK WIDTH (MS).... width of retained peaks (in mS).\n");
        fprintf(stdout,"INFO: RISE TIME (MS).... time for signal to rise to (and fall from) the retained peaks.\n");
        fprintf(stdout,"INFO: TEMPO .... tempo of resulting output as MM (events per minute).\n");
        fprintf(stdout,"INFO: GAIN .... where tempo and peakwidth combine to make events overlap, may be necessary to reduce gain.\n");
        fprintf(stdout,"INFO: TEMPO SCATTER ....randomisation of output times (0-1)\n");
        fprintf(stdout,"INFO: GATE ....level (relative to maximum signal level) below which peaks are ignored (0-1)\n");
        fprintf(stdout,"INFO: LEVELLING .... force peakevent levels towards level of maximum event.\n");
        fprintf(stdout,"INFO: CENTRING ....centring of envelope on peak (0-1): 0 = at peak at envelope start; 1 = peak at envelope end.\n");
        fprintf(stdout,"INFO: REPETITION .... repeat peakevents in the source.\n");
        fprintf(stdout,"INFO: SKIP BY .... after using a peakevent, miss out the next 'skip by' peakevents.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHANPAN):
        fprintf(stdout,"INFO: PAN A FILE OVER MORE THAN 2 OUTPUT CHANNELS.\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: MODE 1:  MOVE MONO SOUND AROUND A MULTICHANNEL SPACE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PANNING DATA .... is a file containing value triples : time  pan-position  pantype\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         PAN-POSITION vals lie between (channel) 1 and a max no-of-channels >= 3.\n");
            fprintf(stdout,"INFO:         positions between 0 and 1 are also possible (see below).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         PANTYPE values can be\n");
            fprintf(stdout,"INFO:         0  = direct pan: pan from 1 to 4 goes directly between lspkrs 1->4\n");
            fprintf(stdout,"INFO:         1  = clockwise rotation: pan from 1 to 4 goes through intermediate lspkrs 1->2->3->4\n");
            fprintf(stdout,"INFO:          (assuming lspks are arranged with numbering increasing in a clockwise direction).\n");
            fprintf(stdout,"INFO:         -1 = anticlockwise rotation: pan from 1 to 4 (with 8 lspkrs) goes 1->8->7->6->5->4\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         Direct pans must start at a single loudspeaker, so position vals must be integers (and NOT 0).\n");
            fprintf(stdout,"INFO:         Rotations can start and stop anywhere, so position values can be fractional,\n");
            fprintf(stdout,"INFO:         and values between 0 & 1 are positions between maximum lspkr (e.g. 8) and lspkr 1\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE ..... This should not be less than the maximum channel number in the panning data.\n");
            fprintf(stdout,"INFO:         but it can be greater.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FOCUS ......... Degree to which positioned sound is focused in the loudspeaker.\n");
            fprintf(stdout,"INFO: If focus = 1.0, position set to (e.g.) '2' puts all the signal in lspkr 2.\n");
            fprintf(stdout,"INFO: If focus = 0.9, position '2' puts 90%% of the signal in lspkr 2\n");
            fprintf(stdout,"INFO: and the remainder in the 2 adjacent lspkrs (1 and 3).\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: MODE 2:  SWITCH (SILENCE-SEPARATED) MONO EVENTS IN SOUND BETWEEN SPECIFIED CHANNELS OF OUTPUT.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OUT-CHANNEL SEQUENCE .... is a file containing a list of output channels.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         Each output channel in the list will be visited, in turn.\n");
            fprintf(stdout,"INFO:         If the end of the list is reached, the sequence wraps back to the start of the list.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE ..... This should not be less than the maximum channel number in the switching data.\n");
            fprintf(stdout,"INFO:         but it can be greater.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FOCUS ......... Degree to which positioned sound is focused in the loudspeaker.\n");
            fprintf(stdout,"INFO: If focus = 1.0, position set to (e.g.) '2' puts all the signal in lspkr 2.\n");
            fprintf(stdout,"INFO: If focus = 0.9, position '2' puts 90%% of the signal in lspkr 2\n");
            fprintf(stdout,"INFO: and the remainder in the 2 adjacent lspkrs (1 and 3).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM DURATION OF SILENCES ..... minimum duration (mS) of consecutive zero-samples\n");
            fprintf(stdout,"INFO:          to constitute a silent 'gap' between peak-events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(2):
            fprintf(stdout,"INFO: MODE 3:  SPREAD SUCCESSIVE (SILENCE-SEPARATED) MONO EVENTS ON DIFFERENT NUMBERS OF CHANNELS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Events are spread over specified output channels.\n");
            fprintf(stdout,"INFO: If the centre, width or depth of the spread are changing in time,\n");
            fprintf(stdout,"INFO: the placement of events changes only at the onset of a new event in the input.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRE OF SPREAD ....... Channel from which spreading radiates.\n");
            fprintf(stdout,"INFO: CHANNEL SPREAD ......... Total Number of channels over which spreading extends.\n");
            fprintf(stdout,"INFO: DEPTH OF SPREAD FRONT .. Number of channels (on each side) activated behind spreading front.\n");
            fprintf(stdout,"INFO: LEVEL ROLLOFF WITH ADDED CHANNELS .... Level compensation for addition of new output channels.\n");
            fprintf(stdout,"INFO:                       0, No rolloff, all channels go up to full level as they are added.\n");
            fprintf(stdout,"INFO:                       1, Full rolloff, level falls to 1/N for N channels of output.\n");
            fprintf(stdout,"INFO:                       Intermediate values are possible.\n");
            fprintf(stdout,"INFO: MINIMUM DURATION OF SILENCES ..... minimum duration (mS) of consecutive zero-samples\n");
            fprintf(stdout,"INFO:          to constitute a silent 'gap' between peak-events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRE, SPREAD and DEPTH can vary over time.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(3):
            fprintf(stdout,"INFO: MODE 4:  SPREAD SOUND GRADUALLY OVER DIFFERENT NUMBERS OF CHANNELS (MONO OR STEREO INPUT).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Events are spread over specified output channels.\n");
            fprintf(stdout,"INFO: If the centre, width or depth of the spread are changing in time,\n");
            fprintf(stdout,"INFO: the placement of events changes continuously.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRE OF SPREAD ....... Channel from which spreading radiates (must be an integer).\n");
            fprintf(stdout,"INFO: CHANNEL SPREAD ......... Total Number of channels over which spreading extends.\n");
            fprintf(stdout,"INFO: DEPTH OF SPREAD FRONT .. Number of channels (on each side) activated behind spreading front.\n");
            fprintf(stdout,"INFO: LEVEL ROLLOFF WITH ADDED CHANNELS .... Level compensation for addition of new output channels.\n");
            fprintf(stdout,"INFO:                       0, No rolloff, all channels go up to full level as they are added.\n");
            fprintf(stdout,"INFO:                       1, Full rolloff, level falls to 1/N for N channels of output.\n");
            fprintf(stdout,"INFO:                       Intermediate values are possible.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRE AND SPREAD can vary continuously over time.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(4):
            fprintf(stdout,"INFO: MODE 5:  ANTIPHONALLY SWAP (SILENCE-SEPARATED) EVENTS IN SOUND BETWEEN TWO SETS OF OUTPUT-CHANNELS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Events are switched between one set of output channels and another.\n");
            fprintf(stdout,"INFO: Event switching occurs only at the onset of a new event.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ANTIPHONAL CHANNEL SETS ..... two strings of letters, with separator ('-')\n");
            fprintf(stdout,"INFO:          representing the 2 sets of output channels to alternate between.\n");
            fprintf(stdout,"INFO:          e.g. abcd-efgh = antiphony between output channels 1,2,3,4 and output channels 5,6,7,8.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE ..... This should not be less than the maximum channel number in the antiphony data,\n");
            fprintf(stdout,"INFO:         but it can be greater.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM DURATION OF SILENCES ..... minimum duration (mS) of consecutive zero-samples\n");
            fprintf(stdout,"INFO:          to constitute a silent 'gap' between peak-events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(5):
            fprintf(stdout,"INFO: MODE 6:  ANTIPHONALLY SWITCH BETWEEN TWO SETS OF OUTPUT-CHANNELS, USING 1 OR MORE SOUNDS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Sound output is switched between one set of output channels and another.\n");
            fprintf(stdout,"INFO: Event switching occurs at specified times and, if several files are input, the next sound in the input list is used.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ANTIPHONAL CHANNEL SETS ..... two strings of letters, with separator ('-')\n");
            fprintf(stdout,"INFO:          representing the 2 sets of output channels to alternate between.\n");
            fprintf(stdout,"INFO:          e.g. abcd-efgh = antiphony between output channels 1,2,3,4 and output channels 5,6,7,8.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE ..... This should not be less than the maximum channel number in the antiphony data,\n");
            fprintf(stdout,"INFO:         but it can be greater.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ANTIPHONY_TIMESTEP ..... Timestep before the output switches to the next set of output channels.\n");
            fprintf(stdout,"INFO:                       Can vary through time.\n");
            fprintf(stdout,"INFO: SILENT GAP BETWEEN ANTIPHONAL EVENTS ... Silence separating antiphonal events (if any).\n");
            fprintf(stdout,"INFO:                       Can vary through time.\n");
            fprintf(stdout,"INFO:                       Cannot be equal to or less than the minimum antiphony_timestep.\n");
            fprintf(stdout,"INFO: SPLICELENGTH (mS) ...... Length of splices fading in and out the antiphonal events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM DURATION OF SILENCES ..... minimum duration (mS) of consecutive zero-samples\n");
            fprintf(stdout,"INFO:          to constitute a silent 'gap' between peak-events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(6):
            fprintf(stdout,"INFO: MODE 7:  PAN FROM ONE CHANNEL CONFIGURATION TO ANOTHER, PASSING \"THROUGH the CENTRE\".\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PANNING DATA .... is a file containing a list of lines, each having : time  pan-positions\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         TIME value must increase, from one entry to the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         PAN-POSITIONS is a list of ALL the output channels in any order.\n");
            fprintf(stdout,"INFO:         Input channels 1 to N are mapped, in order, to the channels in your list.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         On moving from one list to the next, every input channel spreads outwards until\n");
            fprintf(stdout,"INFO:         it feeds every output channel, then gradually focuses into its next output-channel position.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:         To force all inputs to feed all outputs at the start of the sound, at the end of the sound,\n");
            fprintf(stdout,"INFO:         or at any point during the sound, enter a map of zeros (one zero for every input channel)\n");
            fprintf(stdout,"INFO:         at the starttime, and at the endtime, of the desired period.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: LEVEL ROLLOFF WITH ADDED CHANNELS .... Level compensation for addition of new output channels.\n");
            fprintf(stdout,"INFO:                       0, No rolloff, all channels go up to full level as they are added.\n");
            fprintf(stdout,"INFO:                       1, Full rolloff, level falls to 1/N for N channels of output.\n");
            fprintf(stdout,"INFO:                       Intermediate values are possible.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(7):
            fprintf(stdout,"INFO: MODE 8:  PAN A PROCESS ROUND A MULTICHANNEL FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The input multichannel sound remains where it is.\n");
            fprintf(stdout,"INFO: The processing itself progresses around the output space in the manner you define.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRE OF PROCESSING  ....... Channel where processing is located.\n");
            fprintf(stdout,"INFO: CHANNEL SPREAD OF PROCESSING .....Total Number of channels over which processing spreads.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(8):
            fprintf(stdout,"INFO: MODE 9:  ROTATE MONO SOUND AROUND MULTICHANNEL SPACE, SPECIFYING (POSSIBLY VARYING) SPEED.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE ..... This should not be less than the maximum channel number in the panning data.\n");
            fprintf(stdout,"INFO:         but it can be greater.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: START CHANNEL ...... Channel in which sound starts out.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPEED (CYCLES PER SEC) ...... Speed of rotation.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FOCUS ......... Degree to which positioned sound is focused in the loudspeaker.\n");
            fprintf(stdout,"INFO: If focus = 1.0, position set to (e.g.) '2' puts all the signal in lspkr 2.\n");
            fprintf(stdout,"INFO: If focus = 0.9, position '2' puts 90%% of the signal in lspkr 2\n");
            fprintf(stdout,"INFO: and the remainder in the 2 adjacent lspkrs (1 and 3).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ANTICLOCKWISE ...... Force rotation to be anticlockwise (default: clockwise).\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(9):
            fprintf(stdout,"INFO: MODE 10:  SWITCH (SILENCE-SEPARATED) MONO EVENTS IN SOUND BETWEEN RANDOMLY PERMUTED CHANNELS OF OUTPUT.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS IN OUTPUT FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FOCUS ......... Degree to which positioned sound is focused in the loudspeaker.\n");
            fprintf(stdout,"INFO: If focus = 1.0, position set to (e.g.) '2' puts all the signal in lspkr 2.\n");
            fprintf(stdout,"INFO: If focus = 0.9, position '2' puts 90%% of the signal in lspkr 2\n");
            fprintf(stdout,"INFO: and the remainder in the 2 adjacent lspkrs (1 and 3).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM DURATION OF SILENCES ..... minimum duration (mS) of consecutive zero-samples\n");
            fprintf(stdout,"INFO:          to constitute a silent 'gap' between events in source-sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EVENT GROUP SIZE ......... number of events at any channel, before switching to next.\n");
            fprintf(stdout,"INFO:          Can vary through time.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NO STEPS TO ADJACENT CHANNELS.......Reject moving to an adjacent output channel.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOMLY VARY GROUP SIZE.......number of events at any channel, before switching to next,\n");
            fprintf(stdout,"INFO:          can vary randomly from specified size down to just 1.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(TEX_MCHAN):
        fprintf(stdout,"INFO: TEXTURE MADE FROM ONE OR SEVERAL INPUT SOUND FILES, TO MANY OUTPUT CHANNELS\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: HARMONIC TYPES OF TEXTURE------------------------------------------------------\n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Textures are specified WITHIN A (possibly varying) RANGE OF PITCHES\n");
        fprintf(stdout,"INFO: and within that range, the chosen pitches may be\n");
        fprintf(stdout,"INFO: entirely RANDOM, on a HARMONIC SET (using pitches given),\n");
        fprintf(stdout,"INFO: on a HARMONIC FIELD (uses 8va transpositions of pitches given),\n");
        fprintf(stdout,"INFO: or on HARMONIC SETS, OR FIELDS, WHICH CHANGE THROUGH TIME.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: First note (only) of motifs are guaranteed to be on a harmonic set(field) note\n");
        fprintf(stdout,"INFO: except in MOTIFS IN HF, where motifs notes are forced onto set (field) notes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: PARAMETERS FOR TEXTURE---------------------------------------------------------\n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (** starred items CANNOT VARY in time)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT DURATION...........**.(min) duration of outfile\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- TIMING PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: EVENT PACKING ...............(average) time between event onsets.\n");
        fprintf(stdout,"INFO: SKIPTIME BETWEEN GROUP,MOTIF ONSETS..(average) time between group,motif onsets.\n");
        fprintf(stdout,"INFO: EVENT SCATTER................randomisation of event, group or motif onsets.\n");
        fprintf(stdout,"INFO: TIME GRID UNIT...............minstep(MS) quantised timegrid (for event starttimes)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- SOUND PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1ST SND-IN-LIST TO USE,LAST..1st,last snd to use,from listed input sounds.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- LOUDNESS PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIN EVENT GAIN, MAX..........min & max level of input events\n");
        fprintf(stdout,"INFO: MIN EVENT SUSTAIN, MAX.......min & max sustain-time of events.\n");
        fprintf(stdout,"INFO: OVERALL ATTENUATION..........overall attenuation of the output\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- PITCH PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MIN PITCH, MAX...............min & max pitch(MIDI): (gives transposition of input)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- SPATIAL PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SPATIAL POSITION.............centre of output sound-image.\n");
        fprintf(stdout,"INFO: SPATIAL SPREAD...............spatial-spread of texture events (0 to all-outchans).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If spatial spread is set to ZERO ....\n");
        fprintf(stdout,"INFO: With MONO sources, output is distributed randomly over all output channels\n");
        fprintf(stdout,"INFO: with no events in positions BETWEEN output channels (all events IN single loudspeakers).\n");
        fprintf(stdout,"INFO: With STEREO sources, each stereo event is assigned to a random pair of output channels,\n");
        fprintf(stdout,"INFO: and these pairs are randomly permuted, so all channels used before any channel visited a 2nd time.\n");
        fprintf(stdout,"INFO: With panning sources, this produces a set of random pan-motions using all channels equally.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------- OTHER PARAMETERS -----------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SEED.........................same seed-number: reproducible output (0: not so)\n");
        fprintf(stdout,"INFO: PLAY ALL OF INSOUND..........always play whole input-sound (ignoring dur vals).\n");
        fprintf(stdout,"INFO: PLAY FILES CYCLICALLY........play sounds in input order (always uses ALL input sounds).\n");
        fprintf(stdout,"INFO: RANDOMLY PERMUTE EACH CYCLE..permute order of sounds, in each complete cycle.\n");
        fprintf(stdout,"INFO: FIXED POSITIONS..............infiles set at fixed positions in output.\n");
        fprintf(stdout,"INFO:          This option only functions if the output channel count > 2\n");
        fprintf(stdout,"INFO:          and output positions are located on stereo-images formed by alternate lspkrs\n");
        fprintf(stdout,"INFO:          (i.e. stereo 1-3, stereo 2-4, stereo 3-5 etc)\n");
        fprintf(stdout,"INFO:          In this case, \"SPATIAL POSITION\" is read as an offset of the placement of output positions\n");
        fprintf(stdout,"INFO:          With no offset, first sounds entered are on the channels 1-3 stereo image.\n");
        fprintf(stdout,"INFO:          With offset of 1 first sounds entered are on the channels 2-4 stereo image, and so on\n");
        fprintf(stdout,"INFO:          \"SPATIAL SPREAD\" is read as a randomisation of these positions\n");
        fprintf(stdout,"INFO:          with a range 0 to 1 (entered values above 1 are truncated to 1).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: NOTEDATA IS A TEXTFILE CONTAINING-----------------------------------------------\n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LINE 1: list of (possibly fictional) MIDI pitch of each input snd.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Then, where  harmonic sets or harmonic fields are required,\n");
        fprintf(stdout,"INFO: each subsequent group of lines specifies a NOTELIST\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: NOTELISTS HAVE THE FOLLOWING FORMAT---------------------------------------------\n");
        fprintf(stdout,"INFO: --------------------------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: first line:  #N\n");
        fprintf(stdout,"INFO: other lines: time(SECS)     infile_no      pitch(MIDI)      amp(MIDI)     dur(SECS)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: where N = number of notes (and therefore lines) in notelist to follow,\n");
        fprintf(stdout,"INFO: and times in notelist must never decrease.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (The amp(MIDI) and dur(SECS) params are now redundant, but need to be included).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MANYSIL):
        fprintf(stdout,"INFO: INSERT SEVERAL SILENCES IN A SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SILENCE LOCATION & DURATION .....time/duration value pairs, being the times in the sound to insert the silences,\n");
        fprintf(stdout,"INFO:                                 and the durations of the inserted silences..\n");
        fprintf(stdout,"INFO: SPLICE LENGTH .... length of splices, in mS.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(RETIME):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: MODE 1:  RETIME USER-IDENTIFIED PEAKS IN SOUND, PLACING THEM AT REGULAR BEATS AT SPECIFIED MM.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: LOCATIONS OF BEATS .....list of times of events corresponding to beats, in original sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: METRONOME MARK OR BEAT DURATION .... indicating required output tempo.\n");
            fprintf(stdout,"INFO:        (Marked events in source will be placed at regular beats at this MM in output)\n");
            fprintf(stdout,"INFO:        Values between 20 and 400 are interpreted as MM\n");
            fprintf(stdout,"INFO:        Values below 1.0 are interpreted as beat duration\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: MODE 2:  RETIME EVENTS IN ANY SOUND, USING RETIMING DATA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RETIMING DATA .....which consists of.\n");
            fprintf(stdout,"INFO:      (a) MM of rhythm of accents in original sound.\n");
            fprintf(stdout,"INFO:      (b) Time, in the outfile, of the first accented event.\n");
            fprintf(stdout,"INFO:      (c) Two columns of (increasing) time-data. \n");
            fprintf(stdout,"INFO:             (1) The true position of the attacks in the original sound.\n");
            fprintf(stdout,"INFO:             (2) The ideal(ised) position of those attacks.\n");
            fprintf(stdout,"INFO:                    NB time of first-accented event must equal a time in this 2nd list.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:      This Data can be generated AUTOMATICALLY from the 'rcode' property in a properties file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: METRONOME MARK OR BEAT DURATION .... indicating required OUTPUT tempo.\n");
            fprintf(stdout,"INFO:       Values between 20 and 400 are interpreted as MM\n");
            fprintf(stdout,"INFO:       Values below 1.0 are interpreted as beat duration\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PEAKWIDTH (mS) .... ..width to which peak events will be cut, in output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPLICE LENGTH (mS) .... risetime to events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(2):
            fprintf(stdout,"INFO: MODE 3:  SHORTEN (SILENCE-SEPARATED) EVENTS IN A SOUND, USING PEAKWIDTH DATA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OUTPUT PEAKWIDTH .............. width (in mS) of peaks required in output sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OUTPUT SPLICE LENGTH .... ...time (in mS) for splice cutoff of events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ORIGINAL SPLICE LENGTH .. time (in mS) of splices at end of events in original data.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(3):
            fprintf(stdout,"INFO: MODE 4:  RETIME (SILENCE-SEPARATED) EVENTS IN SOUND, PLACING THEM AT REGULAR BEATS AT SPECIFIED MM.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: METRONOME MARK OR BEAT DURATION .... indicating required output tempo.\n");
            fprintf(stdout,"INFO:       (Marked events in source will be placed at regular beats at this MM in output)\n");
            fprintf(stdout,"INFO:       Values between 20 and 400 are interpreted as MM\n");
            fprintf(stdout,"INFO:       Values below 1.0 are interpreted as beat duration\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PREGAIN .... Gain applied to input\n");
            fprintf(stdout,"INFO:       possibly set less than 1.0 where existing grains overlap in output.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(4):
            fprintf(stdout,"INFO: MODE 5:  RETIME (SILENCE-SEPARATED) EVENTS IN SOUND, CHANGING THEIR TIMING BY A GIVEN FACTOR.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TEMPO-CHANGE FACTOR .... increases or decreases tempo of events.\n");
            fprintf(stdout,"INFO:       Factor may vary over time.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TEMPO-CHANGE STARTS AFTER .... Events not moved before this time.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TEMPO-CHANGE ENDS BEFORE .... Events not moved after this time.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SYNCHRONISATION TIME .... .. Time of event in input which will sync with its copy in output.\n");
            fprintf(stdout,"INFO:                    Time should be WITHIN the desired event. Zero implies sync at 1st event.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(5):
            fprintf(stdout,"INFO: MODE 6:  REPOSITION (SILENCE-SEPARATED) EVENTS AT SPECIFIED BEATS, AT SPECIFIED TEMPO.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: BEAT LOCATIONS OF EVENTS .... positioning of output events, counted as beats.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: METRONOME MARK OR BEAT DURATION .... indicating required output tempo.\n");
            fprintf(stdout,"INFO:       Values between 20 and 1000 are interpreted as MM\n");
            fprintf(stdout,"INFO:       Values below 1.0 are interpreted as beat duration\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIME OF FIRST SOUNDING EVENT IN OUTPUT .... in seconds.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:       between peak events.\n");
            fprintf(stdout,"INFO: PREGAIN .... Applied to output: may be necessary if retimed events overlap one another.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(6):
            fprintf(stdout,"INFO: MODE 7:  REPOSITION (SILENCE-SEPARATED) EVENTS AT SPECIFIED TIMES.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIME LOCATIONS OF EVENTS .... positioning of output events, indicated in seconds.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIME OF FIRST SOUNDING EVENT IN OUTPUT .... in seconds.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:       between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PREGAIN .... Applied to output: may be necessary if retimed events overlap one another.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(7):
            fprintf(stdout,"INFO: MODE 8:  REPEAT SPECIFIED (SILENCE-SEPARATED) EVENT, WITHIN SOUND, AT SPECIFIED TEMPO.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: METRONOME MARK OR BEAT DURATION .... indicating required output tempo.\n");
            fprintf(stdout,"INFO:       Values between 20 and 1000 are interpreted as MM\n");
            fprintf(stdout,"INFO:       Values below 1.0 are interpreted as beat duration\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EVENT LOCATION .... (rough) start-time in file of event to be repeated (must be INSIDE event).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: BEATS IN EVENT .... Number of beats (at specified tempo) within the event to repeat.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EVENT REPETITIONS .... How many times (1 or more) to repeat the event.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(8):
            fprintf(stdout,"INFO: MODE 9:  MASK (REPLACE BY SILENCE) (SILENCE-SEPARATED) EVENTS, IN A SPECIFIED PATTERN OF 'DELETIONS'.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MASKING PATTERN......sequence of 0s (mask) and 1s (don't mask) describing masking pattern.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:       between peak events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(9):
            fprintf(stdout,"INFO: MODE 10: EQUALISE LEVELS, OR ACCENT, (SILENCE-SEPARATED) EVENTS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: DEGREE OF LEVEL EQUALISATION .... Range from 0 to 1.\n");
            fprintf(stdout,"INFO:       1 Boosts level of all events to that of loudest. 0 has no effect.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ACCENT_GROUPING .... If set to ZERO, existing accentuation pattern retained,\n");
            fprintf(stdout,"INFO:       and quieter events are boosted by \"equalisation\".\n");
            fprintf(stdout,"INFO:       If set to (e.g.) 3, every 3rd events is accented,\n");
            fprintf(stdout,"INFO:       (others are set at \"equalisation\" level.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PREGAIN .... Applied to output, only where accent-grouping > 0.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(10):
            fprintf(stdout,"INFO: MODE 11: REPORT DURATION OF SHORTEST (AND LONGEST) (SILENCE-SEPARATED) EVENT.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM INTER-EVENT SILENCE (mS) .... minimum duration of any silence\n");
            fprintf(stdout,"INFO:        between peak events.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(11):
            fprintf(stdout,"INFO: MODE 12: LOCATE START OF SOUND (FIRST NON-ZERO SAMPLE) IN FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OUTPUT TEXTFILE .... Data can be written to a new file, or to an existing file.\n");
            fprintf(stdout,"INFO:       The outputfile must have a '.txt' extension, or NO extension.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:       The output data consists of the sound-start-time plus the name of the soundfile.\n");
            fprintf(stdout,"INFO:       The same file can be used for successive calls to this process:\n");
            fprintf(stdout,"INFO:       new data will be appended to the end of the file.\n");
            fprintf(stdout,"INFO:       Hence this process can be applied as a BULK PROCESS on a list of input files.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(12):
            fprintf(stdout,"INFO: MODE 13: MOVE ALL DATA IN FILE SO FILE PEAK FOUND MOVES TO SPECIFIED TIME.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NEW PEAK TIME ......... Time to which to move peak in file.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(13):
            fprintf(stdout,"INFO: MODE 14: MOVE ALL DATA IN FILE SO FILE EVENT SPECIFIED MOVES TO SPECIFIED TIME.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NEW PEAK TIME ......... Time to which to move peak in file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ORIGINAL PEAK TIME .... Time of existing peak in file.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(HOVER):
        fprintf(stdout,"INFO: WANDER THROUGH FILE, ZIGZAG READING SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RATE OF HOVER (Hz) .... slow rate read lots of samples forwards, then backwards\n");
        fprintf(stdout,"INFO:                         fast rate read fewer samples forwards, then backwards\n");
        fprintf(stdout,"INFO: LOCATION OF HOVERING .. Time in input sound where samples are read.\n");
        fprintf(stdout,"INFO: RANDOMISATION OF RATE (0-1)\n");
        fprintf(stdout,"INFO: RANDOMISATION OF LOCATION (0-1)\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (mS) .... Must by less then 2 divided by max \"rate\" used\n");
        fprintf(stdout,"INFO: OUTPUT DURATION ....... Total Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MULTIMIX):
        fprintf(stdout,"INFO: GENERATE MULTI-CHANNEL MIXFILES FROM A LIST OF SOUNDFILES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  ALL FILES START AT TIME ZERO. OUTPUT CHANNEL COUNT IS MAX INPUT CHANNEL COUNT.\n");
        fprintf(stdout,"INFO: (2)  EACH FILE STARTS WHERE PREVIOUS FILE ENDS. OUT CHANNEL CNT IS MAX INPUT CHANNEL CNT.\n");
        fprintf(stdout,"INFO: (3)  EACH FILE STARTS AT A FIXED 'TIMESTEP' AFTER THE PREVIOUS ONE. OUT CHANNEL CNT IS MAX INPUT CHANNEL CNT.\n");
        fprintf(stdout,"INFO: (4)  STEREO (or mono) SOUND DISTRIBUTED TO NARROW AND WIDE STEREO PAIRS (4 of 8).\n");
        fprintf(stdout,"INFO: (5)  STEREO (or mono) SOUND DISTRIBUTED OVER AN 8-CHANNEL (PAIR-AT FRONT) SYSTEM.\n");
        fprintf(stdout,"INFO:          in modes 4 and 5, mono is treated as stereo with same signal in each channel.\n");
        fprintf(stdout,"INFO: (6)  N MONO SOUNDS SENT, IN ORDER, TO N SEPARATE OUTPUT CHANNELS.\n");
        fprintf(stdout,"INFO: (7)  MONO SOUNDS SENT, IN ORDER, TO SEPARATE OUTPUT CHANNELS.\n");
        fprintf(stdout,"INFO:              wrapping back to initial position, if more input files than output channels.\n");
        fprintf(stdout,"INFO: (8)  ALL FILES START AT TIME ZERO. OUTPUT CHANNEL COUNT SPECIFIED BY PARAMETER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIME STEP BETWEEN ENTRIES ..... (Mode 3).\n");
        fprintf(stdout,"INFO: RELATIVE LEVEL OF OUTER PAIR .. (Mode 4) Assuming inner pair is at level 1, this is outer pair level.\n");
        fprintf(stdout,"INFO:                                                           All levels are adjusted to avoid distortion.\n");
        fprintf(stdout,"INFO: FRONT PAIR LEVEL ........ (Mode 5) Level of stereo signal on front pair of loudspeakers.\n");
        fprintf(stdout,"INFO: FRONT WIDE PAIR LEVEL ... (Mode 5) Level of stereo signal on front pair of loudspeakers.\n");
        fprintf(stdout,"INFO: REAR WIDE PAIR LEVEL .... (Mode 5) Level of stereo signal on front pair of loudspeakers.\n");
        fprintf(stdout,"INFO: REAR PAIR LEVEL ......... (Mode 5) Level of stereo signal on front pair of loudspeakers.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 7:\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT .....No of channels in output file.\n");
        fprintf(stdout,"INFO: START CHANNEL ........... Output channel to which first input file is sent.\n");
        fprintf(stdout,"INFO: CHANNEL SKIP ............ Step between output-channel assignment.\n");
        fprintf(stdout,"INFO:                      SKIP 1    assign to successive channels.\n");
        fprintf(stdout,"INFO:                      SKIP 2    assign to alternate channels.\n");
        fprintf(stdout,"INFO:                      SKIP -1   assign to successive channels, counting downwards.\n");
        fprintf(stdout,"INFO: TIMESTEP ................ Timestep between successive entries in mixfile.\n");
        break;
    case(FRAME):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: MODE 1: ROTATE ENTIRE SPATIAL FRAME OF A MULTICHANNEL SOUNDFILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SNAKING SEQUENCE ...... \n");
            fprintf(stdout,"INFO:       In a clockwise frame rotation, an input channel proceeds on a path around all the lspkrs,\n");
            fprintf(stdout,"INFO:       e.g. in an 8-chan file, input-chan 1 follows the path 1- 2->3->4->5->6->7->8->1 etc\n");
            fprintf(stdout,"INFO:       and the other input channels follow it in a \"snake\".\n");
            fprintf(stdout,"INFO:       This ROTATION-snake is the DEFAULT motion, and you should enter\n");
            fprintf(stdout,"INFO:       a ZERO for the snaking sequence, to generate a rotation.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:       However, the channels might snake around the lspkrs on a different route\n");
            fprintf(stdout,"INFO:       e.g. (for an 8-channel file) \"1 3 5 4 6 8 7 2\"\n");
            fprintf(stdout,"INFO:       and these routes could vary over time.\n");
            fprintf(stdout,"INFO:       You can specify such alternative routes in a text datafile of \"time : route\" values\n");
            fprintf(stdout,"INFO:       A line in the datafile for the above route, starting at time zero, would be\n");
            fprintf(stdout,"INFO:       \"0.0 1 3 5 4 6 8 7 2\"\n");
            fprintf(stdout,"INFO:       A changed route could be specified at a later time, on the next line\n");
            fprintf(stdout,"INFO:       e.g. \"1.3327 1 4 6 3 8 5 7 2\"\n");
            fprintf(stdout,"INFO:       In the datafile, the first time used must be zero, and times must increase.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ROTATION SPEED ........\n");
            fprintf(stdout,"INFO:       The speed of frame-rotation, in complete-rotations per second. This can vary over time.\n");
            fprintf(stdout,"INFO:       Positive values give clockwise rotation; negative values, anticlockwise.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SMEAR ........\n");
            fprintf(stdout,"INFO:       Extent to which signal in any OUTPUT channel bleeds onto its 2 adjacent channels.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: MODE 2: ROTATE ENTIRE SPATIAL FRAME OF SOUNDFILE, ROTATING ODD AND EVEN CHANNELS INDEPENDENTLY.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SNAKING SEQUENCE ...... \n");
            fprintf(stdout,"INFO:       In a clockwise frame rotation here,\n");
            fprintf(stdout,"INFO:       an ODD input channel proceeds on a path around all ODD outchannels,\n");
            fprintf(stdout,"INFO:       e.g. in an 8-chan file, input-chan 1 follows the path 1->3->5->7->1 etc\n");
            fprintf(stdout,"INFO:       and the other ODD input channels follow it in a \"snake\" around the ODD outchannels,\n");
            fprintf(stdout,"INFO:       while an EVEN input channel proceeds on a path around all EVEN outchannels,\n");
            fprintf(stdout,"INFO:       e.g. in an 8-chan file, input-chan 2 follows the path 2->4->6->8->2 etc\n");
            fprintf(stdout,"INFO:       and the other EVEN input channels follow it in a \"snake\" around the EVEN outchannels.\n");
            fprintf(stdout,"INFO:       This ROTATION-snake is the DEFAULT motion, and you should enter\n");
            fprintf(stdout,"INFO:       a ZERO for the snaking sequence, to generate a double rotation.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:       but you can redefine the snaking sequences with a datafile\n");
            fprintf(stdout,"INFO:       e.g.  the snake \"8 6 5 2 7 3 4 1\" produces one snake around the odd entries\n");
            fprintf(stdout,"INFO:       i.e. 8 -> 5 -> 7 -> 4 -> 8 etc\n");
            fprintf(stdout,"INFO:       and a 2nd snake around the even entries\n");
            fprintf(stdout,"INFO:       i.e. 6 -> 2 -> 3 -> 1 -> 6 etc\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: 1ST ROTATION SPEED ........\n");
            fprintf(stdout,"INFO:       The speed of frame-rotation for the ODD input channels, in complete-rotations per second. This can vary over time.\n");
            fprintf(stdout,"INFO:       Positive values give clockwise rotation; negative values, anticlockwise.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: 2ND ROTATION SPEED ........\n");
            fprintf(stdout,"INFO:       The speed of frame-rotation for the EVEN input channels, in complete-rotations per second. This can vary over time.\n");
            fprintf(stdout,"INFO:       Positive values give clockwise rotation; negative values, anticlockwise.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SMEAR ........\n");
            fprintf(stdout,"INFO:       Extent to which signal in any OUTPUT channel bleeds onto its 2 adjacent channels.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(2):
            fprintf(stdout,"INFO: MODE 3:  REORIENTATE THE CHANNELS OF THE INPUT FILE TO (FIXED) NEW POSITIONS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: REORIENTATION ..... a list of ALL the output channels, in some order.\n");
            fprintf(stdout,"INFO:        Each successive input channel will be sent to the next output channel in the list.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:        For example, the list \"2 4 6 8 1 3 5 7\"  will cause the input channels to be routed\n");
            fprintf(stdout,"INFO:        1 to 2 : 2 to 4 : 3 to 6 : 4 to 8 : 5 to 1 : 6 to 3 : 7 to 5 : 8 to 7\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(3):
            fprintf(stdout,"INFO: MODE 4:  MIRROR the FRAME OF THE INPUT FILE ABOUT A SPECIFIED AXIS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIRROR PLANE .... Channel number, or Channel-number + 0.5.\n");
            fprintf(stdout,"INFO:       The output channels are symmetrically mirrored about the channel given \n");
            fprintf(stdout,"INFO:       or around the midpoint between channels (1.5 is midpoint between 1 and 2).\n");
            fprintf(stdout,"INFO:       With an N-channel file, N.5 is midpoint between channels N and 1.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(4):
            fprintf(stdout,"INFO: MODE 5:  RENUMBER the OUTPUT CHANNELS, FROM A RING TO A BILATERAL SCHEMA (OR VICE VERSA).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TO RING FORMAT ....\n");
            fprintf(stdout,"INFO:       WITHOUT this flag, converts from ring schema to bilateral schema.\n");
            fprintf(stdout,"INFO:       WITH this flag, converts from bilateral schema to ring schema.\n");;
            fprintf(stdout,"INFO:               Ring         Bilateral                  Ring               Bilateral\n");
            fprintf(stdout,"INFO:                 1                 1                          1                      1\n");
            fprintf(stdout,"INFO:               8   2            2   3                     5   2                 2   3\n");
            fprintf(stdout,"INFO:              7     3          4     5                     4 3                   4 5\n");
            fprintf(stdout,"INFO:               6   4            6   7\n");
            fprintf(stdout,"INFO:                 5                 8\n");
            fprintf(stdout,"INFO: All multichannel processes assume RING format. If using a bilateral numbering schema\n");
            fprintf(stdout,"INFO: convert from and to Bilateral format, before and after processing data.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(5):
            fprintf(stdout,"INFO: MODE 6:  SWAP ANY 2 CHANNEL OF A MLTICHANNEL FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNEL TO SWAP .... The channel to exchange.\n");
            fprintf(stdout,"INFO: CHANNEL TO SWAP WITH .... The channel to exchange it with.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(6):
            fprintf(stdout,"INFO: MODE 7:  ADJUST LEVEL IN (OR ENVELOPE) ONLY SPECIFIED CHANNELS OF A MULTICHANNEL FILE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CHANNELS TO MODIFY ....... Either a channel number, or a text file list of channel numbers.\n");
            fprintf(stdout,"INFO:            Only these channels are modified by the process.\n");
            fprintf(stdout,"INFO: GAIN OR ENVELOPE ....... The gain, or the time-varying gain in the envelope file\n");
            fprintf(stdout,"INFO:            to apply to the specified channels.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(7):
            fprintf(stdout,"INFO: MODE 8:  RENUMBER the OUTPUT CHANNELS, FROM A RING TO BEAST BILATERAL SCHEMA (OR VICE VERSA).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TO RING FORMAT ....\n");
            fprintf(stdout,"INFO:       WITHOUT this flag, converts from ring schema to BEAST bilateral schema.\n");
            fprintf(stdout,"INFO:       WITH this flag, converts from BEAST bilateral schema to ring schema.\n");;
            fprintf(stdout,"INFO:               Ring         Bilateral                  Ring               Bilateral\n");
            fprintf(stdout,"INFO:                 1                 7                          1                      5\n");
            fprintf(stdout,"INFO:               8   2            1   2                     5   2                 1   2\n");
            fprintf(stdout,"INFO:              7     3          3     4                     4 3                   3 4\n");
            fprintf(stdout,"INFO:               6   4            5   6\n");
            fprintf(stdout,"INFO:                 5                 8\n");
            fprintf(stdout,"INFO: All multichannel processes assume RING format. If using a bilateral numbering schema\n");
            fprintf(stdout,"INFO: convert from and to Bilateral format, before and after processing data.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: \"BEAST\" = Birmingham Electro-Acoustic Sound Theatre sound-diffusion system.\n");
            break;
        }
        break;
    case(SEARCH):
        fprintf(stdout,"INFO: FIND THE FIRST REAL SIGNAL IN FILE(S) WHICH START(S) WITH SILENCE.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHANREV):
        fprintf(stdout,"INFO: CREATE MULTICHANNEL ECHO OR REVERBERATION AROUND A SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: INPUT GAIN................Attenuates signal input to stadium.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LEVEL LOSS WITH DISTANCE..across stadium.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: STADIUM SIZE MULTIPLIER...Multiplies average time between echoes.\n");
        fprintf(stdout,"INFO: ..........................(Default average echo time = 0.1 secs).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF ECHOS...........Number of stadium echoes produced.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF OUTPUT CHANNELS....Number of channels in output sound.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CENTRE OF SOUND IMAGE........Centre of sound image amongst output channels.\n");
        fprintf(stdout,"INFO:                      Values from 0, to the total number of output channels.\n");
        fprintf(stdout,"INFO:                      Values can be fractional. Values below 1, lie between Channel N and channel 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SPREAD_OF_ECHOS/REVERB.......Spread of echoes/reverb across output channels.\n");
        fprintf(stdout,"INFO:                      values from 2, to the total number of output channels.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(WRAPPAGE):
        fprintf(stdout,"INFO: GRANULAR RECONSTITUTION OF ONE OR MORE SOUNDFILES, MOVING AROUND A MULTICHANNEL SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CENTRE OF SPREAD  ............ Channel from which sound radiates.Any number between 0 & last output channel.\n");
        fprintf(stdout,"INFO:             Values less than 1, represent locations between the last outchan and the 1st.\n");
        fprintf(stdout,"INFO:             The centre can be moved by supplying a datafile of triples: \"Time   Centre   Direction\"\n");
        fprintf(stdout,"INFO:             Direction, either 1 (clockwise) or -1 (anticlockwise), is direction of motion from PREVIOUS value.\n");
        fprintf(stdout,"INFO: OUTPUT CHANNELS ............. Number of channels of MULTICHANNEL OUTPUT (>2).\n");
        fprintf(stdout,"INFO: CHANNEL SPREAD ............... Total Number of channels over which sound image extends.\n");
        fprintf(stdout,"INFO: DEPTH OF SPREAD FRONT ..... Number of channels (on each side) activated behind spreading front.\n");
        fprintf(stdout,"INFO: TIMESHRINK...... ................Speed of advance in infiles, relative to outfile. (>=0)\n");
        fprintf(stdout,"INFO:              Inverse of timestretch, (& permits infinite timestretch).\n");
        fprintf(stdout,"INFO: DENSITY...........................Amount of grain overlap (>0 : <1 leaves intergrain silence)\n");
        fprintf(stdout,"INFO:              Extremely small values will cease to perform predictably.\n");
        fprintf(stdout,"INFO: GRAINSIZE........................grainsize in MS (must be > 2 * splicelen)\n");
        fprintf(stdout,"INFO: PITCHSHIFT.......... ............is pitchshift of grains in +|- (fractions of) semitones.\n");
        fprintf(stdout,"INFO: LOUDNESS RANGE................is range of gain on grains.\n");
        fprintf(stdout,"INFO:              Use only if amp is to vary (over range &/or through time)\n");
        fprintf(stdout,"INFO: STARTSPLICE.....................length of startsplices on grains,in MS.\n");
        fprintf(stdout,"INFO: ENDSPLICE........................length of endsplices on grains,in MS.\n");
        fprintf(stdout,"INFO: SEARCHRANGE...................for nextgrain, before current 'now' in infile (Default 0 MS).\n");
        fprintf(stdout,"INFO: SCATTER..........................Randomisation of grain position (Range 0-1).\n");
        fprintf(stdout,"INFO: OUTPUT LENGTH.................max outfile length (if end of data not reached).\n");
        fprintf(stdout,"INFO:              Set to zero (Default) for this parameter to be ignored.\n");
        fprintf(stdout,"INFO:              BUT if TIMESHRINK is ANYWHERE 0: OUTLENGTH must be given.\n");
        fprintf(stdout,"INFO: EXPONENTIAL SPLICES.........Default, Linear.\n");
        fprintf(stdout,"INFO: RELATIVE TO OUTPUT TIME..Timeshrink parameters are ALWAYS read relative to time in INPUT file.\n");
        fprintf(stdout,"INFO:              All other parameters are normally also read relative to time in input file.\n");
        fprintf(stdout,"INFO:              Set this flag to force those parameters to be read relative to time in OUTPUT file.\n");
        fprintf(stdout,"INFO: TIMESHRINK LIMIT,DENSITY LIMIT ETC.......allow range of values to be specified\n");
        fprintf(stdout,"INFO:              for any of these params. e.g. With Density & Density Limit set\n");
        fprintf(stdout,"INFO:              a random density is generated between these values,\n");
        fprintf(stdout,"INFO:              while Density & Density Limit can THEMSELVES vary through time.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHSTEREO):
        fprintf(stdout,"INFO: INSERT STEREO FILES INTO A MULTICHANNEL OUTPUT SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: This process allows, for example, stereo outputs from processing the individual channels\n");
        fprintf(stdout,"INFO: of a multichannel file (e.g. reverberation) to be remixed into the multichannel context,\n");
        fprintf(stdout,"INFO: at the sample location as their original mono sources.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PREGAIN.......gain applied to stereo inputs before they are mixed to the output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUT CHANNEL ON WHICH STEREO INPUT CENTRED.......either a channel number,\n");
        fprintf(stdout,"INFO:              or a textfile of channel numbers, one for each stereo inputfile.\n");
        fprintf(stdout,"INFO:              Each stereo input image will be centred (in turn) at the output positions given,\n");
        fprintf(stdout,"INFO:              BUT ...\n");
        fprintf(stdout,"INFO: CENTRE BETWEEN OUTCHANS .... if this flag is set, the output stereo-images are centred\n");
        fprintf(stdout,"INFO:              to the right of the specified output centre, between the 2 output channels.\n");
        fprintf(stdout,"INFO:              e.g. Stereo signal sent to output 2, will be centred between output channels 2 & 3.\n");
        break;
    case(MTON):
        fprintf(stdout,"INFO: CONVERT MONO SOURCE TO MULTICHANNEL SOUND, WITH IDENTICAL DATA IN EVERY CHANNEL.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT.......Number of (identical) channels in the output file.\n");
        break;
    case(FLUTTER):
        fprintf(stdout,"INFO: IMPOSE MULTICHANNEL-DISPERSED LOUDNESS FLUTTERING ON A MULTICHANNEL FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CHANNEL SET SEQUENCE ..... The change in loudness occurs first in one set of output channels,\n");
        fprintf(stdout,"INFO:               then in another, as the fluttering proceeds.\n");
        fprintf(stdout,"INFO:               Each line contains a list of 1 or more of the output channels\n");
        fprintf(stdout,"INFO:               forming a 'channel set' which will flutter.\n");
        fprintf(stdout,"INFO:               The flutter passes from the channels in one set, to the channels in the next,\n");
        fprintf(stdout,"INFO:               on every pulse of the fluttering. When all the defined channels sets are used up,\n");
        fprintf(stdout,"INFO:               The sequence begins again at the start (BUT see the 'randomisation' flag, below),\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FLUTTER FREQUENCY (Hz) ...Frequency of loudness fluctuations. May vary over time.\n");
        fprintf(stdout,"INFO: FLUTTER DEPTH ................... Depth of loudness fluctuations. May vary over time.\n");
        fprintf(stdout,"INFO:               Depth between 0 and 1 determines the trough level of the flutter cycle.\n");
        fprintf(stdout,"INFO:               Depth above 1, makes flutter peaks narrower (troughing still at zero).\n");
        fprintf(stdout,"INFO: GAIN ...................................... Overall gain on the output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOMISE CHANNEL-SETS ORDER .... With this flag set, once all channel-sets have been used\n");
        fprintf(stdout,"INFO:               they are randomly permuted into a different order before the next flutter,\n");
        fprintf(stdout,"INFO:               and when all sets, in this new order, have been used, they are permuted again\n");
        fprintf(stdout,"INFO:               and so on. (The sets themselves are not changed by this process).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ABFPAN):
        fprintf(stdout,"INFO: APPLY FIXED OR ORBITING 1st ORDER B_FORMAT PAN TO A MONO INPUT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: START POSITION ..... 0 is front centre, with values increasing clockwise\n");
        fprintf(stdout,"INFO:               until we reach centre again at 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: END POSITION ....... \"N.M\" means \"N\" complete orbits, finishing at position \"M\".\n");
        fprintf(stdout,"INFO:               positive values give clockwise orbits, negative values anticlockwise orbits.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF B FORMAT OUTPUT CHANNELS .... Either 3 or (default) 4.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT AS STANDARD WAV: AMBISONIC.\n");
        fprintf(stdout,"INFO: OUTPUT AS STANDARD WAV  ........ (NB You cannot set both of these flags)\n");
        fprintf(stdout,"INFO:               The default output is a WAVEX B-FORMAT Ambisonic File.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ABFPAN2):
        fprintf(stdout,"INFO: APPLY FIXED OR ORBITING 2nd ORDER B_FORMAT PAN TO A MONO INPUT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: START POSITION ..... 0 is front centre, with values increasing clockwise\n");
        fprintf(stdout,"INFO:               until we reach centre again at 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: END POSITION ....... \"N.M\" means \"N\" complete orbits, finishing at position \"M\".\n");
        fprintf(stdout,"INFO:               positive values give clockwise orbits, negative values anticlockwise orbits.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PREGAIN .... ... Change the input file amplitude.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: STANDARD WAV (AMBISONIC) OUTPUT ...... default is WAVEX B-FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ABFPAN2P):
        fprintf(stdout,"INFO: APPLY FIXED OR ORBITING 2nd ORDER B_FORMAT PAN TO A MONO INPUT, IN 3-DIMENSIONS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: START POSITION ..... 0 is front centre, with values increasing clockwise\n");
        fprintf(stdout,"INFO:               until we reach centre again at 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: END POSITION ....... \"N.M\" means \"N\" complete orbits, finishing at position \"M\".\n");
        fprintf(stdout,"INFO:               positive values give clockwise orbits, negative values anticlockwise orbits.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PREGAIN .... ... Change the input file amplitude.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: HEIGHT.......... 90 is directly above, -90 directly below.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: STANDARD WAV (AMBISONIC) OUTPUT ...... default is WAVEX B-FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CHANNELX):
        fprintf(stdout,"INFO: EXTRACT CHANNELS FROM A MULTICHANNEL FILE OF ANY FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: INPUT CHANNELS TO EXTRACT.......... Textfile with a list of input channels to extract.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CHORDER):
        fprintf(stdout,"INFO: REORDER CHANNELS INSIDE A MULTICHANNEL FILE OF ANY FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: REORDERING STRING.......... String consisting of (lower-case) letters, with or without zeros.\n");
        fprintf(stdout,"INFO:               The string cannot contain more than 26 items.\n");
        fprintf(stdout,"INFO:               For example, for a 4-channel input file, the channels are represented by \"a\",\"b\",\"c\" and \"d\".\n");
        fprintf(stdout,"INFO:               \"0\" represents a (possible) silent output channel.\n");
        fprintf(stdout,"INFO:               Ordering strings for this 4-channel file could be.....\n");
        fprintf(stdout,"INFO:               \"abcd\" same order as the input (input file not altered).\n");
        fprintf(stdout,"INFO:               \"dcba\" reversed channel-order of the input.\n");
        fprintf(stdout,"INFO:               \"a00b\" input channel 1 to out-channel 1, input channel 2 to out-channel 4, with 2 silent channels.\n");
        fprintf(stdout,"INFO:               \"aababc00ddd\" etc (note that channels can be duplicated in the output).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:               For an 8-channel input file, channels are represented by \"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\" and \"h\".\n");
        fprintf(stdout,"INFO:               and so on.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FORCE A .amb FILENAME EXTENSION (CARE!!)\n");
        fprintf(stdout,"INFO:               specifying a \".amb\" file extension does NOT automatically produce an ambisonic output file.\n");
        fprintf(stdout,"INFO:               This can only be guaranteed by the internal structure of the data.\n");
        fprintf(stdout,"INFO:               Forcing a \".amb\" extension onto non-ambisonic data may cause confusion at a later data!\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: This program permits low level manipulation of the data format of files.\n");
        fprintf(stdout,"INFO: With ambisonic or other non-trivial data structures, it should be used WITH CAUTION!!\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \n");
        break;
    case(FMDCODE):
        fprintf(stdout,"INFO: PLAIN MULTI-LAYOUT DECODER FOR AMBISONIC FILES.\n");
        fprintf(stdout,"INFO: (No shelf filter or NF compensation used).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT LAYOUT.......... This can take one of the following values.\n");
        fprintf(stdout,"INFO:               1  : *   Mono (= W signal only).\n");
        fprintf(stdout,"INFO:               2  : *   Stereo (quasi mid/side, = W +- Y) \n");
        fprintf(stdout,"INFO:               3  :     Square (FL  FR  RR  RL  order)\n");
        fprintf(stdout,"INFO:               4  : *   Quad   (FL  FR  RL  RR  order)\n");
        fprintf(stdout,"INFO:               5  :     Pentagon  \n");
        fprintf(stdout,"INFO:               6  : *   5.0  (WAVEX order)\n");
        fprintf(stdout,"INFO:               7  : *   5.1  (WAVEX order : silent LFE)\n");
        fprintf(stdout,"INFO:               8  :     hexagon  \n");
        fprintf(stdout,"INFO:               9  :     octagon 1 (pair at front)\n");
        fprintf(stdout,"INFO:               10 :    octagon 2  (single lspkr at front centre)\n");
        fprintf(stdout,"INFO:               11 :    cube  (as 3 : low/high interleaved)\n");
        fprintf(stdout,"INFO:               12 : *  cube  (as 4 : low quad followed by high quad)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WRITE WAVEX LSPKR POSITIONS TO HEADER ....... NB only applies to \"*\" layouts above.\n");
        fprintf(stdout,"INFO: PLAIN WAV OUTFILE FORMAT ...... Default is generic wavex format.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CHXFORMAT):
        fprintf(stdout,"INFO: SET OR CHANGE THE LOUDSPEAKER POSITION MASK IN A WAVEX FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \nLSPKR_POSITION_MASK ....... Indicates the loudspeaker positions for sound output.");
        fprintf(stdout,"INFO:               0 : Unsets the loudspeaker mask.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CHXFORMATG):
        fprintf(stdout,"INFO: CHANGE GUID TYPE FROM WAVEX TO AMBISONIC, UNSETTING THE LSPKR POSITION MASK.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CHXFORMATM):
        fprintf(stdout,"INFO: SET THE POSSIBLE LOUDSPEAKER POSITION MASK VALUES FOR A WAVEX FILE.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(INTERLX):
        fprintf(stdout,"INFO: INTERELAVE LIST OF MONO OR STEREO SOUNDS (IN A TEXTFILE) TO A MULTICHANNEL OUTPUT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL FORMAT  ....... Indicates the output soundfile format.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:               0 : Standard (wav, aiff etc.) format.\n");
        fprintf(stdout,"INFO:               1 : generic WAV_EX (no loudspeaker assignments).\n");
        fprintf(stdout,"INFO:               2 : WAV_EX mono/stereo/quad (FL  FR  RL  RR). 1,2 or 4 input channels needed.\n");
        fprintf(stdout,"INFO:               3 : WAV_EX quad surround (L, C, R, S). Four input channels needed.\n");
        fprintf(stdout,"INFO:               4 : WAV_EX 5.1 format surround. Six input channels needed.\n");
        fprintf(stdout,"INFO:               5 : WAV_EX Ambisonic B-Format (W,X,Y,Z....). 3,4,5,6,7,8,9,11 or 16 input chans needed.\n");
        fprintf(stdout,"INFO:               6 : WAV_EX 5.0 surround. Five input channels needed.\n");
        fprintf(stdout,"INFO:               7 : WAV_EX 7.1 surround. Eight input channels needed.\n");
        fprintf(stdout,"INFO:               8 : WAV_EX Cube surround. Eight input channels needed.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Input files must match in sample rate, and number of channels, but can have different sample types.\n");
        fprintf(stdout,"INFO: If Input files are WAVEX, any loudspeaker position information is ignored.\n");
        fprintf(stdout,"INFO: The same input file can be listed several times, if required to send to several output channels.\n");
        break;
    case(COPYSFX):
        fprintf(stdout,"INFO: COPY SOUNDFILE, CHANGING THE FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SAMPLE TYPE  ....... Indicates the output sample type.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:               0 : Retain sample type of input file.\n");
        fprintf(stdout,"INFO:               1 : 16 bit integer (short).\n");
        fprintf(stdout,"INFO:               2 : 32 bit integer (long).\n");
        fprintf(stdout,"INFO:               3 : 32 bit floating-point.\n");
        fprintf(stdout,"INFO:               4 : 24 bit integer (packed).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTFILE FORMAT  ....... Indicates the output soundfile format.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:               -1 : Retain format of input file.\n");
        fprintf(stdout,"INFO:               0 : Standard wav format.\n");
        fprintf(stdout,"INFO:               1 : generic WAV_EX (no loudspeaker assignments).\n");
        fprintf(stdout,"INFO:               2 : WAV_EX mono/stereo/quad (FL  FR  RL  RR). 1,2 or 4 input channels needed.\n");
        fprintf(stdout,"INFO:               3 : WAV_EX quad surround (L, C, R, S). Four input channels needed.\n");
        fprintf(stdout,"INFO:               4 : WAV_EX 5.1 format surround. Six input channels needed.\n");
        fprintf(stdout,"INFO:               5 : WAV_EX Ambisonic B-Format (W,X,Y,Z....). 3,4,5,6,7,8,9,11 or 16 input chans needed.\n");
        fprintf(stdout,"INFO:               6 : WAV_EX 5.0 surround. Five input channels needed.\n");
        fprintf(stdout,"INFO:               7 : WAV_EX 7.1 surround. Eight input channels needed.\n");
        fprintf(stdout,"INFO:               8 : WAV_EX Cube surround. Eight input channels needed.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ADD TDPF DITHER TO 16 BIT OUTFILE .... improving quality of low level signals.\n");
        fprintf(stdout,"INFO: WRITE MINIMAL HEADER (NO PEAKDATA) ... header gets no information about peaks in the output file.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(NJOINCH):
        fprintf(stdout,"INFO: CHECK COMPATIBLITY OF FILES FOR CONCATENATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CD COMPATIBLE FILES ONLY .... All files must have sample-rate 44100\n");
        fprintf(stdout,"INFO:               and must be at least 4 seconds in duration. \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: All files must match in sample-rate and number of channels,\n");
        fprintf(stdout,"INFO: but may have different sample types (e.g. 16-bit, 32-bit etc.)\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(NJOIN):
        fprintf(stdout,"INFO: CONCATENATE FILES e.g. FOR C.D. COMPILATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SILENCE BETWEEN FILES ...... silence separating the files in concatenated output.\n");
        fprintf(stdout,"INFO:               To eliminate silence BEFORE 1st file in output, enter a NEGATIVE value.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CD COMPATIBLE FILES ONLY .... All files must have sample-rate 44100\n");
        fprintf(stdout,"INFO:               and must be at least 4 seconds in duration. \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT A TEXTFILE OF CUES .... Output extra file, with cue points in compilation. \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: All files must match in sample-rate and number of channels,\n");
        fprintf(stdout,"INFO: but may have different sample types (e.g. 16-bit, 32-bit etc.)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The output sample format is taken from the file with the highest precision.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(NMIX):
        fprintf(stdout,"INFO: MIX TWO FILES OF THE SAME FORMAT.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Any format is accepted, so long as both files have the same format.\n");
        fprintf(stdout,"INFO: Formats may be wav, aiff, WAVEX, Ambisonic, etc.\n");
        fprintf(stdout,"INFO: (WAVEX files must have the same loudspeaker layout).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Files may have different sample types (16bit, 32bit etc.)\n");
        fprintf(stdout,"INFO: and (unless \"Float Output\" flag is set) output takes the sample-type of the FIRST file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: START TIME OF 2nd FILE .... First file starts at zero; 2nd file starts at time specified here.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: APPLY DITHER TO 16bit OUTPUT .... Enhance quality of low level signal (only with 16bit output).\n");
        fprintf(stdout,"INFO: FLOAT OUTPUT ......................... Force 32bit floating point output type.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(RMSINFO):
        fprintf(stdout,"INFO: REPORT RMS AND AVERAGE POWER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Scans the file (between the times specified) and reports the loudness in various forms.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Output is a table of values showing, for each channel,\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1) the RMS loudness, as amplitude(0-1) and in dB\n");
        fprintf(stdout,"INFO: 2) the average loudness (power) as amplitude(0-1) and in dB\n");
        fprintf(stdout,"INFO: 3) the NET DC loudness as amplitude(0-1) and in dB\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SFEXPROPS):
        fprintf(stdout,"INFO: DISPLAY PROPERTIES OF WAVEX FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: These include\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The File Format.\n");
        fprintf(stdout,"INFO: The loudspeaker configuration.\n");
        fprintf(stdout,"INFO: The loudspeaker positions (if specified).\n");
        fprintf(stdout,"INFO: Creation date of the file.\n");
        fprintf(stdout,"INFO: Sample Rate.\n");
        fprintf(stdout,"INFO: Channel Count.\n");
        fprintf(stdout,"INFO: Sample Type (16-bit,32-bit etc.)\n");
        fprintf(stdout,"INFO: Duration.\n");
        fprintf(stdout,"INFO: Peak data information for each channel.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SETHARES):
        fprintf(stdout,"INFO: EXTRACT PEAKS FROM ANALYSIS DATA.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  LIST (TIME-VARYING) PEAKS\n");
        fprintf(stdout,"INFO:              List peaks in each window - windows may have different numbers of peaks.\n");
        fprintf(stdout,"INFO: (2)  STREAM MAXIMUM NUMBER OF PEAKS.\n");
        fprintf(stdout,"INFO:              Number of streams = maximum number of peaks in any one window in the file.\n");
        fprintf(stdout,"INFO:              Where a window has insufficient peaks to fill all the streams\n");
        fprintf(stdout,"INFO:              a zero-amplitude peak, at an estimated frequency , is set in the stream for that window.\n");
        fprintf(stdout,"INFO:              In this process, all peaks are retained.\n");
        fprintf(stdout,"INFO: (3)  STREAM MOST PROMINENT PEAKS.\n");
        fprintf(stdout,"INFO:              This process assumes that the spectrum is relatively stable.\n");
        fprintf(stdout,"INFO:              The peaks at every semitone interval in every window are counted.\n");
        fprintf(stdout,"INFO:              This determines the weighting of each pitch among the peaks in the entire file.\n");
        fprintf(stdout,"INFO:              The most prominent pitches are chosen as the stream-centres.\n");
        fprintf(stdout,"INFO:              Time-varying pitch/amp data is then assigned to these streams.\n");
        fprintf(stdout,"INFO:              In this process, some peaks may be discarded.\n");
        fprintf(stdout,"INFO: (4)  OUTPUT AVERAGE PITCHES.\n");
        fprintf(stdout,"INFO:              This process assumes that the spectrum is relatively stable.\n");
        fprintf(stdout,"INFO:              Streams are calculated as in Mode 3, and an average value calculated for each stream.\n");
        fprintf(stdout,"INFO:              The output data does not vary in time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SEARCH WINDOW SIZE (SEMITONES) .... semitone width of subwindow used to search for local peaks in spectrum.\n");
        fprintf(stdout,"INFO: PEAKING RATIO .............................. a peak is defined as a channel whose amplitude\n");
        fprintf(stdout,"INFO:              exceeds the median amplitude of all the channels in the subwindow, by this factor.\n");
        fprintf(stdout,"INFO: AMPLITUDE FLOOR .......................... peak must also exceed a floor value to be retained.\n");
        fprintf(stdout,"INFO:             Entered value is first multiplied by the maximum channel amplitude found in the file.\n");
        fprintf(stdout,"INFO: LOW PITCH LIMIT ............................ Minimum frequency to accept as a peak.\n");
        fprintf(stdout,"INFO: HIGH PITCH LIMIT ............................ Maximum frequency to accept as a peak.\n");
        fprintf(stdout,"INFO: IN-TUNE RANGE (SEMITONES) ............. range within which harmonics accepted as in tune.\n");
        fprintf(stdout,"INFO:             If NON-ZERO, peaks which are harmonics of other peaks are not retained.\n");
        fprintf(stdout,"INFO:             If set to zero, ALL peaks are retained.\n");
        fprintf(stdout,"INFO: NO AMPLITUDES ............................. Discard the amplitude information.\n");
        fprintf(stdout,"INFO:             NB: If the output is in \"FILTER FORMAT\", all amplitudes are set to 1.0.\n");
        fprintf(stdout,"INFO: MIDI OUTPUT ................................. Frequency data output as MIDI values.\n");
        fprintf(stdout,"INFO: QUANTISE TO QUARTERTONES ........... Quantise frqs to tempered-scale quartertone.\n");
        fprintf(stdout,"INFO: MARK ZEROS ................................. Mark windows which have NO peaks.\n");
        fprintf(stdout,"INFO:             If set, peak-free areas are marked by (timed) zeros in the output data.\n");
        fprintf(stdout,"INFO: FILTER FORMAT ............................. Output data in filter varibank format.\n");
        fprintf(stdout,"INFO:             This overrides the \"MARK ZEROS\" flag.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHSHRED):
        fprintf(stdout,"INFO: MULTICHANNEL SOUND SHREDDING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  SHRED MONO FILE TO N OUTPUT CHANNELS\n");
        fprintf(stdout,"INFO: (2)  SHRED MULTICHANNEL FILE\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Cut file into segments, rearrange the segments: Repeat the process on the output.\n");
        fprintf(stdout,"INFO: The output chunks are also sent to a randomly permuted sequence of output channels.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF SHREDS. ...number of repeats of shredding process.\n");
        fprintf(stdout,"INFO: AVERAGE CHUNKLENGTH..average length of chunks to cut & permute.\n");
        fprintf(stdout,"INFO: CUT SCATTER..........randomisation of cuts (0 to K): default 1.\n");
        fprintf(stdout,"INFO: .....................where K = total number of chunks (snd-duration/chunklen).\n");
        fprintf(stdout,"INFO: .....................If scatter = 0: sound is reordered without shredding.\n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL CNT...For Mode 1 only.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHZIG):
        fprintf(stdout,"INFO: READ BACK AND FORTH INSIDE SOUNDFILE, WITH RANDOM PANS\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  RANDOM ZIGZAGS\n");
        fprintf(stdout,"INFO: (2)  ZIGZAG BETWEEN USER SPECIFIED TIMES\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In mode USER SPECIFIED\n");
        fprintf(stdout,"INFO: Required data is textfile containing sequence of times to zigzag (and pan) between.\n");
        fprintf(stdout,"INFO: Each step-between-times must be > (3 * splicelen).\n");
        fprintf(stdout,"INFO: Successive zigsteps moving in same (time-)direction are concatenated.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ZIGZAGGING START TIME..... Start time of the area of the infile where zigzagging will happen.\n");
        fprintf(stdout,"INFO: ZIGZAGGING END TIME ........ End time of the area of the infile where zigzagging will happen.\n");
        fprintf(stdout,"INFO: MIN DURATION OUTFILE ...... output will be at least this long.\n");
        fprintf(stdout,"INFO: MIN ZIG LENGTH ............... in \"Random\" mode, minimum duration of any zig or zag.\n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL CNT\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (MS)\n");
        fprintf(stdout,"INFO: MAX ZIG LENGTH ............... in \"Random\" mode, maximum duration of any zig or zag.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOM SEED..a number to generate a replicable random sequence. (>0)\n");
        fprintf(stdout,"INFO: .............enter same number on next program run, to get same outfile.\n");
        fprintf(stdout,"INFO: .............(Default: (0) random sequence is different every time).\n");
        fprintf(stdout,"INFO: NO PANS BETWEEN ADJACENT CHANNELS.......Reject zigs between adjacent output channels.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MCHITER):
        fprintf(stdout,"INFO: ITERATE INPUT SOUND IN FLUID MANNER, DISTRIBUTING TO MANY CHANNELS\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ****  WARNING: Do NOT use with large files. ****\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DELAY..................(average) delay between iterations. Default:infile dur.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOMISATION OF DELAY.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PITCH SCATTER..........max of random pitchshift of each iteration: semitones\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AMPLITUDE SCATTER......max of random amp-reduction on each iteration.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PROGRESSIVE FADE.......(average) amplitude reduction between iterations.\n");
        fprintf(stdout,"INFO:                        A small value is a small amplitude reduction.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OVERALL GAIN...........(special) value 0, gives best guess for no distortion.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SEED RANDOM GENERATOR..same number produces identical output on rerun,\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECSPHINX):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: IMPOSE CHANNEL AMPLITUDES OF FILE2 ON CHANNEL FRQS OF FILE 1\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: AMPLITUDE BALANCE..... Proportion of File1 Channel-amplitudes retained.\n");
            fprintf(stdout,"INFO: FREQUENCY BALANCE..... Proportion of File2 Channel-frequencies retained in output spectrum.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: MULTIPLY CHANNEL AMPLITUDES OF TWO SPECTRA\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Note that the spectral FREQUENCIES of the FIRST input are always retained.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: BIAS ....... If NON-zero, a proportion of the (channel-by-channel) amplitude of original signal is added to the output.\n");
            fprintf(stdout,"INFO:                        If less than 1, a proportion of the 1st input signal is added to the multiplied output.\n");
            fprintf(stdout,"INFO:                        If greater than 1, a proportion of the 2nd input signal is added to the multiplied output.\n");
            fprintf(stdout,"INFO:                        Ratio of original to multiplied signal, in the output = abs(bias)/(1.0 - abs(bias))\n");
            fprintf(stdout,"INFO:                        where \"abs(bias)\" is the absolute (unsigned) value of \"bias\"\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GAIN ....... Overall gain on output.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(2):
            fprintf(stdout,"INFO: CARVE SPECTRUM OF FILE 1 WITH FORMANT ENVELOPE OF FILE 2\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: If file 2 is continuous, it's continuity is largely retained.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CARVE DEPTH ............ How deeply does the spectral envelope of File 2 bite into the spectrum of File 1. (Range 0 to 1). Time-variable.\n");
            fprintf(stdout,"INFO: OUTPUT GAIN ............ Overall gain on output.\n");
            fprintf(stdout,"INFO: CUTOFF FREQUENCY ... Where in the spectrum does the carving stop (Range 0 - nyquist). Zero value leaves the 1st sound unchanged.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: USE LOUDNESS ENVELOPE OF 2nd SPECTRUM ... The loudness contour of the 1st sound affects that of the output.\n");
            fprintf(stdout,"INFO:                                                                                 Default, the loudness contour of the 1st sound is largely unaffected.\n");
            break;
        }
        break;
    case(SUPERACCU):
        fprintf(stdout,"INFO: SUSTAIN EACH SPECTRAL BAND, UNTIL LOUDER DATA APPEARS IN THAT BAND\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: This process is similar to \"FOCUS ACCUMULATE\"\n");
        fprintf(stdout,"INFO: but at the file end, any decaying channels are retained until they decay to zero.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  SUSTAIN (AND POSSIBLY GLISS) LOUDEST PARTIALS.\n");
        fprintf(stdout,"INFO: (2)  AS (1) BUT TUNE (START OF) SUSTAINED PARTIALS TO TEMPERED SCALE.\n");
        fprintf(stdout,"INFO: (3)  AS (1) BUT TUNE (START OF) SUSTAINED PARTIALS TO NEAREST OF SPECIFIED FREQUENCIES.\n");
        fprintf(stdout,"INFO:             (HARMONIC SET GIVEN IN INPUT DATA FILE).\n");
        fprintf(stdout,"INFO: (4)  AS (1) BUT TUNE (START OF) SUSTAINED PARTIALS TO NEAREST OF SPECIFIED FREQUENCIES OR THEIR 8vas\n");
        fprintf(stdout,"INFO:             (HARMONIC FIELD GIVEN IN INPUT DATA FILE).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECAY RATE....sutained channel data decays by DECAYRATE per sec.\n");
        fprintf(stdout,"INFO: GLISS RATE....sutained channel data glisses at GLISRATE 8vas per sec.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TUNING....forces the (start) frq of sustained partials to one of the specified frequencies.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: REASSIGN CHANNELS .... glissing data is moved into more appropriate channel\n");
        fprintf(stdout,"INFO:                        if it strays beond the channel frq limits.\n");
        fprintf(stdout,"INFO:                        (can cause sustained glissandi to persist for longer.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PARTITION):
        fprintf(stdout,"INFO: PARTITION MONO SOUND FILE INTO DISJUNCT BLOCKS, ASSIGNING EVERY Nth BLOCK TO ONE OF N OUTPUT FILES\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: For input file \"abcdefghijklmno....\" and 3 output files\n");
        fprintf(stdout,"INFO: (where \"a\",\"b\" etc are successive blocks), we produce\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Outfile1 \"a--d--g--j--m--...\n");
        fprintf(stdout,"INFO: Outfile2 \"-b--e--h--k--n-...\n");
        fprintf(stdout,"INFO: Outfile3 \"--c--f--i--l--o...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: where \"--\" is silence replacing the missing blocks\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  BLOCKS DEFINED BY THE COUNT OF THE WAVESETS THEY CONTAIN.\n");
        fprintf(stdout,"INFO: (2)  BLOCKS DEFINED BY THEIR DURATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: GRID COUNT ..... is the number of output files to generate.\n");
        fprintf(stdout,"INFO: WAVESET COUNT PER GRID BLOCK (Mode 1) ..... is the number of wavesets in each Block in the output files.\n");
        fprintf(stdout,"INFO: DURATION OF GRID BLOCKS (Mode 2) ..... is the duration (in seconds) of each Block.\n");
        fprintf(stdout,"INFO: RANDOMISATION OF DURATION (Mode 2) ..... is the randomisation of that duration (Range 0 -1).\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (Mode 2) ..... is the duration of the splices used to cut the blocks, in milliseconds.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECGRIDS):
        fprintf(stdout,"INFO: PARTITION SPECTRUM INTO PARTS, OVER A GRID\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTFILECNT    Number of output spectral files.\n");
        fprintf(stdout,"INFO: CHANGROUPING  Number of adjacent channels per group in the output spectra.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The product of the 2 parameters must be a divisor of the channel count.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If the input file has 16 channels \"abcdefghijklmnop\"\n");
        fprintf(stdout,"INFO: With 2 outfiles and changrouping 1\n");
        fprintf(stdout,"INFO: The outfiles contain \"a-c-e-g-i-k-m-o\" and \"b-d-f-h-j-l-n-p\" respectively.\n");
        fprintf(stdout,"INFO: With 2 outfiles and changrouping 2\n");
        fprintf(stdout,"INFO: The outfiles contain \"ab-ef-ij-mn\" and \"cd-gh-kl-op\".\n");
        fprintf(stdout,"INFO: With 2 outfiles and changrouping 4\n");
        fprintf(stdout,"INFO: The outfiles contain \"abcd-ijkl\" and \"efgh-mnop\".\n");
        fprintf(stdout,"INFO: With 2 outfiles and changrouping 8\n");
        fprintf(stdout,"INFO: The outfiles contain \"abcdefgh\" and \"mnopijkl\".\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: With 4 outfiles and changrouping 1\n");
        fprintf(stdout,"INFO: The outfiles contain \"a-e-i-m\" \"b-f-j-n\" \"c-g-k-o\" and \"d-h-l-p\".\n");
        fprintf(stdout,"INFO: With 4 outfiles and changrouping 2\n");
        fprintf(stdout,"INFO: With changrouping 2 and 4 outfiles\n");
        fprintf(stdout,"INFO: The outfiles contain \"ab-ij\" \"cd-kl\" \"ef-mn\" and \"gh-op\".\n");
        fprintf(stdout,"INFO: With 4 outfiles and changrouping 4\n");
        fprintf(stdout,"INFO: The outfiles contain \"abcd\" \"efgh\" \"ijkl\" and \"mnop\".\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(GLISTEN):
        fprintf(stdout,"INFO: RANDOM PARTITION THE SPECTRUM INTO BINS AND PLAY THESE BACK IN ORDER\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: All the channels of the spectrum are partitioned into N mutually exclusive sets\n");
        fprintf(stdout,"INFO: with channels assigned at random to each set. These sets form 1 complete group.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Then channels in the first set are played, for a given number of windows,\n");
        fprintf(stdout,"INFO: at which point channels in the 2nd set are played, and so on.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (As this happens, we are progressing through the original spectrum at the original rate.\n");
        fprintf(stdout,"INFO: The process determines merely which channels are used - the others being zeroed).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Once all N sets are exhausted, a new group is made by random partition, and so on.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: GROUP DIVISIONS ..... Number of sets to divide analysis-channels into\n");
        fprintf(stdout,"INFO:                     (e.g. with value 4, process partitions channels randomly\n");
        fprintf(stdout,"INFO:                     among 4 sets with [totalchans/4] channels per set).\n");
        fprintf(stdout,"INFO:                     NB Must be an exact divisior of the channel count.\n");
        fprintf(stdout,"INFO: WINDOW LENGTH .......  Number of windows for which each channel-set persists\n");
        fprintf(stdout,"INFO:                     before we switch to next set-of-channels (Range 1-1024)\n");
        fprintf(stdout,"INFO: PITCHSHIFT ............. Maximum +- range of random pitch shifting of each set\n");
        fprintf(stdout,"INFO:                     (Range 0 to 12.0  semitones)\n");
        fprintf(stdout,"INFO: WINDOWLENGTH RANDOMISE ... Randomisation of Window length to use (between 1 and value set)\n");
        fprintf(stdout,"INFO: GROUPDIVIDE RANDOMISE ..... Randomise number of channels in each set in a group\n");
        fprintf(stdout,"INFO:                     Without randomisation, each set-in-a-group has an equal number of channels.\n");
        fprintf(stdout,"INFO:                     With randomisation, a group has sets of different sizes.\n");
        break;
    case(TUNEVARY):
        fprintf(stdout,"INFO: REPLACE SPECTRAL FRQS BY HARMONICS OF SPECIFIED PITCH(ES), POSSIBLY IN MOTION\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Data required a time-changing template of MIDI pitch-values\n");
        fprintf(stdout,"INFO: Each line must start with a time, in seconds,\n");
        fprintf(stdout,"INFO: and be followed by (possibly fractional) MIDI values (range 0 - 127).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Times must start at zero and increase from line to line.\n");
        fprintf(stdout,"INFO: Lines must have equal numbers of entries,\n");
        fprintf(stdout,"INFO: but duplicated MIDI values can be used on any line.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOCUS..........degree of focusing of partial pitches onto template.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CLARITY........degree to which non-template partials are suppressed.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TRACE..........number of (window_by_window) most prominent channels\n");
        fprintf(stdout,"INFO: ...............to be replaced by template frqs. (default, all channels)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LOW FRQ LIMIT..frqs below this are ignored.\n");
        fprintf(stdout,"INFO: \n");
    case(ISOLATE):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: ISOLATE, IN PLACE, SINGLE SPECIFIED SEGMENT(S) OF A SOURCE, TO DISTINCT OUTFILES\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Specified segments are cut from the input file to distinct output files\n");
            fprintf(stdout,"INFO: but the segments retain silent preambles\n");
            fprintf(stdout,"INFO: so they occur at SAME TIME in the outfiles, as in the input file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Process concludes by generating a file of all material left over after segment removal.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The original file is reconstructible by mixing all these components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CUT SEGMENT TIMES .....The datafile is a list of time-pairs,\n");
            fprintf(stdout,"INFO:           being the start and end times of segments to be cut.\n");
            fprintf(stdout,"INFO:           These should be in time order, and must not overlap one another.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           If 2 cuts abutt each other, or are so close that the end and start splices overlap,\n");
            fprintf(stdout,"INFO:           the end of the first cut will be moved back, and the start of 2nd cut moved forward\n");
            fprintf(stdout,"INFO:           so that they overlap by a single splicelength.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           On the Loom, the \"Sound View\" window allows cut-segments to be marked\n");
            fprintf(stdout,"INFO:           on a graphic of the input file waveform.\n");
            fprintf(stdout,"INFO:           Input segments are sorted into order and checked for overlap.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPLICELEN ............ Length of the splices in mS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EXTEND END-SILENCES TO ENDTIME OF SOURCE forces all output files to be the same length.\n");
            fprintf(stdout,"INFO: REVERSE SEGMENT OUTPUT outputs the segmented data backwards-in-time.\n");
            fprintf(stdout,"INFO:            This is useful if the segments are to be INVERSE-PROCESSED.\n");
            fprintf(stdout,"INFO:            i.e. a time-reversed file is processed and the process-output re-reversed, restoring the original time-direction.\n");
            fprintf(stdout,"INFO:            This might be useful where a process generates a tail of sound after the end of the original source  e.g. reverb\n");
            fprintf(stdout,"INFO:            Reverse-processing in this way causes the 'tail' to PRECEDE the source in the final output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:            NB If all outputs are the same length in \"ISOLATE\", the reversed files can be processed\n");
            fprintf(stdout,"INFO:            then rejoined with the remnant file using \"REJOIN\", WITHOUT needing to re-reverse them first.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: ISOLATE, IN PLACE, SETS OF SPECIFIED SEGMENT(S) OF A SOURCE, TO DISTINCT OUTFILES\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Specified sets of isolated segments are cut from the input file.\n");
            fprintf(stdout,"INFO: Each output file has a different set of isolated segments of the source.\n");
            fprintf(stdout,"INFO: The files have silent preambles so that events occur at SAME TIME in the outfiles\n");
            fprintf(stdout,"INFO: as in the source file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The original file is reconstructible by mixing all these components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CUT SEGMENT TIMES ...... Each line of the datafile has a list of time-pairs,\n");
            fprintf(stdout,"INFO:           the start & end times of segments to be cut for that particular output file.\n");
            fprintf(stdout,"INFO:           These should be in time order, in each line.\n");
            fprintf(stdout,"INFO:           None of segments (in any of the lines) must overlap one another.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           If 2 cuts abutt each other, or are so close that the end and start splices overlap,\n");
            fprintf(stdout,"INFO:           the end of the first cut will be moved back, and the start of 2nd cut moved forward\n");
            fprintf(stdout,"INFO:           so that they overlap by a single splicelength.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           On the Loom, the \"Sound View\" window allows cut-segments to be marked\n");
            fprintf(stdout,"INFO:           on a graphic of the input file waveform.\n");
            fprintf(stdout,"INFO:           Marked segments which succeed each other in time are placed on the same line.\n");
            fprintf(stdout,"INFO:           (assumed to be part of the data for the same output file).\n");
            fprintf(stdout,"INFO:           If a new marked segment preceeds (in time) a previous marked segment,\n");
            fprintf(stdout,"INFO:           a new data line is initiated for a 2nd output file, and so on.\n");
            fprintf(stdout,"INFO:           Input segments are also checked for overlap.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPLICELEN ............ Length of the splices in mS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EXTEND END-SILENCES TO ENDTIME OF SOURCE forces all output files to be the same length.\n");
            fprintf(stdout,"INFO: REVERSE SEGMENT OUTPUT outputs the segmented data backwards-in-time.\n");
            fprintf(stdout,"INFO:            This is useful if the segments are to be INVERSE-PROCESSED.\n");
            fprintf(stdout,"INFO:            i.e. a time-reversed file is processed and the process-output re-reversed, restoring the original time-direction.\n");
            fprintf(stdout,"INFO:            This might be useful where a process generates a tail of sound after the end of the original source  e.g. reverb\n");
            fprintf(stdout,"INFO:            Reverse-processing in this way causes the 'tail' to PRECEDE the source in the final output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:            NB If all outputs are the same length in \"ISOLATE\", the reversed files can be processed\n");
            fprintf(stdout,"INFO:            then rejoined with the remnant file using \"REJOIN\", WITHOUT needing to re-reverse them first.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: \n");
            break;
        case(2):
            fprintf(stdout,"INFO: ISOLATE, IN PLACE, SEVERAL SEGMENT(S) OF A SOURCE, TO A SINGLE OUTFILE\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Specified segments are cut from the input file and placed in the same output file.\n");
            fprintf(stdout,"INFO: but the segments retain silent surrounds\n");
            fprintf(stdout,"INFO: so they occur at SAME TIME in the outfiles, as in the input file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Segment starts and ends are located using threshold-on and threshold-off parameters.\n");
            fprintf(stdout,"INFO: If a segment-length is set, only the initial part (length specified) of each segment is retained.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Process concludes by generating a file of all material left over after segment removal.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The original file is reconstructible by mixing both these components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: THRESHOLD ON .......... dB level at which a segment is triggered to  be cut.\n");
            fprintf(stdout,"INFO: THRESHOLD OFF ......... dB level at which a cut segment is triggered to end.\n");
            fprintf(stdout,"INFO: MINIMUM SEGMENT LENGTH.. Minimum Duration in mS which segment must have, to be accepted.\n");
            fprintf(stdout,"INFO: SEGMENT RETAIN LENGTH .. Duration in mS of (start-)portion of segments to retain.\n");
            fprintf(stdout,"INFO:                     If segment length is set to zero, the complete segments are retained.\n");
            fprintf(stdout,"INFO: SPLICELEN ............ Length of the splices in mS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EXTEND END-SILENCES TO ENDTIME OF SOURCE forces all output files to be the same length.\n");
            fprintf(stdout,"INFO: REVERSE SEGMENT OUTPUT outputs the segmented data backwards-in-time.\n");
            fprintf(stdout,"INFO:            This is useful if the segments are to be INVERSE-PROCESSED.\n");
            fprintf(stdout,"INFO:            i.e. a time-reversed file is processed and the process-output re-reversed, restoring the original time-direction.\n");
            fprintf(stdout,"INFO:            This might be useful where a process generates a tail of sound after the end of the original source  e.g. reverb\n");
            fprintf(stdout,"INFO:            Reverse-processing in this way causes the 'tail' to PRECEDE the source in the final output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:            NB If all outputs are the same length in \"ISOLATE\", the reversed files can be processed\n");
            fprintf(stdout,"INFO:            then rejoined with the remnant file using \"REJOIN\", WITHOUT needing to re-reverse them first.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(3):
            fprintf(stdout,"INFO: ISOLATE, IN PLACE, ALL THE SLICED UP SEGMENT(S) OF A SOUNDFILE\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The source is segmented into successive adjacent segments, written to distinct output files.\n");
            fprintf(stdout,"INFO: The files have silent preambles so that events occur at SAME TIME in the outfiles\n");
            fprintf(stdout,"INFO: as in the source file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The original file is reconstructible by mixing all these components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SLICE TIMES ...... Datafile contains a list of (increasing) times where the source is to be cut.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           On the Loom, the \"Sound View\" window allows cut-times to be marked\n");
            fprintf(stdout,"INFO:           on a graphic of the input file waveform.\n");
            fprintf(stdout,"INFO:           Cut-times are sorted into ascending order.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPLICELEN ............ Length of the splices in mS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EXTEND END-SILENCES TO ENDTIME OF SOURCE forces all output files to be the same length.\n");
            fprintf(stdout,"INFO: REVERSE SEGMENT OUTPUT outputs the segmented data backwards-in-time.\n");
            fprintf(stdout,"INFO:            This is useful if the segments are to be INVERSE-PROCESSED.\n");
            fprintf(stdout,"INFO:            i.e. a time-reversed file is processed and the process-output re-reversed, restoring the original time-direction.\n");
            fprintf(stdout,"INFO:            This might be useful where a process generates a tail of sound after the end of the original source  e.g. reverb\n");
            fprintf(stdout,"INFO:            Reverse-processing in this way causes the 'tail' to PRECEDE the source in the final output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:            NB If all outputs are the same length in \"ISOLATE\", the reversed files can be processed using \"REJOIN\",\n");
            fprintf(stdout,"INFO:            WITHOUT needing to re-reverse them first.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(4):
            fprintf(stdout,"INFO: ISOLATE, IN PLACE, ALL THE SLICED UP SEGMENT(S) OF A SOUNDFILE, WITH SLIGHT OVERLAPS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The source is segmented into successive adjacent segments, written to distinct output files.\n");
            fprintf(stdout,"INFO: The files have silent preambles so that events occur at SAME TIME in the outfiles\n");
            fprintf(stdout,"INFO: as in the source file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The cut segments are made to overlap slightly (good for isolating speech syllables).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The original file is reconstructible by mixing all these components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SLICE TIMES ...... Datafile contains a list of (increasing) times where the source is to be cut.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           On the Loom, the \"Sound View\" window allows cut-times to be marked\n");
            fprintf(stdout,"INFO:           on a graphic of the input file waveform.\n");
            fprintf(stdout,"INFO:           Cut-times are sorted into ascending order.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPLICELEN ............ Length of the splices in mS\n");
            fprintf(stdout,"INFO: DOVETAIL  ............ Length of segment overlaps in mS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EXTEND END-SILENCES TO ENDTIME OF SOURCE forces all output files to be the same length.\n");
            fprintf(stdout,"INFO: REVERSE SEGMENT OUTPUT outputs the segmented data backwards-in-time.\n");
            fprintf(stdout,"INFO:            This is useful if the segments are to be INVERSE-PROCESSED.\n");
            fprintf(stdout,"INFO:            i.e. a time-reversed file is processed and the process-output re-reversed, restoring the original time-direction.\n");
            fprintf(stdout,"INFO:            This might be useful where a process generates a tail of sound after the end of the original source  e.g. reverb\n");
            fprintf(stdout,"INFO:            Reverse-processing in this way causes the 'tail' to PRECEDE the source in the final output.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:            NB If all outputs are the same length in \"ISOLATE\", the reversed files can be processed using \"REJOIN\",\n");
            fprintf(stdout,"INFO:            WITHOUT needing to re-reverse them first.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(REJOIN):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: REMIX SEGMENT-FILES ORIGINATING IN THE \"ISOLATE\" PROCESS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Process assumes the source files are semgents cut from a source, using \"ISOLATE\"\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The (possibly processed) files are here remixed together\n");
            fprintf(stdout,"INFO: returning segments to their original timings in the source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: If the segments were originally REVERSED by the isolate process\n");
            fprintf(stdout,"INFO: setting \"REVERSE SEGMENTS\" here will automatically re-reverse the (possibly processed) segments\n");
            fprintf(stdout,"INFO: before mixing them.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GAIN ....... Changes the output level (Range 0 - 1).\n");
            fprintf(stdout,"INFO:             (Note that output level is automatically turned down if output clips).\n");
            fprintf(stdout,"INFO: \n");
            break;      
        case(1):
            fprintf(stdout,"INFO: REMIX SEGMENT-FILES ORIGINATING IN THE \"ISOLATE\" PROCESS, WITH THE REMNANT FILE\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Process assumes the source files are segments cut from a source, using \"ISOLATE\"\n");
            fprintf(stdout,"INFO: PLUS the remnant file, which must be LAST in the list of input files.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The (possibly processed) files are here remixed together\n");
            fprintf(stdout,"INFO: returning segments to their original timings in the source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: If the segments were originally REVERSED by the isolate process\n");
            fprintf(stdout,"INFO: setting \"REVERSE SEGMENTS\" here will automatically re-reverse the (possibly processed) segments\n");
            fprintf(stdout,"INFO: before mixing them with the remnant file.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GAIN ....... Changes the output level (Range 0 - 1).\n");
            fprintf(stdout,"INFO:             (Note that output level is automatically turned down if output clips).\n");
            fprintf(stdout,"INFO: \n");
            break;      
        }
        break;
    case(PANORAMA):
        fprintf(stdout,"INFO: CREATE PANORAMA OF INPUT FILES, SPREADING ACROSS MULTICHANNEL SURROUND SPACE\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Loudspeakers assumed to be effectively surrounding the listening area from the front outwards.\n");
        fprintf(stdout,"INFO: Input sounds distributed in order from leftmost to rightmost position\n");
        fprintf(stdout,"INFO: (with a 360 degree spread specified, 180 is assumed to be the rightmost position).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES ----------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  SPECIFY THE NUMBER OF LOUDSPEAKERS, AND THE TOTAL ANGULAR WIDTH ( >= 190 degrees )\n");
        fprintf(stdout,"INFO: 2)  LIST OF LOUDSPEAKER POSITIONS, IN A FILE (TOTAL ANGULAR WIDTH >= 190 degrees)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS -------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1:\n");
        fprintf(stdout,"INFO:       NO. OF LOUDSPEAKERS ........ Assumed equally spaced.\n");
        fprintf(stdout,"INFO:       TOTAL ANGULAR WIDTH OF LSPKRS ......(190 - 360).\n");
        fprintf(stdout,"INFO:                       The loudspeaker array is assumed to be symmetrical around its centre-line.\n");
        fprintf(stdout,"INFO: MODE 2:\n");
        fprintf(stdout,"INFO:       LOUDSPEAKER POSITIONS ....... A textfile list of the angular positions of the loudspeakers.\n");
        fprintf(stdout,"INFO:           positions to the right of centre lie between 0 (front) and 180 (rear)\n");
        fprintf(stdout,"INFO:           positions to the left of centre lie between >180 (rear) and 360(=0) (front)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ANGULAR WIDTH OF SOUND IMAGE .......... (0 - 360 degrees).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ANGULAR OFFSET OF SOUND IMAGE ...... angle between centre-line of sounds and centre-line of loudspeakers.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SOUND CONFIGURATION ........ Distribution of output sounds within the sound image angle.\n");
        fprintf(stdout,"INFO:          1: sounds are equally spaced\n");
        fprintf(stdout,"INFO:          2: two sounds are equally spaced, followed by a gap, etc.\n");
        fprintf(stdout,"INFO:          3: three sounds are equally spaced, followed by a gap, etc.\n");
        fprintf(stdout,"INFO:          and so on\n");
        fprintf(stdout,"INFO:          Must be a divisor of the number of input sounds used.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOMISATION ............... Randomisation of sound positions (0-1).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FRONT-PAIR LSPKRS ....... If the angular width of the loudspeakers is 360 degrees.\n");
        fprintf(stdout,"INFO:          The speaker orientation is ambiguous.\n");
        fprintf(stdout,"INFO:          Default assumes that there is a single loudspeaker at centre front.\n");
        fprintf(stdout,"INFO:          Setting this flag forces a pair of lspkrs, symmetrically placed to each side of centre-front.\n");
        fprintf(stdout,"INFO:          (The flag is IGNORED if TOTAL ANGULAR WIDTH OF LSPKRS is less than 360 degrees )\n");
        fprintf(stdout,"INFO: FRONT-PAIR SOUND IMAGES ....... The same logic applied to the SOUND positions\n");
        fprintf(stdout,"INFO:          (ignored if the ANGULAR WIDTH OF SOUND IMAGE is less than 360 degrees )\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(TREMOLO):
        fprintf(stdout,"INFO: TREMOLO A SOUND, WITH ADJUSTABLE PEAK-WIDTH\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FRQWISE....Interpolate linearly between frqs in any frq brktable (default).\n");
        fprintf(stdout,"INFO: PITCHWISE..Interpolate logarithmically (like pitch). (Care with zero frqs).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TREMOLO FREQUENCY..is frequency of the tremolo vibration itself.\n");
        fprintf(stdout,"INFO: TREMOLO DEPTH......amplitude depth of tremolo.\n");
        fprintf(stdout,"INFO: OVERALL GAIN.......Overall signal gain, or envelope.\n");
        fprintf(stdout,"INFO: PEAK NARROWING ....Tremolo peaks can be made narrower.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ECHO):
        fprintf(stdout,"INFO: REPEATEDLY ECHO A SOUND\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DELAY...................must be greater than the sound duration.\n");
        fprintf(stdout,"INFO:               (use the \"DELAY\" program otherwise).\n");
        fprintf(stdout,"INFO: ATTENUATION.............change in level from one echo to the next.\n");
        fprintf(stdout,"INFO: MAXIMUM DURATION....... maximum duration of output (output may be shorter).\n");
        fprintf(stdout,"INFO: RANDOMISATION ......... Randomisation of echo times.\n");
        fprintf(stdout,"INFO: CUTOFF LEVEL .......... Level below which output signal is cut off.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PACKET):
        fprintf(stdout,"INFO: CREATE AN ENVELOPED SOUND-PACKET, CUT AND SHAPED FROM A SOURCE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOUND....Use signal minima around the specified location in the source, to determine where to cut a packet.\n");
        fprintf(stdout,"INFO: FORCED...Cut a packet at the specified location in the source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PACKET LOCATION IN SOURCE ........ Time in source around which packet is to be cut.\n");
        fprintf(stdout,"INFO:                    A single time value or a textfile list of times.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ......... Duration (of forced packet) or minimum-duration (of found packet) in mS.\n");
        fprintf(stdout,"INFO:                    (Must be less than half the source duration).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NARROWING ........ Narrowing of the packet envelope, which is normally cosinusoidal.\n");
        fprintf(stdout,"INFO:                    Values below 1.0 broaden the packet.\n");
        fprintf(stdout,"INFO:                    Values very close to zero may produce clicks (square-wave envelope).\n");
        fprintf(stdout,"INFO:                    High vals with short packets may produce click-impulses or silence.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CENTRING ........  Centring of the peak of the packet envelope.\n");
        fprintf(stdout,"INFO:                    0  gives a peak at centre: -ve values move the peak towards the start of packet\n");
        fprintf(stdout,"INFO:                    +ve values move the peak towards the end of the packet.\n");
        fprintf(stdout,"INFO:                    If the packet content has varying level, the true peak position may not correspond\n");
        fprintf(stdout,"INFO:                    to the envelope peak position, unless the \"-f\" flag is used.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NORMALISE ........ Normalise the packet level.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: EXPAND ........... Packet wave maxima(minima) are forced up(down) to the envelope contour of the packet.\n");
        fprintf(stdout,"INFO:                    (default, the packet envelope is simply imposed on the existing signal).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SHAVE SILENCE..... Remove leading or trailing silence in resultant packet.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SYNTHESIZER):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: SYNTHESIZE COMPLEX TONES\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Creates tones with any number of partials which may vary through time in frequency and level.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECTRUM DATA ..... A textfile Listing of partial ratios and relative levels, against time.\n");
            fprintf(stdout,"INFO:                     Data is a text file of lines of data and every line must have the same number of entries.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     The 1ST ENTRY on each line is a time. Times must start at zero and increase.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All EVEN NUMBERED entries are partial numbers\n");
            fprintf(stdout,"INFO:                     For synthesizing tones, the first partial number on each line must be 1.\n");
            fprintf(stdout,"INFO:                     Partial numbers must increase through a line.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All other ODD NUMBERED entries are partial levels and may have any numeric value.\n");
            fprintf(stdout,"INFO:                     -ve values invert the phase of the partial.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SAMPLE_RATE ....... Sample rate of the synthesized sound.\n");
            fprintf(stdout,"INFO: DURATION .......... Total Duration of the synthesized sound.\n");
            fprintf(stdout,"INFO: FREQUENCY ......... Fundamental frequency of the synthesized sound (possibly time-varying).\n");
            break;
        case(1):
            fprintf(stdout,"INFO: SYNTHESIZE PACKET_STREAMS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Creates a stream of wave-packets, which may vary in content through time.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECTRUM DATA ..... A textfile Listing of partial ratios and relative levels, against time.\n");
            fprintf(stdout,"INFO:                     Data is a text file of lines of data and every line must have the same number of entries.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     The 1ST ENTRY on each line is a time. Times must start at zero and increase.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All EVEN NUMBERED entries are partial numbers\n");
            fprintf(stdout,"INFO:                     For synthesizing tones, the first partial number on each line must be 1.\n");
            fprintf(stdout,"INFO:                     Partial numbers must increase through a line.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All other ODD NUMBERED entries are partial levels and may have any numeric value.\n");
            fprintf(stdout,"INFO:                     -ve values invert the phase of the partial.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SAMPLE_RATE ....... Sample rate of the synthesized sound.\n");
            fprintf(stdout,"INFO: DURATION .......... Total Duration of the synthesized sound.\n");
            fprintf(stdout,"INFO: FREQUENCY ......... Fundamental frequency of the synthesized sound (possibly time-varying).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NARROWING ......... Narrowing of the packet envelope, which is normally cosinusoidal.\n");
            fprintf(stdout,"INFO:                     Values below 1.0 broaden the packet.\n");
            fprintf(stdout,"INFO:                     Values very close to zero may produce clicks (square-wave envelope).\n");
            fprintf(stdout,"INFO:                     High vals with high frequencies may produce click-impulses or silence.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CENTRING .........  Centring of the peak of the packet envelope.\n");
            fprintf(stdout,"INFO:                     0 gives a peak at centre: -ve values move the peak towards the start of packet\n");
            fprintf(stdout,"INFO:                     +ve values move the peak towards the end of the packet.\n");
            fprintf(stdout,"INFO:                     If the packet content has varying level, the true peak position may not correspond\n");
            fprintf(stdout,"INFO:                     to the envelope peak position.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: STATIONARY PACKET PARAMS .......\n");
            fprintf(stdout,"INFO:                     With this flag set, packet parameters are set at the outset of a packet,\n");
            fprintf(stdout,"INFO:                     and remain the same until its end.\n");
            fprintf(stdout,"INFO:                     With no flag set, frq and level parameters of partials continue to vary WITHIN the packets.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: SYNTHESIZE GLISTENING SOUNDS\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Creates a distribution of partials-components of spectrum (which may vary through time), varying in time and space.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECTRUM DATA ..... A textfile Listing of partial ratios and relative levels, against time.\n");
            fprintf(stdout,"INFO:                     Data is a text file of lines of data and every line must have the same number of entries.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     The 1ST ENTRY on each line is a time. Times must start at zero and increase.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All EVEN NUMBERED entries are partial numbers\n");
            fprintf(stdout,"INFO:                     For synthesizing tones, the first partial number on each line must be 1.\n");
            fprintf(stdout,"INFO:                     Partial numbers must increase through a line.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All other ODD NUMBERED entries are partial levels and may have any numeric value.\n");
            fprintf(stdout,"INFO:                     -ve values invert the phase of the partial.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SAMPLE_RATE ....... Sample rate of the synthesized sound.\n");
            fprintf(stdout,"INFO: DURATION ............ Total Duration of the synthesized sound.\n");
            fprintf(stdout,"INFO: FREQUENCY ......... Fundamental frequency of the synthesized sound (possibly time-varying).\n");
            fprintf(stdout,"INFO: CHANNEL COUNT ... Number of output channels.\n");
            fprintf(stdout,"INFO: MAX OCTAVE TRANSPOSITION.. Maximum transposition of spectral components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMESTEP ............ Average timestep between changes in partials-content of output.\n");
            fprintf(stdout,"INFO: RISETIME ............ Time taken to attain max octave transposition range, at start of sound.\n");
            fprintf(stdout,"INFO: FALLTIME ............ Time taken to return to minimal range.\n");
            fprintf(stdout,"INFO: STEADY STATE ...... Time spent in minimal range at end of sound.\n");
            fprintf(stdout,"INFO: FROM FUNDAMENTAL  Initial rise in number of partials is from fundamental only.\n");
            fprintf(stdout,"INFO: TO FUNDAMENTAL .... Final \"steady state\" gradually contracts to using fundamental only.\n");
            fprintf(stdout,"INFO: SPLICETIME (mS).... Length of fade-in/out times of components in output sound, in milliseconds.\n");
            fprintf(stdout,"INFO: PARTIALS IN PLAY . Number of partials used in any segment: If set to zero, number of partials used is random.\n");
            fprintf(stdout,"INFO: MAXCHANGE PARTIALS .. As far as possible, always change partials used, from one segment to the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPATIALISE ............ Distribute components in space.\n");
            fprintf(stdout,"INFO: EMERGENCE CHANNEL .. If spatial image emerges from a single channel, to fill the space, this is the channel.\n");
            fprintf(stdout,"INFO: EMERGENCE TIME .... If spatial image emerges from a single channel, time taken to fully emerge.\n");
            fprintf(stdout,"INFO: CONVERGENCE CHANNEL .. If spatial image converges to a single channel at end of sound, this is the channel.\n");
            fprintf(stdout,"INFO: CONVERGENCE TIME . If spatial image converges to a single channel, time taken to fully converge.\n");
            fprintf(stdout,"INFO: JUMP .................. Use same spatial position for all partials in a segment.\n");
            fprintf(stdout,"INFO: ROTATION SPEED .... Rotation speed for Special Space Type 3 (only).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECIAL SPACE TYPE  (8-channel files only) .... Special types of spatialisation.\n");
            fprintf(stdout,"INFO:    1:  Left-Right Rand ........... Alternate Left and Right sides, random positions.\n");
            fprintf(stdout,"INFO:    2:  Front-Back Rand .......... Alternate Front and back areas of space , random positions.\n");
            fprintf(stdout,"INFO:    3:  Rotate ...................... (Requires a positive or negative rotation speed).\n");               
            fprintf(stdout,"INFO:    4:  Superspace1 ............... Single channel positions only.\n");
            fprintf(stdout,"INFO:    5:  Superspace2 ............... Single channels and channel-pairs only.\n");
            fprintf(stdout,"INFO:    6:  Superspace3 ............... Single channels and channel-pairs and channel-triples only.\n");
            fprintf(stdout,"INFO:    7:  Superspace4 ............... Single channels, channel-pairs, channel-triples, square, diamond and all-positions.\n");
            fprintf(stdout,"INFO:    8:  Left-Right Alternate ....... Alternate Left and Right sides, using all channels of each.\n");
            fprintf(stdout,"INFO:    9:  Back-Front Alternate ...... Alternate Back and Front areas, using all channels of each.\n");
            fprintf(stdout,"INFO:    10: Frameswitch ............... Alternate Between Square and Diamond 4-sets.\n");
            fprintf(stdout,"INFO:    11: Triangle Rotate 1 ......... Rotate a triple of alternate channels, clockwise.\n");
            fprintf(stdout,"INFO:    12: Triangle AntiRotate 1 ..... Rotate a triple of alternate channels, anticlockwise.\n");
            fprintf(stdout,"INFO:    13: Triangle Rotate 2 ......... Rotate a channel and the pair opposite, clockwise.\n");
            fprintf(stdout,"INFO:    14: Triangle AntiRotate 2 ..... Rotate a channel and the pair opposite, anticlockwise.\n");
            break;
        case(3):
            fprintf(stdout,"INFO: SYNTHESIZE FRACTALLY-ARRAYED SEQUENCES OF SPIKES\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Creates waveform with fractal distribution of spikes.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SAMPLE_RATE ....... Sample rate of the synthesized sound.\n");
            fprintf(stdout,"INFO: DURATION ............ Total Duration of the synthesized sound.\n");
            fprintf(stdout,"INFO: FREQUENCY ......... Fundamental frequency of the synthesized sound (possibly time-varying).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Shape of waveform is \"ON OFF ON OFF TAIL\" where ...\n");
            fprintf(stdout,"INFO:       \"ON\" segments contain signal, and are of same duration.\n");
            fprintf(stdout,"INFO:       \"OFF\" segments contain NO signal, and are of same duration.\n");
            fprintf(stdout,"INFO:       \"TAIL\" (can be zero length) is additional silence at waveform end.\n");
            fprintf(stdout,"INFO: The \"ON\" segments are then themselves divided in similar proportions, the resulting smaller \"ON\" segments similarly, and so on,\n");
            fprintf(stdout,"INFO: producing a  fractal distribution.\n");
            fprintf(stdout,"INFO: Signal spikes are then placed in the \"ON\" segments.\n");
            fprintf(stdout,"INFO: Spikes alternate from +ve to -ve at the specified level of fractalisation.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SAMPLES IN SPIKE ATTACK ... Number of samples in the spike attack (can be zero).\n");
            fprintf(stdout,"INFO: SLOPE OF SPIKE ATTACK ..... Slope of attack : 1 = linear  : >1 rises slowly-then-faster  : <1 rises fast-then-slower.\n");
            fprintf(stdout,"INFO: SAMPLES IN SPIKE DECAY .... Number of samples in the spike decay (can be zero).\n");
            fprintf(stdout,"INFO: SLOPE OF SPIKE DECAY ...... Slope of decay : 1 = linear  : >1 falls fast-then-slower  : <1 falls slowly-then-faster.\n");
            fprintf(stdout,"INFO: RATIO ONSEG TO ONOFF GROUPLENGTH ............ Determines relative size of \"ON\" and \"OFF\" segments.\n");
            fprintf(stdout,"INFO: RATIO ONOFFONOFF GROUPLENGTH TO WAVECYCLE LENGTH ............ \n");
            fprintf(stdout,"INFO:             Determines relative size of the 4 (\"ON\",\"OFF\",\"ON\",\"OFF\") segments group, and the total wavecycle length.\n");
            fprintf(stdout,"INFO: RANDOMISATION OF SPIKES ............ Degree of time-randomisation of the spikes.\n");
            fprintf(stdout,"INFO: FRACTALISATION LEVEL FOR SPIKES TO FLIP POS TO NEG ...... Level of fractalisation at which spikes flip from +ve to -ve.\n");
            break;
        }
        break;
    case(TAN_ONE):
        fprintf(stdout,"INFO: PLAY REPETITIONS OF MONO SOUND ON TANGENT PATH TO AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: loudspeaker array is numbered clockwise, starting with \"1\" at front-centre.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Different modes have different tangent styles...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FAR TANGENT  .... For focus at speaker 1, starts along line at right-angles to speaker 2.\n");
        fprintf(stdout,"INFO: NEAR TANGENT .... For focus at speaker 1, starts along line formed by speakers 2 and 3.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ....... Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: EVENT COUNT ... Count of the events in the tangent stream (Single and Two src modes only).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAXIMUM ANGLE .. (Far Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Max angle of rotation of the motion lies between 3rd pair (  i.e. between  90 to 135 degrees).\n");
        fprintf(stdout,"INFO:                       (lsprks 3-4 in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SKEW  ....... .. (Near Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Skew is the ratio (0-1) of time spent between the last pair & the penultimate pair of lspkrs.\n");
        fprintf(stdout,"INFO:                       (lspkr pairs 3-4 and 2-3, in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECIMATION ..... Loudness decimation on passing from one event to the next.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOCUS POSITION .. Loudpseaker at which the motion ends (approaching motion) or begins (receding motion).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: JITTER ..........  Randomisation of event timings (0-1, default 0) Can vary over time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DRAG ........... (Far Tangent Modes) Slows the pan-motion acceleration.\n");
        fprintf(stdout,"INFO:                  Smaller values make stream proceed more slowly to (or from) the focus position.\n");
        fprintf(stdout,"INFO:                  For approaching motion, 0.5 avoids the arrival being too fast to tell.\n");
        fprintf(stdout,"INFO:                  For receding motion, 1.0, makes the initial motion rapid.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RECEDE ........  Sounds Recede (default, sounds approach).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AT LEFT .......  Motion is to or from the left of the focal lspkr (default: motion is to or from the right).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Note that in the part of the stream closest to the focal lspkr,\n");
        fprintf(stdout,"INFO: the SAME final (approaching)  or initial (receding) event is repeated, at fixed level.\n");
        fprintf(stdout,"INFO: These repeated events are ADDITIONAL to the event-count.\n");
        break;
    case(TAN_TWO):
        fprintf(stdout,"INFO: PLAY REPETITIONS OF TWO MERGED MONO SOUNDS ON TANGENT PATH TO AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: loudspeaker array is numbered clockwise, starting with \"1\" at front-centre.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The two sources are superimposed along the tangent path, beginning with only the 1st sound\n");
        fprintf(stdout,"INFO: and gradually mixing in more of the 2nd sound from one event to the next.\n");
        fprintf(stdout,"INFO: If one input is a filtered version of the other, this suggest it might be more distant.\n");
        fprintf(stdout,"INFO: Hence for approaching motion the filterd sound should be first,\n");
        fprintf(stdout,"INFO: whereas for receding motion the filtered sound should be second.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Different modes have different tangent styles...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FAR TANGENT  .... For focus at speaker 1, starts along line at right-angles to speaker 2.\n");
        fprintf(stdout,"INFO: NEAR TANGENT .... For focus at speaker 1, starts along line formed by speakers 2 and 3.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ....... Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: EVENT COUNT ... Count of the events in the tangent stream (Single and Two src modes only).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAXIMUM ANGLE .. (Far Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Max angle of rotation of the motion lies between 3rd pair (  i.e. between  90 to 135 degrees).\n");
        fprintf(stdout,"INFO:                       (lsprks 3-4 in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SKEW  ....... .. (Near Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Skew is the ratio (0-1) of time spent between the last pair & the penultimate pair of lspkrs.\n");
        fprintf(stdout,"INFO:                       (lspkr pairs 3-4 and 2-3, in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECIMATION ..... Loudness decimation on passing from one event to the next.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: BALANCE ACCUMULATOR ... Progressive accumulation of 2nd sound in the mix.\n");
        fprintf(stdout,"INFO:                  For an accumulation value of 0.33, succeesive mix would be [1.0 : 0.0] [0.66 : 0.33] [0.44 : 0.56] etc.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOCUS POSITION .. Loudpseaker at which the motion ends (approaching motion) or begins (receding motion).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: JITTER ..........  Randomisation of event timings (0-1, default 0) Can vary over time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DRAG ........... (Far Tangent Modes) Slows the pan-motion acceleration.\n");
        fprintf(stdout,"INFO:                  Smaller values make stream proceed more slowly to (or from) the focus position.\n");
        fprintf(stdout,"INFO:                  For approaching motion, 0.5 avoids the arrival being too fast to tell.\n");
        fprintf(stdout,"INFO:                  For receding motion, 1.0, makes the initial motion rapid.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RECEDE ........  Sounds Recede (default, sounds approach).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AT LEFT .......  Motion is to or from the left of the focal lspkr (default: motion is to or from the right).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Note that in the part of the stream closest to the focal lspkr,\n");
        fprintf(stdout,"INFO: the SAME final (approaching)  or initial (receding) event is repeated, at fixed level.\n");
        fprintf(stdout,"INFO: These repeated events are ADDITIONAL to the event-count, and there are no balance changes here.\n");
        break;
    case(TAN_SEQ):
        fprintf(stdout,"INFO: PLAY SEQUENCE OF MONO SOUNDS ON TANGENT PATH TO AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: loudspeaker array is numbered clockwise, starting with \"1\" at front-centre.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Different modes have different tangent styles...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FAR TANGENT  .... For focus at speaker 1, starts along line at right-angles to speaker 2.\n");
        fprintf(stdout,"INFO: NEAR TANGENT .... For focus at speaker 1, starts along line formed by speakers 2 and 3.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ....... Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAXIMUM ANGLE .. (Far Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Max angle of rotation of the motion lies between 3rd pair (  i.e. between  90 to 135 degrees).\n");
        fprintf(stdout,"INFO:                       (lsprks 3-4 in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SKEW  ....... .. (Near Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Skew is the ratio (0-1) of time spent between the last pair & the penultimate pair of lspkrs.\n");
        fprintf(stdout,"INFO:                       (lspkr pairs 3-4 and 2-3, in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECIMATION ..... Loudness decimation on passing from one event to the next.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOCUS POSITION .. Loudpseaker at which the motion ends (approaching motion) or begins (receding motion).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: JITTER ..........  Randomisation of event timings (0-1, default 0) Can vary over time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DRAG ........... (Far Tangent Modes) Slows the pan-motion acceleration.\n");
        fprintf(stdout,"INFO:                  Smaller values make stream proceed more slowly to (or from) the focus position.\n");
        fprintf(stdout,"INFO:                  For approaching motion, 0.5 avoids the arrival being too fast to tell.\n");
        fprintf(stdout,"INFO:                  For receding motion, 1.0, makes the initial motion rapid.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RECEDE ........  Sounds Recede (default, sounds approach).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AT LEFT .......  Motion is to or from the left of the focal lspkr (default: motion is to or from the right).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Note that in the part of the stream closest to the focal lspkr,\n");
        fprintf(stdout,"INFO: the SAME final (approaching) or initial (receding) event is repeated, at fixed level\n");
        fprintf(stdout,"INFO: and these events are ADDED to the input events.\n");
        break;
    case(TAN_LIST):
        fprintf(stdout,"INFO: PLAY SEQUENCE OF MONO SOUNDS (IN A TEXTFILE LIST OF SOUNDS) ON TANGENT PATH TO AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: loudspeaker array is numbered clockwise, starting with \"1\" at front-centre.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Different modes have different tangent styles...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FAR TANGENT  .... For focus at speaker 1, starts along line at right-angles to speaker 2.\n");
        fprintf(stdout,"INFO: NEAR TANGENT .... For focus at speaker 1, starts along line formed by speakers 2 and 3.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ....... Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAXIMUM ANGLE .. (Far Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Max angle of rotation of the motion lies between 3rd pair (  i.e. between  90 to 135 degrees).\n");
        fprintf(stdout,"INFO:                       (lsprks 3-4 in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SKEW  ....... .. (Near Tangent Modes) The motion lies between 3 lspkr pairs (e.g. 1-2, 2-3, 3-4)\n");
        fprintf(stdout,"INFO:                       Skew is the ratio (0-1) of time spent between the last pair & the penultimate pair of lspkrs.\n");
        fprintf(stdout,"INFO:                       (lspkr pairs 3-4 and 2-3, in the example)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DECIMATION ..... Loudness decimation on passing from one event to the next.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOCUS POSITION .. Loudpseaker at which the motion ends (approaching motion) or begins (receding motion).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: JITTER ..........  Randomisation of event timings (0-1, default 0) Can vary over time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DRAG ........... Slows the pan-motion acceleration.\n");
        fprintf(stdout,"INFO:                  Smaller values make stream proceed more slowly to (or from) the focus position.\n");
        fprintf(stdout,"INFO:                  For approaching motion, 0.5 avoids the arrival being too fast to tell.\n");
        fprintf(stdout,"INFO:                  For receding motion, 1.0, makes the initial motion rapid.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RECEDE ........  Sounds Recede (default, sounds approach).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AT LEFT .......  Motion is to or from the left of the focal lspkr (default: motion is to or from the right).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Note that in the part of the stream closest to the focal lspkr,\n");
        fprintf(stdout,"INFO: the SAME final (approaching) or initial (receding) event is repeated, at fixed level.\n");
        fprintf(stdout,"INFO: and these repeated events are ADDED to the input events.\n");
        break;
    case(SPECTWIN):
        fprintf(stdout,"INFO: INTERBREED THE SPECTRAL CONTENT OF TWO DIFFERENT SOUNDS\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Spectral envelope may be drawn over the local-maxima of the channel-levels (Formant Envelope)\n");
        fprintf(stdout,"INFO: or simply follow the amplitude changes from one channel to the next (Absolute Envelope)\n");
        fprintf(stdout,"info: Spectral envelops are interbred as follows ....\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FORMANTS SND 1 WITH FORMANTS SND 2.\n");
        fprintf(stdout,"INFO: FORMANTS SND 1 WITH ABSOLUTE SND 2.\n");
        fprintf(stdout,"INFO: ABSOLUTE SND 1 WITH FORMANTS SND 2.\n");
        fprintf(stdout,"INFO: ABSOLUTE SND 1 WITH ABSOLUTE SND 2.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FREQUENCY INTERPOLATION .... Dominance of spectral frequencies of 2nd input file.\n");
        fprintf(stdout,"INFO:            Values > 0 move channel frequencies from those of file 1 towards those of file 2.\n");
        fprintf(stdout,"INFO: ENVELOPE INTERPOLATION ..... Dominance of spectral envelope of 2nd input file.\n");
        fprintf(stdout,"INFO:            Values > 0 move the envelope from that of file 1 towards that of file 2.\n");
        fprintf(stdout,"INFO:            Note that when Formant and Absolute envelopes are combined,\n");
        fprintf(stdout,"INFO:            the formant peaks are moved onto the absolute envelope,\n");
        fprintf(stdout,"INFO:            with all other channels moving proportionately.\n");
        fprintf(stdout,"INFO: SPECTRAL DUPLICATIONS .... Adds transposed copies to spectrum 1, before proceeding.\n");
        fprintf(stdout,"INFO: DUPLICATION INTERVAL .... Transposition from one duplication to next, in semitones.\n");
        fprintf(stdout,"INFO: DUPLICATION ROLLOFF ....  Level change in passing to next higher duplication.\n");
        break;
    case(TRANSIT):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS REPETITIONS OF A MONO SOUND\n");
        fprintf(stdout,"INFO:          ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO:  REPETITIONS ...... Count of events from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration and number of repetitions will be double these values, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  To extend the motion further (which increases the duration and the number of repetitions)....\n");
        fprintf(stdout,"INFO:  the (gain) decimation can be modified with these 4 parameters ... \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  THRESHOLD FOR EXTENSION.. Value of (decimated) gain at which gain the decimation starts to increase.\n");
        fprintf(stdout,"INFO:  DECIMATION MAXIMUM ......... Maximum level of decimation after it starts to increase (> DECIMATION).\n");
        fprintf(stdout,"INFO:  FINAL GAIN ....................... Decimated gain at which the event concludes ( < THRESHOLD).\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION .......... Maximum duration of motion from centre to edge (in case FINAL GAIN is never reached) ( >= DURATION).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(TRANSITF):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS REPETITIONS OF A PAIR OF MONO SOUNDS\n");
        fprintf(stdout,"INFO:               ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  The 2nd sound is gradually mixed in to the first as distance from focus increases.\n");
        fprintf(stdout,"INFO:  If 2nd sound is a filtered version of the first, this may suggest greater distance.\n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO:  REPETITIONS ...... Count of events from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration and number of repetitions will be double these values, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO:  BALANCE DECIMATION ..Proportion of 2nd sound mixed into first as sound becomes more distant from focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  To extend the motion further (which increases the duration and the number of repetitions)....\n");
        fprintf(stdout,"INFO:  the (gain) decimation can be modified with these 4 parameters ... \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  THRESHOLD FOR EXTENSION.. Value of (decimated) gain at which gain the decimation starts to increase.\n");
        fprintf(stdout,"INFO:  DECIMATION MAXIMUM ......... Maximum level of decimation after it starts to increase (> DECIMATION).\n");
        fprintf(stdout,"INFO:  FINAL GAIN ....................... Decimated gain at which the event concludes ( < THRESHOLD).\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION .......... Maximum duration of motion from centre to edge (in case FINAL GAIN is never reached) ( >= DURATION).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(TRANSITD):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS REPETITIONS OF A MONO SOUND\n");
        fprintf(stdout,"INFO:        ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS,\n");
        fprintf(stdout,"INFO:                      SHIFTING TO 2nd SOUND ON PASSING FOCUS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  The 2nd sound replaces the first once the focus of the motion is passed.\n");
        fprintf(stdout,"INFO:  If the 2nd sound is a pitch-shifted version of the 1st, this may suggest doppler-shift.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Additional sounds may be input, to place at the centre point of the mix (near the focus)\n");
        fprintf(stdout,"INFO:  suggesting gradual changes in pitch at the doppler-shift moment.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO:  REPETITIONS ...... Count of events from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration and number of repetitions will be double these values, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  To extend the motion further (which increases the duration and the number of repetitions)....\n");
        fprintf(stdout,"INFO:  the (gain) decimation can be modified with these 4 parameters ... \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  THRESHOLD FOR EXTENSION.. Value of (decimated) gain at which gain the decimation starts to increase.\n");
        fprintf(stdout,"INFO:  DECIMATION MAXIMUM ......... Maximum level of decimation after it starts to increase (> DECIMATION).\n");
        fprintf(stdout,"INFO:  FINAL GAIN ....................... Decimated gain at which the event concludes ( < THRESHOLD).\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION .......... Maximum duration of motion from centre to edge (in case FINAL GAIN is never reached) ( >= DURATION).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(TRANSITFD):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS REPETITIONS OF A PAIR OF MONO SOUNDS\n");
        fprintf(stdout,"INFO:        ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS,\n");
        fprintf(stdout,"INFO:                      SHIFTING TO 2nd PAIR ON PASSING FOCUS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  The 2nd sound is gradually mixed in to the first as distance from focus increases.\n");
        fprintf(stdout,"INFO:  If 2nd sound is a filtered version of the first, this may suggest greater distance.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  The 3rd sound replaces the first once the focus of the motion is passed.\n");
        fprintf(stdout,"INFO:  If the 3rd sound is a pitch-shifted version of the 1st, this may suggest doppler-shift.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  The 4th sound is gradually mixed in to the 3rd, as with sounds 1 and 2.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Additional sounds may be input, to place at the centre point of the mix (near the focus)\n");
        fprintf(stdout,"INFO:  suggesting gradual changes in pitch at the doppler-shift moment.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO:  REPETITIONS ...... Count of events from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration and number of repetitions will be double these values, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO:  BALANCE DECIMATION ..Proportion of 2nd(4th) sound mixed into 1st(3rd) as sound becomes more distant from focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  To extend the motion further (which increases the duration and the number of repetitions)....\n");
        fprintf(stdout,"INFO:  the (gain) decimation can be modified with these 4 parameters ... \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  THRESHOLD FOR EXTENSION.. Value of (decimated) gain at which gain the decimation starts to increase.\n");
        fprintf(stdout,"INFO:  DECIMATION MAXIMUM ......... Maximum level of decimation after it starts to increase (> DECIMATION).\n");
        fprintf(stdout,"INFO:  FINAL GAIN ....................... Decimated gain at which the event concludes ( < THRESHOLD).\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION .......... Maximum duration of motion from centre to edge (in case FINAL GAIN is never reached) ( >= DURATION).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(TRANSITS):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS A SEQUENCE OF MONO SOUND\n");
        fprintf(stdout,"INFO:          ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration will be double this value, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(TRANSITL):
        fprintf(stdout,"INFO:  CREATE MULTICHANNEL MIX WHICH POSITIONS A SEQUENCE OF MONO SOUND LISTED IN A TEXTFILE\n");
        fprintf(stdout,"INFO:          ON TANGENT PATH TO AND FROM AN 8-CHANNEL RING OF LSPKRS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Loudspeakers assumed to be equidistant in a ring, and numbered clockwise.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         GLANCING                EDGEWISE                  CROSSING                   CLOSE                   CENTRAL\n");
        fprintf(stdout,"INFO:           ---O->>            ->>--O---O->>                       O                          O      O                          O\n");
        fprintf(stdout,"INFO:       O              O                                           ->>--O-------O->>                                           O              O\n");
        fprintf(stdout,"INFO:                                       O                  O                                    ->>-O--------------O->>\n");
        fprintf(stdout,"INFO:     O                  O                                              O                  O                                  ->>-O---------------O->>\n");
        fprintf(stdout,"INFO:                                       O                  O                                            O                  O\n");
        fprintf(stdout,"INFO:       O              O                                                  O              O                                              O              O\n");
        fprintf(stdout,"INFO:               O                            O      O                            O                          O      O                          O\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  FOCUS ............ Centre of motion. Integer for odd modes, 1.5 ; 2.5 etc for even modes.\n");
        fprintf(stdout,"INFO:  DURATION ......... Duration of motion from centre to edge (ONLY).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  Total duration will be double this value, as the mix approaches and then recedes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  MAXIMUM RANGE .... (Modes 1-4) Maximum angle from centreline reached ( < 90).\n");
        fprintf(stdout,"INFO:                                 (Mode 5) Maximum distance from centre, where centre-to-loudspeaker distance is 1.\n");
        fprintf(stdout,"INFO:  DECIMATION ....... Gain multiplier (>0 <1) on passing from one event to the next, away from the focus.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  LEFTWARDS FROM FOCUS .... Motion towards left of focal position (Default: motion towards right).\n");
        break;
    case(CANTOR):
        fprintf(stdout,"INFO:  GRADUALLY INSERT HOLES INTO A SOURCE, IN THE MANNER OF A CANTOR SET\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:  A hole is gradually cut in the middle of the source sound, dividing into two parts.\n");
        fprintf(stdout,"INFO:  Then holes are cut in these two parts, and so on.\n");
        fprintf(stdout,"INFO:  The output is a set of versions of the source, with more and more holes.\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  MODE 1 .... Holesize proportional to size of segment they cut.\n");
        fprintf(stdout,"INFO:  MODE 2 .... Holesize is fixed.\n");
        fprintf(stdout,"INFO:  MODE 3 .... Holes generated by  superimposed layers of sinusoindal envelope-shapng..\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  In Modes 1 & 2\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  HOLE SIZE ........ Percentage of the input sound (or sound segment) taken up by the hole.\n");
        fprintf(stdout,"INFO:  DIG DEPTH ........ Depth of each cut (as a fraction of 1) as hole is gradually created.\n");
        fprintf(stdout,"INFO:  TRIGGER DEPTH .... Depth of hole at which next pair of holes start to be dug.\n");
        fprintf(stdout,"INFO:  SPLICE LENGTH .... Splice length in milliseconds.\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION.. Maximum total duration of all the output sounds.\n");
        fprintf(stdout,"INFO:  EXTEND TO LIMIT .. Proceed with hole digging even when there are not enough samples left to create splices.\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  In Modes 3\n");
        fprintf(stdout,"INFO:  \n");
        fprintf(stdout,"INFO:  MNIMUM HOLE LEVEL .. Level of signal at base of holes.\n");
        fprintf(stdout,"INFO:  DIG DEPTH .......... Number of repetitions for hole to reach its maximum depth.\n");
        fprintf(stdout,"INFO:  LAYER COUNT ........ Number of enveloping layers used.\n");
        fprintf(stdout,"INFO:  LAYER DECIMATION ... Relative depth at which each layer is imposed.\n");
        fprintf(stdout,"INFO:  MAXIMUM DURATION.... Maximum total duration of all the output sounds.\n");
        break;
    case(SHRINK):
        switch(mode) {
        case(0):
        case(1):
        case(2):
        case(3):
            switch(mode) {
            case(0):
                fprintf(stdout,"INFO:  REPEAT A SOUND, SHRINKING IT, BY REMOVING ITS END, AS THE REPETITIONS PROCEEDS.\n");
                break;
            case(1):
                fprintf(stdout,"INFO:  REPEAT A SOUND, SHRINKING IT AROUND ITS MIDPOINT AS THE REPETITIONS PROCEEDS.\n");
                break;
            case(2):
                fprintf(stdout,"INFO:  REPEAT A SOUND, SHRINKING IT, BY REMOVING ITS BEGINNING, AS THE REPETITIONS PROCEEDS.\n");
                break;
            case(3):
                fprintf(stdout,"INFO:  REPEAT A SOUND, SHRINKING IT AROUND A SPECIFIED TIME, AS THE REPETITIONS PROCEEDS.\n");
                break;
            }
            fprintf(stdout,"INFO:  \n");
            fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
            fprintf(stdout,"INFO:  \n");
            if(mode == 3)
                fprintf(stdout,"INFO:  CENTRE OF SHRINKAGE.. Time around which shrinkage takes place.\n");
            fprintf(stdout,"INFO:  SOUND SHRINKAGE ..... Shortening factor of sound from one repeat to the next.\n");
            fprintf(stdout,"INFO:                                                Shrinkage stops once events become too short for the splices.\n");
            fprintf(stdout,"INFO:  EVENT GAP ........... Initial timestep between output events (>= input sound duration).\n");
            fprintf(stdout,"INFO:  TIME CONTRACTION .....Shortening of time between placement of sounds in output stream.\n");
            fprintf(stdout,"INFO:                                                1.0 = events equally spaced, < 1.0 events become closer\n");
            fprintf(stdout,"INFO:                                                Events cannot overlap, so the minimum value of \"contraction\" = value of \"sound shrinkage\".\n");
            fprintf(stdout,"INFO:  DURATION ............ (Minimum) duration of the output.\n");
            fprintf(stdout,"INFO:  SPLICE LENGTH ....... Length of splices, in millseconds.\n");
            fprintf(stdout,"INFO:  MINIMUM EVENT DURATION ....... When sound duration reaches this minimum, shrinkage stops and events thereafter are of equal length.\n");
            fprintf(stdout,"INFO:  MINIMUM EVENT SEPARATION ..... When event separation reaches this minimum, contraction stops and events thereafter are equally spaced in time.\n");
            fprintf(stdout,"INFO:  EVENT TIME RANDOMISATION ..... Randomisation of entry times of events.\n");
            fprintf(stdout,"INFO:  EQUALISE EVENT LEVELS ........ Force the (maximum) level of all output events to that of the input event (if possible).\n");
            fprintf(stdout,"INFO:  REVERSE SEGMENTS ............. Output events are each reversed, but remain in the same time order.\n");
            break;
        case(4):
        case(5):
            switch(mode) {
            case(4):
                fprintf(stdout,"INFO:  IN A SOUND, SHRINK EVENTS CENTRED ROUND DETECTABLE PEAKS.\n");
                break;
            case(5):
                fprintf(stdout,"INFO:  IN A SOUND, SHRINK EVENTS CENTRED ROUND USER-SPECIFIED PEAKS.\n");
                break;
            }
            fprintf(stdout,"INFO:  \n");
            fprintf(stdout,"INFO: PARAMETERS---------------------------------------------------------------\n");
            fprintf(stdout,"INFO:  \n");
            if(mode == 5)
                fprintf(stdout,"INFO:  PEAK TIMES .......... A textfile listing the times of peaks in the input sound file.\n");
            fprintf(stdout,"INFO:  SOUND SHRINKAGE ..... Shortening factor of sound from one repeat to the next.\n");
            fprintf(stdout,"INFO:                                                Shrinkage stops once events become too short for the splices.\n");
            if(mode == 4)
                fprintf(stdout,"INFO:  WINDOW SIZE ......... Size of window for peak detection (in milliSeconds).\n");
            else
                fprintf(stdout,"INFO:  WINDOW SIZE ......... Size of window for minima detection (in milliSeconds).\n");
            fprintf(stdout,"INFO:  TIME CONTRACTION .....Shortening of time between placement of sounds in output stream.\n");
            fprintf(stdout,"INFO:                                                1.0 = events equally spaced, < 1.0 events become closer\n");
            fprintf(stdout,"INFO:                                                Events cannot overlap, so the minimum value of \"contraction\" = value of \"sound shrinkage\".\n");
            fprintf(stdout,"INFO:  SHRINKAGE START...... Time at which shrinking begins.\n");
            fprintf(stdout,"INFO:  SPLICE LENGTH ....... Length of splices, in millseconds.\n");
            fprintf(stdout,"INFO:  MINIMUM EVENT DURATION ....... When sound duration reaches this minimum, shrinkage stops.\n");
            fprintf(stdout,"INFO:  MINIMUM EVENT SEPARATION ..... When event separation reaches this minimum, contraction stops.\n");
            fprintf(stdout,"INFO:  EVENT TIME RANDOMISATION ..... Randomisation of entry times of events.\n");
            fprintf(stdout,"INFO:  \n");
            fprintf(stdout,"INFO:  MINIMUM LENGTH FOR SQUEEZE START.....\n");
            fprintf(stdout,"INFO:                                 Minimum source-segment length before sound squeezing can begin (for the \"SQUEEZE EVENLY\" option)\n");
            fprintf(stdout,"INFO:  INPUT GATE .......... Input level (relative to the maximum level of the source) below which source-peaks are ignored.\n");
            if(mode == 4)
                fprintf(stdout,"INFO:  SKEW ................ Where, in the found source-segment, the sound is cut. e.g. 0 = at start  :  0.5 = in the middle  :  1 = at end.\n");
            fprintf(stdout,"INFO:  \n");
            fprintf(stdout,"INFO:  EQUALISE EVENT LEVELS ........ Force the (maximum) level of all output events to that of the input event (if possible).\n");
            fprintf(stdout,"INFO:  REVERSE SEGMENTS ............. Output events are each reversed, but remain in the same time order.\n");
            fprintf(stdout,"INFO:                        Mixing the output, then reversing the resultant sound produces an 'Expansion' of events,\n");
            fprintf(stdout,"INFO:                        opposite to the 'Shrinkage/Contraction'.\n");
            fprintf(stdout,"INFO:                        Note that the mixed sequence can be developed (each sound processed) to produce new, related sequences\n");
            fprintf(stdout,"INFO:                        which can be mixed using the same mix times as in the original.\n");
            fprintf(stdout,"INFO:                        If sounds processing involves any time-extension, start-times in the mix for the reversed segments will be altered.\n");
            fprintf(stdout,"INFO:                        Hence, with this flag set, an additional file is output listing the gaps between sound-ENDS in any mix\n");
            fprintf(stdout,"INFO:                        of the processed events.\n");
            fprintf(stdout,"INFO:  SQUEEZE EVENLY ............... If \"shrinkage\" > 0, sounds shorten in a regular manner.\n");
            fprintf(stdout,"INFO:                                                                If \"contraction\" > 0, output accelerates in a regular manner.\n");
            fprintf(stdout,"INFO:  OUTPUT GATE .................. Omit any too-quiet events, once a fixed end tempo has been reached.\n");
            break;
        }
        break;
    case(NEWTEX):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: GRANULATE SOURCE SOUND OVER TIME AND SPACE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Granulate several streams from a SINGLE source, where the source can be transposed.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TRANSPOSITION DATA ..... A textfile Listing of transposition ratios and relative levels, against time.\n");
            fprintf(stdout,"INFO:                     Data is a text file of lines of data and every line must have the same number of entries.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     The 1ST ENTRY on each line is a time. Times must start at zero and increase.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All EVEN NUMBERED entries are transpositions, and these must increase through a line.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                     All other ODD NUMBERED entries are loudness levels for those transposition, between -1 and 1.\n");
            fprintf(stdout,"INFO:                     -ve values invert the phase of the source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: DURATION ............ Total Duration of the output sound.\n");
            fprintf(stdout,"INFO: CHANNEL COUNT ... Number of output channels.\n");
            fprintf(stdout,"INFO: OCTAVE TRANSPOSITION.. Current range of additional octave transpositions of the original components.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMESTEP ............ Average timestep between changes in stream-content of output.\n");
            fprintf(stdout,"INFO: SPLICETIME (mS).... Length of fade-in/out times of components in output sound, in milliseconds.\n");
            fprintf(stdout,"INFO: STREAMS IN PLAY . Number of streams used in any segment: If set to ZERO, number of streams used is random.\n");
            fprintf(stdout,"INFO: MAXCHANGE COMPONENTS  As far as possible, always change components used, from one segment to the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EMERGENCE CHANNEL .. If spatial image emerges from a single channel, to fill the space, this is the channel.\n");
            fprintf(stdout,"INFO: EMERGENCE TIME .... If spatial image emerges from a single channel, time taken to fully emerge.\n");
            fprintf(stdout,"INFO: CONVERGENCE CHANNEL .. If spatial image converges to a single channel at end of sound, this is the channel.\n");
            fprintf(stdout,"INFO: CONVERGENCE TIME . If spatial image converges to a single channel, time taken to fully converge.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Note that Emergence always works but, because of the nature of the algorithm, Convergence is only a tendency\n");
            fprintf(stdout,"INFO: and the signal may not all converge to the specified convergence channel.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: For NO EMERGENCE or NO CONVERGENCE, set the relevant values to ZERO.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: JUMP .................. Use same spatial position for all components in a segment.\n");
            fprintf(stdout,"INFO: ROTATION SPEED .... Rotation speed for Special Space Type 3 (only).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECIAL SPACE TYPE  (8-channel files only) .... Special types of spatialisation.\n");
            fprintf(stdout,"INFO:    1:  Left-Right Rand ........... Alternate Left and Right sides, random positions.\n");
            fprintf(stdout,"INFO:    2:  Front-Back Rand .......... Alternate Front and back areas of space , random positions.\n");
            fprintf(stdout,"INFO:    3:  Rotate ...................... (Requires a positive or negative rotation speed).\n");
            fprintf(stdout,"INFO:    4:  Superspace1 ............... Single channel positions only.\n");
            fprintf(stdout,"INFO:    5:  Superspace2 ............... Single channels and channel-pairs only.\n");
            fprintf(stdout,"INFO:    6:  Superspace3 ............... Single channels and channel-pairs and channel-triples only.\n");
            fprintf(stdout,"INFO:    7:  Superspace4 ............... Single channels, channel-pairs, channel-triples, square, diamond and all-positions.\n");
            fprintf(stdout,"INFO:    8:  Left-Right Alternate ....... Alternate Left and Right sides, using all channels of each.\n");
            fprintf(stdout,"INFO:    9:  Back-Front Alternate ...... Alternate Back and Front areas, using all channels of each.\n");
            fprintf(stdout,"INFO:    10: Frameswitch ............... Alternate Between Square and Diamond 4-sets.\n");
            fprintf(stdout,"INFO:    11: Triangle Rotate 1 ......... Rotate a triple of alternate channels, clockwise.\n");
            fprintf(stdout,"INFO:    12: Triangle AntiRotate 1 ..... Rotate a triple of alternate channels, anticlockwise.\n");
            fprintf(stdout,"INFO:    13: Triangle Rotate 2 ......... Rotate a channel and the pair opposite, clockwise.\n");
            fprintf(stdout,"INFO:    14: Triangle AntiRotate 2 ..... Rotate a channel and the pair opposite, anticlockwise.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: GRANULATE SEVERAL SOURCE SOUNDS OVER TIME AND SPACE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Granulate a group of sounds, where the sources are not transposed.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: DURATION ............ Total Duration of the output sound.\n");
            fprintf(stdout,"INFO: CHANNEL COUNT ... Number of output channels.\n");
            fprintf(stdout,"INFO: MAX SOURCE DUPLICATION...... Maximum number of simultaneous streams of any one source.\n");
            fprintf(stdout,"INFO: DELAY ................. Time delay between duplicated streams.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMESTEP ............ Average timestep between changes in stream-content of output.\n");
            fprintf(stdout,"INFO: SPLICETIME (mS).... Length of fade-in/out times of components in output sound, in milliseconds.\n");
            fprintf(stdout,"INFO: STREAMS IN PLAY . Number of streams used in any segment: If set to ZERO, number of streams used is random.\n");
            fprintf(stdout,"INFO: MAXCHANGE COMPONENTS  As far as possible, always change components used, from one segment to the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EMERGENCE CHANNEL .. If spatial image emerges from a single channel, to fill the space, this is the channel.\n");
            fprintf(stdout,"INFO: EMERGENCE TIME .... If spatial image emerges from a single channel, time taken to fully emerge.\n");
            fprintf(stdout,"INFO: CONVERGENCE CHANNEL .. If spatial image converges to a single channel at end of sound, this is the channel.\n");
            fprintf(stdout,"INFO: CONVERGENCE TIME . If spatial image converges to a single channel, time taken to fully converge.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Note that Emergence always works but, because of the nature of the algorithm, Convergence is only a tendency\n");
            fprintf(stdout,"INFO: and the signal may not all converge to the specified convergence channel.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: For NO EMERGENCE or NO CONVERGENCE, set the relevant values to ZERO.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: JUMP .................. Use same spatial position for all components in a segment.\n");
            fprintf(stdout,"INFO: ROTATION SPEED .... Rotation speed for Special Space Type 3 (only).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECIAL SPACE TYPE  (8-channel files only) .... Special types of spatialisation.\n");
            fprintf(stdout,"INFO:    1:  Left-Right Rand ........... Alternate Left and Right sides, random positions.\n");
            fprintf(stdout,"INFO:    2:  Front-Back Rand .......... Alternate Front and back areas of space , random positions.\n");
            fprintf(stdout,"INFO:    3:  Rotate ...................... (Requires a positive or negative rotation speed).\n");
            fprintf(stdout,"INFO:    4:  Superspace1 ............... Single channel positions only.\n");
            fprintf(stdout,"INFO:    5:  Superspace2 ............... Single channels and channel-pairs only.\n");
            fprintf(stdout,"INFO:    6:  Superspace3 ............... Single channels and channel-pairs and channel-triples only.\n");
            fprintf(stdout,"INFO:    7:  Superspace4 ............... Single channels, channel-pairs, channel-triples, square, diamond and all-positions.\n");
            fprintf(stdout,"INFO:    8:  Left-Right Alternate ....... Alternate Left and Right sides, using all channels of each.\n");
            fprintf(stdout,"INFO:    9:  Back-Front Alternate ...... Alternate Back and Front areas, using all channels of each.\n");
            fprintf(stdout,"INFO:    10: Frameswitch ............... Alternate Between Square and Diamond 4-sets.\n");
            fprintf(stdout,"INFO:    11: Triangle Rotate 1 ......... Rotate a triple of alternate channels, clockwise.\n");
            fprintf(stdout,"INFO:    12: Triangle AntiRotate 1 ..... Rotate a triple of alternate channels, anticlockwise.\n");
            fprintf(stdout,"INFO:    13: Triangle Rotate 2 ......... Rotate a channel and the pair opposite, clockwise.\n");
            fprintf(stdout,"INFO:    14: Triangle AntiRotate 2 ..... Rotate a channel and the pair opposite, anticlockwise.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: GRANULATE SOURCE SOUND(S) OVER TIME AND SPACE, WITH DRUNKEN WALK THROUGH SOURCE(S).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The sources are not transposed.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: DURATION ............ Total Duration of the output sound.\n");
            fprintf(stdout,"INFO: CHANNEL COUNT ... Number of output channels.\n");
            fprintf(stdout,"INFO: MAX SOURCE DUPLICATION...... Maximum number of simultaneous streams of any one source.\n");
            fprintf(stdout,"INFO: LOCUS ................................. Time around which (next) source-read begins.\n");
            fprintf(stdout,"INFO: AMBITUS ............................ Area around locus within which next source-segment read may start.\n");
            fprintf(stdout,"INFO: DRUNK STEP ..................... Maximum size of random leap in source between start of this read and start of next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMESTEP ............ Average timestep in output between changes in stream-content.\n");
            fprintf(stdout,"INFO: SPLICETIME (mS).... Length of fade-in/out times of components in output sound, in milliseconds.\n");
            fprintf(stdout,"INFO: STREAMS IN PLAY . Number of streams used in any segment: If set to ZERO, number of streams used is random.\n");
            fprintf(stdout,"INFO: MAXCHANGE COMPONENTS  As far as possible, always change components used, from one segment to the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: EMERGENCE CHANNEL .. If spatial image emerges from a single channel, to fill the space, this is the channel.\n");
            fprintf(stdout,"INFO: EMERGENCE TIME .... If spatial image emerges from a single channel, time taken to fully emerge.\n");
            fprintf(stdout,"INFO: CONVERGENCE CHANNEL .. If spatial image converges to a single channel at end of sound, this is the channel.\n");
            fprintf(stdout,"INFO: CONVERGENCE TIME . If spatial image converges to a single channel, time taken to fully converge.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Note that Emergence always works but, because of the nature of the algorithm, Convergence is only a tendency\n");
            fprintf(stdout,"INFO: and the signal may not all converge to the specified convergence channel.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: For NO EMERGENCE or NO CONVERGENCE, set the relevant values to ZERO.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: JUMP .................. Use same spatial position for all components in a segment.\n");
            fprintf(stdout,"INFO: ROTATION SPEED .... Rotation speed for Special Space Type 3 (only).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SPECIAL SPACE TYPE  (8-channel files only) .... Special types of spatialisation.\n");
            fprintf(stdout,"INFO:    1:  Left-Right Rand ........... Alternate Left and Right sides, random positions.\n");
            fprintf(stdout,"INFO:    2:  Front-Back Rand .......... Alternate Front and back areas of space , random positions.\n");
            fprintf(stdout,"INFO:    3:  Rotate ...................... (Requires a positive or negative rotation speed).\n");
            fprintf(stdout,"INFO:    4:  Superspace1 ............... Single channel positions only.\n");
            fprintf(stdout,"INFO:    5:  Superspace2 ............... Single channels and channel-pairs only.\n");
            fprintf(stdout,"INFO:    6:  Superspace3 ............... Single channels, channel-pairs and triangles only.\n");
            fprintf(stdout,"INFO:    7:  Superspace4 ............... Single channels, channel-pairs, triangles, square, diamond and all-positions.\n");
            fprintf(stdout,"INFO:    8:  Left-Right Alternate ....... Alternate Left and Right sides, using all channels of each.\n");
            fprintf(stdout,"INFO:    9:  Back-Front Alternate ...... Alternate Back and Front areas, using all channels of each.\n");
            fprintf(stdout,"INFO:    10: Frameswitch ............... Alternate Between Square and Diamond 4-sets.\n");
            fprintf(stdout,"INFO:    11: Triangle Rotate 1 ......... Rotate a triple of alternate channels, clockwise, speed determined by \"Timestep\".\n");
            fprintf(stdout,"INFO:    12: Triangle AntiRotate 1 ..... Rotate a triple of alternate channels, anticlockwise, speed determined by \"Timestep\".\n");
            fprintf(stdout,"INFO:    13: Triangle Rotate 2 ......... Rotate a channel and the pair opposite, clockwise, speed determined by \"Timestep\".\n");
            fprintf(stdout,"INFO:    14: Triangle AntiRotate 2 ..... Rotate a channel and the pair opposite, anticlockwise, speed determined by \"Timestep\".\n");
            break;
        }
        break;
    case(CERACU):
        fprintf(stdout,"INFO: SUPERIMPOSE DIFFERENT CYCLIC REPETITIONS OF A SOUND, UNTIL THE CYCLES RESYNCHRONISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The source sound repeats at regular time-intervals.\n");
        fprintf(stdout,"INFO: There are 2 or more streams of such repetition, each with a different repetition time-interval.\n");
        fprintf(stdout,"INFO: A \"complete-cycle\" takes us from one point where all the streams are in sync to the next point where this is the case.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CYCLE COUNT DATA ................... A list of integers.\n");
        fprintf(stdout,"INFO:                                    The number of items in the list determines the number of simultaneous cycle-streams.\n");
        fprintf(stdout,"INFO:                                    The values entered determined how many repeats there are in each stream before all streams resynchronise.\n");
        fprintf(stdout,"INFO: SHORTEST REPEAT TIME .............. Time before the first repeat in the fastest cycle. If set to ZERO, assumed to be duration of input file.\n");
        fprintf(stdout,"INFO:                                    NB With many prime-number cycles, the \"Shortest Repeat Time\" may be adjusted upwards (sometimes considerably!)\n");
        fprintf(stdout,"INFO:                                    to allow all the repeating cycles to fit into a cycle with the correct number of repeats.\n");
        fprintf(stdout,"INFO:                                    (The minimum output duration, in samples, cannot be less than the Lowest Common Multiple of all the cycle-counts,\n");
        fprintf(stdout,"INFO:                                    and the cyclecnts will all be factors of this duration).\n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT ............ Number of output channels.\n");
        fprintf(stdout,"INFO: MINIMUM OUTPUT DURATION......... Minimum duration of the output. If set to ZERO, assumed to be one complete-cycle.\n");
        fprintf(stdout,"INFO:                                    Process always outputs a WHOLE NUMBER of complete-cycles\n");
        fprintf(stdout,"INFO:                                    and this output will be equal to or longer in duration than the output duration specified.\n");
        fprintf(stdout,"INFO: OVERRIDE LENGTH LIMIT ............. Force output to continue until a complete cycle is generated, no matter how long this may take.\n");
        fprintf(stdout,"INFO:                                    A warning will be given after 1 hour of output(!).\n");
        fprintf(stdout,"INFO:                                    No guarantee can be given that the program will not crash for extremely long durations.\n");
        fprintf(stdout,"INFO: ECHO DELAY ................................. An optional echo of the entire output can be added. To avoid this echo, set parameter to ZERO.\n");
        fprintf(stdout,"INFO:                                    The echo delay should not be greater than the \"Shortest Repeat Time\" BUT\n");
        fprintf(stdout,"INFO:                                    the \"Shortest Repeat Time\" may be recalculated (see program output) to accomodate\n");
        fprintf(stdout,"INFO: ECHO SPATIAL OFFSET ................ Any optional echo can be offset to a different channel.\n");
        fprintf(stdout,"INFO:                                    1 offset it 1 channel to the right, -1 offsets it 1 chyannel to the left, and so on.\n");
        fprintf(stdout,"INFO: LINEAR OUTPUT ARRAY ................ If output > stereo, loudspeaker array assumed to be in surround (circling the audience).\n");
        fprintf(stdout,"INFO:                                    But if this flag is set, the array is assumed to be linear (reaching from a leftmost to a rightmost point).\n");
        break;
    case(MADRID):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: REPEAT SOUND(S) WITH SPATIALISED ACCENTUATIONS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The source sounds repeat, with several superimposed copies played at different spatial locations.\n");
            fprintf(stdout,"INFO: By randomly deleting events from these streams spatial relocations and accents are produced.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OUTPUT DURATION ....................... Maximum Duration of output.\n");
            fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT ............... Number of channels in the output sound.\n");
            fprintf(stdout,"INFO: NUMBER OF STREAMS .................... Number of spatially distinct streams.\n");
            fprintf(stdout,"INFO: DELETION FACTOR ........................ Proportion of events to delete.\n");
            fprintf(stdout,"INFO:                                                        Values between 0 and 1 delete that proportion of events in the various streams.\n");
            fprintf(stdout,"INFO:                                                        For values greater than 1, the proportion of events at a single location increases.\n");
            fprintf(stdout,"INFO: and, if you \"ALLOW GAPS IN OUTPUT\", the proportion of empty events also increases.\n");
            fprintf(stdout,"INFO: EVENT TIME STEP .......................... Time-step between event repetitions.\n");
            fprintf(stdout,"INFO: EVENT TIME RANDOMISATION .......... Randomisation of time-step between event repetitions.\n");
            fprintf(stdout,"INFO: DELETION SEED VALUE .................... If the process is run a 2nd time, with the SAME parameters,\n");
            fprintf(stdout,"INFO:                                                        If the seed value is set to the same POSITIVE value, deletions will be the same.\n");
            fprintf(stdout,"INFO:                                                        If set to zero however, deletions will always be different, even when all other parameters are the same.\n");
            fprintf(stdout,"INFO: ALLOW GAPS IN OUTPUT ................. Some repeptition points may have NO sound at all.\n");
            fprintf(stdout,"INFO: LINEAR OUTPUT ARRAY .................. If output > stereo, loudspeaker array assumed to be in surround (circling the audience).\n");
            fprintf(stdout,"INFO:                                                        But if this flag is set, the array is assumed to be linear (reaching from a leftmost to a rightmost point).\n");
            fprintf(stdout,"INFO: RANDOMLY_PERMUTE_INFILE_ORDER . Randomly permuter order of input files, and play 1 of each in this order before creating the next order permutation.\n");
            fprintf(stdout,"INFO: RANDOMLY_SELECT_INFILE .............. Randomly select the next input file to use, independently of any previous selection.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: You cannot use BOTH Random Permutation AND Random Selection.\n");
            fprintf(stdout,"INFO: Neither of these flags is operational where there is only ONE input sound.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: SEQUENCE SOUND(S) WITH SPATIALISED ACCENTUATIONS.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The source sounds follow each other in a defined sequence\n");
            fprintf(stdout,"INFO: with several superimposed copies played at different spatial locations.\n");
            fprintf(stdout,"INFO: By randomly deleting events from these streams spatial relocations and accents are produced.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEQUENCE DATA ........................ Textfile of integers between 1 and the number of input files.\n");
            fprintf(stdout,"INFO:                                                        The sequence of numbers in this file determines the sequence of input files used in the output.\n");
            fprintf(stdout,"INFO: OUTPUT DURATION ....................... Maximum Duration of output.\n");
            fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT ............... Number of channels in the output sound.\n");
            fprintf(stdout,"INFO: NUMBER OF STREAMS .................... Number of spatially distinct streams.\n");
            fprintf(stdout,"INFO: DELETION FACTOR ........................ Proportion of events to delete.\n");
            fprintf(stdout,"INFO:                                                        Values between 0 and 1 delete that proportion of events in the various streams.\n");
            fprintf(stdout,"INFO:                                                        For values greater than 1, the proportion of events at a single location increases.\n");
            fprintf(stdout,"INFO: and, if you \"ALLOW GAPS IN OUTPUT\", the proportion of empty events also increases.\n");
            fprintf(stdout,"INFO: EVENT TIME STEP .......................... Time-step between event repetitions.\n");
            fprintf(stdout,"INFO: EVENT TIME RANDOMISATION .......... Randomisation of time-step between event repetitions.\n");
            fprintf(stdout,"INFO: DELETION SEED VALUE .................... If the process is run a 2nd time, with the SAME parameters,\n");
            fprintf(stdout,"INFO:                                                        If the seed value is set to the same POSITIVE value, deletions will be the same.\n");
            fprintf(stdout,"INFO:                                                        If set to zero however, deletions will always be different, even when all other parameters are the same.\n");
            fprintf(stdout,"INFO: ALLOW GAPS IN OUTPUT ................. Some repeptition points may have NO sound at all.\n");
            fprintf(stdout,"INFO: LINEAR OUTPUT ARRAY .................. If output > stereo, loudspeaker array assumed to be in surround (circling the audience).\n");
            fprintf(stdout,"INFO:                                                        But if this flag is set, the array is assumed to be linear (reaching from a leftmost to a rightmost point).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: You cannot use BOTH Random Permutation AND Random Selection.\n");
            fprintf(stdout,"INFO: Neither of these flags is operational where there is only ONE input sound.\n");
            break;
        }
        break;
    case(SHIFTER):
        fprintf(stdout,"INFO: GENERATE A SERIES OF SIMULTANEOUS REPETITION STREAMS WHERE THE RHYTHMIC PULSE SHIFTS FROM ONE TO THE OTHER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The source sound repeats regularly in (specified) cycles.\n");
        fprintf(stdout,"INFO: The tempi of the cycles is arranged so that the streams resynchronise after a set number of repetitions.\n");
        fprintf(stdout,"INFO: e.g. 11,12,13 would set up 3 streams which repeat the sound 11,12 and 13 times, respectively, before the streams resynchronise.\n");
        fprintf(stdout,"INFO: The focus may shift from one stream to another (by loudness emphasis), as the output sound evolves.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CYCLE DATA ................................. Textfile list of at least 2 different integers with values  >= 2.\n");
        fprintf(stdout,"INFO:                                                        In Mode 2, the number of entries should equal the number of input sound-sources.\n");
        fprintf(stdout,"INFO:                                                        These numbers represent the count of repetitions in each output stream before the streams resynchronise.\n");
        fprintf(stdout,"INFO: CYCLE DURATION ........................ Duration from one streams-synchronisation-point to the next.\n");
        fprintf(stdout,"INFO:                                                        Cycle duration and cycle data together determine the tempi of the different streams.\n");
        fprintf(stdout,"INFO: MIN OUTPUT DURATION ................ Minimum Duration of the output.\n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT ............. Number of channels in the output sound. The cycles play at fixed locations distributed over the output array.\n");
        fprintf(stdout,"INFO: MINIMUM BEAT DIVISION .............. Smallest integer subdivision of the beat: a multiple of 2 or 3, and greater than 4.\n");
        fprintf(stdout,"INFO:                                                        This determines the quantisation of the entry-times in the various streams.\n");
        fprintf(stdout,"INFO: LINGER CYCLES .......................... Number of cycles for which the focus is on any one cycle.\n");
        fprintf(stdout,"INFO: TRANSITION CYCLES .................... Number of cycles during which the focus moves from one cycle to another.\n");
        fprintf(stdout,"INFO:                                                        The sum of Linger cycles and Transition cycles must be >= 1.\n");
        fprintf(stdout,"INFO: FOCUS LEVEL BOOST .................... If the standard stream level is \"L\", the focus stream is increased in level by \"L\" times \"FOCUS LEVEL BOOST\".\n");
        fprintf(stdout,"INFO: LINEAR OUTPUT ARRAY .................. If output > stereo, loudspeaker array assumed to be in surround (circling the audience).\n");
        fprintf(stdout,"INFO:                                                        But if this flag is set, the array is assumed to be linear (reaching from a leftmost to a rightmost point).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In standard operation, focus shifts to each of the listed cycles in the order they appear in the data file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: READ BACK AND FORTH_THROUGH FOCUS .. Focus shifts gradually to the end of the data list, then back gradually towards the start, and so on.\n");
        fprintf(stdout,"INFO: RANDOMLY PERMUTE FOCUS ........... The cycle to focus on is determined by a random permutation of the order of the cycles.\n");
        fprintf(stdout,"INFO:                                                        Once all the cycles have been used, a new permutation is made.\n");
        fprintf(stdout,"INFO: You cannot use both Back-and-Forth AND Random focus shift.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(FRACTURE):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: MONO SOUND GRADUALLY FRACTURES INTO ELEMENTS DISTRIBUTED IN SPACE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stderr,"INFO: The source is cut into fragments which are enveloped and possibly transpose-stacked\n");
            fprintf(stderr,"INFO: and these fragments are distributed in space.\n");
            fprintf(stderr,"INFO: Stacks are synchronised at the envelope peak of the fragment.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ENVELOPE SERIES ......... A text datafile of lines consisting of a time and 7 pairs of envelope data.\n");
            fprintf(stdout,"INFO:                                                       The times are abslute times and must start at 0 and advance.\"\n");
            fprintf(stdout,"INFO:                                                       Each pair of the 7 consists of an \"etime\" and a level value.\n");
            fprintf(stdout,"INFO:                                                       Etimes are RELATIVE times within the envelope.\n");
            fprintf(stdout,"INFO:                                                       In Each line they must start at 0, end at 1, and advance.\n");
            fprintf(stdout,"INFO:                                                       Levels values should lie between 0 and 1. The first and last values MUST be zero, and the maximum value MUST be 1.0.\n");
            fprintf(stdout,"INFO:                                                       Envelopes to use at a specific time are derived by interpolating between the given envelopes\n");
            fprintf(stdout,"INFO:                                                       and subsequently modifying their depth (how close to zero they cut - see below).\n");
            fprintf(stdout,"INFO: OUTPUT CHANNELS ......... The number of channels in the output file (2-16).\n");
            fprintf(stdout,"INFO: NUMBER OF SPATIAL STREAMS .. The number of spatial positions to which the resulting fragments are allotted ( >=4 ).\n");
            fprintf(stdout,"INFO: PULSE DURATION ............ The average time between each SET of fragments (one in each stream).\n");
            fprintf(stdout,"INFO: DEPTH AND STACK ........... Between 0 and 1 this parameter controls how deeply the envelopes cut into the source.\n");
            fprintf(stdout,"INFO:                                                       With depth 1 the envelope cuts down to zero (as in the input envelope data).\n");
            fprintf(stdout,"INFO:                                                       With depth 0.75 the envelope cuts 3/4 of the way to zero.\n");
            fprintf(stdout,"INFO:                                                       With depth 0 the envelope has NO EFFECT on the source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                                                       Once the depth value exceeds 1, a STACK value is derived, being the depth minus 1.\n");
            fprintf(stdout,"INFO:                                                       Stacking adds transposed copies to the fragment, synchronised around the envelope peak.\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 2, the Stack value is 1: The 1st transposed element is added at full level,\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 1.5, the Stack value is .5: the transposed element is added at 1/2 level,\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 2.5, the Stack value is 1.5: The first element is added at full level, the 2nd at 1/2 level\n");
            fprintf(stdout,"INFO:                                                       and so on.\n");
            fprintf(stdout,"INFO: STACKING INTERVAL ........ Interval of (upward) transposition in the stack, in semitones (0-12).\n");
            fprintf(stdout,"INFO:                                                       The (Default) zero value is read as an octave (12). Zeros MUST NOT BE USED in stack brkpoint files.\n");
            fprintf(stdout,"INFO: READ RANDOMISATION .... Randomisation of the fragment read-time in the source. Range 0-1.\n");
            fprintf(stdout,"INFO: PULSE RANDOMISATION ... Randomisation of the pulse duration. Range 0-1.\n");
            fprintf(stdout,"INFO:                                                       In both cases, maximum random scatter scatters within range +- half the duration of the fragment.\n");
            fprintf(stdout,"INFO: STREAM DISPERSAL ........ Scattering of the output timings amongst different streams.\n");
            fprintf(stdout,"INFO:                                                       If pulse(+randomisation) generates a timing \"P\",\n");
            fprintf(stdout,"INFO:                                                       With Dispersal 0 : all fragments start at \"P\".\n");
            fprintf(stdout,"INFO:                                                       With Dispersal 1 : fragments are scattered within a range of +- half the duration of the fragment.\n");
            fprintf(stdout,"INFO:                                                       Intermediate values scattered fragment start-times to various extents around the time \"W\".\n");
            fprintf(stdout,"INFO: LEVEL RANDOMISATION .... Randomisation of the levels of the fragments. Range  0 - 1.\n");
            fprintf(stdout,"INFO:                                                       With value 0: All fragments are at full level. Value 1 produces random levels between 0 & full level.\n");
            fprintf(stdout,"INFO: ENVELOPE RANDOMISATION .. Randomisation of the choice of source envelope.\n");
            fprintf(stdout,"INFO:                                                       This is a time-range between 0 and \"now\".\n");
            fprintf(stdout,"INFO:                                                       If set (>0) the time in the envelope data file at which the envelope is selected\n");
            fprintf(stdout,"INFO:                                                       is set randomly between \"now\" and \"now minus time-range\".\n");
            fprintf(stdout,"INFO: STACK RANDOMISATION .. Randomisation of the stacking depth.\n");
            fprintf(stdout,"INFO:                                                       If set to zero, stacking depth is determined completely by the depth parameter (S = D - 1).\n");
            fprintf(stdout,"INFO:                                                       If set to one, stacking depth is selected at random between 0 and the given value.\n");
            fprintf(stdout,"INFO:                                                       Intermediate values give intermediate random-selection ranges.\n");
            fprintf(stdout,"INFO: PITCH RANDOMISATION IN CENTS .. Randomisation of the transposition of the fragments.\n");
            fprintf(stdout,"INFO:                                                       If set to \"P\", Fragments are randomly transposed in pitch between +P and -P.\n");
            fprintf(stdout,"INFO: RANDOM SEED .............. If the seed value is set as ZERO, and randomising parameters are used,\n");
            fprintf(stdout,"INFO:                                                       running the process again with IDENTICAL parameters will produce DIFFERENT output (due to the the variable randomisation).\n");
            fprintf(stdout,"INFO:                                                       With a POSITIVE seed value, re-running the process with IDENTICAL randomising parameters produces IDENTICAL (randomised) output.\n");
            fprintf(stdout,"INFO: MINIMUM FRAGMENT DURATION .... Minimum duration of any fragment in any stream.\n");
            fprintf(stdout,"INFO: MAXIMUM FRAGMENT DURATION ... Maximum duration of any fragment in any stream.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PERMIT SHORT STACKS ... Normally, very sort events are not stacked (to prevent clipping). Setting this flag allows short events to be stacked.\n");
            fprintf(stdout,"INFO: LINEAR OUTPUT ARRAY ... If output > stereo, loudspeaker array assumed to be in surround (circling the audience).\n");
            fprintf(stdout,"INFO:                                                        But if this flag is set, the array is assumed to be linear (reaching from a leftmost to a rightmost point).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NB Stacking, and the read, level & pitch randomisations ARE NOT ACTIVATED if the depth is less than 1.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: MONO SOUND GRADUALLY FRACTURES INTO ELEMENTS DISTRIBUTED IN STEREO, THEN STEREO-IMAGE POSITIONED IN MULTICHANNEL SPACE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stderr,"INFO: The source is cut into fragments which are enveloped and possibly transpose-stacked\n");
            fprintf(stderr,"INFO: and these fragments are distributed in space.\n");
            fprintf(stderr,"INFO: Stacks are synchronised at the envelope peak of the fragment.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The stereo \"front\" is then positioned in multichannel space.\n");
            fprintf(stdout,"INFO: If the front moves it must always move forwards.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ENVELOPE SERIES ......... A text datafile of lines consisting of a time and 7 pairs of envelope data.\n");
            fprintf(stdout,"INFO:                                                       The times are abslute times and must start at 0 and advance.\"\n");
            fprintf(stdout,"INFO:                                                       Each pair of the 7 consists of an \"etime\" and a level value.\n");
            fprintf(stdout,"INFO:                                                       Etimes are RELATIVE times within the envelope.\n");
            fprintf(stdout,"INFO:                                                       In Each line they must start at 0, end at 1, and advance.\n");
            fprintf(stdout,"INFO:                                                       Levels values should lie between 0 and 1. The first and last values MUST be zero, and the maximum value MUST be 1.0.\n");
            fprintf(stdout,"INFO:                                                       Envelopes to use at a specific time are derived by interpolating between the given envelopes\n");
            fprintf(stdout,"INFO:                                                       and subsequently modifying their depth (how close to zero they cut - see below).\n");
            fprintf(stdout,"INFO: OUTPUT CHANNELS ......... The number of channels in the output file (2-16).\n");
            fprintf(stdout,"INFO: NUMBER OF SPATIAL STREAMS .. The number of spatial positions to which the resulting fragments are allotted ( >=4 ).\n");
            fprintf(stdout,"INFO: PULSE DURATION ............ The average time between each SET of fragments (one in each stream).\n");
            fprintf(stdout,"INFO: DEPTH AND STACK ........... Between 0 and 1 this parameter controls how deeply the envelopes cut into the source.\n");
            fprintf(stdout,"INFO:                                                       With depth 1 the envelope cuts down to zero (as in the input envelope data).\n");
            fprintf(stdout,"INFO:                                                       With depth 0.75 the envelope cuts 3/4 of the way to zero.\n");
            fprintf(stdout,"INFO:                                                       With depth 0 the envelope has NO EFFECT on the source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                                                       Once the depth value exceeds 1, a STACK value is derived, being the depth minus 1.\n");
            fprintf(stdout,"INFO:                                                       Stacking adds transposed copies to the fragment, synchronised around the envelope peak.\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 2, the Stack value is 1: The 1st transposed element is added at full level,\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 1.5, the Stack value is .5: the transposed element is added at 1/2 level,\n");
            fprintf(stdout,"INFO:                                                       With a Depth of 2.5, the Stack value is 1.5: The first element is added at full level, the 2nd at 1/2 level\n");
            fprintf(stdout,"INFO:                                                       and so on.\n");
            fprintf(stdout,"INFO: STACKING INTERVAL ........ Interval of (upward) transposition in the stack, in semitones (0-12).\n");
            fprintf(stdout,"INFO:                                                       The (Default) zero value is read as an octave (12). Zeros MUST NOT BE USED in stack brkpoint files.\n");
            fprintf(stdout,"INFO: CENTRE OF IMAGE .......... Channel from which stereo image radiates (must be an integer).\n");
            fprintf(stdout,"INFO: FRONT POSITION ............ Position of stereo image in surround-space.\n");
            fprintf(stdout,"INFO:                                                       1 : front at centre lspkr.     -1: front at lspkr opposite to centre      0 : front at midline of surround-space.\n");
            fprintf(stdout,"INFO:                                                       2 : front infinitely far away in direction of centre lspkr.     -(2+(depth*2)) : front infinitely far away in direction opposite to centre lspkr.\n");
            fprintf(stdout,"INFO: DEPTH BEHIND FRONT ...... Fraction of total channels activated behind spreading front.\n");
            fprintf(stdout,"INFO: LEVEL ROLLOFF WITH ADDED CHANNELS .... Level compensation for addition of new output channels.\n");
            fprintf(stdout,"INFO:                                                       0, No rolloff, all channels play at full-current-level as they are added.\n");
            fprintf(stdout,"INFO:                                                       1, Full rolloff, levels fall to 1/N of full-current-level when Nth channels is added.\n");
            fprintf(stdout,"INFO:                                                       Intermediate values are possible.\n");
            fprintf(stdout,"INFO: READ RANDOMISATION .... Randomisation of the fragment read-time in the source. Range 0-1.\n");
            fprintf(stdout,"INFO: PULSE RANDOMISATION ... Randomisation of the pulse duration. Range 0-1.\n");
            fprintf(stdout,"INFO:                                                       In both cases, maximum random scatter scatters within range +- half the duration of the fragment.\n");
            fprintf(stdout,"INFO: STREAM DISPERSAL ........ Scattering of the output timings amongst different streams.\n");
            fprintf(stdout,"INFO:                                                       If pulse(+randomisation) generates a timing \"P\",\n");
            fprintf(stdout,"INFO:                                                       With Dispersal 0 : all fragments start at \"P\".\n");
            fprintf(stdout,"INFO:                                                       With Dispersal 1 : fragments are scattered within a range of +- half the duration of the fragment.\n");
            fprintf(stdout,"INFO:                                                       Intermediate values scattered fragment start-times to various extents around the time \"W\".\n");
            fprintf(stdout,"INFO: LEVEL RANDOMISATION .... Randomisation of the levels of the fragments. Range  0 - 1.\n");
            fprintf(stdout,"INFO:                                                       With value 0: All fragments are at full level. Value 1 produces random levels between 0 & full level.\n");
            fprintf(stdout,"INFO: ENVELOPE RANDOMISATION .. Randomisation of the choice of source envelope.\n");
            fprintf(stdout,"INFO:                                                       This is a time-range between 0 and \"now\".\n");
            fprintf(stdout,"INFO:                                                       If set (>0) the time in the envelope data file at which the envelope is selected\n");
            fprintf(stdout,"INFO:                                                       is set randomly between \"now\" and \"now minus time-range\".\n");
            fprintf(stdout,"INFO: STACK RANDOMISATION .. Randomisation of the stacking depth.\n");
            fprintf(stdout,"INFO:                                                       If set to zero, stacking depth is determined completely by the depth parameter (S = D - 1).\n");
            fprintf(stdout,"INFO:                                                       If set to one, stacking depth is selected at random between 0 and the given value.\n");
            fprintf(stdout,"INFO:                                                       Intermediate values give intermediate random-selection ranges.\n");
            fprintf(stdout,"INFO: PITCH RANDOMISATION IN CENTS .. Randomisation of the transposition of the fragments.\n");
            fprintf(stdout,"INFO:                                                       If set to \"P\", Fragments are randomly transposed in pitch between +P and -P.\n");
            fprintf(stdout,"INFO: RANDOM SEED .............. If the seed value is set as ZERO, and randomising parameters are used,\n");
            fprintf(stdout,"INFO:                                                       running the process again with IDENTICAL parameters will produce DIFFERENT output (due to the the variable randomisation).\n");
            fprintf(stdout,"INFO:                                                       With a POSITIVE seed value, re-running the process with IDENTICAL randomising parameters produces IDENTICAL (randomised) output.\n");
            fprintf(stdout,"INFO: MINIMUM FRAGMENT DURATION .... Minimum duration of any fragment in any stream.\n");
            fprintf(stdout,"INFO: MAXIMUM FRAGMENT DURATION ... Maximum duration of any fragment in any stream.\n");
            fprintf(stdout,"INFO: ATTENUATION FACTOR .......... Rapidity of attenuation of level of front, with distance from ring,\n");
            fprintf(stdout,"INFO:                                                       or during intrinsic fade-out of sound which doesn't recede into far distance.\n");
            fprintf(stdout,"INFO:                                                       1 = linear fade.\n");
            fprintf(stdout,"INFO: SUBTEND ZERO POINT ......... Point at which image becomes mono as it retreats from circle, or ceases being mono as it approaches the circle of loudspeakers.\n");
            fprintf(stdout,"INFO:                                                       Ratio of the required-distance(time)-to-the-subtend-zero-point to the total-distance(time)-to-infinity.\n");
            fprintf(stdout,"INFO: CONTRACTION FACTOR ...... Rate of contraction of image :  1 = linear.\n");
            fprintf(stdout,"INFO: MAX FILTER POINT ............ Point at which image becomes entirely lo-pass filtered as it retreats from circle, or begins to de-filter as it approaches the circle of loudspeakers.\n");
            fprintf(stdout,"INFO:                                                       Ratio of the required-distance(time)-to-the-max-filter-point to the total-distance(time)-to-infinity.\n");
            fprintf(stdout,"INFO: FILTER MIX FACTOR ............ Rate of replacement by filtered image :  1 = linear.\n");
            fprintf(stdout,"INFO: FILTER LOPASS FREQUENCY.. Low-pass cut-off frequency of distance-filter.\n");
            fprintf(stdout,"INFO: FADE IN ........................... Proportion of total duration over which event fades in from zero (independently of any fade associated with distance).\n");
            fprintf(stdout,"INFO: FADE OUT ......................... Proportion of total duration over which event decays to zero (independently of any fade associated with distance).\n");
            fprintf(stdout,"INFO: OVERALL GAIN ................. Overall gain: rare possibility that very rapid contraction with very low attenuation rate may cause overload in mixing to mono.\n");
            fprintf(stdout,"INFO:                                                       In case of overload, turn down inputs with \"Overall Gain\".\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PERMIT SHORT STACKS ... Normally, very sort events are not stacked (to prevent clipping). Setting this flag allows short events to be stacked.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NB The stacking, level and repitching parameters DO NOT KICK IN until the depth reaches 1.\n");
            break;
        }
        break;
    case(SUBTRACT):
        fprintf(stdout,"INFO: SUBTRACTS A MONO FILE FROM (1 CHANNEL OF) ANOTHER FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The first file can have any number of channels.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CHANNEL TO SUBTRACT .......... The number ( 1 - N ) of any channel in the 2nd file. (Setting to ZERO subtracts channel 1).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPEKLINE):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: CREATING SPECTRUM FROM SPECTRAL LINES TEXT DATA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ANALYSIS CHANNELS .......................... Number of channels in output spectral file (multiple of 2).\n");
            fprintf(stdout,"INFO: SOUND SAMPLING RATE ...................... Sampling rate of sound which will eventually be generated.\n");
            fprintf(stdout,"INFO: OUTPUT DURATION .............................. Duration of output spectrum.\n");
            fprintf(stdout,"INFO: NO OF ADDED HARMONICS .................. Number of harmonics to add to basic input spctrum.\n");
            fprintf(stdout,"INFO: HARMONICS ROLLOFF(dB).................... Rolloff (in dB) proceeding from one harmonic to the next.\n");
            fprintf(stdout,"INFO: FOOT OF INPUT DATA ........................ Minimum value in input to be represented in output spectrum ( less or equal to min data value).\n");
            fprintf(stdout,"INFO: CEILING OF INPUT DATA ..................   Maximum value in input to be represented in output spectrum ( breater than or equal to max data value).\n");
            fprintf(stdout,"INFO: FOOT OF SPECTRUM IN OUTPUT ........  Frequency of minimum value represented in output spectrum.\n");
            fprintf(stdout,"INFO: CEILING OF SPECTRUM IN OUTPUT .. Frequency of maximum value represented in output spectrum.\n");
            fprintf(stdout,"INFO: OVERALL GAIN .................................... Attenuation of output spectrum.\n");
            fprintf(stdout,"INFO: SPECTRAL WARP .................................. If NOT set to 1.0, warpa the shape of the output spectrum .... \n");
            fprintf(stdout,"INFO:                               Warp greater than 1 causes spectrum to be squeezed into the lower frequencies.\n");
            fprintf(stdout,"INFO:                               Warp less than 1 causes spectrum to be squeezed into the higher frequencies.\n");
            fprintf(stdout,"INFO: AMPLITUDE RANGE FLATTENING ........ If NOT set to 1.0 changes range of amplitudes of spectral lines.... \n");
            fprintf(stdout,"INFO:                               As value increases, amplitude range is increasingly flattened.\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: CREATING FILTER DATA FILE FROM SPECTRAL LINES TEXT DATA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SOUND SAMPLING RATE ...................... Sampling rate of sound which will eventually be generated.\n");
            fprintf(stdout,"INFO: OUTPUT DURATION .............................. Duration of output spectrum.\n");
            fprintf(stdout,"INFO: FOOT OF INPUT DATA ........................ Minimum value in input to be represented in output spectrum ( less or equal to min data value).\n");
            fprintf(stdout,"INFO: CEILING OF INPUT DATA ..................   Maximum value in input to be represented in output spectrum ( breater than or equal to max data value).\n");
            fprintf(stdout,"INFO: FOOT OF SPECTRUM IN OUTPUT ........  Frequency of minimum value represented in output spectrum.\n");
            fprintf(stdout,"INFO: CEILING OF SPECTRUM IN OUTPUT .. Frequency of maximum value represented in output spectrum.\n");
            fprintf(stdout,"INFO: SPECTRAL WARP .................................. If NOT set to 1.0, warpa the shape of the output spectrum .... \n");
            fprintf(stdout,"INFO:                               Warp greater than 1 causes spectrum to be squeezed into the lower frequencies.\n");
            fprintf(stdout,"INFO:                               Warp less than 1 causes spectrum to be squeezed into the higher frequencies.\n");
            fprintf(stdout,"INFO: AMPLITUDE RANGE FLATTENING ........ If NOT set to 1.0 changes range of amplitudes of spectral lines.... \n");
            fprintf(stdout,"INFO:                               As value increases, amplitude range is increasingly flattened.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(SPECMORPH):
        switch(mode) {
        case(6):
            fprintf(stdout,"INFO: MORPH, IN STEPS, BETWEEN TWO DISSIMILAR SPECTRA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Spectral peaks of 2 files are matched and, at each output step, move away from 1st and closer to 2nd.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NUMBER OF PEAKS TO MAP ..................... Number of peaks to look for.\n");
            fprintf(stdout,"INFO: NUMBER OF INTERMEDIATE FILES ... Number of output files with peaks in between the 1st and 2nd input files.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RETAIN LOUDNESS ENVELOPE OF 1st SND The loudness contour of the 1st sound is retained, even as its spectrum is changed.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: INTERP PEAKS ONLY .................... Retain file1 content of all non-peak channels.\n");
            fprintf(stdout,"INFO:                                   (In default case, non-peak channels interpolate towards file2 values).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: INTERP PEAK FREQUENCIES ONLY .. Amplitudes of peak channels are determined by peak amplitudes of sound 1 only.\n");
            fprintf(stdout,"INFO: \n");
            break;
        default:
            fprintf(stdout,"INFO: MORPH BETWEEN TWO DISSIMILAR SPECTRA.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Spectral peaks are matched, and pitch-glide towards one another.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Modes 1 and 2: Calculate the channels of the spectral peaks as an average over the whole sound.\n");
            fprintf(stdout,"INFO: Modes 3 and 4: Calculate the channels of the spectral peaks on a window by window basis.\n");
            fprintf(stdout,"INFO: Modes 5 and 6: Uses harmonic field of the average peaks in the 2nd sound to tune the spectrum of the 1st.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: 2nd FILE ENTRY TIME ........... Entry of 2nd sound may be delayed (but morph can only begin oce it has entered).\n");
            fprintf(stdout,"INFO: INTERPOLATION START ........ Start time of the morph.\n");
            fprintf(stdout,"INFO: INTERPOLATION END ........... End time of the morph.\n");
            fprintf(stdout,"INFO: INTERPOLATION EXPONENT ... Determines the shape of the interpolation.\n");
            fprintf(stdout,"INFO:                      In modes 1 and 3\n");
            fprintf(stdout,"INFO:                                   exponent 1 gives a linear interpolation.\n");
            fprintf(stdout,"INFO:                                   exponent more than 1 interpolates slower at the start and faster at the end.\n");
            fprintf(stdout,"INFO:                                   exponent less than 1 interpolates faster at the start and slower at the end.\n");
            fprintf(stdout,"INFO:                      In modes 2 and 4\n");
            fprintf(stdout,"INFO:                                   exponent 1 gives a cosinusiodal interpolation.\n");
            fprintf(stdout,"INFO:                                   exponent more than 1 forces the cosinusiodal transition towards the midpoint-time.\n");
            fprintf(stdout,"INFO:                                   exponent less than 1 speeds up the initial and final interpolation-rate.\n");
            fprintf(stdout,"INFO:                                   exponent .85 approaches the linear case.\n");
            fprintf(stdout,"INFO:                                   Below .85 the interpolation lingers longer around its half-way point.\n");
            fprintf(stdout,"INFO: NUMBER OF PEAKS TO MAP ..................... Number of peaks to look for.\n");
            fprintf(stdout,"INFO: RANDOMISATION OF GOAL PEAK FRQ ... Randomisation of goal peak-frequencies (can vary over time).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RETAIN LOUDNESS ENVELOPE OF 1st SND The loudness contour of the 1st sound is retained, even as its spectrum morphs.\n");
            fprintf(stdout,"INFO:                                   In this case, output will cease once the 1st sound ends.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: INTERP PEAKS ONLY .................... Retain file1 content of all non-peak channels.\n");
            fprintf(stdout,"INFO:                                   (In default case, non-peak channels interpolate towards file2 values).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: INTERP PEAK FREQUENCIES ONLY .. Peak channel amplitudes are determined by 1st sound peak amplitudes only.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(SPECMORPH2):
        fprintf(stdout,"INFO: EXTRACT OR MORPH SPECTRAL PEAKS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Spectral peaks are made to glide to new values.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mode 1:  Extract average frequencies of the peaks  (in order of decreasing prominence).\n");
        fprintf(stdout,"INFO: Mode 2: Uses peak-frequencies specified in textfile (in order of decreasing prominence) to gradually tune the spectrum.\n");
        fprintf(stdout,"INFO: Mode 3: Ditto, using cosinusoidal morph.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF PEAKS TO LOOK FOR ..... Number of peaks to look for.\n");
        fprintf(stdout,"INFO: INTERPOLATION START ........ Start time of the morph.\n");
        fprintf(stdout,"INFO: INTERPOLATION END ........... End time of the morph.\n");
        fprintf(stdout,"INFO: INTERPOLATION EXPONENT ... Determines the shape of the interpolation.\n");
        fprintf(stdout,"INFO:                      In modes 1 and 3\n");
        fprintf(stdout,"INFO:                                   exponent 1 gives a linear interpolation.\n");
        fprintf(stdout,"INFO:                                   exponent more than 1 interpolates slower at the start and faster at the end.\n");
        fprintf(stdout,"INFO:                                   exponent less than 1 interpolates faster at the start and slower at the end.\n");
        fprintf(stdout,"INFO:                      In modes 2 and 4\n");
        fprintf(stdout,"INFO:                                   exponent 1 gives a cosinusiodal interpolation.\n");
        fprintf(stdout,"INFO:                                   exponent more than 1 forces the cosinusiodal transition towards the midpoint-time.\n");
        fprintf(stdout,"INFO:                                   exponent less than 1 speeds up the initial and final interpolation-rate.\n");
        fprintf(stdout,"INFO:                                   exponent .85 approaches the linear case.\n");
        fprintf(stdout,"INFO:                                   Below .85 the interpolation lingers longer around its half-way point.\n");
        fprintf(stdout,"INFO: RANDOMISATION OF GOAL PEAK FRQ ... Randomisation of goal peak-frequencies (can vary over time).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(NEWDELAY):
        fprintf(stdout,"INFO: DELAY WITH FEEDBACK, GENERATING PITCHED OUTPUT.\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: Pitch a sound using delay with feedback.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI PITCH .................. MIDI pitch generated by delayed feedback\n");
            fprintf(stdout,"INFO: DELAYED SIGNAL IN MIX .. Level of delayed signal in the output\n");
            fprintf(stdout,"INFO: FEEDBACK................... Feedback level (Feedback generates pitch effect)\n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: Pitch the start portion (HEAD) of a sound using delay with feedback.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI PITCH ....................................................... MIDI pitch to be generated.\n");
            fprintf(stdout,"INFO: HEAD DURATION ................................................ Duration of Head portion of sound.\n");
            fprintf(stdout,"INFO: FACTOR BY WHICH HEAD DURATION EXTENDED .......... Repeats of Head cause the resulting pitched-head to be longer than original by this factor.\n");
            fprintf(stdout,"INFO: DELAY RANDOMISATION ....................................... More randomisation of delay causes pitch to be more gritty or unclear.\n");
            fprintf(stdout,"INFO: MAX OF LEVEL DIP IN EXTENDED HEAD (A FACTOR) ....... Extended Head can dip in level in its middle. Factor 1 = no dip, factor 3 = dip to 1/3 level.\n");
            fprintf(stdout,"INFO: POSITION OF MAX DIP AS FRACTION OF HEAD LENGTH .. Any dip in level reaches its lowest point at this fraction of the extended head's duration.\n");
            fprintf(stdout,"INFO: \n");
            break;
        }
        break;
    case(FILTRAGE):
        fprintf(stdout,"INFO: GENERATE RANDOM FILTER-SETTINGS FOR VARIBANK FILTER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mode 1: Make fixed-values filter.\n");
        fprintf(stdout,"INFO: Mode 2: Make time-varying filter.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION ...................... Duration of filter.\n");
        fprintf(stdout,"INFO: NUMBER OF FILTERS .......... Number of separate pitch-streams defined in output filter data.\n");
        fprintf(stdout,"INFO: MIN MIDIPITCH OF FILTERS .. Minimum MIDI pitch in any specified pitchstream.\n");
        fprintf(stdout,"INFO: MAX MIDIPITCH OF FILTERS .. Maximum MIDI pitch in any specified pitchstream\n");
        fprintf(stdout,"INFO: PITCH DISTRIBUTION ........ 1 gives linear pitch-distribution,\n");
        fprintf(stdout,"INFO:                                           greater than 1 squeezes pitches towards lower values.\n");
        fprintf(stdout,"INFO:                                           less than 1 squeezes pitches towards higher values.\n");
        fprintf(stdout,"INFO: PITCH RANDOMISATION ......... Randomisation of pitches. 1 gives maximum randomisation.\n");
        fprintf(stdout,"INFO: MINIMUM FILTER AMPLITUDE ... Filters will vary in amplitude between thhis MINIMUM, and the max value of 1.0\n");
        fprintf(stdout,"INFO: AMPLITUDE RANDOMISATION .. Randomisation of amplitudes.\n");
        fprintf(stdout,"INFO: AMPLITUDE DISTRIBUTION ...... 0 gives random amplitudes.\n");
        fprintf(stdout,"INFO:                                           1 gives increasing amplitude with pitch.\n");
        fprintf(stdout,"INFO:                                           -1 gives decreasing amplitude with pitch.\n");
        fprintf(stdout,"INFO:                                           Intermediate values give increasing degrees of randomisation, as zero is approached.\n");
        if(mode == 1) {
            fprintf(stdout,"INFO: TIMESTEP BETWEEN FILTER SETS .. (Average) timestep between each pitch-set specification, for time-changing filters,\n");
            fprintf(stdout,"INFO: RANDOMISATION OF TIMESTEP ........ Randomisation of timesteps.\n");
        }
        fprintf(stdout,"INFO: RANDOM SEED .................... If seed value is NOT zero, random values used in process will be reproduced on next pass with SAME parameters.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ITERLINE):
    case(ITERLINEF):
        if(process == ITERLINE)
            fprintf(stdout,"INFO: EXTEND SOURCE BY ITERATION, FOLLOWING A DEFINED TRANSPOSITION LINE.\n");
        else {
            fprintf(stdout,"INFO: EXTEND BY ITERATION A SET OF SOUNDS WHICH ARE TRANSPOSITIONS OF A SOURCE, FOLLOWING A DEFINED TRANSPOSITION LINE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The aim here is to effect a line which changes in pitch without altering the formant character of a source.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: There must be 25 input files, being semitone transpositions of an original source.\n");
            fprintf(stdout,"INFO: The first 12 sounds are transpositions downward by 12 semitones, 11 semitones, 10 semitones etc\n");
            fprintf(stdout,"INFO: File 13 is the original, untransposed source.\n");
            fprintf(stdout,"INFO: Files 14-25 are transpositions upwards by 1 semitone, 2 semitones, 3 semitones etc\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: The transpositions should be duration and formant preserving.\n");
            fprintf(stdout,"INFO: \n");
        }
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mode 1: Interpolate timewise between transposition values.\n");
        fprintf(stdout,"INFO: Mode 2: Step between transposition values.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TRANSPOSITION DATA.....Textfile of pairs of time/transposition values. Times must start at 0, and increase.\n");
        fprintf(stdout,"INFO:                                       Transposition valueds are in (possibly fractional) semitones, in range +- 24 (2 octaves up or down)\n");
        fprintf(stdout,"INFO: DELAY..................(average) delay between iterations.\n");
        fprintf(stdout,"INFO: PITCH SCATTER..........max of randomisation of pitchshift of each iteration: (possibly fractional) semitones.\n");
        fprintf(stdout,"INFO: AMPLITUDE SCATTER......max of random amp-reduction on each iteration.\n");
        fprintf(stdout,"INFO: OVERALL GAIN...........(special) value 0, gives best guess for no distortion.\n");
        fprintf(stdout,"INFO: SEED RANDOM GENERATOR..same number produces identical output on rerun,\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECRAND):
        fprintf(stdout,"INFO: TIME-RANDOMISE SPECTRAL DATA.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOMISATION TIMESCALE .......... Timescale over which spectral data are randomised.\n");
        fprintf(stdout,"INFO: WINDOW GROUPING .................. Spectral windows are grouped into sets of time-adjacent windows, and these sets are time-randomised,\n");
        fprintf(stdout,"INFO:                                          This parameter determines the number of windows in each set.\n");
        fprintf(stdout,"INFO:                                          The duration of the window-group cannot exceed (half of) the Randomisation Timescale.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECSQZ):
        fprintf(stdout,"INFO: SQUEEZE THE FREQUENCY-SECTRUM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CENTRE FREQUENCY ............. Frequency around which other values are squeezed.\n");
        fprintf(stdout,"INFO: SQUEEZE FACTOR ............... Contraction of the frequency data range (less than 1).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(HOVER2):
        fprintf(stdout,"INFO: ZIGZAG READ A SOURCE AT A GIVEN FREQUENCY.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: At any specified location, process searches for nearby zero-crossing,\n");
        fprintf(stdout,"INFO: then reads forwards from the zero, then back to the zero, producing a wave half-cycle,\n");
        fprintf(stdout,"INFO: then writes the inversion of those samples, producing symmetrical 2nd-half of wave-cycle.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RATE OF HOVER (Hz) .... slow rate: reads lots of samples forwards, backwards, forwards.\n");
        fprintf(stdout,"INFO:                         fast rate: reads fewer samples forwards, backwards, forwards.\n");
        fprintf(stdout,"INFO: LOCATION OF HOVERING .. Time in input sound where samples are read.\n");
        fprintf(stdout,"INFO: RANDOMISATION OF RATE (0-1)\n");
        fprintf(stdout,"INFO: RANDOMISATION OF LOCATION (0-1)\n");
        fprintf(stdout,"INFO: OUTPUT DURATION ....... Total Duration of output file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ADVANCE LOCATIONS STEPWISE ..... If a brkpoint table is used for LOCATION\n");
        fprintf(stdout,"INFO:                         then the location read at any time-value remains the read-location\n");
        fprintf(stdout,"INFO:                         until a new time-value in the file is reached.\n");
        fprintf(stdout,"INFO:                         (The default read mode is to INTERPOLATE between locations specified at the time-values in the file).\n");
        fprintf(stdout,"INFO: NORMALISE OUTPUT ..... Normalise the level of all wavecycles generated.\n");
        break;
    case(SELFSIM):
        fprintf(stdout,"INFO: MAKE SPECTRUM MORE SELF-SIMILAR.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SELF SIMILARITY INDEX ............. Number of similar windows to replace.\n");
        fprintf(stdout,"INFO:                         Value 1 uses loudest window to replace the most similar window.\n");
        fprintf(stdout,"INFO:                         then the next loudest window to replace window most similar to it\n");
        fprintf(stdout,"INFO:                         and so on, with appropriate overall-loudness scaling.\n");
        fprintf(stdout,"INFO:                         With value 2, loudest windows replaces the TWO windows most similar to it.\n");
        fprintf(stdout,"INFO:                         and so on.\n");
        fprintf(stdout,"INFO:                         If two windows are to be replaced by A, and A first replaces B,\n");
        fprintf(stdout,"INFO:                         and D is more similar to B, than C is to A, then A replaces D rather than C.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ITERFOF):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: GENERATE PITCHED LINE FROM SMALL SOUND PACKET OR FOF.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Treat source as a wavelength sized FOF, and use transposition data, to guide pitch of output line.\n");
            fprintf(stdout,"INFO: With any transposition breakpoint file, interpolate between values, so pitch glides from one value to next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE WHOLE EVENT ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEMITONE TRANSPOSITION OF LINE Assumes duration of input = wavelength of the fundamental pitch to be transposed.\n");
            fprintf(stdout,"INFO: DURATION ............................... (Minimum) duration of the entire output sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE ELELEMTS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEGMENT PITCH RANDOMISATION ... Randomises pitch of individual segments themselves.\n");
            fprintf(stdout,"INFO: MAX OF RANDOM AMP REDUCTION .. If greater than 0, amplitude of successive segments are randomly reduced\n");
            fprintf(stdout,"INFO:                                                                          up to a maximum of the value input here.\n");
            fprintf(stdout,"INFO: TRIMMED DURATION OF ELEMENTS . If elements are to be shortened, this is Duration to trim to\n");
            fprintf(stdout,"INFO:                                                                          and will be equal to or less than (possibly transposed) source duration.\n");
            fprintf(stdout,"INFO:                                                                          A ZERO value means the elements are NOT trimmed.\n");
            fprintf(stdout,"INFO: FADE DURATION OF ELEMENTS ...... Duration of any fade on end of elements.\n");
            fprintf(stdout,"INFO: FADE SLOPE ............................. Slope of any fade on end of elements.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE LINE ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH ROUGHNESS ....................... Randomisation of instantaneous pitch.\n");
            fprintf(stdout,"INFO: MIN VIBRATO FREQUENCY .......... Minimum frequency of line vibrato.\n");
            fprintf(stdout,"INFO: MAX VIBRATO FREQUENCY .......... Maximum frequency of line vibrato. Frequnecy varies at random between min and max.\n");
            fprintf(stdout,"INFO: MIN VIBRATO DEPTH ................. Minimum depth of line vibrato in semitones.\n");
            fprintf(stdout,"INFO: MAX VIBRATO DEPTH  ................ Maximum depth of line vibrato. Depth varies at random between min and max.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GENERAL PARAMETERS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOM SEED ......... ............. Setting a particular seed value will produce similar output when same seed applied again.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: GENERATE STEPPED PITCHED LINE FROM SMALL SOUND PACKET OR FOF.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Treat source as a wavelength sized FOF, and use transposition data, to set pitches of output line.\n");
            fprintf(stdout,"INFO: With any transposition breakpoint file, STEP between values, so that pitch steps from one timed-event to next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE WHOLE EVENT ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEMITONE TRANSPOSITION OF LINE Assumes duration of input = wavelength of the fundamental pitch to be transposed.\n");
            fprintf(stdout,"INFO: DURATION ............................... (Minimum) duration of the entire output sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE ELELEMTS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEGMENT PITCH RANDOMISATION ... Randomises pitch of individual segments themselves.\n");
            fprintf(stdout,"INFO: MAX OF RANDOM AMP REDUCTION .. If greater than 0, amplitude of successive segments are randomly reduced\n");
            fprintf(stdout,"INFO:                                                                          up to a maximum of the value input here.\n");
            fprintf(stdout,"INFO: TRIMMED DURATION OF ELEMENTS . If elements are to be shortened, this is Duration to trim to\n");
            fprintf(stdout,"INFO:                                                                          and will be equal to or less than (possibly transposed) source duration.\n");
            fprintf(stdout,"INFO:                                                                          A ZERO value means the elements are NOT trimmed.\n");
            fprintf(stdout,"INFO: FADE DURATION OF ELEMENTS ...... Duration of any fade on end of elements.\n");
            fprintf(stdout,"INFO: FADE SLOPE ............................. Slope of any fade on end of elements.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE LINE ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH ROUGHNESS ....................... Randomisation of instantaneous pitch.\n");
            fprintf(stdout,"INFO: MIN VIBRATO FREQUENCY .......... Minimum frequency of line vibrato.\n");
            fprintf(stdout,"INFO: MAX VIBRATO FREQUENCY .......... Maximum frequency of line vibrato. Frequnecy varies at random between min and max.\n");
            fprintf(stdout,"INFO: MIN VIBRATO DEPTH ................. Minimum depth of line vibrato in semitones.\n");
            fprintf(stdout,"INFO: MAX VIBRATO DEPTH  ................ Maximum depth of line vibrato. Depth varies at random between min and max.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS FOR ANY DISTINCT PITCHES ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIN LEVEL NOTES ..................... Minimum note loudness.\n");
            fprintf(stdout,"INFO: MAX LEVEL NOTES ..................... Maximum note loudness. Notes vary in loudness between min and max\n");
            fprintf(stdout,"INFO: NOTE INFADE DURATION ............ Duration of any fade-in of notes.\n");
            fprintf(stdout,"INFO: NOTE OUTFADE DURATION ......... Duration of any fade-out of notes.\n");
            fprintf(stdout,"INFO: GAP BETWEEN NOTES ................. Relative length of any gap between notes, as proportion of note duration.\n");
            fprintf(stdout,"INFO: PORTAMENTO TYPE ................... 0 = none  :  1 = rising  :  -1 = falling  :  2 = randomly rising or falling.\n");
            fprintf(stdout,"INFO: PORTAMENTO INTERVAL ............. Interval rise(fall) of any portamento, in semitones, attained only by the start-time of next note.\n");
            fprintf(stdout,"INFO:                                                            (If there are gaps between notes, maximum interval will not be reached).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GENERAL PARAMETERS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOM SEED ......... ............. Setting a particular seed value will produce similar output when same seed applied again.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: GENERATE PITCHED LINE FROM INPUT SOUND.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI-pitch data determines pitch of output line.\n");
            fprintf(stdout,"INFO: With any pitch breakpoint file, interpolate between timed values, so that pitch glides from one timed-event to next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE WHOLE EVENT ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI-PITCH OF LINE ...................\n");
            fprintf(stdout,"INFO: DURATION ............................... (Minimum) duration of the entire output sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE ELELEMTS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEGMENT PITCH RANDOMISATION ... Randomises pitch of individual segments themselves.\n");
            fprintf(stdout,"INFO: MAX OF RANDOM AMP REDUCTION .. If greater than 0, amplitude of successive segments are randomly reduced\n");
            fprintf(stdout,"INFO:                                                                          up to a maximum of the value input here.\n");
            fprintf(stdout,"INFO: TRIMMED DURATION OF ELEMENTS . If elements are to be shortened, this is Duration to trim to\n");
            fprintf(stdout,"INFO:                                                                          and will be equal to or less than (possibly transposed) source duration.\n");
            fprintf(stdout,"INFO:                                                                          A ZERO value means the elements are NOT trimmed.\n");
            fprintf(stdout,"INFO: FADE DURATION OF ELEMENTS ...... Duration of any fade on end of elements.\n");
            fprintf(stdout,"INFO: FADE SLOPE ............................. Slope of any fade on end of elements.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                                                            (If there are gaps between notes, maximum interval will not be reached).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE LINE ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH ROUGHNESS ....................... Randomisation of instantaneous pitch.\n");
            fprintf(stdout,"INFO: MIN VIBRATO FREQUENCY .......... Minimum frequency of line vibrato.\n");
            fprintf(stdout,"INFO: MAX VIBRATO FREQUENCY .......... Maximum frequency of line vibrato. Frequnecy varies at random between min and max.\n");
            fprintf(stdout,"INFO: MIN VIBRATO DEPTH ................. Minimum depth of line vibrato in semitones.\n");
            fprintf(stdout,"INFO: MAX VIBRATO DEPTH  ................ Maximum depth of line vibrato. Depth varies at random between min and max.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GENERAL PARAMETERS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOM SEED ......... ............. Setting a particular seed value will produce similar output when same seed applied again.\n");
            break;
        case(3):
            fprintf(stdout,"INFO: GENERATE STEP-PITCHED LINE FROM INPUT SOUND.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI-pitch data determines pitches of output line.\n");
            fprintf(stdout,"INFO: With any pitch breakpoint file, step between timed values, so pitch steps from one timed-event to next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE WHOLE EVENT ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIDI-PITCHES OF LINE ...............\n");
            fprintf(stdout,"INFO: DURATION ............................... (Minimum) duration of the entire output sound.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE ELELEMTS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEGMENT PITCH RANDOMISATION ... Randomises pitch of individual segments themselves.\n");
            fprintf(stdout,"INFO: MAX OF RANDOM AMP REDUCTION .. If greater than 0, amplitude of successive segments are randomly reduced\n");
            fprintf(stdout,"INFO:                                                                          up to a maximum of the value input here.\n");
            fprintf(stdout,"INFO: TRIMMED DURATION OF ELEMENTS . If elements are to be shortened, this is Duration to trim to\n");
            fprintf(stdout,"INFO:                                                                          and will be equal to or less than (possibly transposed) source duration.\n");
            fprintf(stdout,"INFO:                                                                          A ZERO value means the elements are NOT trimmed.\n");
            fprintf(stdout,"INFO: FADE DURATION OF ELEMENTS ...... Duration of any fade on end of elements.\n");
            fprintf(stdout,"INFO: FADE SLOPE ............................. Slope of any fade on end of elements.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS OF THE LINE ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH ROUGHNESS ....................... Randomisation of instantaneous pitch.\n");
            fprintf(stdout,"INFO: MIN VIBRATO FREQUENCY .......... Minimum frequency of line vibrato.\n");
            fprintf(stdout,"INFO: MAX VIBRATO FREQUENCY .......... Maximum frequency of line vibrato. Frequnecy varies at random between min and max.\n");
            fprintf(stdout,"INFO: MIN VIBRATO DEPTH ................. Minimum depth of line vibrato in semitones.\n");
            fprintf(stdout,"INFO: MAX VIBRATO DEPTH  ................ Maximum depth of line vibrato. Depth varies at random between min and max.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS FOR ANY DISTINCT PITCHES (Modes 2 and 4) ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MIN LEVEL NOTES ..................... Minimum note loudness.\n");
            fprintf(stdout,"INFO: MAX LEVEL NOTES ..................... Maximum note loudness. Notes vary in loudness between min and max\n");
            fprintf(stdout,"INFO: NOTE INFADE DURATION ............ Duration of any fade-in of notes.\n");
            fprintf(stdout,"INFO: NOTE OUTFADE DURATION ......... Duration of any fade-out of notes.\n");
            fprintf(stdout,"INFO: GAP BETWEEN NOTES ................. Relative length of any gap between notes, as proportion of note duration.\n");
            fprintf(stdout,"INFO: PORTAMENTO TYPE ................... 0 = none  :  1 = rising  :  -1 = falling  :  2 = randomly rising or falling.\n");
            fprintf(stdout,"INFO: PORTAMENTO INTERVAL ............. Interval rise(fall) of any portamento, in semitones, attained only by the start-time of next note.\n");
            fprintf(stdout,"INFO:                                                            (If there are gaps between notes, maximum interval will not be reached).\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GENERAL PARAMETERS ----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOM SEED ......... ............. Setting a particular seed value will produce similar output when same seed applied again.\n");
            break;
        }
        break;
    case(PULSER):
    case(PULSER2):
    case(PULSER3):
        switch(mode) {
        case(0):
            switch(process) {
            case(PULSER):
                fprintf(stdout,"INFO: CREATE A STREAM OF PITCHED PACKETS FROM A MONO SOURCE.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: (NB: Only the spectral brightness of the source is reflected in the output sound.)\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                break;
            case(PULSER2):
                fprintf(stdout,"INFO: CREATE A STREAM OF PITCHED PACKETS FROM MONO SOURCES.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: (NB: Only the spectral brightness of the sources is reflected in the output sound.)\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                break;
            case(PULSER3):
                fprintf(stdout,"INFO: CREATE A STREAM OF SYNTHESIZED PACKETS FROM PARTIAL-NUMBER DATA.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARTIAL NUMBERS AND LEVELS ......... Textfile list of paired items: Each pair is a partial number and a level.\n");
                fprintf(stdout,"INFO:                                                                                  Partial number range 1 - 64 (can be fractional) : level range -1 to 1.\n");
                break;
            }
            fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
            fprintf(stdout,"INFO: MIDI PITCH ................................. Midi pitch of output packets.\n");
            break;
        case(1):
            switch(process) {
            case(PULSER):
                fprintf(stdout,"INFO: CREATE A STREAM OF PACKETS FROM A MONO SOURCE, USING THE START OF THE SOURCE ONLY.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                break;
            case(PULSER2):
                fprintf(stdout,"INFO: CREATE A STREAM OF PACKETS FROM MONO SOURCES, USING THE START OF THE SOURCES ONLY.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                break;
            case(PULSER3):
                fprintf(stdout,"INFO: CREATE A STREAM OF SYNTHESIZED PACKETS WHOSE SPECTRA CHANGE WITH TIME.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARTIAL NUMBERS AND LEVELS ......... Textfile is of list of lines of format \"Time  partialno level [partialno2 level2 ......]\"\n");
                fprintf(stdout,"INFO:                                                                                  Partial number range 1 - 64 (can be fractional) : level range -1 to 1.\n");
                fprintf(stdout,"INFO:                                                                                  Timers must start at zero, and increase.\n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                fprintf(stdout,"INFO: MIDI PITCH ................................. Midi pitch of output packets.\n");
                break;
            }
            break;
        case(2):
            switch(process) {
            case(PULSER):
                fprintf(stdout,"INFO: CREATE A STREAM OF PACKETS FROM A MONO SOURCE, SELECTING RANDOM CHUNKS FROM INSIDE THE SOURCE.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                fprintf(stdout,"INFO: LSPKR SELECTION ...................... ZERO   ~~OR~~   SPATIALISATION DATA FOR AN 8-CHANNEL OUPUT.\n");
                fprintf(stdout,"INFO:                                                                                  With ZERO, Sound Output is MONO or (if WIDTH > 0) STEREO.\n");
                fprintf(stdout,"INFO:                                                                                  SPATIALISATION DATA is either ......\n");
                fprintf(stdout,"INFO:                                                                                              (1) a string of channel numbers indicating which of 8 ouput channels to use.\n");
                fprintf(stdout,"INFO:                                                                                              (2) A textfile with a time and a spacedata-string on each line, times increasing from one line to next.\n");
                fprintf(stdout,"INFO:                                                                                                      The number of channels used (as well as the channel selection) may change with time.\n");
                break;
            case(PULSER2):
                fprintf(stdout,"INFO: CREATE A STREAM OF PACKETS FROM MONO SOURCES, SELECTING RANDOM CHUNKS FROM INSIDE THE SOURCES.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                fprintf(stdout,"INFO: LSPKR SELECTION ...................... ZERO   ~~OR~~   SPATIALISATION DATA FOR AN 8-CHANNEL OUPUT.\n");
                fprintf(stdout,"INFO:                                                                                  With ZERO, Sound Output is MONO or (if WIDTH > 0) STEREO.\n");
                fprintf(stdout,"INFO:                                                                                  SPATIALISATION DATA is either ......\n");
                fprintf(stdout,"INFO:                                                                                              (1) a string of channel numbers indicating which of 8 ouput channels to use.\n");
                fprintf(stdout,"INFO:                                                                                              (2) A textfile with a time and a spacedata-string on each line, times increasing from one line to next.\n");
                fprintf(stdout,"INFO:                                                                                                      The number of channels used (as well as the channel selection) may change with time.\n");
                break;
            case(PULSER3):
                fprintf(stdout,"INFO: CREATE A STREAM OF SYNTHESIZED PACKETS WHOSE SPECTRA CHANGE AT RANDOM.\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
                fprintf(stdout,"INFO: \n");
                fprintf(stdout,"INFO: PARTIAL NUMBERS AND LEVELS ......... Textfile is of list of lines of format \"Time  partialno level [partialno2 level2 ......]\"\n");
                fprintf(stdout,"INFO:                                                                                  Partial number range 1 - 64 (can be fractional) : level range -1 to 1.\n");
                fprintf(stdout,"INFO:                                                                                  Timers must start at zero, and increase.\n");
                fprintf(stdout,"INFO:                                                                                  Lines are read in RANDOM order (TIMES ARE IGNORED).\n");
                fprintf(stdout,"INFO: DURATION .................................. Duration of output.\n");
                fprintf(stdout,"INFO: MIDI PITCH ................................. Midi pitch of output packets.\n");
                break;
            }
            break;
        }
        fprintf(stdout,"INFO: RISE-TIME MINIMUM/MAXIMUM ......... Minimum and maximum duration of risetime of packets.\n");
        fprintf(stdout,"INFO: SUSTAIN-TIME MINIMUM/MAXIMUM .. Minimum and maximum duration of sustain time of packets.\n");
        fprintf(stdout,"INFO: DECAY-TIME MINIMUM/MAXIMUM ...... Minimum and maximum duration of decaytime of packets.\n");
        fprintf(stdout,"INFO:                                                                                  Actual rise, sustain and decay times are set at random, between the limits given.\n");
        fprintf(stdout,"INFO: TIME STEP BETWEEN PACKETS .......... Timestep between packets in output stream.\n");
        fprintf(stdout,"INFO: PACKET TIME RANDOMISATION ........ Randomisation of timestep between packets.\n");
        fprintf(stdout,"INFO: SLOPE OF ATTACK,SLOPE OF DECAY .. 1 is linear : greater than 1 is steep : less than 1 is less steep.\n");
        fprintf(stdout,"INFO: PITCH SCATTER (SEMITONES) .......... Random scattering of packet pitches.\n");
        fprintf(stdout,"INFO: AMPLITUDE SCATTER ..................... Random scattering of packet amplitudes.\n");
        fprintf(stdout,"INFO: OCTAVIATION ............................. Redundant parameter : no longer in use.\n");
        fprintf(stdout,"INFO: PACKET PITCH BEND ...................... Bending of pitches of packets.\n");
        fprintf(stdout,"INFO: RANDOM SEED ............................. Setting a particular seed value will produce similar output when same seed applied again.\n");
        if(process != PULSER3 && mode == 2) {
            fprintf(stdout,"INFO: SPATIAL WIDTH ............................. With LSPKR SELECTION SET TO ZERO, Width is spatial spread of placement of output segments in stereo panorama.\n");
            fprintf(stdout,"INFO:                                                                                  A width of ZERO produces a MONO output.\n");
            fprintf(stdout,"INFO:                                                                                  With LSPKR SELECTION NOT ZERO Width is spatial spread around the selected output loudspeakers.\n");
            fprintf(stdout,"INFO:                                                                                  A width of ZERO produces a loudspeaker-centric output.\n");
        }
        if(process == PULSER2) {
            fprintf(stdout,"INFO: TOTALLY RANDOM SRC SEQUENCE .... Source sound to produce next packet is chosen totally at random.\n");
            fprintf(stdout,"INFO:                                                                                  Default:  all srcs are used once, in a random order, before proceeding to the next random ordering.\n");
        } else if(process == PULSER3) {
            fprintf(stdout,"INFO: SAMPLING RATE ............................ Sampling rate of sythesized output.\n");
            fprintf(stdout,"INFO: PARTIAL COUNT ............................ Number of partials actually activated (time-variable).\n");
            fprintf(stdout,"INFO:                                                                                  Fractional values can be used: e.g. 2.4 means use 1st and 2nd partials, and 3rd partial attenuated by 0.4.\n");
        }
        fprintf(stdout,"INFO: \n");
        if(process == PULSER && mode == 2)
            fprintf(stdout,"INFO: All parameters except DURATION, RISE/DECAY limits, and SEED can vary through time.\n");
        else if(process == PULSER3)
            fprintf(stdout,"INFO: All parameters except DURATION, RISE/SUSTAIN/DECAY limits, SEED and SAMPLE RATE can vary through time.\n");
        else
            fprintf(stdout,"INFO: All parameters except DURATION, RISE/SUSTAIN/DECAY limits, and SEED can vary through time.\n");
        break;
    case(CHIRIKOV):
        fprintf(stdout,"INFO: GENERATE SOUND OR PITCHLINE BASED ON CHIRIKOV STANDARD MAP, OR CIRCULAR MAP.\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):    fprintf(stdout,"INFO: GENERATE SOUND BASED ON ITERATION OF CHIRIKOV STANDARD MAP.\n");      break;
        case(1):    fprintf(stdout,"INFO: GENERATE PITCH LINE BASED ON ITERATION OF CHIRIKOV STANDARD MAP.\n"); break;
        case(2):    fprintf(stdout,"INFO: GENERATE SOUND BASED ON ITERATION OF CIRCULAR MAP.\n");               break;
        case(3):    fprintf(stdout,"INFO: GENERATE PITCH LINE BASED ON ITERATION OF CIRCULAR MAP.\n");          break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):    
        case(1):    fprintf(stdout,"INFO: DURATION .................... Duration of the output sound.\n");  break;
        case(2):
        case(3):    fprintf(stdout,"INFO: DURATION .................... Duration of the output breakpoint file.\n");    break;
        }
        fprintf(stdout,"INFO: FREQUENCY ................... Frequency of the forcing oscillation (can vary through time).\n");
        fprintf(stdout,"INFO: DAMPING ..................... Damping coeeficient (can vary through time).\n");
        switch(mode) {
        case(0):    
        case(1):    
            fprintf(stdout,"INFO: SAMPLE RATE .......... Sampling rate of the synthesized sound.\n");   
            fprintf(stdout,"INFO: SPLICE LENGTH (mS) ... Splice length (in milliseconds) of the onset and end of the output sound.\n"); 
            break;
        case(2):    
        case(3):    
            fprintf(stdout,"INFO: MINIMUM_MIDI PITCH .. Bottom of MIDI pitch range of output data.\n"); 
            fprintf(stdout,"INFO: MAXIMUM_MIDI PITCH .. Top of MIDI pitch range of output data.\n");    
            fprintf(stdout,"INFO: TIME STEP ....................... Time step between entries in output brkpoint file.\n"); 
            fprintf(stdout,"INFO: TIME RANDOMISATION .. Randomisation of times in output brkpoint file.\n");    
            break;
        }
        break;
    case(MULTIOSC):
        fprintf(stdout,"INFO: GENERATE INTERACTING OSCILLATORS.\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):    fprintf(stdout,"INFO: OSCILLATION OF OSCILLATION.\n");                               break;
        case(1):    fprintf(stdout,"INFO: OSCILLATION OF OSCILLATION OF OSCILLATION.\n");                break;
        case(2):    fprintf(stdout,"INFO: OSCILLATION OF OSCILLATION OF OSCILLATION OF OSCILLATION.\n"); break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION .................... Duration of the output sound.\n");
        fprintf(stdout,"INFO: FREQUENCY ................... Oscillator frequency.\n");
        fprintf(stdout,"INFO: FREQUENCY TWO................ Frequency of oscillation of oscillation.\n");
        fprintf(stdout,"INFO: AMPLITUDE TWO................ Amplitude of oscillation of oscillation.\n");
        if(mode >= 1) {
            fprintf(stdout,"INFO: FREQUENCY THREE................ Frequency of oscillation of oscillation of oscillation.\n");
            fprintf(stdout,"INFO: AMPLITUDE THREE................ Amplitude of oscillation of oscillation of oscillation.\n");
        }
        if(mode == 2) {
            fprintf(stdout,"INFO: FREQUENCY FOUR................ Frequency of oscillation of oscillation of oscillation of oscillation.\n");
            fprintf(stdout,"INFO: AMPLITUDE FOUR................ Amplitude of oscillation of oscillation of oscillation of oscillation.\n");
        }
        fprintf(stdout,"INFO: SAMPLE RATE .......... Sampling rate of the synthesized sound.\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (mS) ... Splice length (in milliseconds) of the onset and end of the output sound.\n");
        break;
    case(SYNFILT):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: GENERATE BAND OF FILTERED NOISE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: REQUIRED DATAFILE-------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMELIST OF PITCHES OF FILTS .... a textfile of lines with time-pitch pairs on each line. \n");
            fprintf(stdout,"INFO: \n");
            break;
        case(1):
            fprintf(stdout,"INFO: GENERATE BAND OF MULTIPITCHED FILTERED NOISE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: REQUIRED DATAFILE-------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TIMELIST OF PICHS&AMPS OF FILTS .... a textfile with lines of data for filter bands at successive times.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Each line contains the following items\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:           Time   Pitch1 Amp1   [Pitch2 Amp2    etc....].\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Where pitch and Amp values must be paired: and any number of pairs can be used in a line,\n");
            fprintf(stdout,"INFO: BUT each line must have SAME number of pairs on it.\n");
            fprintf(stdout,"INFO: Amp values may be numeric, or dB values (e.g. -4.1dB).\n");
            fprintf(stdout,"INFO: (To eliminate a band in any line(s), set its amplitude to 0.0).\n");
            break;
        }
        fprintf(stdout,"INFO: Time values (in secs) must be in ascending order (and >=0.0), with the maximum time being greater than 0.03 seconds.\n");
        fprintf(stdout,"INFO: Pitch vals are MIDI values (but may be fractional).\n");
        fprintf(stdout,"INFO: (Comment-lines may be used: start these with ';').\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OTHER PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SAMPLE RATE ............. Sample rate of output sound.\n");
        fprintf(stdout,"INFO: CHANNEL COUNT ......... Mono or stereo output.\n");
        fprintf(stdout,"INFO: FILTER Q .................. Q (tightness) of filter.\n");
        fprintf(stdout,"INFO: NUMBER OF HARMONICS.. No of harmonics (of each pitch) to use: Default 1.\n");
        fprintf(stdout,"INFO:                                                Very high harmonics of high pitches may be too high to calculate. (check with Max Harmonic button)\n");
        fprintf(stdout,"INFO:                                                No-of-pitches times no-of-harmonics determines program speed.\n");
        fprintf(stdout,"INFO: ROLL OFF................. Level drop (in dB) from one harmonic to next.\n");
        fprintf(stdout,"INFO: RANDOM SEED .......... Any set value gives reproducible output.\n");
        fprintf(stdout,"INFO: DOUBLE FILTERING .... More sharply defined filter frequencies.\n");
        fprintf(stdout,"INFO: DROP OUT ON OVERFLOW   The filter is designed to adjust its internal level to prevent numerical overflow from\n");
        fprintf(stdout,"INFO:                                                setting this flag will cause the filter to stop calculating if any overflow is detected.\n");
        fprintf(stdout,"INFO:                                                The filter gain can then be turned down, and the filter launched again.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB: USING VERY LARGE NUMBERS OF HARMONICS MAY PRODUCE NUMERICAL INSTABILITY (OUTPUT WILL FAIL)\n");
        fprintf(stdout,"INFO: NB: USING RAPID PITCH SHIFTS AT THE SOUND'S END (ESPECIALLY WITH LOW PITCH & FEW HARMONICS) MAY GIVE TAIL ARTEFACTS.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(STRANDS):
        switch(mode) {
        case(0):
        case(2):
            fprintf(stdout,"INFO: GENERATE PITCHBAND DATA EXHIBITING  LAMINAR,  TAYLOR_COUETTE, AND  TURBULENT  FLOW.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: GENERATE PITCHBANDED SOUND EXHIBITING  LAMINAR,  TAYLOR_COUETTE, AND  TURBULENT  FLOW.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Generates pitch threads distributed over a specified range, which can \"flow\" in the following ways ....\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:         (a)  LAMINAR FLOW (threads do not cross).\n");
        fprintf(stdout,"INFO:         (b)  TWISTED FLOW (threads are grouped in pitch-adjacent bands, and the threads in each band cycle around one another).\n");
        fprintf(stdout,"INFO:         (c)  TWISTED FLOW WITH WAVY BOUNDARIES.\n");
        fprintf(stdout,"INFO:         (d)  BANDED FLOW WITH TURBULENCE (threads cross indiscriminately within the bands).\n");
        fprintf(stdout,"INFO:         (e)  TURBULENT FLOW (threads cross indiscriminately across the entire range).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Transitions to (and from) twisting, and to (and from) turbulence are managed by the process, and timed by the input parameters supplied.\n");
        fprintf(stdout,"INFO: \n");
        if(mode==0) {
            fprintf(stdout,"INFO: Data is output as a set of time-pitch breakkpoint files which define the pitch-evolution of each stream.\n");
            fprintf(stdout,"INFO: (Level data may also be output: see the \"3D\" option below).\n");
            fprintf(stdout,"INFO: \n");
        }
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        if(mode==2)
            fprintf(stdout,"INFO: THREADCOUNT IN EACH BAND ........... Number of pitch-threads in each band, listed in a textfile.\n");
        switch(mode) {
        case(0):
        fprintf(stdout,"INFO: DURATION .................................. Duration of the output data.\n");
        break;
        case(1):
        fprintf(stdout,"INFO: DURATION .................................. Duration of the output sound.\n");
        break;
        }
        fprintf(stdout,"INFO: NUMBER OF BANDS ........................ Number of pitch-bands in the output.\n");
        if(mode != 2)
            fprintf(stdout,"INFO: NUMBER OF THREADS PER BAND ........ Number of pitch-threads in each band.\n");
        fprintf(stdout,"INFO: TIMESTEP BETWEEN OUTPUT VALUES .. Timestep (in mS) between the pitch-data values in the output.\n");
        fprintf(stdout,"INFO: BOTTOM OF PITCH RANGE ................ Lowest pitch of all output.\n");
        fprintf(stdout,"INFO: TOP OF PITCH RANGE ..................... Highest pitch of all output.\n");
        fprintf(stdout,"INFO: FREQUENCY OF BAND ROTATION ....... Rate (in Hz) at which the pitches twist aroud one another within the bands.\n");
        fprintf(stdout,"INFO:                                     (1)  If two successive times in the input data have ZERO frequency,\n");
        fprintf(stdout,"INFO:                                               the flow between those times is LAMINAR.\n");
        fprintf(stdout,"INFO:                                     (2)  If two successive times have NON-ZERO freqency,\n");
        fprintf(stdout,"INFO:                                               the flow between those times is TWISTED.\n");
        fprintf(stdout,"INFO:                                     (3)  If two successive times have zero and non-zero freqencies,\n");
        fprintf(stdout,"INFO:                                               the flow gradually changes between laminar and twisted.\n");
        fprintf(stdout,"INFO: RANDOM DIVERSITY OF BAND FREQUENCIES\n");
        fprintf(stdout,"INFO:                                     (1) With LAMINAR FLOW : Amount of random divergence of thread pitches from steady pitch.\n");
        fprintf(stdout,"INFO:                                     (2) With TWISTED FLOW : Amount of random divergence of twist of individual bands\n");
        fprintf(stdout,"INFO:                                               from the specified twist frequency.\n");
        fprintf(stdout,"INFO: RANDOM WARPING OF THREAD OSCILLATIONS\n");     
        fprintf(stdout,"INFO:                                     (1) With LAMINAR FLOW : If the flow is 3D (see below),\n");
        fprintf(stdout,"INFO:                                               amount of scattering of the loudness random of each stream.\n");
        fprintf(stdout,"INFO:                                               (If the flow is NOT 3D, this parameter is ignored during laminar flow).\n");
        fprintf(stdout,"INFO:                                     (2) With TWISTED FLOW : Random timewarp (acceleration or decelleration)\n");
        fprintf(stdout,"INFO:                                               of the twisting of individual threads in the same band.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: BAND BOUNDARY WAVINESS ............ Amount that the band-boundaries wander away from fixed pitches.\n" );
        fprintf(stdout,"INFO: WAVINESS MIN FREQUENCY ............. Minimum rate of oscillation of the band boundaries.\n");
        fprintf(stdout,"INFO: WAVINESS MAX FREQUENCY ............ Maximum rate of oscillation of the band boundaries.\n");
        fprintf(stdout,"INFO:                                     Actual oscillation rates are selected at random (for each band boundary) between these limits.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TURBULENCE ............................... Turbulence destroys the laminar or twisting pattern of the threads.\n");
        fprintf(stdout,"INFO:                                     Value ZERO creates no turbulence.\n"); 
        fprintf(stdout,"INFO:                                     Values UP TO 1.0 create increasingly turbulent paths WITHIN the  band boundaries.\n");
        fprintf(stdout,"INFO:                                     Values BETWEEN 1.0 and 2.0 create increasingly turbulent paths over the entire pitch-range.\n");
        fprintf(stdout,"INFO:                                     Note that turbulence can ONLY be non-zero when the flow is (fully) twisted.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SEED ..................................... Seed for random generators in process. Set same side on 2 runs to get identical randomisation.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MINIMUM PITCH INTERVAL BETWEEN BANDS Minimum pitch-interval separating the pitch-bands.\n");
        fprintf(stdout,"INFO: MINIMUM PITCH WIDTH OF BANDS ...... Minimum width of bands (especially when subjected to wavyiness).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ROTATION IN 3D ........................... 2 more tranches of values are created to control 3d asepcts of the flow.\n");
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO:                                     The 1st tranche can be used to generate relative level values for the streams,\n");
            fprintf(stdout,"INFO:                                     or to control the number of partials in the stream with changes in pitch.\n");
            fprintf(stdout,"INFO:                                     The 2nd tranche can be used to control the level of a modified version of the source\n");
            fprintf(stdout,"INFO:                                     (e.g. reverbd or filtered), in a mix with the unmodified source.\n");
            fprintf(stdout,"INFO:                                     BOTH processes might indicate the instantaneous distance of each stream from the listener.\n");
            fprintf(stdout,"INFO:                                     This data output as 2 FURTHER sets of textfiles, AFTER all pitch data files have been output.\n");
            break;
        case(1):
            fprintf(stdout,"INFO:                                     This data is used to modify the relative level of the streams in the output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT BANDS SEQUENTIALLY ......... Outputs each band separately, in sequence, rather than all superimposed.\n");
        fprintf(stdout,"INFO: \n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        break;
    case(REFOCUS):
        fprintf(stdout,"INFO: GENERATE ENVELOPES TO CHANGE THE FOCUS (LOUDNESS) BETWEEN CO-EXISTING SOUNDS (e.g. IN A SET OF SOUNDS TO BE MIXED).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  Randomly permute which band is currently in focus.\n");
        fprintf(stdout,"INFO: 2)  Bring bands into focus consecutively in 'rising' sequences, starting at the lowest, rising to the highest.\n");
        fprintf(stdout,"INFO: 3)  Bring bands into focus consecutively in 'falling' sequences, starting at the highest, falling to the lowest.\n");
        fprintf(stdout,"INFO: 4)  Bring bands into focus in a rising/falling/rising... cycle, starting at the lowest.\n");
        fprintf(stdout,"INFO: 5)  Bring bands into focus in a falling/rising/falling.. cycle, starting at the highest.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DURATION .................................. Duration of output envelope files.\n");
        fprintf(stdout,"INFO: NUMBER OF BANDS ........................ Number of sounds to envelope.\n");
        fprintf(stdout,"INFO: FOCUSING RATIO .......................... Ratio of loudness of in-focus sound to out of focus sounds.\n");
        fprintf(stdout,"INFO: TIMESTEP TO NEXT REFOCUS............. Time between refocusings.\n");
        fprintf(stdout,"INFO: TIMESTEP RANDOMISATION .............. Randomisation of this these times.\n");
        fprintf(stdout,"INFO: OFFSET BEFORE REFOCUSING BEGINS .. Refocusing does not start until after the \"offset\" time\n");
        fprintf(stdout,"INFO: TIME AT WHICH REFOCUSING ENDS ..... Refocusing ends at this time, unless it is set to zero.\n");
        fprintf(stdout,"INFO: NO FOCUS ON EXTREMAL BAND .......... The upper (1) or lower (-1) band gets no special focus.\n");
        fprintf(stdout,"INFO: RANDOM SEED .............................. Seend for random value generation: identical seed gives identical output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT IS A SET OF ENVELOPE TEXTFILES which can be used to modify the levels of the sounds in the set of sounds.\n");
        break;
    case(CHANPHASE):
        fprintf(stdout,"INFO: INVERT THE PHASE OF A SPECIFIED CHANNEL OF AN INPUT FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CHANNEL TO INVERT  .................................. Channel whose phase is to be inverted.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SILEND):
        fprintf(stdout,"INFO: PAD END OF SOUND WITH EXTRA SILENCE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1: ................. Duration of silence to add.\n");
        fprintf(stdout,"INFO: MODE 2: ................. Total Duration of new output sound (must be greater than duration of input sound).\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECULATE):
        fprintf(stdout,"INFO: SYSTEMATICALLY PERMUTE CHANNELS OF ANALYSIS FILE, PRODUCING MANY OUTPUT FILES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Analysis channels are permuted pairwise, in the manner of a \"Plain Bob\" bell-ringing sequence.\n");
        fprintf(stdout,"INFO: After each permutation, a new file is output.\n");
        fprintf(stdout,"INFO: The process conclude once the permutations have cycled the channels round to their original order\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MINIMUM FREQUENCY: ................. Frq of lowest analysis channel to permute.\n");
        fprintf(stdout,"INFO: MAXIMUM FREQUENCY: ................. Frq of highest analysis channel to permute.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MASK OTHER CHANNELS: .............. Zero any spectral information outside range of frequencies defined by Min and Max above.\n");
        break;
    case(SPECTUNE):
        fprintf(stdout,"INFO: FIND MOST PROMINENT PITCH IN INPUT FILE, THEN RETUNE THE FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: On retuning, the entire file is transposed by the same amount,\n");
        fprintf(stdout,"INFO: and such that the most prominent pitch moves to the tuning pitch.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1)  Tune to the nearest tempered pitch.\n");
        fprintf(stdout,"INFO: 2)  Tune to the nearest of the pitches listed in the \"tuning\" file.\n");
        fprintf(stdout,"INFO: 3)  Tune to the nearest pitch, or it's octave equivalents, listed in the \"tuning\" file.\n");
        fprintf(stdout,"INFO: 4)  Report the pitch found : no sound output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: VALID HARMONICS COUNT ................ how many of the loudest peaks in the spectral window\n");
        fprintf(stdout,"INFO: ...................................... must be harmonics to confirm that the window is pitched. (default %d)\n",ST_ACCEPTABLE_MATCH);
        fprintf(stdout,"INFO: MINIMUM MIDI PITCH ...................... MIDI value of the LOWEST acceptable pitch. (default 4)\n");
        fprintf(stdout,"INFO: MAXIMUM MIDI PITCH ...................... MIDI value of the HIGHEST acceptable pitch. (default 127)\n");
        fprintf(stdout,"INFO: START TIME FOR PITCH SEARCH .... Time in source at which pitch-search begins (default: 0.0).\n");
        fprintf(stdout,"INFO: END TIME FOR PITCH SEARCH ......... Time in source at which pitch-search ends (default: end-of-file)..\n");
        fprintf(stdout,"INFO: IN-TUNE RANGE (SEMIT) ................. semitone-range within which harmonics accepted as in tune (default %d)\n",ST_ACCEPTABLE_MATCH);
        fprintf(stdout,"INFO: MIN WINDOWS TO CONFIRM PITCH .. minimum number of adjacent windows that must be pitched\n");
        fprintf(stdout,"INFO: ............................... for pitch-value to be registered. (default %d)\n",BLIPLEN);
        fprintf(stdout,"INFO: SIGNAL TO NOISE RATIO (dB) ...... in decibels (default %.1lf)\n",SILENCE_RATIO);
        fprintf(stdout,"INFO: ................................. Windows whose level falls this far below the maximum window level in the sound\n");
        fprintf(stdout,"INFO: ................................. are assumed to be noise, & any detected pitch is assumed spurious.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: IGNORE PITCHED-WINDOW RELATIVE-LOUDNESS  ......\n");
        fprintf(stdout,"INFO:                               Assign window-pitches to 1/8thsemitone bins, and count occurences in bins.\n");
        fprintf(stdout,"INFO:                               Default, Weight the count with the window loudnesses.\n");
        fprintf(stdout,"INFO: SMOOTH PITCH-CONTOUR ..........................................\n");
        fprintf(stdout,"INFO:                               Smooth pitch-contour data before assessing most prominent pitch.\n");
        fprintf(stdout,"INFO:                               Default, no smoothing.\n");
        fprintf(stdout,"INFO: FORMANT ENVELOPE NOT PRESERVED (Modes 1 to 3 only)............ \n");
        fprintf(stdout,"INFO:                               If flag set, transposition ignores the original formant envelope.\n");
        fprintf(stdout,"INFO:                               Default, transposition preserves original formant envelope.\n");
        break;
    case(REPAIR):
        fprintf(stdout,"INFO: REASSEMBLE A SET OF MULTICHANNEL FILES FROM INDIVIDUAL MONO-CHANNEL SOURCES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT  ................ how many channels in the output sound (2, 4, 5, 7, 8, 16 only)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  The number of (mono) input files must be a multiple of the \"OUTPUT CHANNEL COUNT\"\n");
        fprintf(stdout,"INFO: (2)  All files destined to be channel-1s in the output should be listed first;\n");
        fprintf(stdout,"INFO:           All files destined to be channel-2s in the output should be listed next;\n");
        fprintf(stdout,"INFO:           and so on.\n");
        fprintf(stdout,"INFO: (3)  For any one output file, its mono file sources must all be the same length,\n");
        fprintf(stdout,"INFO:           (but output files need not be the same length).\n");
        break;
    case(DISTSHIFT):
        fprintf(stdout,"INFO: DISTORT BY TIME-SHIFTING (GROUPS OF) HALF-WAVESETS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: A half-waveset is defined as the samples between one zero-crossing and the next.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Alternate (groups of) half-wavesets are time-shifted with respect to their partners.\n");
        fprintf(stdout,"INFO: (2)  Alternate (groups of) half-wavesets are swapped.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WAVESET GROUP SIZE  ................ Number of wavesets in the waveset-groups which are operated on.\n");
        fprintf(stdout,"INFO:            1 corresponds to a single half-waveset\n");
        fprintf(stdout,"INFO:            2 corresponds to a complete waveset and a single half-waveset\n");
        fprintf(stdout,"INFO:            3 corresponds to 2 complete wavesets and a single half-waveset\n");
        fprintf(stdout,"INFO:            ETC.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WAVESET SHIFT (MODE 1 ONLY).... Number of waveset(group)s by which the signal is shifted.\n");
        break;
    case(QUIRK):
        fprintf(stdout,"INFO: DISTORT BY RAISING SAMPLE-VALUES TO A POWER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1: Rescales values differently within each half-waveset, scaling values within noramlised range of\n");
        fprintf(stdout,"INFO:              zero to max (for +ve half-waveset) or zero to min (for -ve half-waveset)\n");
        fprintf(stdout,"INFO:              and hence retianing the maximum (minimum) excursion of each half-waveset.\n");
        fprintf(stdout,"INFO: MODE 2: Rescales values within noramlised range of (absolute) maximum sample in file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: POWER FACTOR ................ Factor by which each sample is scaled.\n");
        fprintf(stdout,"INFO:            > 1 exaggerates waveform contour.\n");
        fprintf(stdout,"INFO:            < 1 smooths waveform contour.\n");
        break;
    case(ROTOR):
        fprintf(stdout,"INFO: GENERATING CYCLING PITCH-SPEED SETS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Generates sequence of pitch-sets : sets expand-contract in range, and accel-rit in speed.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Sound is generated from an input soundfile and an input envelope (text)file of time-value pairs.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The input soundfile is read as a wavecycle table.\n");
        fprintf(stdout,"INFO: and should start and end at zero level, and the start and end must both rise, or both fall.\n");
        fprintf(stdout,"INFO: Dovetailing (fading the start and end) can be used to trim the edges of the source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The envelope file is used to envelope the output events.\n");
        fprintf(stdout,"INFO: The duration of the envelope determines the duration of all the events.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: There are 3 ways to specifiy the time-gap between the pitch-sets.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1: Timestep from start of one set to start of next is determined by your input parameter.\n");
        fprintf(stdout,"INFO: MODE 2: Timestep from last event of first set, to first event of next\n");
        fprintf(stdout,"INFO:              is determined by the last timestep between the elements in the previous set.\n");
        fprintf(stdout,"INFO: MODE 3: First element of new set overlays the last element of the previous set.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: COUNT OF NOTES PER SET................................... Number of events in each set.\n");
        fprintf(stdout,"INFO: MIN MIDI PITCH/MAX MIDI PITCH...................... Minimum and Maximum (MIDI) pitch when set has maximal pitch-range.\n");
        fprintf(stdout,"INFO: MAX DURATION SLOWEST BEAT............................ Timestep between elements of sets when at slowest speed.\n");
        fprintf(stdout,"INFO: NUMBER OF SETS PER PITCH CYCLE .................. How many sets before the pitch-sequence returns to its original form.\n");
        fprintf(stdout,"INFO: NUMBER OF SETS PER SPEED CYCLE .................. How many sets before the sequence returns to its original speed.\n"); 
        fprintf(stdout,"INFO: INITIAL PHASE DIFFERENCE BETWEEN CYCLES . Range 0 (in phase) to 1, where -5 is antiphase.\n");
        fprintf(stdout,"INFO: (MININIMUM) OUTPUT DURATION ........................ (Minimum) duration of output to be generated.\n");
        fprintf(stdout,"INFO: DOVETAIL DURATION (mS) .................................. (Optional) dovetails for sommthing onset and tail of source sound.\n");
        fprintf(stdout,"INFO: TIME STEP BETWEEN WHOLE SETS (Mode 1 only). Timestep from start of one set to the next.\n");
        break;
    case(DISTCUT):
        fprintf(stdout,"INFO: CHOP SOUND INTO SEGMENTS, BY COUNTING WAVESETS, AND IMPOSE A DECAYING-ENVELOPE ON SEGMENTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: A waveset is defined as the samples between one zero-crossing and the next-but-one.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Envelope stretches from start of waveset-group to start of next waveset-group.\n");
        fprintf(stdout,"INFO:            Groups are therefore abutted and adjacent.\n");
        fprintf(stdout,"INFO: (2)  Envelope length (in wavesets) and step to start of next envelope group are independent.\n");
        fprintf(stdout,"INFO:            Groups may therefore overlap or be separated by intervening wavesets.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CYCLE COUNT ................. Number of wavesets in the waveset-groups which are enveloped.\n");
        fprintf(stdout,"INFO: CYCLE STEP ................... Number of wavesets from start of one group to start of next.\n");
        fprintf(stdout,"INFO:                                      In Mode 1, this is the same as the cycle_count.\n");
        fprintf(stdout,"INFO: DECAY EXPONENT ........... Defines the decay shape of the envelope.\n");
        fprintf(stdout,"INFO:         1 = Linear  :  >1  Decays more quickly initially  :  <1 Decays more sloly initially.\n");
        fprintf(stdout,"INFO: CUTOFF (dB) ................. Segments whose maximum level falls below MINUS this (dB) value, are not retained.\n");
        break;
    case(ENVCUT):
        fprintf(stdout,"INFO: CHOP SOUND INTO SEGMENTS, AND IMPOSE A DECAYING-ENVELOPE ON SEGMENTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Envelope stretches to time where next envelopes begins.\n");
        fprintf(stdout,"INFO:            Cut segments are therefore abutted and adjacent.\n");
        fprintf(stdout,"INFO: (2)  Envelope duration step to start of next enveloped segment are independent.\n");
        fprintf(stdout,"INFO:            Segments may therefore overlap or be separated from one another within the source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE DURATION ..... ....... .. Duration of segments which are enveloped.\n");
        fprintf(stdout,"INFO: TIMESTEP TO NEXT SEGMENT .. TImestep from start of one enveloped segment to start of next.\n");
        fprintf(stdout,"INFO:                                      In Mode 1, this is the same as the Envelope Duration.\n");
        fprintf(stdout,"INFO: ATTACK DURATION (mS) ........... Defines the rise-time of the envelope, in Milliseconds.\n");
        fprintf(stdout,"INFO: DECAY EXPONENT ........... Defines the decay shape of the envelope.\n");
        fprintf(stdout,"INFO:         1 = Linear  :  >1  Decays more quickly initially  :  <1 Decays more sloly initially.\n");
        fprintf(stdout,"INFO: CUTOFF (dB) ................. Segments whose maximum level falls below MINUS this (dB) value, are not retained.\n");
        break;
    case(SPECFOLD):
        fprintf(stdout,"INFO: PERMUTE SPECTRAL CHANNELS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Fold the spectrum.\n");
        fprintf(stdout,"INFO:         A group of consecutive channels to fold is selected.\n");
        fprintf(stdout,"INFO:         Channels in the group are split into 2 equal sets  (e.g. 1-to-8 and 9-to-16.\n");
        fprintf(stdout,"INFO:         Values in the 1st set are moved to alternate channels (e.g. 1-->2  2-->4  3-->6  etc.\n");
        fprintf(stdout,"INFO:         Values in the 2nd set are assigned to the remaining channels, in descending order.(e.g. 5-->7  6-->5  7-->3  etc.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (2)  Invert the spectrum.\n");
        fprintf(stdout,"INFO: (3)  Randomise the spectrum.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CHANNEL WHERE PROCESSING STARTS .. The number of the first channel in the folded groups.\n");
        fprintf(stdout,"INFO: CHANNELS TO PROCESS .......................... Number of channels to process.\n");
        fprintf(stdout,"INFO: (MODE 1) NUMBER OF FOLDINGS .......... Number of times to repreat the folding process.\n");
        fprintf(stdout,"INFO: (MODE 3) RANDOM SEED ........................ Same seed value produces exactly the same random permutation.\n");
        fprintf(stdout,"INFO: AMPLITUDES ONLY .................................. Process only the channel amplitude information.\n");
        break;
    case(BROWNIAN):
        fprintf(stdout,"INFO: CREATE BROWNIAN MOTION IN PITCH AND SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Use the source sound as a wavetable to generate the output pitches.\n");
        fprintf(stdout,"INFO: (2)  Use the whole source sound to generate individual events, by transposition.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The pitch of successive events wander in both pitch and space.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT ................. Number of channels in the output file (1-16).\n");
        fprintf(stdout,"INFO: (MAX) OUTPUT DURATION ................. (Maximum) duration of the output file.\n");
        fprintf(stdout,"INFO: EVENT ATTACK DURATION ................ Rise time of events (Mode 1 only).\n");
        fprintf(stdout,"INFO: EVENT DECAY DURATION .................. Decay time of events (Mode 1 only).\n");
        fprintf(stdout,"INFO: BOTTOM OF PITCHRANGE (MIDI) ........ Bottom of pitch range (MIDI).\n");
        fprintf(stdout,"INFO: TOP OF PITCHRANGE (MIDI) ............. Top of pitch range (MIDI).\n");
        fprintf(stdout,"INFO: STARTING PITCH (MIDI) ................... Initial pitch (MIDI).\n");
        fprintf(stdout,"INFO: START POSITION ............................ Initial spatial position amongst output channels (numbering channels 1 - N).\n");
        fprintf(stdout,"INFO: MAX PITCH STEP (SEMITONES) .......... Maximum pitch step between events.\n");
        fprintf(stdout,"INFO: MAX SPACE STEP ............................ Max spatial step between events (fraction of distance between channels).\n");
        fprintf(stdout,"INFO:                                                                      START POSITION and SPACE STEP are ignored if the output is specified MONO.\n");
        fprintf(stdout,"INFO: AVERAGE TIMESTEP BETWEEN EVENTS.. (Average) Time between events.\n");
        fprintf(stdout,"INFO: RANDOM SEED ............................... (Integer) Seed value (Gives a reproducible random sequence).\n");
        fprintf(stdout,"INFO: MAX AMPLITUDE STEP(dB) ................. Max loudness step between events, in dB (default = 0: max = 96dB).\n");
        fprintf(stdout,"INFO: MINIMUM AMPLITUDE(dB) ................... Min loudness (only comes into play if \"AMPLITUDE STEP\" is greater than zero).\n");
        fprintf(stdout,"INFO:                                                                      If min > zero, and varying amplitude reaches -min dB,\n");
        fprintf(stdout,"INFO:                                                                       amplitude values are \"reflected\" back from this minimum boundary.\n");
        fprintf(stdout,"INFO:                                                                      If set to zero, NO amplitude minimum is set and\n");
        fprintf(stdout,"INFO:                                                                      if varying amplitude reaches -96dB, the sounds stream terminates.\n");
        fprintf(stdout,"INFO: ATTACK SLOPE ................................ Slope of the attack (mode 1 only)\n");
        fprintf(stdout,"INFO:                                                                      values < 1 rise fast, then more slowly  : values > 1 rise slowly, then faster.\n");
        fprintf(stdout,"INFO: DECAY SLOPE .................................. Slope of the decay (mode 1 only).\n");
        fprintf(stdout,"INFO:                                                                      values < 1 fall slowly, then faster  : values > 1 fall fast, then more slowly.\n");
        fprintf(stdout,"INFO: LINEAR LSPKR_ARRAY ...................... Output channels fed to \"linear\" array of loudspeakers.\n");
        fprintf(stdout,"INFO:                                                                      Default: loudspeaker array encircles the listener.\n");
        break;
    case(SPIN):
        fprintf(stdout,"INFO: ROTATE A WIDE STEREO-IMAGE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Rotate around the same 2 stereo channels, with possible doppler-shift.\n");
        fprintf(stdout,"INFO: (2)  Rotate around central channel (with possible doppler-shift) with stereo image spread to channels on left and right of this.\n");
        fprintf(stdout,"INFO: (3)  As mode 2, with image squeezing at centre i.e. when the spinning image crosses the centre ....\n");
        fprintf(stdout,"INFO:               MODE 3 uses ONLY the central channel to project the stereo-at-centre image.\n");
        fprintf(stdout,"INFO:               whereas MODE 2 also uses contributions from the outer channels to project the stereo-at-centre image.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ROTATION_RATE(CYCLES PER SEC) ........... Number of complete rotations per second (can vary through time).\n");
        fprintf(stdout,"INFO:                                                                            Positive values rotate clockwise (as viewed from above).\n");
        fprintf(stdout,"INFO:                                                                            Negative values rotate anticlockwise.\n");
        fprintf(stdout,"INFO: DIFFERENTIAL BETWEEN FRONT AND REAR .. As the edges cross the centre, edge \"at front\" is amplified by this factor\n");
        fprintf(stdout,"INFO:                                                                            while edge at rear is attenuated by this factor.\n");
        fprintf(stdout,"INFO: ATTENUATION AT CENTRE ...................... Attenuates BOTH edges as they cross the centre.\n");
        fprintf(stdout,"INFO: MAX DOPPLER PITCHSHIFT(SEMITONES) ...... Maximum pitchshift (up and down) due to motion-dependent doppler-shift.\n");
        fprintf(stdout,"INFO: EXPAND BUFFERS BY .............................. For large doppler-shift, more memory may be needed for calculations.\n");
        fprintf(stdout,"INFO:                                                                            Memory may be expanded here by some integer factor.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In Modes 2 and 3 .....\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTFILE CHANNEL COUNT ...................... Channel count of the output file. \n");
        fprintf(stdout,"INFO: CENTRE CHANNEL OF IMAGE ................... Channel number, in output file, which is at the output image centre.\n");
        fprintf(stdout,"INFO: MIN LEVEL ON CENTRE CHAN  .................. Minimum level of mono-condensed signal on centre channel.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In Mode 2 only .....\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAX BOOST ON CENTRE CHAN  ................ Maximum amplification of (mono-condensed) signal on centre channel.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPINQ):
        fprintf(stdout,"INFO: ROTATE A DOUBLE STEREO-IMAGE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Takes two stereo inputs and rotates them  around central channel with stereo image spread to channels on left and right of this.\n");
        fprintf(stdout,"INFO: The two inputs are initially wrapped around one another.\n");
        fprintf(stdout,"INFO: i.e. if the channels of File 1 are \"1L\" and \"1R\", and of File 2, \"2L\" and \"2R\", with central channel \"C\"\n");
        fprintf(stdout,"INFO: then the initial placement is  2L   1L   C   1R   2R\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Rotate around central channel (with possible doppler-shift) with stereo image spread to channels on left and right of this.\n");
        fprintf(stdout,"INFO: (2)  As mode 1, with image squeezing at centre i.e. when the spinning image crosses the centre ....\n");
        fprintf(stdout,"INFO:               MODE 2 uses ONLY the central channel to project the stereo-at-centre image.\n");
        fprintf(stdout,"INFO:               whereas MODE 1 also uses contributions from the outer channels to project the stereo-at-centre image.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ROTATION_RATE(CYCLES PER SEC) ........... Number of complete rotations per second (can vary through time).\n");
        fprintf(stdout,"INFO:                                                                            Positive values rotate clockwise (as viewed from above).\n");
        fprintf(stdout,"INFO:                                                                            Negative values rotate anticlockwise.\n");
        fprintf(stdout,"INFO: DIFFERENTIAL BETWEEN FRONT AND REAR .. As the edges cross the centre, edge \"at front\" is amplified by this factor\n");
        fprintf(stdout,"INFO:                                                                            while edge at rear is attenuated by this factor.\n");
        fprintf(stdout,"INFO: ATTENUATION AT CENTRE ...................... Attenuates BOTH edges as they cross the centre.\n");
        fprintf(stdout,"INFO: OUTFILE CHANNEL COUNT ...................... Channel count of the output file. \n");
        fprintf(stdout,"INFO: CENTRE CHANNEL OF IMAGE ................... Channel number, in output file, which is at the output image centre.\n");
        fprintf(stdout,"INFO: MAX DOPPLER PITCHSHIFT(SEMITONES) ...... Maximum pitchshift (up and down) due to motion-dependent doppler-shift.\n");
        fprintf(stdout,"INFO: EXPAND BUFFERS BY .............................. For large doppler-shift, more memory may be needed for calculations.\n");
        fprintf(stdout,"INFO:                                                                            Memory may be expanded here by some integer factor.\n");
        fprintf(stdout,"INFO: MIN LEVEL ON CENTRE CHAN  .................. Minimum level of mono-condensed signal on centre channel.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: In Mode 2 only .....\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MAX BOOST ON CENTRE CHAN  ................ Maximum amplification of (mono-condensed) signal on centre channel.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CRUMBLE):
        fprintf(stdout,"INFO: DISINTEGRATE A MONO SOURCE OVER A MULTICHANNEL SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Project a MONO source on all channels of a multichannel output, then segment it,\n");
        fprintf(stdout,"INFO: and distribute the segments over smaller and smaller groups of channels\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Over an 8-channel space.\n");
        fprintf(stdout,"INFO: (2)  Over a 16-channel space.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: START TIME ............................ Time in source at which disintegration starts.\n");
        fprintf(stdout,"INFO: DURATION OF HALF SPLITS .......... Duration of section where signal splits into 2 images.\n");
        fprintf(stdout,"INFO: DURATION OF QUARTER SPLITS .... Duration of section where signal split into 4 images.\n");
        fprintf(stdout,"INFO: DURATION OF EIGHTH SPLITS ....... (Mode 2 only) Duration of section where signal split into 8 images.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The sum of the \"Start Time\" and all these \"Duration\"s cannot exceed the duration of the input sound.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ORIENTATION ......................... When the input image first splits onto 2 images on 2 blocks of adjacent chans.\n");
        fprintf(stdout,"INFO:                                                                                The first block starts at channel \"ORIENTATION\" and uses channels clockwise of this.\n");
        fprintf(stdout,"INFO:                                                                                The 2nd block uses the remaining channels.\n");
        fprintf(stdout,"INFO: SEGMENT SIZE ........................ The (average) duration of the cut segments (can vary ober time).\n");
        fprintf(stdout,"INFO: SIZE RANDOMISATION ..............  Range 0 - 1. Maximum value(1) modifies size randomly between (size/2) and (3*size)./2\n");
        fprintf(stdout,"INFO: INPUT SCATTER ...................... Random scatering of the start-time in the source at which the next segment is cut. (Range 0 - 1)\n");
        fprintf(stdout,"INFO:                                                                                The cut-time in the source always advances.\n");
        fprintf(stdout,"INFO:                                                                                With no scatter, the timestep step to the next cut-time equals the duration of the current segment.\n");
        fprintf(stdout,"INFO:                                                                                With max input-scatter(1) timestep is a random value between 0 and the current segment duration.\n");
        fprintf(stdout,"INFO: OUTPUT SCATTER .................... Random scatering of the time-placement of the segment in the output stream. (Range 0 - 1)\n");
        fprintf(stdout,"INFO:                                                                                Time-placement in the output stream always advances.\n");
        fprintf(stdout,"INFO:                                                                                With no scatter, the step to the next output-time equals the duration of the current segment.\n");
        fprintf(stdout,"INFO:                                                                                With max output-scatter(1) timestep is a random value between 0 and the current segment duration.\n");
        fprintf(stdout,"INFO: OUTPUT TIMESTRETCH .............. Stretching of time-placement of segments in the output stream. (Range 1 - 64)\n");
        fprintf(stdout,"INFO:                                                                                The timestep in the output stream to the next segment-placement, is multiplied by the timestretch.\n");
        fprintf(stdout,"INFO:                                                                                Where output-timestretch is greater than 1, silent gaps should appear in the output.\n");
        fprintf(stdout,"INFO: PITCH SCATTER ...................... Maximum transposition (up or down) of the output segments,\n");
        fprintf(stdout,"INFO:                                                                                For example, a value of 3 produces a random transposition anywhere between 3 semitones up and 3 semitones down.\n");
        fprintf(stdout,"INFO: SEED ................................... The same seed value produces identical output on successive process runs.\n");
        fprintf(stdout,"INFO: SPLICELENGTH(mS) ................. Length, in milliseconds, of splices which cut segments from source.\n");
        fprintf(stdout,"INFO: LENGTH OF EXPONENTIAL TAIL(mS) Length, in milliseconds, of any (exponentially decaying) tail on the cut segments.\n");
        fprintf(stdout,"INFO: MAXIMIM DURATION ................ If output duration exceeds this limit, curtail it (set to zero for no curtailment).\n");
        break;
    case(TESSELATE):
        fprintf(stdout,"INFO: CREATE REPEATING PATTERN WITH SHIFTS IN SPACE AND TIME, USING ONE OR MORE MONO SOURCES.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The mono source is repeated one (set of) channels, but delays between repeats are different on a different (set of) channel(s).\n");
        fprintf(stdout,"INFO: The standard-delay is the \"Repeat Cycle Duration\".\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The change in the delay, as you pass from one (set of) channel(s) to the next, is specified by an integer, the \"Cycle Index\".\n");
        fprintf(stdout,"INFO: With 4 output channels, and a Cycle Index of 60,\n");
        fprintf(stdout,"INFO: If Channel A has standard-delay,\n");
        fprintf(stdout,"INFO: then the associated channels have standard-delay * (1 + 1/60)\n");
        fprintf(stdout,"INFO: so that\n");
        fprintf(stdout,"INFO: after 60 repetitions, channel(s) B resynchronises with channel(s) A\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Several sources can be input, and time-offset (Time Stagger), so the N sources (initially) form a rhythmic phrase.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Different sources can have different cycle-indeces.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TESSELATION DATA .......................... A textfile consisting of 2 lines of data.\n");
        fprintf(stdout,"INFO:                                   Each line must contain one entry for each input file.\n");
        fprintf(stdout,"INFO:                                   Line 1 - indicates the \"Cycle Index\" for the associated source.\n");
        fprintf(stdout,"INFO:                                   Line 2 - indicates the \"Time Stagger\" of the associated source.\n");
        fprintf(stdout,"INFO:                                                 One item should have stagger zero.\n");
        fprintf(stdout,"INFO:                                                 The other items should have different staggers\n");
        fprintf(stdout,"INFO:                                                 indicating their timing in the initial rhythmic phrase.\n");
        fprintf(stdout,"INFO:                                                 No delay should equal or exceed the \"Repeat Cycle Duration\".\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL COUNT .................. The number of output channels (2 - 16). This must be an even number of channels.\n");
        fprintf(stdout,"INFO: REPEAT CYCLE DURATION .................. The standard-(shortest)-delay between repetitions (the \"Repeat Cycle Duration\").\n");
        fprintf(stdout,"INFO: OUTPUT DURATION .......................... The required duration of the output sound.\n");
        fprintf(stdout,"INFO: TESSELATION TYPE ........................ Specifies how the channels are paired up.\n");
        fprintf(stdout,"INFO:                                       0 : Double diamond, all odd-channels play at one delay rate, and all even-channels at the other.\n");
        fprintf(stdout,"INFO:                                       1 : Channels are paired with the adjacent channel (sound 1 on ch1-paired-with-ch2, sound 2 on ch2-paired-with-ch3, etc.\n");
        fprintf(stdout,"INFO:                                       2 : Channels are paired with the channel 2 ahead (sound 1 on ch1 paired-with-ch3, sound 2 on ch2-paired-with-ch4, etc.\n");
        fprintf(stdout,"INFO:                                       3 : Channels are paired with the channel 3 ahead (sound 1 on ch1 paired-with-ch4, sound 2 on ch2-paired-with-ch5, etc.\n");
        fprintf(stdout,"INFO:                                       and so on.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(PHASOR):
        fprintf(stdout,"INFO: CREATE GRADUALLY PITCH-SHIFTING COPIES OF SOURCE SOUND, WHICH \"PHASE\" WITH ONE ANOTHER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Each stream pitch-shifts gradually up and down, to a specified max/min pitch-shift, at a rate determined by the frequency of the phasing wave.\n");
        fprintf(stdout,"INFO: The streams can be distributed over a specified number of output channels, and can be synchronous or time-staggered.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF PHASING STREAMS .......... The number of pitch-shifting streams to be output.\n");
        fprintf(stdout,"INFO: FREQUENCY OF PHASING WAVE .......... The frequency at which the up-down pitch-shifts happen.\n");
        fprintf(stdout,"INFO: MAX PHASING SHIFT (SEMITONES) .. The maximum phase shift used (in semitones): other streams have proportionately less phase-shift.\n");
        fprintf(stdout,"INFO: NUMBER OF OUTPUT CHANNELS .......... Output streams are distributed over this given number of output channels.\n");
        fprintf(stdout,"INFO: TIME OFFSET OF STREAMS(mS) ........ The start-time of the streams can be staggered by a few milliseconds (default, no stagger).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SOUND-SURROUND ................................ If more than 2 output channels, there output-placement relates to a sound-surround array.\n");
        fprintf(stdout,"INFO: WARN OF ROUNDING ERRORS .............. Warns of any errors in calculating the phase-shifted stream outputs.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB With time-variable phasing-wave frequency, extreme frequency shifts or reversals may produce anomalous output.\n");
        break;
    case(CRYSTAL):
        fprintf(stdout,"INFO: CREATE SOUND-SET RELATED, IN PITCH, TIME & PROXIMITY, TO VERTICES OF A 3D CRYSTAL, THEN ROTATE CRYSTAL AND RECREATE SOUNDS, ETC..\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mono input sound (or N input sounds for N vertices) used as sample-read table to generate outputs. Ideal duration 1 sec, but any dur possible.\n");
        fprintf(stdout,"INFO: Crystal vertices projected onto x, y plane, where x represents pitch, and y represents time. z (depth) determines signal brightness.\n");
        fprintf(stdout,"INFO: After playing one set of vertices, crystal rotates, around 2 different axes, and process of sound generation is then repeated ...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Mono output.\n");
        fprintf(stdout,"INFO: (2)  Stereo output (the y-coordinate is further interpreted as a position in the stereo space).\n");
        fprintf(stdout,"INFO: (3)  Stereo output across 2 channels of an 8-channel multichannel file, but separated by 1 channel.\n");
        fprintf(stdout,"INFO: (4)  Ditto, stepping clockwise around the channels for each vertex-group generated.\n");
        fprintf(stdout,"INFO: (5)  Ditto, stepping anticlockwise.\n");
        fprintf(stdout,"INFO: (6)  Ditto, stepping randomly.\n");
        fprintf(stdout,"INFO: (7)  Stereo output across 2 adjacent channels of an 8-channel multichannel file, stepping clockwise.\n");
        fprintf(stdout,"INFO: (8)  Ditto, stepping anticlockwise.\n");
        fprintf(stdout,"INFO: (9)  Ditto, stepping randomly.\n");
        fprintf(stdout,"INFO: (10) Stereo output, each vertex-set is output as a separate file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ROTATION SPEED AROUND Z AXIS (CYCS PER SEC) ................ Rotation speed (cycles per second) around z-axis.\n");
        fprintf(stdout,"INFO: ROTATION SPEED AROUND Y AXIS (CYCS PER SEC) ................ Rotation speed (cycles per second) around y-axis.\n");
        fprintf(stdout,"INFO: MAXIMUM TIMEWIDTH OF ONE ALL-VERTICES-PLAY .................. Maximum time between first vertex to play, and last, for any playing of one set of vertices.\n");
        fprintf(stdout,"INFO:                 Actual time between first and last vertices played will depend on crystal orientation.\n");
        fprintf(stdout,"INFO:                 Maximum timewidth is the maximum value this timewidth can take for all possible orientations of the crystal.\n");
        fprintf(stdout,"INFO:                 There will be a central time around which the vertices are laid out, sone before and some after this central time.\n");
        fprintf(stdout,"INFO: TIMESTEP BETWEEN ONE ALL-VERTICES-PLAY AND NEXT .......... Time-step between central-time of one playing-of-a-set-of-vertices, and the next playing.\n");
        fprintf(stdout,"INFO: TOTAL DURATION OF OUTPUT ........................................................ Minimum output duration.\n");
        fprintf(stdout,"INFO:                 When \"total duration\" is reached, any vertex-set being played will continue to its end before the output terminates.\n");
        fprintf(stdout,"INFO: MIN MIDI PITCH OF ANY VERTEX (WHEREVER ROTATED)\n");
        fprintf(stdout,"INFO: MAX MIDI PITCH OF ANY VERTEX (WHEREVER ROTATED) .......... As vertices are rotated, their pitch will usually change.\n");
        fprintf(stdout,"INFO:                 These are the minimum and maximum pitch thay any vertex might attain, and will not necessarily be reached by any rotated vertex.\n");
        fprintf(stdout,"INFO: FRQ OF PASSBAND OF FILTER FOR DISTANCE CUES\n");
        fprintf(stdout,"INFO: FRQ OF STOPBAND OF FILTER FOR DISTANCE CUES\n");
        fprintf(stdout,"INFO: MAX ATTENUATION(DB) OF FILTER\n");
        fprintf(stdout,"INFO: GAIN APPLIED TO SRC BEFORE FILTERING ..................................As vertices recede beyond x-y plane, sound is filtered to indicate distance.\n");
        fprintf(stdout,"INFO:                 Filtering done by CDP lowpass-filter, for which a passband, a (higher) stopband, an attenuation and a pregain need to be specified.\n");
        fprintf(stdout,"INFO: CURVE SLOPE FOR MIXING FILT TO UNFILT SND(DEPTH CUE) .. The filtered sound is mixed into the unfiltered, increasingly for greater distance.\n");
        fprintf(stdout,"INFO:                 The curve slope determines how this mixing differs from a simple linear crossfade.\n");
        fprintf(stdout,"INFO:                 Values less than one create a more rapid increase in filtering in the initial stages, values greater than one, the opposite.\n");
        fprintf(stdout,"INFO: CURVE SLOPE FOR MIXING IN OCTAVE-UP-SND(PROXIMITY CUE) As vertices approach in front of the x-y plane, sound is octave-stacked to indicate proximity.\n");
        fprintf(stdout,"INFO:                 The curve slope determines, similarly, how this mixing differs from a simple linear crossfade.\n");
        break;
    case(WAVEFORM):
        fprintf(stdout,"INFO: CREATE A WAVETABLE SUITABLE FOR USE IN THE \"CRYSTAL\" PROCESS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mono input sound used to generate a symmetric output table, suitable to use as a waveform for sound-generation.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Specify a time in the source, and a number of half-wavesets to read.\n");
        fprintf(stdout,"INFO: (2)  Specify a time in the source, and a duration in milliseconds to read.\n");
        fprintf(stdout,"INFO: (3)  Ditto, then combine the selected sound with a single-cycle sinusoid.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIME OF SAMPLING ...................... Time in the source where sound is to be sampled.\n");
        fprintf(stdout,"INFO: COUNT OF HALF WAVESETS .......... Number of half-wavesets to read from the source.\n");
        fprintf(stdout,"INFO: DURATION TO SAMPLE (mS) ........ Duration, in mS, to sample from the source.\n");
        fprintf(stdout,"INFO: BALANCE WITH SINUSOID ............ Relative level of source and sinusoid in final output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Modes 1 and 2 cut a source segment (at zero-crossings), then abutt the inverted segment to the original, to make a waveform.\n");
        fprintf(stdout,"INFO: In Mode 3, this abutted waveform is superimposed over a single-cycle sinusoid of the same duration.\n");
        break;
    case(DVDWIND):
        fprintf(stdout,"INFO: SHORTEN SOUND BY READ-THEN-SKIP, READ-THEN-SKIP, ETC.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIME CONTRACTION ............. Time-contraction of the source. Greater than 1. Can vary through time.\n");
        fprintf(stdout,"INFO: SIZE OF CLIPS(mS) ............ Duration of the retained clips, in mS. Can vary through time.\n");
        break;
    case(CASCADE):
        fprintf(stdout,"INFO: SUCCESSIVE SEGMENTS OF SRC ARE REPEAT-ECHOED, AND ECHO-SETS SUPERIMPOSED ON SRC.\n");
        fprintf(stdout,"INFO: \n");
        if(mode < 5) {
            switch(mode) {
            case(0):    
                fprintf(stdout,"INFO: N-chan output :: N-chan input. Every echo is in all N channels.\n");
                break;
            case(1):
                fprintf(stdout,"INFO: Stereo output :: Mono input (going to left of output)   :: Echo-streams pan to right.\n");
                break;
            case(2):
                fprintf(stdout,"INFO: Stereo output :: Mono input (going to centre of output) :: Echo-streams pan alternately to L and R.\n");
                break;
            case(3):
                fprintf(stdout,"INFO: 8-chan output :: Mono input (going initially to Ch 1)   :: Each echo in each stream steps to next channel, clockwise.\n");
                break;
            case(4):
                fprintf(stdout,"INFO: 8-chan output :: Mono input (going initially to Ch 1)   :: Each echo in odd-numbered streams steps to R, even-numbered to L.\n");
                break;
            }
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SEGMENT LENGTH .......................... Duration (in secs) of (successive) segments in source; each of which is echoed. Possibly time-varying.\n");
            fprintf(stdout,"INFO: MAX SEGMENT LENGTH .................... Maximum duration of the segments. If set, \"SEGMENT LENGTH\" treated as a minimum.\n");
            fprintf(stdout,"INFO:                                                              Actual length is a random value between min and max.\n");
        } else {
            switch(mode) {
            case(5):    
                fprintf(stdout,"INFO: N-chan output :: N-chan input. Every echo is in all N channels.\n");
                break;
            case(6):
                fprintf(stdout,"INFO: Stereo output :: Mono input (going to left of output)   :: Echo-streams pan to right.\n");
                break;
            case(7):
                fprintf(stdout,"INFO: Stereo output :: Mono input (going to centre of output) :: Echo-streams pan alternately to L and R.\n");
                break;
            case(8):
                fprintf(stdout,"INFO: 8-chan output :: Mono input (going initially to Ch 1)   :: Each echo in each stream steps to next channel, clockwise.\n");
                break;
            case(9):
                fprintf(stdout,"INFO: 8-chan output :: Mono input (going initially to Ch 1)   :: Each echo in odd-numbered streams steps to R, even-numbered to L.\n");
                break;
            }
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: CUT_TIMES_IN_SOURCE .................... (Succesive) times at which to cut source, to produce the segments to echo.\n");
            fprintf(stdout,"INFO: \n");
        }
        fprintf(stdout,"INFO: ECHO COUNT ................................... Number of echos of each segment. Possibly time-varying.\n");
        fprintf(stdout,"INFO: MAX ECHO COUNT ........................... Maximum number of echos. If set, \"ECHO COUNT\" treated as a minimum.\n");
        fprintf(stdout,"INFO:                                                              Actual count is a random value between min and max.\n");
        fprintf(stdout,"INFO:                                                              If set to ZERO it is ignored.\n");
        fprintf(stdout,"INFO: TIME RANDOMISATION OF ECHOS .. Randomisation of echo timings (default zero).\n");
        fprintf(stdout,"INFO: RANDOM SEED ............................... With same non-zero Seed value, a repeat process-run with same parameters gives identical output.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ECHOS MAY BE SHREDDED (echoed-segment cut into smaller chunks which are then randomly rearraged)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CHUNKS IN ANY SEGMENT SHRED .. Number of chunks into which segment-echo is cut.\n");
        fprintf(stdout,"INFO: REPEAT SHREDDINGS ....................... Number of repeated shreddings on each segment-echo.\n");
        fprintf(stdout,"INFO: ALSO SHRED SOURCE ....................... Source is shredded, as well as echos.\n");
        fprintf(stdout,"INFO: LINEAR DECAY ECHO LEVELS ........ Successice echos, in each echo-set, fall away in level less rapdily.\n");
        fprintf(stdout,"INFO: NORMALISE LOW LEVEL OUTPUT .... Raise Low level output to near maximum level. (High level output is automatically normalised).\n");
        break;
    case(SYNSPLINE):
        fprintf(stdout,"INFO: SYNTHESIS FROM WAVEFORMS MADE BY SMOOTHLY JOINING RANDOMLY GENERATED POINTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SAMPLE RATE ........................... Sample rate of synthesized sound.\n");
        fprintf(stdout,"INFO: DURATION .............................. Duration of the output sound.\n");
        fprintf(stdout,"INFO: FREQUENCY ............................ Fundamental frq of the output (Range 0.001 to 10000 Hz).\n");
        fprintf(stdout,"INFO: SPLINE COUNT ......................... Number of random points generated within a half-wavecycle. InterpolatION between these create the (next) waveform. (0 -64)\n");
        fprintf(stdout,"INFO: INTERPOLATION STEPS .............. Number of interpolation steps in which one waveform morph into the next (0 - 4096).\n");
        fprintf(stdout,"INFO: MAXIMUM SPLINE COUNT ............ Maximum Spline Count. If a non-zero value is entered, at each new vavecycle,\n");
        fprintf(stdout,"INFO:                                                                     a random number of spline points is generated with value between \"Spline Count\" and this maximum value.\n");
        fprintf(stdout,"INFO: MAXIMUM INTERPOLATION STEPS .. Maximum number of interpolation steps. If a non-zero value is entered, at each new vavecycle,\n");
        fprintf(stdout,"INFO:                                                                     a random number of steps is generated with value between \"Interpolation Steps\" and this maximum value.\n");
        fprintf(stdout,"INFO: MAXIMUM PITCH_DRIFT (SEMITONES)............... Maximum random drift of pitch away away from specified frequency, in semitones. (0 - 12)\n");
        fprintf(stdout,"INFO: AVERAGE TIME(mS) BETWEEN NEW DRIFT VALS .. New pitch drift value set after approximately this timestep (mS).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NORMALISE ALL WAVECYCLES ...... Normalise every wavecycle (default: cycles retain whatever (maximal)-amplitude is generated\n");
        fprintf(stdout,"INFO:                                                                     in the waveform generation process).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FREQUENCY, SPLINE COUNT, INTERPOLATION STEPS (and the related maximal parameters) can all vary through time. \n");
        break;
    case(FRACTAL):
        fprintf(stdout,"INFO: CREATE FRACTAL REARRANGEMENT OF SOURCE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF FRACTAL LAYERS .. How many times the source is rearranged : Range 2 to 100.\n");
        fprintf(stdout,"INFO: SPLICE LENGTH IN mS ............ Length of splices : Range 2 to 50\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB The process magnifies the size of the source, substantially.\n");
        break;
    case(FRACSPEC):
        fprintf(stdout,"INFO: IMPOSE FRACTAL TRANSPOSITION PATTERN ON SPECTRUM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SEMITONE TRANSPOSITION PATTERN ......................... set of time:semitone-transposition pairs for largest time-scale of fractal pattern,\n");
        fprintf(stdout,"INFO:                                                                                                      Last time defines duration of pattern, last value ignored.\n");
        fprintf(stdout,"INFO:                                                                                                      Pattern reproduced at contracted time-scale, on each element of pattern, recursively.\n");
        fprintf(stdout,"INFO: MAX FRACTALISATION ............................................ Maximum degree of fractalisation (repetition of patterning at smaller and smaller timescales.\n");
        fprintf(stdout,"INFO: TIME STRETCH OF FRACTAL PATTERN ......................... Timestretch applied to fractal pattern. Must be >= 1. If set to zero, ignored.\n");
        fprintf(stdout,"INFO: INTERVAL STRETCH OF FRACTAL PATTERN ................... Interval stretch applied to fractal pattern. If set to zero, ignored.\n");
        fprintf(stdout,"INFO: The previous three parameters can all vary through time. \n");
        fprintf(stdout,"INFO: SHRINK FRACTAL INTERVALS AS_TIMESCALE SHRINKS ..... e.g. if pattern (at next timescale) shrinks by 1/4, transposition intervals also shrink by 1/4.\n");
        fprintf(stdout,"INFO: READ BRKPNT DATA IN OUTFILE TIMEFRAME ................. (default : brkpoint data is read in the inputfile timeframe).\n");
        fprintf(stdout,"INFO: FORMANTS NOT RETAINED ............................................. Simple transposition of spectral components. (Default: attempts to retain formant envelope).\n");
        break;
    case(SPLINTER):
        switch(mode) {
        case(0):    
        case(2):    
            fprintf(stdout,"INFO: CREATE SPLINTERS MERGING INTO SOURCE SOUND.\n");
            break;
        case(1):    
        case(3):    
            fprintf(stdout,"INFO: CREATE SPLINTERS EMERGING OUT OF SOURCE SOUND.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Creates splinters by repeating, with shrinking, a specific waveset-group in the source.\n");
        fprintf(stdout,"INFO: The time of and size of this group is specified by you.\n");
        switch(mode) {
        case(0): case(2):   
            fprintf(stdout,"INFO: The derived, shrunk splinters repeat, then expand, eventually merging into the original sound at their origin point.\n");
            break;
        case(1): case(3):   
            fprintf(stdout,"INFO: The original sound plays up to the selected time, then splinters,\n");
            break;
        }
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: As they expand, the splinters step downwards in pitch.\n");
            break;
        case(1):    
            fprintf(stdout,"INFO: As they shrink, the splinters step upward in pitch.\n");
            break;
        case(2): case(3):   
            fprintf(stdout,"INFO: As they shrink, the splinters retain the original pitch (roughly).\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIME (BEFORE) WAVESET GROUP ............. Time immediately before start of selected wavesets.\n");
        fprintf(stdout,"INFO: WAVESET COUNT ............................... Number of wavesets to use to make splinter.\n");
        fprintf(stdout,"INFO: SHRINKING SPLINTERS COUNT ................ Number of splinter repeats before max shrinking attained.\n"); 
        fprintf(stdout,"INFO: SHRUNK SPLINTERS COUNT ................... Number of additional max-shrunk splinters before any accel or rit ends.\n");
        fprintf(stdout,"INFO: SPLINTER PULSE RATE AT ORIG WAVESET .. Pulse rate (in Hz) of the repeating splinters close to their origin in the source.\n");
        fprintf(stdout,"INFO: GOAL PULSE RATE ............................. Pulse rate (in Hz) of the splinters at max distance from their origin.\n");
        fprintf(stdout,"INFO: EXTRA SPLINTERS COUNT .................... Number of any additional splinters, at regular pulse, beond the \"maximum\" distance.\n");
        switch(mode) {
        case(0): case(2):
            fprintf(stdout,"INFO: SHRINK CONTOUR ............................. Contour of shrink. 1.0 = linear; >1 expands more rapidly at end; <1  less rapidly at end.\n");
            break;
        case(1): case(3):
            fprintf(stdout,"INFO: SHRINK CONTOUR ............................. Contour of shrink. 1.0 = linear; >1 shrink more rapidly at end; <1  less rapidly at end.\n");
            break;
        }
        switch(mode) {
        case(0): case(2):
            fprintf(stdout,"INFO: TIMING CONTOUR ............................. Contour of pulse-rate change. >1 accels or rits more rapidly at end; <1 less rapidly at end.\n");
            break;
        case(1): case(3):
            fprintf(stdout,"INFO: TIMING CONTOUR ............................. Contour of pulse-rate change. >1 accels or rits more rapidly at start; <1 less rapidly at start.\n");
            break;
        }
        switch(mode) {
        case(0): case(1):   
            fprintf(stdout,"INFO: FRQ OF SHRUNK WAVESETS ................. Determines final wavelength of wavesets when they are maximally shrunk. Default 6000Hz\n");
            break;
        case(2): case(3):   
            fprintf(stdout,"INFO: DURATION(mS) OF SHRUNK WAVESETS ... The final size (in mS) of the waveset-group when it is maximally shrunk.\n");
            break;
        }
        fprintf(stdout,"INFO: SPLINTER TIMING RANDOMISATION ......... Randomisation of the pulse-rate of the splinters.\n");
        fprintf(stdout,"INFO: SPLINTER SHRINKING RANDOMISATION .... Randomisation of the shrinkage of the splinters.\n");
        switch(mode) {
        case(0): case(2):   
            fprintf(stdout,"INFO: RETAIN ALL SOURCE SND ..................... Default, source is not heard until the splinters merge into it.\n");
            break;
        case(1): case(3):   
            fprintf(stdout,"INFO: RETAIN ALL SOURCE SND ..................... Default, source is not heard after splinters emerge from it.\n");
            break;
        }
        fprintf(stdout,"INFO: RETAIN NO SOURCE SND ..................... The source sound is entirely suppressed.\n");
        break;
    case(REPEATER):
        fprintf(stdout,"INFO: PLAY THROUGH SOURCE, WITH SPECIFIED ELEMENTS REPEATING THEMSELVES.\n");
        fprintf(stdout,"INFO:        The Sound-stream pauses for each segment-of-repeats then continues (to the next) ...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 3 : produces decrescendoing, accelerating output, like bouncing object.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: REPEATED SEGMENTS DATA ......................... a textfile of values specifying the segments to be repeated, and the details of the repetition .\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:                         Each line contains 4 values .....\n");
        fprintf(stdout,"INFO: \n");
        if(mode == 0 || mode == 2) {
            fprintf(stdout,"INFO:                         \"Start-time\"   \"End-time\"   \"Number-of-Repeats\"   \"Delay-time\"\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                         \"Start-time\" and \"End-time\" are the start and end of the segment to be repeated.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                         \"Delay-time\", for any repeating segment,\n");
            fprintf(stdout,"INFO:                         is the time between the START of one repeated element and the START of the next.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                         Delay zero will produce a delay equal to the segment length.\n");
            fprintf(stdout,"INFO:                         Otherwise, delays less than 0.05 seconds may produce output like an oscillator.\n");
        } else {
            fprintf(stdout,"INFO:                         \"Start-time\"   \"End-time\"   \"Number-of-Repeats\"   \"Offset-time\"\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO:                         \"Offset-time\", for any repeating segment,\n");
            fprintf(stdout,"INFO:                         is the time between the END of one repeated element and the START of the next.\n");
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:                         Selected segments  must be at least 0.01 seconds in duration\n");
        fprintf(stdout,"INFO:                         and can overlap one-another, or backtrack in the source sound.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANGE OF ANY RANDOM EXPANSION OF DELAY TIMES ......... For any segment, the delay times may each be randomly stretched.\n");
        fprintf(stdout,"INFO:                            This parameter specifies the upper limit of such streching, and this limit may vary through time.\n");
        fprintf(stdout,"INFO:                            An expansion of \"1.0\" results in no stretching.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANGE OF ANY RANDOM PITCH VARIATION(SEMITONES) ..... For any segment, the pitch of each repeat may randomly vary.\n");
        fprintf(stdout,"INFO:                            This parameter specifies the upper limit of such pitch-variation, in semitones.\n");
        fprintf(stdout,"INFO:                            An expansion limit of e.g. \"1.5\" results in random pitch shifts in the range 1.5 semitones down to 1.5 semitones up.\n");
        fprintf(stdout,"INFO:                            A value of zero results in no transposition.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RANDOM SEED .............................................................. An integer. Repeated process-runs with same source and same seed value gives identical output.\n");
        if(mode == 2) {
            fprintf(stdout,"INFO: ACCELERATION OF REPEATS ...................................... e.g. \"3\" means Gradually shorten delays until they reach 1/3 duration .\n");
            fprintf(stdout,"INFO: WARP OF ACCELERATION ................................................ Warp value >1 shortens by less initially and by more later. Warp 1 has no effect.\n");
            fprintf(stdout,"INFO: FADE CONTOUR .............................................................. 1  Gives linear fade:   >1  Faster followed by slower decay:   <1  Slower followed by faster.\n");
            fprintf(stdout,"INFO: \n");
        }
        break;
    case(VERGES):
        fprintf(stdout,"INFO: PLAY SOURCE, WITH SPECIFIED BRIEF MOMENTS GLISSING UP OR DOWN ABRUPTLY, AND POSSIBLY ACCENTED.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Best applied to attack points in the source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: VERGE TIMES ............................................... Textifle, being a list of times at which to create the verges.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: VERGE TRANSPOSITION(SEMITONES) ......... Initial semitone transposition at the verge-time.\n");
        fprintf(stdout,"INFO:                            This parameter specifies the upper limit of such streching, and this limit may vary through time.\n");
        fprintf(stdout,"INFO:                            An expansion of \"1.0\" results in no stretching.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: VERGE SLOPE ............................................... Slope of glissando. Default 1 (linear). Other values are steeper.\n");
        fprintf(stdout,"INFO: VERGE DURATION ........................................ Duration of the verges.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \"TRANSPOSITION\", \"SLOPE\" and \"DURATION\" can vary through time.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DON'T SEARCH FOR LOCAL PEAKS ....... Use the exact verge-times supplied. Do not search for local peaks.\n");
        fprintf(stdout,"INFO: BOOST VERGE LEVEL ..................................... Boost the level of the verges.\n");
        fprintf(stdout,"INFO: SUPPRESS NON-VERGES .............................. Suppress any input signal which is not a verge.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \"BOOST\" and \"SUPPRESS\" Cannot be used together.\n");
        break;
    case(MOTOR):
        fprintf(stdout,"INFO: CREATING A FAST STREAM OF PULSES, ENVELOPED BY A SLOWER-PULSING STREAM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Create fast (inner) pulse-stream, within slower (outer) pulsing-enveloping.\n");
        fprintf(stdout,"INFO: Under every outer envelope-pulse, the inner events are cut, successively, from the input source(s).\n");
        fprintf(stdout,"INFO: Each outer-pulse (possibly shortened by randomisation) must hold at least 2 inner-pulses (possibly lengthened by randomisation).\n");
        fprintf(stdout,"INFO: Shortish sources with a changing spectrum (or shortish segments cut from a larger source) are recommended.\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: MODE: Uses a single source. Reads src-segment, then advances during pulse crescendo, regressing during decrescendo.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: MODE: Uses several elements cut from a single source, with cuts specified in \"SLICE TIMES\".\n");
            fprintf(stdout,"INFO:             Reads a segment from an element then advances during pulse crescendo, regressing during decrescendo.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: MODE: Uses several srcs. Reads element from a src then advances during pulse crescendo, regressing during decrescendo.\n");
            break;
        case(3):
            fprintf(stdout,"INFO: MODE: Uses a single source. Reads src-segment then advances.\n");
            break;
        case(4):
            fprintf(stdout,"INFO: MODE: Uses several elements cut from a single source, with cuts specified in \"SLICE TIMES\".\n");
            fprintf(stdout,"INFO:             Reads an element-segment then advances.\n");
            break;
        case(5):
            fprintf(stdout,"INFO: MODE: Uses several srcs. Reads a src-segment then advances.\n");
            break;
        case(6):
            fprintf(stdout,"INFO: MODE: Uses a single source. Reads src-segment, advancing for rest of read, or regressing for rest of read. Decision to advance or regress is random.\n");
            break;
        case(7):
            fprintf(stdout,"INFO: MODE: Uses several elements cut from a single source, with cuts specified in \"SLICE TIMES\".\n");
            fprintf(stdout,"INFO:             Reads element-segment advancing for rest of read, or regressing for of the read. Decision to advance or regress is random.\n");
            break;
        case(8):
            fprintf(stdout,"INFO: MODE: Uses several srcs. Reads src-segment advancing for rest of read, or regressing for rest the read. Decision to advance or regress is random.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        switch(mode) {
        case(1):
        case(4):
        case(7):
            fprintf(stdout,"INFO: SLICE TIMES (Mode 2 only) ........................... Slice times to cut source input sound into several source segments.\n");
            break;
        }
        fprintf(stdout,"INFO: TOTAL OUTPUT DURATION ........................... Duration of output sound to produce.\n");
        fprintf(stdout,"INFO: INNER PULSE FRQ(Hz) ................................. Frq rate of inner (faster) pulses.\n");
        fprintf(stdout,"INFO: OUTER PULSE RATE(Hz) ............................... Frq rate of outer (enveloping) pulses.\n");
        fprintf(stdout,"INFO: INNER PULSES PROPORTION ON-TO-OFF TIME ... Proportion of the inner pulse which sounds (the rest is silence, or a low-level tail: see below).\n");
        fprintf(stdout,"INFO: OUTER PULSES PROPORTION ON-TO-OFF TIME .. Proportion of the outer pulse which sounds (the rest is silence).\n");
        fprintf(stdout,"INFO: SYMMETRY OF OUTER PULSES ....................... Position of peak within envelope: 0 is start, 1 is end: 1/2 is halfway through envelope.\n");
        fprintf(stdout,"INFO: INNER PULSE FRQ RANDOMISATION ................ Range of randomisation of the inner-pulse frequency (0 to 1) (max range (val 1) from dur/3 to 3*dur/2).\n");
        fprintf(stdout,"INFO: OUTER PULSE FRQ RANDOMISATION ............... Range of randomisation of the outer-envelope frequency. (similarly)\n");
        fprintf(stdout,"INFO: PITCH RANDOMISATION RANGE(SEMITONES) ..... Range of pitch variation of inner pulse, moving from one envelope to next. (0-3 semitones)\n");
        fprintf(stdout,"INFO: ATTENUATION RANDOMISATION RANGE ........... Range of any random attenuation of inner-pulses (0: no attenuation :: 1: rand attenuation  from  none to zero level output).\n");
        fprintf(stdout,"INFO: SYMMETRY RANDOMISATION ......................... Range of randomisation of envelope symmetry (0 to 1).\n");
        fprintf(stdout,"INFO: INNER PULSES DECAY TAIL ........................... Length of decay tails on inner-pulses, a multiple of their duration.\n");
        fprintf(stdout,"INFO: OUTER PULSE SHARPNESS ............................ Slope of outer-envelope. 1 = linear: >1 slow-to-fast rise:  <1 fast_to_slow rise.\n");
        fprintf(stdout,"INFO: READ ADVANCE RANDOMISATION ................... Randomisation of the step advance in reading the input. (Range 0 to 1).\n");
        fprintf(stdout,"INFO: RANDOM SEED .............................................. Same seed value, with same values for randomising params, produces identical output.\n");
        fprintf(stdout,"INFO: ADVANCE BY FIXED STEP IN SRC READS ........... Default is to step regularly through src so we reach its end, whatever the length of the pulse.\n");
        switch(mode) {
        case(1):
        case(4):
        case(7):
            fprintf(stdout,"INFO: USE SEGMENTS CYCLICALLY .......................... Default is to randomly permute the order of the segments.\n");
            break;
        case(2):
        case(5):
        case(8):
            fprintf(stdout,"INFO: USE SRCS CYCLICALLY ............................... Default is to randomly permute the order of the srcs.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: All parameters EXCEPT \"SEED\" and \"DURATION\" can vary through time.\n");
        break;
    case(STUTTER):
        fprintf(stdout,"INFO: SLICE SOURCE INTO ELEMENTS, AND RANDOMLY PLAY SEGMENTS SLICED FROM START OF SEGMENTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Best applied to attack points in the source (e.g. start of word or syllable of text).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: SLICE TIMES  ...................................................... Slice times to cut source input sound into several elements.\n");
        fprintf(stdout,"INFO: OUTPUT DURATION ...............................................Duration of output sound to produce.\n");
        fprintf(stdout,"INFO: MAX SEGMENT JOINS ............................................ Segments can be used independently, or joined together consecutively.\n");
        fprintf(stdout,"INFO:                                                                                                This parameter determines the maximum number of segments to be joined.\n");
        fprintf(stdout,"INFO: PROPORTION OF SILENCE ...................................... Cut elements can be separated by silence\n");
        fprintf(stdout,"INFO:                                                                                                This parameter determines the proportion of segments that are followed by silence.\n");
        fprintf(stdout,"INFO: MIN SILENCE DURATION ........................................ Minimum duration of any intervening silences.\n");
        fprintf(stdout,"INFO: MAX SILENCE DURATION ........................................ Maximum duration of any intervening silences.\n");
        fprintf(stdout,"INFO: RANDOM SEED .................................................... Same seed value, with same values for randomising params, produces identical output.\n");
        fprintf(stdout,"INFO: MAX RANGE OF RANDOM TRANSPOSITION(SEMITONES) .. Maximum range over which cut segments can be randomly transposed.\n");
        fprintf(stdout,"INFO: MAX RANGE_OF RANDOM ATTENUATION .................... Maximum range over which cut segments can be attenuated.\n");
        fprintf(stdout,"INFO: SEGMENT LENGTH BIAS .......................................... Bias < 0 favours shorter cuts from segments. Bias > 0, longer cuts.\n");
        fprintf(stdout,"INFO: MIN SEGMENT DURATION(mS) .................................. Minimum duration of any cut segment.\n");
        fprintf(stdout,"INFO: PERMUTE SEGMENT ORDER ..................................... Play a cut from each elements in random order, than permute order and repeat.\n");
        fprintf(stdout,"INFO:                                                                                                (Default: elements selected entirely at random.)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \"TRANSPOSITION\", \"ATTENUATION\" and \"BIAS\" can vary through time.\n");
        break;
    case(SCRUNCH):
        switch(mode) {
        case(0):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S AND PERMUTE THEIR ORDER TO FORM OUTPUT STREAM.\n");                   break;
        case(1):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S, THE SELECT AT RANDOM INTO OUTPUT STREAM.\n");                        break;
        case(2):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF INCREASING LENGTH (PITCH FALLING).\n");  break;
        case(3):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF DECREASING LENGTH (PITCH RISING).\n");   break;
        case(4):    fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF INCREASING LENGTH (PITCH FALLING).\n");  break;
        case(5):    fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF DECREASING LENGTH (PITCH RISING).\n");   break;
        case(6):    fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE ALTERNATELY IN ORDER OF INCREASING THEN DECREASING LENGTH (PITCH FALL-RISE).\n"); break;
        case(7):    fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE ALTERNATELY IN ORDER OF DECREASING THEN INCREASING LENGTH (PITCH RISE-FALL).\n"); break;
        case(8):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF INCREASING LOUDNESS.\n");    break;
        case(9):    fprintf(stdout,"INFO: CUT SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF DECREASING LOUDNESS.\n");    break;
        case(10):   fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF INCREASING LOUDNESS.\n");    break;
        case(11):   fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE THEM IN ORDER OF DECREASING LOUDNESS.\n");    break;
        case(12):   fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE ALTERNATELY IN ORDER OF INCREASING THEN DECREASING LOUDNESS.\n"); break;
        case(13):   fprintf(stdout,"INFO: CUT SEGMENTS OF SOURCE INTO WAVESET(GROUP)S AND ARRANGE ALTERNATELY IN ORDER OF DECREASING THEN INCREASING LOUDNESS.\n"); break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        if(mode <= 1)
            fprintf(stdout,"INFO: OUTPUT DURATION ...............................................Duration of output sound to produce.\n");
        else if((mode > 3 && mode < 8) || mode > 9)
            fprintf(stdout,"INFO: SLICE TIMES ...................................................... Textfile of (increasing) times at which to divide src into segments for processing.\n");
        fprintf(stdout,"INFO: RANDOM SEED .................................................... Same seed value, with same values for randomising params, produces identical output.\n");
        fprintf(stdout,"INFO: COUNT_OF_WAVESETS_IN_A_GROUP ....................... Count (and then cut) wavesets in groups of this size.\n");
        fprintf(stdout,"INFO: MAX RANGE OF RANDOM TRANSPOSITION(SEMITONES) .. Maximum range over which cut segments can be randomly transposed.\n");
        fprintf(stdout,"INFO: MAX RANGE_OF RANDOM ATTENUATION .................... Maximum range over which cut segments can be attenuated.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \"TRANSPOSITION\", and \"ATTENUATION\" can vary through time.\n");
        break;
    case(IMPULSE):
        fprintf(stdout,"INFO: GENERATE IMPULSES OR IMPULSE STREAMS, PITCHED OR CHIRPING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT DURATION .............................. Duration of output sound to produce.\n");
        fprintf(stdout,"INFO: PITCH OF IMPULSE STREAM(MIDI) ............ Not the pitch of the impulses, but the rate at which they occur.\n");
        fprintf(stdout,"INFO: GLISSING OF IMPULSE .......................... Zero value gives a fixed-pitch impulse, >zero, impulses gliss (up then down). CARE: high valus may clip.\n");
        fprintf(stdout,"INFO: SLOPE OF IMPULSE .............................. Value 1, impulses rise and fall in level linearly. Higher values give steeper slopes.\n");
        fprintf(stdout,"INFO: NUMBER OF PEAKS PER IMPULSE .............. Dividing this number by the frq of the stream (derived from pitch) gives the (Start) pitch of the impulses themselves.\n");
        fprintf(stdout,"INFO: IMPULSE LEVEL ................................... Loudness of the impulses.\n");
        fprintf(stdout,"INFO: PROPORTIONAL GAP BETWEEN IMPULSES .. Zero gives no gap. +ve vals leave silent space between impulses e.g. 0.5 gives a gap of 1/2 the duration of the impulse.\n");
        fprintf(stdout,"INFO:                                                                                                          -ve values cause the impulses to overlap. With -0.5 they overlap by 1/2 their length.\n");
        fprintf(stdout,"INFO: SAMPLE RATE .................................... Sample rate of the output sound.\n");
        fprintf(stdout,"INFO: OUTPUT CHANNEL CNT ......................... Number of channels in the output sound.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \"PITCH\", \"GLISSING\", \"SLOPE\", \"NUMBER OF PEAKS\", \"LEVEL\" and \"GAP\" can vary through time.\n");
        break;
    case(TWEET):
        switch(mode) {
        case(0):
        case(1):
            fprintf(stdout,"INFO: SUBSITUTE CHIRPS FOR VOCAL FORMANTS.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: SUBSITUTE NOISE FOR VOCAL FORMANTS.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIMEBLOKS IN SRC NOT TO SEARCH FOR FOFS ... Textfile of pairs of times in src where there are no FOFs expected,\n");
        fprintf(stdout,"INFO: FREQUENCY OF SRC(HZ) .............................. A textfile of time : frequency pairs, being the extracted pitch contour of the input sound\n");
        fprintf(stdout,"INFO: LOWEST LEVEL AT WHICH FOFS DETECTED(dB) ... If any FOF is more than this number of dBs below the level of the loudest FOF detected, it is ignored.\n");
        fprintf(stdout,"INFO:                                                                                    (A ZERO value will search for FOFs at any level).\n");
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: NUMBER OF PEAKS IN CHIRP ... ...................... Number of peaks in the chirp which replaces the FOF. (Frq will vary depending on size of FOF)\n");
            fprintf(stdout,"INFO: GLISSING OF CHIRP ..................................... Amount of glissing of the chirps.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: \"NUMBER OF PEAKS\", and \"GLISSING\" can vary through time.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: FREQUENCY OF CHIRP ................................. (Fixed) Frequency of the chirps.\n");
            fprintf(stdout,"INFO: GLISSING OF CHIRP ..................................... Amount of glissing of the chirps.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: \"FREQUENCY\" and \"GLISSING\" can vary through time.\n");
            break;
        }
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: COSIN SMOOTH FOFS .................................. Cosinusoidal onset and decay applied to FOFs, before replacement sound inserted.\n");
        break;
    case(RRRR_EXTEND): // verasion 8+ 
        switch(mode) {
            case(0):
            case(1):
                fprintf(stdout,"INFO: TIME-EXTEND NATURAL ITERATIVE EVENTS IN A SRC (LIKE ROLLED 'rrr' IN SPEECH) IN A PLAUSIBLE WAY\n");
                break;
            case(2):
                fprintf(stdout,"INFO: FIND AND CUT OUT EACH GRAIN OF AN ITERATIVE EVENT IN A SRC SOUND (LIKE ROLLED 'rrr' IN SPEECH)\n");
                fprintf(stdout,"INFO: AND SAVE EACH GRAIN (AND THE PRE-ITERATE AND POST-ITERATE CHUNKS OF THE SRC) TO ITS OWN SOUNDFILE BY FIRST\n");
                break;
        }
        switch(mode) {
            case(0):
            case(2):
            fprintf(stdout,"INFO: SPECIFYING WHERE THE ITERATIVE EVENT IS IN THE SOURCE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: START OF SECTION TO BE EXTENDED ......................... Time of start of the iterated material in the source.\n");
            fprintf(stdout,"INFO: END OF SECTION TO BE EXTENDED ............................ Time of end of the iterated material in the source.\n");
            fprintf(stdout,"INFO: ANTICIPATED NO OF SEGMENTS TO FIND IN SRC............ Estimate how many iterations you hear in marked area.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: LETTING THE PROCESS SEARCH FOR THE (FIRST) ITERATIVE EVENT IN THE SOURCE.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PARAMETERS ----------------------------------------------------\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINUMUM NO OF SEGMENTS TO FIND IN SRC ................ Estimate how many iterations you hear in marked area.\n");
            fprintf(stdout,"INFO: APPROX SIZE OF GRANULE (MS) ................................ Anticipated size of grain (try 15mS).\n");
            fprintf(stdout,"INFO: GATE LEVEL BELOW WHICH SIGNAL ENVELOPE IGNORED .. Don't search for grains where signal drops below gate-level.\n");
            fprintf(stdout,"INFO: NUMBER OF GRAINS AT ITERATIVE START TO OMIT ........ Allows you to play through first N grains you find\n");
            fprintf(stdout,"INFO:                                                                  before using the ensuing grains for the time-extension process.\n");
            break;
        }
        fprintf(stdout,"INFO: APPROX RANGE OF ITERATIVE SOUND (OCTAVES) ......... The acceptable variation in grainsize of grains to find (Try 1).\n");
        fprintf(stdout,"INFO:                                                                  This is the 'pitch'-range of the (low_frq) iteration, and NOT the resonant frequency.\n");
        fprintf(stdout,"INFO:                                                                  e.g. for a rolled 'rrr' it is the frq of the 'rrr' itself (even if unvoiced)\n");
        fprintf(stdout,"INFO:                                                                  and not the pitch of any sung note (if the 'rrr' is voiced).\n");
        switch(mode) {
            case(0):
            case(1):
            fprintf(stdout,"INFO: TIME EXTENSION OF THE MATERIAL ITSELF (TEM).......... How much to time-extend the marked material (by randomised repetition).\n");
            fprintf(stdout,"INFO: MAX ADJACENT OCCURENCES OF ANY SEG IN OUTPUT ... Iterated material extended by reusing the individual grains in a randomised pattern.\n");
            fprintf(stdout,"INFO:                                                              In this pattern, grain-A may occur next to an identical copy of grain-A, or not.\n");
            fprintf(stdout,"INFO:                                                              This parameter specifies how many adjacent copies of any segment you are prepared to allow.\n");
            fprintf(stdout,"INFO: AMPLITUDE SCATTER .............................................. The iterated segments may vary in amplitude.\n");
            fprintf(stdout,"INFO:                                                            0 retains original amplitude: N produces random amplitudes between orig and (1-N) * orig.\n");
            fprintf(stdout,"INFO: PITCH SCATTER ................................................... The iterated segments may vary in pitch.\n");;
            fprintf(stdout,"INFO:                      0 retains original pitch: N produces random pitchshift between N and -N semitones.\n");
            fprintf(stdout,"INFO: GRAIN SEPARATION TIMESTRETCH (GST) .................... Material can also be time-stretched by inserting silence between the grains.\n");
            fprintf(stdout,"INFO:                                                              This parameter, varying upwards from 1 (= no timestretch), is independent of the TEM parameter\n");;
            fprintf(stdout,"INFO:                                                              and will overiride it if GST makes the output longer, or shorter than the length implied by TEM.\n");
            fprintf(stdout,"INFO:                                                              In any breakpoint file for this parameter, times are measured FROM THE START OF THE ITERATED SEGMENT\n");
            fprintf(stdout,"INFO:                                                              (rather than the start of the source file) and the final value of \"1.0\" in the brkfile defines the time-end of the GST.\n");
            fprintf(stdout,"INFO:                                                              Note that if your brkpoint values don't begin and end at \"1.0\" there will be a discontinuity\n");
            fprintf(stdout,"INFO:                                                              if you attach the sound before (or after) the iterated segment to the iterated segment itself.\n");
            fprintf(stdout,"INFO: GRAIN SEPARATION REGULARISTION ........................... When set to 1, attempts to make grains appear at a fixed regular rate\n");
            fprintf(stdout,"INFO:                                                              independent of the invidual grain durations.\n");;
            fprintf(stdout,"INFO:                                                              It will only kick in once the grains have been stretched by GST (and total regularity is not possible\n");
            fprintf(stdout,"INFO:                                                               until the average step from one grain start to the next is greater than size of largest grain).\n");
            fprintf(stdout,"INFO:                                                              In any breakpoint file for this parameter, times are measured FROM THE START OF THE ITERATED SEGMENT\n");
            fprintf(stdout,"INFO:                                                              (rather than the start of the source file).\n");
            fprintf(stdout,"INFO: DON'T KEEP SOUND BEFORE ITERATE ..................... If flag is set, start of sound (before iterated material) is discarded.\n");
            fprintf(stdout,"INFO: DON'T KEEP SOUND AFTER ITERATE ....................... If flag is set, end of sound (after iterated material) is discarded.\n");
        }
        break;
    case(SORTER):
        fprintf(stdout,"INFO: CHOPS MONO SOURCE INTO ELEMENTS, THEN REORGANISES BY LOUDNESS, OR DURATION.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Mode 1: Sort to Crescendo.\n");
        fprintf(stdout,"INFO: Mode 2: Sort to Decrescendo.\n");
        fprintf(stdout,"INFO: Mode 3: Sort to Accelerando. (With very small elements, may rise in pitch).\n");
        fprintf(stdout,"INFO: Mode 4: Sort to Ritardando.  (With very small elements, may fall in pitch).\n");
        fprintf(stdout,"INFO: Mode 5: Order at Random.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ELEMENT SIZE ... Approximate size of elements to sort, in seconds.\n");
        fprintf(stdout,"INFO:                                   If set to zero, individual wavesets are chosen as elements.\n");
        fprintf(stdout,"INFO: SMOOTHING .........  Fade in (and out) each segment, with a \"SMOOTH\" mS splice.\n");
        fprintf(stdout,"INFO:                                   If elementsize is zero, this is ignored.\n");
        fprintf(stdout,"INFO: SEED ................... Mode 5 (\"Order at Random\"): a rerun with same non-zero seed value\n");
        fprintf(stdout,"INFO:                                   outputs the SAME random ordering of elements.\n");
        fprintf(stdout,"INFO:                                   (Zero seed-value gives different random ordering on each run).\n");
        fprintf(stdout,"INFO: OUTPITCH ........... Output elements time-spacing equivalent to the MIDI pitch,\"OPCH\".\n");
        fprintf(stdout,"INFO:                                   If \"AS FREQUENCY\" flag is used, value can be set to 128 to specify\n");
        fprintf(stdout,"INFO:                                   the median pitch of the source.\n");
        fprintf(stdout,"INFO:                                   If value is set to zero, parameter is ignored.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AS FRQEQUENCY .. Element size is read as a frq value (= 1.0/duration)\n");
        fprintf(stdout,"INFO:                                   and could be e.g. a frequency-trace of the pitch of the source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The following parameters can only be used if \"AS FRQEQUENCY\" flag is set.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ELEMENT PITCH .. Transpose input elements to the MIDI pitch specified.\n");
        fprintf(stdout,"INFO:                                   If value set to 128, the median pitch of the source is used.\n");
        fprintf(stdout,"INFO:                                   If value is set to zero, parameter is ignored.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The following parameter is only useful if \"ELEMENT PITCH\" is set.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: META GROUPING ... Size of meta-grouping, in seconds.\n");
        fprintf(stdout,"INFO:                                   Allows larger units to be (approximately) pitch-correlated.\n");
        fprintf(stdout,"INFO:                                   Source is first cut to pitch-wavelen-scale elements & transpositions calculated.\n");
        fprintf(stdout,"INFO:                                   These elements are then further grouped to (approx) \"META GROUPING\" size.\n");
        fprintf(stdout,"INFO:                                   This must be larger than the largest element (1/frq) from frq trace.\n");
        fprintf(stdout,"INFO:                                   If \"META GROUPING\" is set to zero, it is ignored.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If \"ELEMENT PITCH\" is NOT set, larger groupings are obtained by using larger value of \"ELEMENT SIZE\".\n");
        break;
    case(SPECFNU):
        switch(mode) {
        case(0):
            fprintf(stdout,"INFO: NARROW FORMANTS: Steepens skirts of formant peaks by power factor.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: NARROWING ........................................ Narrowing of individual formant peaks. Range 1 to 1000. Timevariable.\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: SUPPRESS SET ...................................... Suppress the listed formants. \"OFF\" can be any combination of\n");
            fprintf(stdout,"INFO:                                                                                \"1\",\"2\",\"3\" & \"4\" but not all of them, and with no repetitions.\n");
            fprintf(stdout,"INFO: ZERO TOP OF SPECTRUM .......................... Zero top of spectrum (above fourth formant).\n");
            fprintf(stdout,"INFO: FORCE FUNDAMENTAL ............................. Force lowest formant to use fundamental frq as peak.\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS .................. Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED... Re.place unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(1):
            fprintf(stdout,"INFO: SQUEEZE SPECTRUM AROUND FORMANT: Squeeze around specified formant.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SQUEEZE ............................................ Squeeze factor. Range 1 to 10. Timevariable.\n");
            fprintf(stdout,"INFO: CENTRE FORMANT ................................. Formant peak at centre of squeeze. (range 1 to 4)\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: SQUEEZE AROUND TROUGH ABOVE ............. Squeeze around trough above specified peak.\n");
            fprintf(stdout,"INFO: FORCE FUNDAMENTAL ............................. Force lowest formant to use fundamental frq as peak.\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ............ Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS .................. Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(2):
            fprintf(stdout,"INFO: INVERT FORMANTS: Formant peaks become troughs, and troughs peaks.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: VIBRATE RATE ........................................ If not zero, cycle between original & inversion at this frq. Timevariable.\n");
            fprintf(stdout,"INFO: GAIN .................................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ................................ Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS .............. Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS .................... Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .... Replace unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(3):
            fprintf(stdout,"INFO: ROTATE FORMANTS: Formant peaks & frqs move up (or down) spectrum.\n");
            fprintf(stdout,"INFO:         reappearing at foot (top) of formant-area, when they reach its edge.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ROTATION SPEED ................................... Spectrum rotation speed, e.g. 2 = twice every second.\n");
            fprintf(stdout,"INFO:                                                                                 Range -300 to 300 rotations per second. Timevariable.\n");
            fprintf(stdout,"INFO: GAIN ................................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................... Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ............ Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS ................... Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED ... Replace unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(4):
            fprintf(stdout,"INFO: SPECTRAL NEGATIVE: Spectral values inverted for each channel.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GAIN ...... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: FLAT ...... Do not re-envelope the output spectrum.\n");
            break;
        case(5):
            fprintf(stdout,"INFO: SUPPRESS FORMANTS: Suppresses the selected formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: SUPPRESS SET ............................... which of (4) formants to suppress. e.g. \"1\" means suppress 1st,\n");
            fprintf(stdout,"INFO:                                                                    while \"134\" means suppress 1st, 3rd and 4th.\n");
            fprintf(stdout,"INFO: GAIN ........................................... Output gain or attenuation. (Range 0.1 to 10).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ...................... Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS .... Exclude non-harmonic partials.\n");
            break;
        case(6):
            fprintf(stdout,"INFO: GENERATE FILTER(S) FROM FORMANT(S): Outputs varibank filter data textfile.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: DATAFILE .......................... Textfile containing.\n");
            fprintf(stdout,"INFO:     (1)  LIST OF TIMES at which src to be divided into blocks for analysis.\n");
            fprintf(stdout,"INFO:                      Resulting filter step-changes between vals created from each block.\n");
            fprintf(stdout,"INFO:                      Value ZERO means use the entire source to make 1 fixed filter.\n");
            fprintf(stdout,"INFO:     (2)  PITCH GRID on which pitches you are searching for must lie.\n");
            fprintf(stdout,"INFO:                      There must first be a marker indicating the grid type. These are..\n");
            fprintf(stdout,"INFO:                              #HS:    Followed by listed MIDI pitches to search for.\n");
            fprintf(stdout,"INFO:                              #HF:    Followed by listed MIDI pitches to search for IN ALL OCTAVES.\n");
            fprintf(stdout,"INFO:                              #SCALE: Followed by just TWO values.\n");
            fprintf(stdout,"INFO:                                    (a) the number of equal pitch divisions in an octave.\n");
            fprintf(stdout,"INFO:                                    (b) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO:                              #ELACS: Followed by just THREE values.\n");
            fprintf(stdout,"INFO:                                    (a) Size of \"octave\" in (possibly fractional) semitones.\n");
            fprintf(stdout,"INFO:                                    (b) the number of equal pitch divisions in \"octave\".\n");
            fprintf(stdout,"INFO:                                    (c) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO: PEAKS PER FORMANT ........ (Max) number of peaks from each formant to use. (Default value 1). \n");
            fprintf(stdout,"INFO: FORCE A PITCH BELOW ..... Try to ensure there is 1 (or more) pitch(es) below this MIDI value.\n");
            fprintf(stdout,"INFO: KEEP PEAK LOUDNESS ....... Keep relative (summed) loudnesses of peaks as part of filter design.\n");
            fprintf(stdout,"INFO: INVERT PEAK LOUDNESS .... Keep inverse of loudnesses as part of filter design.\n");
            fprintf(stdout,"INFO:                                                   Default. All filter amplitudes set to 1.0\n");
            fprintf(stdout,"INFO: FORCE FUNDAMENTAL ...... Force lowest formant to use fundamental frq as peak.\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ........ Use short-window for extracting spectral envelope.\n");
            break;
        case(7):
            fprintf(stdout,"INFO: MOVE FORMANTS BY: Displace individual formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MOVE1 .................................................. Frq displacement, up or down, of formant 1. Timevariable.\n");
            fprintf(stdout,"INFO: MOVE2,MOVE3,MOVE4 ............................... Similarly for other formants.\n");
            fprintf(stdout,"INFO:                                          (Formants moving below zero or above nyquist/2 will disappear).\n");
            fprintf(stdout,"INFO: GAIN .................................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ZERO TOP OF SPECTRUM ............................ Zero top of spectrum (above fourth formant).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ................................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS .............. Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS .................... Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .... Replace unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(8):
            fprintf(stdout,"INFO: MOVE FORMANTS TO: Displace individual formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FRQ1 ................................................... New frq of formant 1. Timevariable.\n");
            fprintf(stdout,"INFO: FRQ2,FRQ3,FRQ4 ................................... Similarly for other formants.\n");
            fprintf(stdout,"INFO: GAIN ................................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ZERO TOP OF SPECTRUM ........................... Zero top of spectrum (above fourth formant).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................... Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: NARROW FORMANT BANDS ........................ Use narrow formant bands.\n");
            fprintf(stdout,"INFO:                                                                    Using narrow bands can give counterintuitive results.\n");
            fprintf(stdout,"INFO:                                                                    Doesn't capture so many harmonic peaks, so sounds duller.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ............. Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: EXCLUDE HARMONIC PARTIALS ................... Exclude harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED ... Replace unpitched (or extremely quiet) windows by silence.\n");
            break;
        case(9):
            fprintf(stdout,"INFO: ARPEGGIATE SPECTRUM: Arpeggiate spectrum of source, under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE ..................... Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: GAIN ......................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ..................... Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS .. Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ............................. Arpeggiate downwards (default upwards).\n");
            fprintf(stdout,"INFO: UP AND DOWN ............................ Arpeggiate up and down.\n");
            break;
        case(10):
            fprintf(stdout,"INFO: OCTAVE-SHIFT UNDER FORMANTS: Octave-shift src spectrum, under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: OCTAVE SHIFT ...................................... Octave shift (Range -4 to + 4). (Timevariable).\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE .............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ............................................ Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: FILL TOP OF SPECTRUM ........................... If transposing downwards, fill spectrum top with extra harmonics.\n");
            break;
        case(11):
            fprintf(stdout,"INFO: TRANSPOSE UNDER FORMANTS: tranpose spectrum of src, under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: TRANSPOSITION (SEMITONES).................... Semitone transposition (Range -48 to + 48). (Timevariable).\n");
            fprintf(stdout,"INFO: GAIN ................................................... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE ............................... Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................. Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ............................................. Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ............ Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: FILL TOP OF SPECTRUM ........................... If transposing downwards, fill spectrum top with extra harmonics.\n");
            break;
        case(12):
            fprintf(stdout,"INFO: FRQSHIFT UNDER FORMANTS: Frqshift src spectrum of under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FREQUENCY SHIFT ................................. Frequency shift(Hz) (Range -1000 to +1000). (Timevariable).\n");
            fprintf(stdout,"INFO: GAIN ........................................ ......... Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE .............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ............................................ Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ............ Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: FILL TOP OF SPECTRUM ........................... If transposing downwards, fill spectrum top with extra harmonics.\n");
            break;
        case(13):
            fprintf(stdout,"INFO: RESPACE PARTIALS UNDER FORMANTS: Respace partials in src spectrum,retaining formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: FREQUENCY SPACING ............................ New frq spacing of partials (Hz) (Range 1 to 1000).(Timevariable).\n");
            fprintf(stdout,"INFO: GAIN ................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE ............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ........................................... Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: FILL TOP OF SPECTRUM ........................... If transposing downwards, fill spectrum top with extra harmonics.\n");
            break;
        case(14):
            fprintf(stdout,"INFO: PITCH-INVERT UNDER FORMANTS: Invert pitch of src, under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: INTERVAL MAP ................................... Set map to ZERO if no mapping is required..OTHERWISE\n");
            fprintf(stdout,"INFO:                                                                                         map is a textfile of paired values showing how intervals\n");
            fprintf(stdout,"INFO:                                                                                         (in, possibly fractional, SEMITONES)\n");
            fprintf(stdout,"INFO:                                                                                         are to be mapped onto their inversions.\n");
            fprintf(stdout,"INFO:                                                                                         Range +-%0lf semitones (+- %.0lf octaves).\n",MAXINTRANGE,MAXINTRANGE/SEMITONES_PER_OCTAVE);
            fprintf(stdout,"INFO: PIVOT PITCH ....................................... Pitch about which to invert pitch of src (Range %d to %d).\n",SPEC_MIDIMIN,MIDIMAX);
            fprintf(stdout,"INFO:                                                                                         Pitch as MIDI, with possibly fractional val.  (Timevariable).\n");
            fprintf(stdout,"INFO:                                                                                         If value zero entered, uses the mean pitch of the input.\n");
            fprintf(stdout,"INFO: GAIN ................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE ............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ........................................... Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: LOW PITCH LIMIT .................................. Minimum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: HIGH PITCH LIMIT ................................. Maximum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ...................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ..................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            break;
        case(15):
            fprintf(stdout,"INFO: PITCH-EXAGGERATE/SMOOTH UNDER FORMANTS: Exaggerate/Smooth pitch-line, retaining the formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PIVOT PITCH ....................................... Pitch about which to exaggerate/smooth the pitchline of src (Range %d to %d).\n",SPEC_MIDIMIN,MIDIMAX);
            fprintf(stdout,"INFO:                                                                                Pitch as MIDI, with possibly fractional val.  (Timevariable).\n");
            fprintf(stdout,"INFO:                                                                                If value zero entered, uses the MEAN pitch of the input.\n");
            fprintf(stdout,"INFO: RANGE MULTIPLIER ................................  Expand or Contract Range of pitchline. (Range 0 - 1).\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE .............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ........................................... Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: LOW PITCH LIMIT ................................... Minimum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: HIGH PITCH LIMIT .................................. Maximum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ...................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ..................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: TIE TO TOP ......................................... Tie to TOP of pitch range.\n");
            fprintf(stdout,"INFO: TIE TO FOOT ....................................... Tie to FOOT of pitch range.\n");
            fprintf(stdout,"INFO: TIE TO MIDDLE ..................................... Also Tie to range middle (only with other \"TIE\" flags) .\n");
            fprintf(stdout,"INFO: ABOVE MEAN ONLY ................................ Do range change ABOVE mean only.\n");
            fprintf(stdout,"INFO: BELOW MEAN ONLY ................................ Do range change BELOW mean only.\n");
            break;
        case(16):
            fprintf(stdout,"INFO: QUANTISE PITCH: Force source onto a specified pitch field.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH GRID .......................................... Textfile defining PITCH GRID on which quantised pitches must lie.\n");
            fprintf(stdout,"INFO:                  There must first be a marker indicating the grid type. These are..\n");
            fprintf(stdout,"INFO:                  #HS:    Followed by listed MIDI pitches to search for.\n");
            fprintf(stdout,"INFO:                  #HF:    Followed by listed MIDI pitches to search for IN ALL OCTAVES.\n");
            fprintf(stdout,"INFO:                  #THF:   Followed by lines each with time + list of MIDI pitches.\n");
            fprintf(stdout,"INFO:                                    1st time must be zero & times must increase.\n");
            fprintf(stdout,"INFO:                                    Each MIDI list must be the same length.\n");
            fprintf(stdout,"INFO:                                    To change number of pitches from line to line, duplicate values.\n");
            fprintf(stdout,"INFO:                  #SCALE: Followed by just TWO values.\n");
            fprintf(stdout,"INFO:                                    (a) the number of equal pitch divisions in an octave.\n");
            fprintf(stdout,"INFO:                                    (b) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO:                  #ELACS: Followed by just THREE values.\n");
            fprintf(stdout,"INFO:                                    (a) Size of \"octave\" in (possibly fractional) semitones.\n");
            fprintf(stdout,"INFO:                                    (b) the number of equal pitch divisions in \"octave\".\n");
            fprintf(stdout,"INFO:                                    (c) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE .............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................. Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ............................................ Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: LOW PITCH LIMIT ................................... Minimum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: HIGH PITCH LIMIT .................................. Maximum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: ALLOW ORNAMENTS ............................... Allow ORNAMENTS in the quantised pitch-line.\n");
            fprintf(stdout,"INFO: NO SMOOTHING .................................... No smoothing of transitions between pitches.\n");
            break;
        case(17):
            fprintf(stdout,"INFO: PITCH RANDOMISE: Randomise pitch of src.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH GRID (OR ZERO) .......................... Zero OR a textfile defining PITCH GRID on which pitches are pre-quantised.\n");
            fprintf(stdout,"INFO:                  IF SET TO ZERO, no pre-quantisation of pitch takes place \n");
            fprintf(stdout,"INFO:                  If a textfile, in that file there must first be a marker indicating the grid type. These are..\n");
            fprintf(stdout,"INFO:                  #HS:    Followed by listed MIDI pitches to search for.\n");
            fprintf(stdout,"INFO:                  #HF:    Followed by listed MIDI pitches to search for IN ALL OCTAVES.\n");
            fprintf(stdout,"INFO:                  #THF: Followed by lines each with time + list of MIDI pitches.\n");
            fprintf(stdout,"INFO:                                    1st time must be zero & times must increase.\n");
            fprintf(stdout,"INFO:                                    Each MIDI list must be the same length.\n");
            fprintf(stdout,"INFO:                                    To change number of pitches from line to line, duplicate values.\n");
            fprintf(stdout,"INFO:                  #SCALE: Followed by just TWO values.\n");
            fprintf(stdout,"INFO:                                    (a) the number of equal pitch divisions in an octave.\n");
            fprintf(stdout,"INFO:                                    (b) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO:                  #ELACS: Followed by just THREE values.\n");
            fprintf(stdout,"INFO:                                    (a) Size of \"octave\" in (possibly fractional) semitones.\n");
            fprintf(stdout,"INFO:                                    (b) the number of equal pitch divisions in \"octave\".\n");
            fprintf(stdout,"INFO:                                    (c) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO: RANDOMISATION RANGE ........................ Semitone range within which random offsets generated. (Range 0 to %d)\n",RANDPITCHMAX);
            fprintf(stdout,"INFO: RANDOMISATION SLEW .......................... Relationship between (possible) upward & downward random variation.\n");
            fprintf(stdout,"INFO:                           e.g. 2: uprange = 2 * downrange     0.5: uprange = 0.5 * downrange.\n");
            fprintf(stdout,"INFO:                           Ranges 0.1 to 10. (Value 1 has no effect).\n");
            fprintf(stdout,"INFO: GAIN ................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE ............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................ Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ........................................... Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: LOW PITCH LIMIT ..................................  Minimum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: HIGH PITCH LIMIT .................................. Maximum acceptable pitch (MIDI, possibly fractional).\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ...................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            fprintf(stdout,"INFO: FAST PITCH-CHANGE .............................. Allow fast pitch-motion in the quantised pitch-line.\n");
            fprintf(stdout,"INFO: NO SMOOTHING .................................... No smoothing of transitions between pitches.\n");
            fprintf(stdout,"INFO: NO FORMANT RESHAPING ........................ Do not reshape formants after pitch randomisation.\n");
            break;
        case(18):
            fprintf(stdout,"INFO: RANDOMISE SPECTRUM UNDER FORMANTS: Randomise spectrum, under formants.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: RANDOMISATION .................................. Randomisation of partial frequencies (Range 0 to 1).(Timevariable).\n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: ARPEGGIATION RATE .............................. Rate of arpeggiation of spectrum (Range -50 to +50 Hz).\n");
            fprintf(stdout,"INFO: LOW CUT ............................................. Cut off frequencies below this. (range 20 to 10000)\n");
            fprintf(stdout,"INFO: HIGH CUT ............................................ Cut off frequencies above this. (range 50 to 10000)\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW .............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: EXCLUDE NON-HARMONIC PARTIALS ........... Exclude non-harmonic partials.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: DOWNWARDS ....................................... Arpeggiate downwards (default upwards) (Only when ARPEGGIATION RATE > 0).\n");
            fprintf(stdout,"INFO: UP AND DOWN ...................................... Arpeggiate up and down. (Only when ARPEGGIATION RATE > 0)\n");
            break;
        case(19):
            fprintf(stdout,"INFO: SEE SPECTRAL ENVELOPES: \n");
            fprintf(stdout,"INFO: Outputs viewable (not playable) sndfile showing spectral envelope at each window as a block of +ve samples.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ... Use short-window for extracting spectral envelope.\n");
            break;
        case(20):
            fprintf(stdout,"INFO: SEE SPECTRAL PEAKS & TROUGHS: Frequencies of troughs/peaks in each window printed to textfile.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Format of the printout is:\n");
            fprintf(stdout,"INFO:    \"Trough  PEAK-1  Trough  PEAK-2  Trough  PEAK-3  Trough  PEAK-4  Trough\"\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ... Use short-window for extracting spectral envelope.\n");
            break;
        case(21):
            fprintf(stdout,"INFO: LIST TIMES OF TROUGHS BETWEEN SYLLABLES: Times printed to textfile.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: Will usually need post-correction \"by hand\".\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: MINIMUM SYLLABE DURATION .... Minimum acceptable duration for a syllable (default %.04lf)\n",MIN_SYLLAB_DUR);
            fprintf(stdout,"INFO: MINIMUM PEAK HEIGTH ............ Minimum height of peak above bracketing trofs (default %.04lf).\n",MIN_PEAKTROF_GAP);
            fprintf(stdout,"INFO:                                                                    (Maximum possible height is 1.0).\n");
            fprintf(stdout,"INFO: GET PEAKS ........................... Get syllable amplitude-peaks, rather than interening troughs.\n");
            fprintf(stdout,"INFO: GET TROUGHS AND PEAKS ........ Get both troughs and peaks,\n");
            break;
        case(22):
            fprintf(stdout,"INFO: SINE SPEECH: Convert formant frequencies to sinus tones.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: PITCH GRID (OR ZERO) ........................ ZERO or a textfile.\n");
            fprintf(stdout,"INFO:                                If this is set to ZERO, no pitch quantisation takes place.\n");
            fprintf(stdout,"INFO:                                Otherwise, this is textfile of data about pitches to quantise to.\n");
            fprintf(stdout,"INFO:                                There must first be a marker indicating the grid type. These are..\n");
            fprintf(stdout,"INFO:                                #HS:    Followed by listed MIDI pitches to quantise to.\n");
            fprintf(stdout,"INFO:                                #HF:    Followed by listed MIDI pitches to quantise to IN ALL OCTAVES.\n");
            fprintf(stdout,"INFO:                                #THF:   Followed by lines each with time + list of MIDI pitches.\n");
            fprintf(stdout,"INFO:                                        1st time must be zero & times must increase.\n");
            fprintf(stdout,"INFO:                                        Each MIDI list must be the same length.\n");
            fprintf(stdout,"INFO:                                        To change no of pitches from line to line, duplicate values.\n");
            fprintf(stdout,"INFO:                                #SCALE: Followed by just TWO values.\n");
            fprintf(stdout,"INFO:                                      (a) the number of equal pitch divisions in an octave.\n");
            fprintf(stdout,"INFO:                                      (b) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO:                                #ELACS: Followed by just THREE values.\n");
            fprintf(stdout,"INFO:                                      (a) Size of \"pseudo-octave\" in (possibly fractional) semitones.\n");
            fprintf(stdout,"INFO:                                      (b) the number of equal pitch divisions in peudo-octave.\n");
            fprintf(stdout,"INFO:                                      (c) MIDI pitch of any pitch to tune the scales to.\n");
            fprintf(stdout,"INFO: \n");
            fprintf(stdout,"INFO: GAIN .................................................. Output gain or attenuation. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: DEPTH ................................................ Degree of sinusoidisation. Range 0 to 1.\n");
            fprintf(stdout,"INFO: LEVEL1 ............................................... Relative gain or attenuation of formant1. (Range 0.01 to 10)\n");
            fprintf(stdout,"INFO: LEVEL2,LEVEL3,LEVEL4 ............................ similar for the other formants.\n");
            fprintf(stdout,"INFO: HFIELD DEPTH1 .................................... If Harmonic Field applied, how strongly to force formant1 pitches to Field (Range 0-1).\n");
            fprintf(stdout,"INFO: HFIELD DEPTH2, DEPTH3, DEPTH4 .............. Similarly for other formant bands.\n");
            fprintf(stdout,"INFO: USE SHORT WINDOW ............................. Use short-window for extracting spectral envelope.\n");
            fprintf(stdout,"INFO: FORCE FUNDAMENTAL ............................ Force lowest formant to use fundamental frq as peak.\n");
            fprintf(stdout,"INFO: NONPITCH_&_LOLEVEL_WINDOWS_ZEROED .. Replace unpitched (or extremely quiet) windows by silence.\n");
            fprintf(stdout,"INFO: SMOOTHING ........................................ Smoothing between pitches in formant traces.\n");
            break;
        }
        break;
    case(FLATTEN):
        fprintf(stdout,"INFO: EQUALISE LEVELS OF SEGMENTS (e.g. SYLLABLES) WITHIN A SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ELEMENTSIZE ...... Approx size of elements (e.g. syllables) in the source sound.\n");
        fprintf(stdout,"INFO: SHOULDER ......... Risetime to attain new (segment) level, in mS. (Range 20 to ELEMENTSIZE/2).\n"
        "                                                                           Will never be longer than the time from segment edge to segment peak.\n");
        fprintf(stdout,"INFO: TAIL ................. Portion of end of sound to be treated as a whole segment. (Range 0 to < duration (secs)).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIP :   Use the \"TAIL\" parameter to handle any anomalies (sudden loudness) at file end.\n");
        break;
    case(BOUNCE):
        fprintf(stdout,"INFO: REPEAT SOURCE, \"BOUNCING\" (ACCELERATING REPETITION WITH FADING LEVEL).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1:  Waveset-interpolate between markers.\n");
        fprintf(stdout,"INFO: MODE 2:  Waveset-interpolate within alternate marked blocks.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF BOUNCES ............................ Number of bouncing repeats (after initial sound) (Range 1 to 100).\n");
        fprintf(stdout,"INFO: FIRST BOUNCE EXTENT ........................ Timestep to first bounce entry (Range 0.04 to 10).\n");
        fprintf(stdout,"INFO: BOUNCE ACCEL ...................................... Step to next bounce is \"Bounce-accel\" times step to previous bounce (Range 0.1 to 1).\n");
        fprintf(stdout,"INFO: FINAL LEVEL ........................................ Level of final bounce, relative to source level (Range 0 to 1).\n");
        fprintf(stdout,"INFO: LEVEL DECAY SLOPE ............................ Slope of level reduction: > 1 Greater reduction at start : < 1 Greater reduction at end (Range .1 to 10).\n");
        fprintf(stdout,"INFO: SHRINK GRADUALLY(MIN_DURATION) ..  Successive events are shrunk (by cutting them short) in same proportion as change in bounce-steps.\n");
        fprintf(stdout,"INFO:                                                                           Zero value indicates NO CUTTING. Minimum non-zero value = 0.02.\n");
        fprintf(stdout,"INFO: TRIM TO SIZE ...................................... If bounced elements overlap in time, cut them short to avoid this overlap.\n");
        fprintf(stdout,"INFO: CUTS FROM START ................................ (Automatic in Mode 2) If elements are cut short, trim from the start, retaining the end of the source.\n");
        fprintf(stdout,"INFO:                                                                           (Default, trim from the end, retaining the start of the source).\n");
        break;
    case(DISTMARK):
        fprintf(stdout,"INFO: INTERPOLATE BETWEEN WAVESETS AT MARKED TIMES IN (MONO) SOURCE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIME MARKS IN SOURCE ..................... Times in source at which wavesets are to be selected.\n");
        fprintf(stdout,"INFO: WAVESETGROUP LENGTH(mS) ............... Approximate length, in mS, of waveset group to find (time-variable).\n");
        fprintf(stdout,"INFO: TIMESTRETCH ....................................... Timestretch (in output file) of steps between marks in source (time-variable).\n");
        fprintf(stdout,"INFO: GROUPLENGTH RANDOMISATION ........... Randomisation of lengths of interpolated wavesets (time-variable).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: RETROGRADE AND PHASE INVERT ALTERNATE WAVESETS (Tends to lower the pitch).\n");
        fprintf(stdout,"INFO: RETAIN ORIGINAL TAIL ..................... Once the final marker is reached, the remainder of the source is copied to the output.\n");
        fprintf(stdout,"INFO: ATTENUATION OF DISTORTED REGIONS ... reduction of level of the distorted segments relative to the undistorted.\n");
        fprintf(stdout,"INFO: RETAIN ORIGINAL TAIL ..................... Once the final marker is reached, the remainder of the source is copied to the output.\n");
        fprintf(stdout,"INFO:                                                                                 (Any source-sound before the first marker is also copied into the output).\n");
        fprintf(stdout,"INFO: SWITCH RETAINED AND DISTORTED ELEMENTS ...Switch which set of elements is distorted, and which is undistorted.\n");
        break;
    case(DISTREP):
        fprintf(stdout,"INFO: REPEAT (GROUPS OF) WAVESETS, USING SPLICES TO SMOOTH TRANSITIONS..\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Each (group of) waveset(s), in turn, is repeated.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (2)  After the first repetition-set, the process jumps to a time in the input corresponding to the time at end of current output\n");
        fprintf(stdout,"INFO:            and selects its next waveset from there, so the output is not time-dilated relative to the input.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: REPETITION COUNT ................................ Number of times to repeat each waveset(group). Can vary over time.\n");
        fprintf(stdout,"INFO: COUNT OF WAVESETS IN GROUP TO REPEAT .. How many wavesets, as a group, to repeat. Can vary over time.\n");
        fprintf(stdout,"INFO: WAVESETS TO SKIP AT START .................... Number of wavesets to ignore at file start.\n");
        fprintf(stdout,"INFO: SPLICELENGTH (mS) ................................. Length of splices, in milliseconds (0 to 50, default 15).\n");
        break;
    case(TOSTEREO):
        fprintf(stdout,"INFO: MOVE STEREO SOURCE FROM A MONO-MERGE TO TRUE STEREO, OR VICE VERSA, AND POSSIBLY INTO A MULTICHANNEL SPACE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: There are 4 possible processes.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  The stereo signal starts out merged into mono, the same signal being presented on BOTH channels of the original stereo image,\n");
        fprintf(stdout,"INFO:          and the true stereo image gradually emerges on the same 2 channels.\n");
        fprintf(stdout,"INFO: (2)  The stereo signal starts out as true stereo on a pair of channels and is gradually merged into mono,\n");
        fprintf(stdout,"INFO:          the same merged signal being presented on both of these channels.\n");
        fprintf(stdout,"INFO: (3)  The stereo signal starts out merged into mono, the merged signal being presented on a SINGLE mono channel,\n");
        fprintf(stdout,"INFO:          and the true stereo image gradually emerges onto the TWO ADJACENT CHANNELS (only) : the signal \"FORKS\".\n");
        fprintf(stdout,"INFO: (4)  The stereo signal starts out as true stereo on 2 channels SEPARATED BY an empty INTERVENING CHANNEL,\n");
        fprintf(stdout,"INFO:          and is gradually merged into a mono signal, presenting only on the intermediate channel.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Options (3) and (4) are only available if the count of \"OUTPUT CHANNELS\" is set greater than 2.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: DIVERGE START TIME .......................... Time of start of divergence from mono-merged signal (moving towards true stereo).\n");
        fprintf(stdout,"INFO: DIVERGE END TIME .............................  Time of complete emergence of true stereo.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If the \"DIVERGE\" times are IN REVERSED ORDER, the signal will gradually MERGE FROM stereo INTO mono.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OUTPUT CHANNELS ............................. Number of channels of output file.\n");
        fprintf(stdout,"INFO: LEFT CHANNEL TO : or FORK FROM .......... Channel to which original Left stereo channel is routed in output stereo image\n");
        fprintf(stdout,"INFO:                                                                          OR Channel from which signal Forks.\n");
        fprintf(stdout,"INFO: RIGHT CHANNEL TO ............................. Channel to which original Right stereo channel is routed in output stereo image.\n");
        fprintf(stdout,"INFO:                                                                          If set to ZERO and \"OUTPUT CHANNELS\" is greater than Stereo,\n");
        fprintf(stdout,"INFO:                                                                          output will FORK from \"FORK FROM\" channel to channels on either side.\n");
        fprintf(stdout,"INFO: CHANNEL LEVELS IN MIX TO MONO ........... Level of each of the separated channel signals when mix-merged to mono.\n"); 
        fprintf(stdout,"INFO:                                                                          A ZERO value sets a DEFAULT LEVEL. Otherwise, levels below 0.5 are invalid.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SUPPRESS):
        fprintf(stdout,"INFO: SUPPRESS THE MOST PROMINENT PARTIALS IN THE FRQ BAND, AND AT THE TIMES, INDICATED\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TIMESLOTS .......................... Textfile of time-pairs indicating start & end of timeslots where action is to be taken.\n");
        fprintf(stdout,"INFO: BAND LOW FREQUENCY ....... Frequency of BOTTOM of band in which partials are to be suppressed.\n");
        fprintf(stdout,"INFO: BAND HIGH FREQUENCY ..... Frequency of TOP of band in which partials are to be suppressed.\n");
        fprintf(stdout,"INFO: PARTIALS TO SUPPRESS ... The number of partials to suppress.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CALTRAIN):
        fprintf(stdout,"INFO: BLUR THE HIGH FREQUNCY COMPONENTS OF THE SPECTRUM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: AVERAGE OVER TIME (SECS) .. Time in seconds over which upper frequncy data is averaged.\n");
        fprintf(stdout,"INFO: BLUR ABOVE FRQ (HZ) ............ Frequency (Hz) above which spectrum is blurred.\n");
        fprintf(stdout,"INFO: CUT BASS BELOW FRQ (HZ) .... Frequencies below this in the spectrum are suppressed.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECENV):
        fprintf(stdout,"INFO: APPLY SPECTRAL ENVELOPE OF FILE2 TO FILE1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: WINDOWSIZE (ANALCHANCNT OR OCTAVES) ...... frequency-width of the windows used to extract the spectral envelope.\n");
        fprintf(stdout,"INFO:                                                                                     Either the number of analysis channels per window, or the window-width in octaves.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: BALANCE WITH SOURCES .............................. Ammount of original sources to mix into the transformed output.\n");
        fprintf(stdout,"INFO:                                                                                     Values > 0 are the ratio of sourcefile 1 in the final mix.\n");
        fprintf(stdout,"INFO:                                                                                     Values < 0 are converted to positive values and are then the ratio of sourcefile 2 in the mix.\n");
        fprintf(stdout,"INFO:                                                                                     Default value is zero (none of either source is mixed into the output).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: READ WINDOWSIZE AS OCTAVES .................... Default: windowsize is the number of analysis channels per window.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: IMPOSE SPECTRAL ENVELOPE ......................... Impose spectral envelope of file 2 OVER that of file 1. Default is to REPLACE that of file 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: LOUDNESS CONTOUR FOLLOWS FILE 2 .............. Default is to follow the loudness contour of File 1.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: If the window-amplitude of file 2 (but not file 1) falls below a (near-to-zero) threshold, the file 1 window is passed through with no processing.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(CLIP):
        fprintf(stdout,"INFO: CLIP PEAKS OF SOUND (DISTORTION).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  Clip at given signal level.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (2)  Clip every waveset at given fraction of its maximum height.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS-----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CLIP LEVEL (Mode 1)....... Signal level at which input sound is clipped.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: CLIP LEVEL (Mode 2) .......Fraction of maximum height of each waveset at which (all) wavesets are clipped.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECEX):
        fprintf(stdout,"INFO: TIMESTRETCH SEGMENT OF ANALYSIS FILE WITH RANDOMISATION OF WINDOWS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: STARTTIME OF REGION TO STRETCH ...................... Time in source where region to be stretched begins.\n");
        fprintf(stdout,"INFO: DURATION OF REGION TO STRETCH ......................... Duration of region to be stretched.\n");
        fprintf(stdout,"INFO: TIME STRETCHING RATIO ......................................... Time stretch to apply (at least 2).\n");
        fprintf(stdout,"INFO: NO OF WINDOWS IN GROUPS-FOR-PERMUTATION ... Time-stretching repeats selected region, but with windows randomly permuted.\n");
        fprintf(stdout,"INFO:                                                                                      Windows can be collected into groups, and these groups permuted.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: INCLUDE SOUND BEFORE STRETCHED PORTION ........... Sound before stretched portion is retained.\n");
        fprintf(stdout,"INFO: INCLUDE SOUND AFTER STRETCHED PORTION ............. Sound after stretched portion is retained.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(MATRIX):
        fprintf(stdout,"INFO: SPECTRALLY WARP SOUNDFILE, USING UNITARY MATRIX, OR OTHERWISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  GENERATE (SAVE TO FILE) AND USE A RANDOM UNITARY MATRIX.\n");
        fprintf(stdout,"INFO: (2)  USE AN EXISTING UNITARY MATRIX FILE.\n");
        fprintf(stdout,"INFO: (3)  SWAP AMPLITUDE AND PHASE VALUES OF FFT.\n");
        fprintf(stdout,"INFO: (4)  INVERT (x MINUS 1) PHASE VALUES IN FFT .\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS IF NOT IN MODE 2----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ANALYSIS POINTS..(2-32768 (power of 2)): default 1024\n");
        fprintf(stdout,"INFO: .................More points give better freq resolution\n");
        fprintf(stdout,"INFO: .................but worse time-resolution (e.g. rapidly changing spectrum).\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: OVERLAP..........Filter overlap factor (1-4): default 3\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(TRANSPART):
        fprintf(stdout,"INFO: TRANSPOSE OR SHIFT ONLY PART OF SPECTRUM, ABOVE OR BELOW A GIVEN FREQUNCY.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES---------------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  TRANSPOSE ABOVE FRQ, RETAINING ORIGINAL FORMANTS.\n");
        fprintf(stdout,"INFO: (2)  TRANSPOSE BELOW FRQ, RETAINING ORIGINAL FORMANTS.\n");
        fprintf(stdout,"INFO: (3)  TRANSPOSE ABOVE FRQ, ALSO MOVING FORMANTS.\n");
        fprintf(stdout,"INFO: (4)  TRANSPOSE BELOW FRQ, ALSO MOVING FORMANTS.\n");
        fprintf(stdout,"INFO: (5)  FREQUENCY SHIFT ABOVE FRQ, RETAINING ORIGINAL FORMANTS.\n");
        fprintf(stdout,"INFO: (6)  FREQUENCY SHIFT BELOW FRQ, RETAINING ORIGINAL FORMANTS.\n");
        fprintf(stdout,"INFO: (7)  FREQUENCY SHIFT ABOVE FRQ, ALSO MOVING FORMANTS.\n");
        fprintf(stdout,"INFO: (8)  FREQUENCY SHIFT BELOW FRQ, ALSO MOVING FORMANTS.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FOR TRANSPOSITION\n");
        fprintf(stdout,"INFO: TRANSPOSITION IN SEMITONES ............ Semitone transposition. Range : 4 octaves, up or down.\n");
        fprintf(stdout,"INFO: FOR FREQUENCY SHIFTING\n");
        fprintf(stdout,"INFO: FREQUNCY SHIFT IN HZ ..................... Frequency shift in Hz. Range : (nyquist/4) up or down.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ABOVE/BELOW THIS FREQUENCY ONLY .. Frq above/below which spectrum shifted (Range: 5 to nyquist/2)\n");
        fprintf(stdout,"INFO: OVERALL GAIN ............................... Range : 0.1 to 1.0\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECINVNU):
        fprintf(stdout,"INFO: INVERT THE SPECTRAL AMPLITUDES OVER A SPECIFIED RANGE OF THE SPECTRUM\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: The spectral inversion is over a range of frequencies (a \"region\") which you specify (params 1 & 2).\n");
        fprintf(stdout,"INFO: You must also search for the spectral peak lying between 0Hz and a cutoff frequency (param 3)\n");
        fprintf(stdout,"INFO: This peak is used to create a spectral-amplitude-envelope, used to rebalance the inverted spectrum.\n");
        fprintf(stdout,"INFO: Parameter (3) must lie between the Start Frq of the region (param 1)\n");
        fprintf(stdout,"INFO: and the halfway-point frequency of that region.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  START FRQ OF REGION TO INVERT ................. Range : 0 to nyquist/2\n");
        fprintf(stdout,"INFO: (2)  END FRQ OF REGION TO INVERT .................... Range : 100 to nyquist.\n");
        fprintf(stdout,"INFO: (3)  TOP FRQ TO END SEARCH FOR SPECTRAL PEAK .. Range : 0 to nyquist\n");
        fprintf(stdout,"INFO: (4)  GAIN ...................................................... Range : 0.1 to 1.0\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECCONV):
        fprintf(stdout,"INFO: EXPERIMENTAL CONVOLUTION PROCESS (NOT RECOMMENDED)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1 : CONVOLVE SOUND WITH ITSELF\n");
        fprintf(stdout,"INFO: MODE 2 : CONVOLVE SOUND WITH ANOTHER, EQUAL LENGTH OR SHORTER, SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  OVERALL GAIN ........................... Range : 0.1 to 10.0\n");
        fprintf(stdout,"INFO: (2)  APPLY PROCESS THIS MANY TIMES .. Range : (Mode 1) 1 to 10  (Mode 2) 1 to 2.\n");
        fprintf(stdout,"INFO: (3)  DON'T TIME-STRETCH FILE 2 ......... (Mode 2 ONLY)\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECSND):
        fprintf(stdout,"INFO: TREAT SPECTRUM AS IF IT WERE A SOUND\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Spectral envelope is treated as a waveform.\n");
        fprintf(stdout,"INFO: Ouput pitch derives from maximum amplitude in the spectrum.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: (1)  MINIMUM UPWARD TRANSPOSITION IN OCTAVES .... Range : 0 to 8\n");
        fprintf(stdout,"INFO: (2)  MAXIMUM UPWARD TRANSPOSITION IN OCTAVES .... Range : 1 to 8.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(SPECFRAC):
        fprintf(stdout,"INFO: CREATE FRACTAL VERSION OF SPECTRUM.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NB Ouput sounds depend on number of analysis channels used in source.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1 : Abutt 2 copies, then shrink to orig size by time-contraction.\n");
        fprintf(stdout,"INFO: MODE 2 : Abutt copy with reverse-copy, then shrink by time-contraction.\n");
        fprintf(stdout,"INFO: MODE 3 : As mode 2, but cut into segments and process each segment in turn.\n");
        fprintf(stdout,"INFO: MODE 4 : As mode 3, but shrink by averaging.\n");
        fprintf(stdout,"INFO: MODE 5 : Swap two halves of segments.\n");
        fprintf(stdout,"INFO: MODE 6 : Reverse 2nd half of segments.\n");
        fprintf(stdout,"INFO: MODE 7 : Interleave two halves of segments.\n");
        fprintf(stdout,"INFO: MODE 8 : Reverse 2nd half of segments, then interleave.\n");
        fprintf(stdout,"INFO: MODE 9 : Interleave, retaining original speed.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: NUMBER OF FRACTAL LAYERS .................. Number of times fractalisation process applied.\n");
        fprintf(stdout,"INFO: OUTPUT ALL INTERMEDIATE FRACTALS .. Outputs sound made at each intermediate stage of fractalisation.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ENVSPEAK):
        fprintf(stdout,"INFO: PROCESS SPEECH \"SYLLABLE\"-WISE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES 1-12  Extract the \"syllables\" by an automatic envelope-tracking process.\n");
        fprintf(stdout,"INFO: MODES 13-24 Expects a File specifying the necessary cut-times to separate the sound into syllables.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: 1 & 13 : Repeat each syllable, N times.\n");
        fprintf(stdout,"INFO: 2 & 14 : Reverse-repeat each syllable.\n");
        fprintf(stdout,"INFO: 3 & 15 : Attenuate N in N+1 syllables.\n");
        fprintf(stdout,"INFO: 4 & 16 : Attenuate all except N in N+1 syllables.\n");
        fprintf(stdout,"INFO: 5 & 17 : Repeat each syllable N times, shrinking from its end, on each repeat, by 1/Nth.\n");
        fprintf(stdout,"INFO: 6 & 18 : Repeat each syllable N times, shrinking from its start, on each repeat, by 1/N.\n");
        fprintf(stdout,"INFO: 7 & 19 : Divide each syllable into N parts, and repeat just one of those parts, N times.\n");
        fprintf(stdout,"INFO: 8 & 20 : For each syllable, repeat it, shrinking from its end by a specified Ratio.\n");
        fprintf(stdout,"INFO: 9 & 21 : For each syllable, repeat it, shrinking from its start by a specified Ratio.\n");
        fprintf(stdout,"INFO: 10 & 22 : Extract all the syllables.\n");
        fprintf(stdout,"INFO: 11 & 23 : Randomly reorder the syllables.\n");
        fprintf(stdout,"INFO: 12 & 24 : Reverse order of first N syllable , then order of 2nd N syllable,  etc.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (mS) (Modes 1-12 ONLY) ........... Size of envelope-search window in mS (default 50).\n");
        fprintf(stdout,"INFO: SYLLABLE CUT TIMES (secs) (Modes 13-24 ONLY).............. Position of cuts (except at zero and end of file) to separate the syllables.\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (mS) ............................................... Splice length in mS (default 15) \n");
        fprintf(stdout,"INFO: INITIAL SYLLABLES TO SKIP ....................................... Number of syllables at sound start to send to output UNCHANGED.\n");
        fprintf(stdout,"INFO: NUMBER OF REPETITIONS ........................................ Number of repetitions of each syllable (Range 2 upwards).\n");
        fprintf(stdout,"INFO: N (ATTEN N in every N+1 SYLLABLES) ........................... Size of Each Group of syllables to attenuate : N = 3 means attenuate 3 in every 4.\n");
        fprintf(stdout,"INFO: N (DON'T ATTEN N in every N+1 SYLLABS) .....................  Size of Each Group of syllables NOT to attenuate : N = 3 means DON'T attenuate 3 in every 4.\n");
        fprintf(stdout,"INFO: GAIN ON ATTENUATED SYLLABLES ............................... Reduce the level of Attenuated syllables by this number of dBs: (Range -96 to < 0)\n");
        fprintf(stdout,"INFO: NO OF PARTS TO DIVIDE SYLLABLES INTO .....................  For each syllable, Keep 1/Nth part, and repeat that part N times.\n");
        fprintf(stdout,"INFO: WHICH DIVIDED ELEMENT TO USE ............................... Which division of the divided-sylllable to repeat (Range 1 to N)\n");
        fprintf(stdout,"INFO: CONTRACTION RATIO ............................................. Reduce length of repeated elements by this Ratio : Range (> 0.0 to 1)\n");
        fprintf(stdout,"INFO: DEGREE OF RANDOMISATION, LENGTHS OF REPET UNITS .. Degree of Randomisation of the lengths of repeated units.\n");
        fprintf(stdout,"INFO: REVERSE ORDER IN GROUPS OF ................................. Reverse the order order of the first N syllables, then the order of the 2nd N, and so on ....\n");
        fprintf(stdout,"INFO: SEED FOR RANDOM PERMUTATION ............................. (Modes 11 only) Initialises the random number generator for Random reorderings of the syllables.\n");
        fprintf(stdout,"INFO:                                                                                                   If the Seed is NOT 0, using the same seed again on a future pass gives IDENTICAL random output.\n");
        fprintf(stdout,"INFO: REPEATED ELEMENTS DO NOT GROW IN SIZE ................. (Mode 7 only) with many divisions, may give a mechanical or buzzing quality to the ouptut.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(EXTSPEAK):
        fprintf(stdout,"INFO: OVERWRITE OR REPLACE SPEECH SYLLABLES WITH ALTERNATIVE \"SYLLABLES\"\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------------------------------------MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: FINDING THE ORIGINAL SYLLABLES IN INPUT FILE 1.\n");
        fprintf(stdout,"INFO:            In Modes 1-6 the \"syllables\" in file-1 are extracted by an automatic process using the ENVELOPE WINDOW SIZE parameter.\n");
        fprintf(stdout,"INFO:                                  Results may be good enough for some applications, but not as good as ...\n");
        fprintf(stdout,"INFO:            In Modes 7-18 the syllable-boundaries in file-1 are marked \"by hand\" on a graphic of the original soundfile.\n");
        fprintf(stdout,"INFO:                                  Markers at time zero, and at the end of the sound are not required.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: USE OF THE NEW SYLLABLES, FROM INPUT FILES 2,3 ....\n");
        fprintf(stdout,"INFO:            In Modes 1-3,7-9     new syllables REPLACE, or are INJECTED BETWEEN, the original syllables.\n");
        fprintf(stdout,"INFO:            In Modes 4-6,10-12 new syllables MIX INTO the original syllables.\n");
        fprintf(stdout,"INFO:            In Modes 13-15        new syllables REPLACE the SPECIFIED original syllables.\n");
        fprintf(stdout,"INFO:            In Modes 16-18        new syllables MIX INTO the SPECIFIED original syllables.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ORDER OF THE NEW SYLLABLES.\n");
        fprintf(stdout,"INFO:            Modes 1,4,7,10,13,16:  Insert syllables in the Order of the input files. Or (\"SELECT INSERTS AT RANDOM\") Entirely at Random.\n");
        fprintf(stdout,"INFO:            Modes 2,5,8,11,14,17:  Insert ALL syllables in the input files in some random order, then permute that order before adding more syllables, and so on.\n");
        fprintf(stdout,"INFO:            Modes 3,6,9,12,15,18:  Insert syllables in a specific pattern, specified in the Pattern File.\n");
        fprintf(stdout,"INFO:                                                   For example : Pattern \"1 5 2\" means insert syllables 1,5 and 2 from the input list, in that order, then repeat (so 1 5 2 1 5 2 1 ....etc.)\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------------------------------------INPUT DATA (Scroll down for MORE)---------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Many of the modes require you to enter data in a TEXT FILE.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:            SYLLABLE BOUNDARY TIMES   Modes 7-18             This LIST OF TIMES indicate where file1 is to be divided, to produce separate syllables.\n");
        fprintf(stdout,"INFO:                                                                                             You do not need to indicate a cut at zero time or at the file end (if you do, these are ignored).\n");
        fprintf(stdout,"INFO:                                                                                             there is one cut for the END of each syllable, and the area after the last cut is a final syllable.\n");
        fprintf(stdout,"INFO:                                                                                             So with C cuts, there will be C+1 syllables.\n");
        fprintf(stdout,"INFO:                                                                                             IN OTHER MODES \"syllables\" are cut automatically,\n");
        fprintf(stdout,"INFO:                                                                                             using the ENVELOPE WINDOW SIZE parameter to scan the loudness envelope of the input file.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:            PATTERN OF INSERTS        Modes 3,6,8,12,15      This LIST OF NUMBERS indicates the order of the syllables to be added.\n");
        fprintf(stdout,"INFO:                                                                                             The pattern \"2  5  1\" means add syllable 2, then syllable 5, then syllable 1: And then repeat this pattern as long as necessary.\n");
        fprintf(stdout,"INFO:                            OTHERWISE:     Modes 1,4,7,10,13,16  Uses the new syllables in the order you enter them on the \"Chosen Files\" listing EXCEPT \n");
        fprintf(stdout,"INFO:                                                                                             with the \"SELECT INSERTS AT RANDOM\" flag, which causes new syllables to be selected entirely randomly.\n");
        fprintf(stdout,"INFO:                                                      Modes 2,5,8,11,14,17   Uses ALL new syllables in some random order, before creating a different random order and using ALL the files again, and so on ...\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:            SYLLABLES TO TARGET     Modes 12 - 18                This LIST OF NUMBERS indicates which of the syllables in the first infile are to reaplaced, or mixed-over by the syllables in the other files.\n");
        fprintf(stdout,"INFO:                            OTHERWISE:                                           This is determined by the parameter \"N\" and the Flag \"N = RETAIN ...\".\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO:            Note that, in some modes 2 or 3 of these data sets are required, in the SAME textfile. In this case THE DATA SETS ARE SEPARATED BY A LINE WITH A SINGLE \"#\" CHARACTER.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------------------------------------PARAMETERS (Scroll down for MORE)---------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (mS) ...................................... Size of envelope-search window in mS (default 50).\n");
        fprintf(stdout,"INFO: SPLICE LENGTH (mS) .................................................. Splice length for cutting and joining syllables, in mS (default 15) \n");
        fprintf(stdout,"INFO: INITIAL SYLLABLES TO SKIP .......................................... Number of syllables at sound start to send to the output UNCHANGED.\n");
        fprintf(stdout,"INFO: N = RETAIN 1 ORIG SYLLAB FOR EVERY N OVERWRITTEN ...... Size of Group replaced/overwritten/inserted : N = 3 means r-o-i 3 in every 4  (BUT see \"-k\" Flag)\n");
        fprintf(stdout,"INFO: OVERALL ATTENUATION OF INSERTED SYLLABLES ............... Reduce the level of the new syllables by this number of dBs: (Range -96 to < 0)\n");
        fprintf(stdout,"INFO: (NOT Modes 3,6,9,12,15,18) SEED FOR RANDOM GENERATOR Initialises the random number generator for Random reorderings of the syllables.\n");
        fprintf(stdout,"INFO:                                                                                                        If the Seed is NOT 0, using the same seed again on a future pass gives IDENTICAL random output.\n");
        fprintf(stdout,"INFO: N = RETAIN N ORIG SYLLABS FOR EVERY 1 OVERWRITTEN .... Changes the meaning of the Parameter N.\n");
        fprintf(stdout,"INFO:                                                                                                       (see the examples below).\n");
        fprintf(stdout,"INFO: TRANSPOSE (RATHER THAN CUT TO SIZE) INSERTS ............. Default option cuts (or pads with zeros) the resized syllables.\n");
        fprintf(stdout,"INFO: FOLLOW ENVELOPE OF OVERWRITTEN SYLLABLES ............... Inserted syllables follow level-contour of original syllables.\n");
        fprintf(stdout,"INFO: INSERT BETWEEN (RATHER THAN OVERWRITE) .................. Don't overwrite/mix-into the original syllables. INSERT the new syllables After the existing syllables.\n");
        fprintf(stdout,"INFO:                                                                                                       (see the examples below).\n");
        fprintf(stdout,"INFO: RETAIN ORIGINAL DURATION OF INSERTS ........................ This option (typically) changes the duration and rhythm of the output relative to that of the (1st) input file.\n");
        fprintf(stdout,"INFO:                                                                                                        Default option RESIZES the inserted syllables to match the durations of the replaced syllables.\n");
        fprintf(stdout,"INFO: (Modes 1,4,7,10,13,16) SELECT INSERTS AT RANDOM .......... Select next syllable to insert, from the input syllable-files, ENTIRELY at random.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ----------------------------------------------------------HOW THE N-patterning WORKS---------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: STARTING WITH A SET OF 9 SYLLABLES USING A VALUE N=2: ..... S S S S S S S S S\n");
        fprintf(stdout,"INFO:                                         NO FLAGS gives .............................. S x x S x x S x x\n");
        fprintf(stdout,"INFO:                                         \"N = RETAIN ...\" FLAG gives ............... S S x S S x S S x\n");
        fprintf(stdout,"INFO:                                         \"INSERT ...\" FLAG gives ....................  S x x S x x S x x S x x S x x S x x S x x S x x S x x\n");
        fprintf(stdout,"INFO:                                         Using BOTH OF THESE FLAGS gives ....... S S x S S x S S x S S x S\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(ENVSCULPT):
        fprintf(stdout,"INFO: SCULPT SHARP ATTACK FROM SYLLABLE\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODES----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MODE 1 : SCULPT AN EVENT\n");
        fprintf(stdout,"INFO: MODE 2 : SCULPT A USER-SPECIFIED DOUBLE-EVENT (e.g. Consonant-Vowel) .\n");
        fprintf(stdout,"INFO: MODE 3 : SCULPT A DOUBLE-EVENT AUTOMATICALLY.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (mS) ................. Window Size for extracting envelope (1-64 dflt 20)\n");
        fprintf(stdout,"INFO: RISE TIME (mS) ................................... (Max) Duration of attack onset (mS).\n");
        fprintf(stdout,"INFO: DECAY DURATION ................................ Maximum time to reach zero after the attack peak.\n");
        fprintf(stdout,"INFO: STEEPNESS  ........................................ Steepness of decay : 1 = linear, > 1 steeper.\n");
        fprintf(stdout,"INFO: CONSONANT DECAY START ..................... Time at which sound after 1st attack can start to fall to zero.\n");
        fprintf(stdout,"INFO: CONSONANT DECAY END ........................ End time of decay-to-zero after 1st attack.\n");
        fprintf(stdout,"INFO: LOUDNESS RATIO OF 1st TO 2nd ATTACKS .. Ratio of loudness of First attack to loudness of Second (Dflt 1).\n");
        fprintf(stdout,"INFO: ATTACK 2nd PEAK ONLY (Mode 3) ............. Peak One is isolated, but with no Attack.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(TREMENV):
        fprintf(stdout,"INFO: TREMOLO A SOUND AFTER ITS PEAK, WITH TREMOLO-WIDTH NARROWING.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: TREMOLO FREQUENCY ....................... is frequency of the tremolo vibration itself.\n");
        fprintf(stdout,"INFO: TREMOLO DEPTH ............................... amplitude depth of tremolo.\n");
        fprintf(stdout,"INFO: ENVELOPE WINDOW SIZE (mS) ....... Window Size for extracting envelope (1-64 dflt 20)\n");
        fprintf(stdout,"INFO: PEAK NARROWING .................. Tremolo peaks can be made narrower.\n");
        fprintf(stdout,"INFO: \n");
        break;
    case(DCFIX):
        fprintf(stdout,"INFO: REMOVE DC SIGNAL FROM A DISTORTED SOUND.\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: Use with \"Distort Multiply\".\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: PARAMETERS----------------------------------------------------------\n");
        fprintf(stdout,"INFO: \n");
        fprintf(stdout,"INFO: MINIMUM DURATION OF DC (mS) ...... Minimu duration of any block of DC signal to be removed.\n");
        fprintf(stdout,"INFO: \n");
        break;
    default:
        fprintf(stdout,"ERROR: Unknown PROCESS\n");
        fprintf(stdout,"INFO: \n");
        break;
    }
    return 0;
}

void RoomReverbFormat(void)
{
    fprintf(stdout,"INFO: DELAY TIMES AMPS (& POSITIONS). A Text Datafile.\n");
    fprintf(stdout,"INFO:       Each line has either 2 vals (TIME , AMP of one of delays) or 3 (3rd is spatial POSITION in stereo space).\n");
    fprintf(stdout,"INFO:       TIMES (seconds) must be increasing. Duplicate times are ignored.\n");
    fprintf(stdout,"INFO:       A zero time (no delay) overrides the mix parameter, and determines the level and pan of the (effectively mono) input.\n");
    fprintf(stdout,"INFO:       AMP values must be in the range 0.0 to 1.0\n");
    fprintf(stdout,"INFO:       Empty lines and lines starting with a semi-colon (e.g. comments) are permitted.\n");
    fprintf(stdout,"INFO:       If a Position value is used in any line, outfile will be stereo.\n");
    fprintf(stdout,"INFO:       POSITION values are nominally in the range -1 to +1:     0 = centre.  If all position values are 0, the output will be mono.\n");
    fprintf(stdout,"INFO:       Values beyond these limits result in attenuation according to the inverse-square law, to suggest distance beyond the speakers.\n");
}
