Răsfoiți Sursa

remove duplicate file

richarddobson 2 ani în urmă
părinte
comite
fc0b7a02e0
1 a modificat fișierele cu 0 adăugiri și 2391 ștergeri
  1. 0 2391
      dev/science/fractal.c

+ 0 - 2391
dev/science/fractal.c

@@ -1,2391 +0,0 @@
-/*
- * Copyright (c) 1983-2023 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
- *
- */
-
-// see HEREH
-//  TEST cmdline =
-//  _cdprogs\fractal wave 1 sin_cycle.wav testfrac.wav fracshape.brk 4 -m2
-//  Only getting 1/2-way through the pattern ... why??
-//  look at "seedata.txt" to check times advance!!!!
-//  _cdprogs\fractal spectrum zzz.ana testfrac.ana fracshape5.brk
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <structures.h>
-#include <tkglobals.h>
-#include <pnames.h>
-#include <filetype.h>
-#include <processno.h>
-#include <modeno.h>
-#include <logic.h>
-#include <globcon.h>
-#include <cdpmain.h>
-#include <math.h>
-#include <mixxcon.h>
-#include <osbind.h>
-#include <standalone.h>
-#include <science.h>
-#include <ctype.h>
-#include <sfsys.h>
-#include <string.h>
-#include <srates.h>
-
-
-#ifdef unix
-#define round(x) lround((x))
-#endif
-#ifndef HUGE
-#define HUGE 3.40282347e+38F
-#endif
-
-#define FRAC_SPLICELEN  50          //  Ms  
-#define FRAC_FORMANTS   4           //  No of formants used
-
-#define FRAC_SHRINK     0
-#define FRAC_OUTIMES    1
-
-#define  mintime        timemark            //  Minimum possible duration of any fractal element    
-#define  startfrq       frametime           //  Frq of first pitch in (Mode 1) fractal_pitch-pattern
-#define  maxtrnsp       is_flat             //  Maximum possible upward-transpostion of any fractal element
-#define  arraysize      rampbrksize         //  Array size for totally fractalised pattern
-#define  fracdur        minbrk              //  Input duration of the fractal template
-#define  minstep        scalefact           //  Minimum element-duration in fractal template
-#define  minfracratio   halfchwidth         //  Time shrinkage of smallest element in fractal template, when proceeding from one fractal level to next
-#define  maxfractalise  ringsize            //  Maximum degree of fractalisation
-#define  timevary       is_transpos         //  Inicates that fractal patterning varies through time
-#define  fracsize       fzeroset            //  Number of elements in current totally-fractalised pattern
-#define  convertor      chwidth
-#define  total_splice   specenv_type        //  Total number of samples used in (any) end-splice
-#define  splicesmps     deal_with_chan_data //  No of grouped-samples in (any) end-splice
-#define  maxtransshrink is_sharp            //  Time-shrinkage of the element with maximum upward transposition, when proceeding from one fractal level to next
-#define  mintransshrink minnum              //  Time-shrinkage of the element with maximum downward transposition, when proceeding from one fractal level to next
-
-#define FRACDUR     0
-#define FRACMAX     1
-#define FRACTSTR    2
-#define FRACISTR    3
-
-char errstr[2400];
-
-int anal_infiles = 1;
-int sloom = 0;
-int sloombatch = 0;
-
-const char* cdp_version = "6.1.0";
-
-//CDP LIB REPLACEMENTS
-static int check_fractal_param_validity_and_consistency(dataptr dz);
-static int setup_fractal_application(dataptr dz);
-static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
-static int parse_infile_and_check_type(char **cmdline,dataptr dz);
-static int setup_fractal_param_ranges_and_defaults(dataptr dz);
-static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
-static int setup_and_init_input_param_activity(dataptr dz,int tipc);
-static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
-static int establish_application(dataptr dz);
-static int initialise_vflags(dataptr dz);
-static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
-static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
-static int mark_parameter_types(dataptr dz,aplptr ap);
-static int assign_file_data_storage(int infilecnt,dataptr dz);
-static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
-static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
-static int get_the_mode_from_cmdline(char *str,dataptr dz);
-static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
-static int handle_the_special_data(char *str,dataptr dz);
-static int create_fractal_sndbufs(dataptr dz);
-static void get_max_fractalisation(dataptr dz);
-static int fractalise(dataptr dz);
-static int fractal_initialise_specenv(int *arraycnt,dataptr dz);
-static int fractal_set_specenv_frqs(int arraycnt,dataptr dz);
-static int fractal_setup_octaveband_steps(double **interval,dataptr dz);
-static int fractal_setup_low_octave_bands(int arraycnt,dataptr dz);
-static int fractal_extract_specenv(dataptr dz);
-static int fractal_tranpose_within_formant_envelope(int vc,double transpose,dataptr dz);
-static int fractal_reposition_partials_in_appropriate_channels(double transpose,dataptr dz);
-static int fractal_spectrnsf(double transpose,dataptr dz);
-static int fractal_getspecenvamp(double *thisamp,double thisfrq,dataptr dz);
-static int fractal_get_channel_corresponding_to_frq(int *chan,double thisfrq,dataptr dz);
-
-/**************************************** MAIN *********************************************/
-
-int main(int argc,char *argv[])
-{
-    int exit_status;
-    dataptr dz = NULL;
-    char **cmdline;
-    int  cmdlinecnt;
-    int arraycnt = 0;
-    char specialname[1200];
-//    aplptr ap;
-    int is_launched = FALSE;
-    if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
-        fprintf(stdout,"%s\n",cdp_version);
-        fflush(stdout);
-        return 0;
-    }
-                        /* CHECK FOR SOUNDLOOM */
-    if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
-        sloom = 0;
-        sloombatch = 1;
-    }
-    if(sflinit("cdp")){
-        sfperror("cdp: initialisation\n");
-        return(FAILED);
-    }
-                          /* SET UP THE PRINCIPLE DATASTRUCTURE */
-    if((exit_status = establish_datastructure(&dz))<0) {                    // CDP LIB
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    if(!sloom) {
-        if(argc == 1) {
-            usage1();   
-            return(FAILED);
-        } else if(argc == 2) {
-            usage2(argv[1]);    
-            return(FAILED);
-        }
-    }
-    if(!sloom) {
-        if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) {     // CDP LIB
-            print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-            return(FAILED);
-        }
-        cmdline    = argv;
-        cmdlinecnt = argc;
-        if((get_the_process_no(argv[0],dz))<0)
-            return(FAILED);
-        cmdline++;
-        cmdlinecnt--;
-        if(dz->process == FRACTAL) {
-            dz->maxmode = 2;
-            if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
-                print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-                return(exit_status);
-            }
-            cmdline++;
-            cmdlinecnt--;
-        } else
-            dz->maxmode = 0;
-        // setup_particular_application =
-        if((exit_status = setup_fractal_application(dz))<0) {
-            print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-            return(FAILED);
-        }
-        if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) {       // CDP LIB
-            print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-            return(FAILED);
-        }
-    } else {
-        //parse_TK_data() =
-        if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
-            exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-            return(exit_status);         
-        }
-    }
-//    ap = dz->application;
-
-    // parse_infile_and_hone_type() = 
-    if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
-        exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    // setup_param_ranges_and_defaults() =
-    if((exit_status = setup_fractal_param_ranges_and_defaults(dz))<0) {
-        exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    // open_first_infile        CDP LIB
-    if((exit_status = open_first_infile(cmdline[0],dz))<0) {    
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);  
-        return(FAILED);
-    }
-    cmdlinecnt--;
-    cmdline++;
-    if(dz->process == FRACSPEC) {
-        dz->nyquist     = dz->infile->origrate/2.0;
-        dz->frametime   = (float)(1.0/dz->infile->arate);
-        dz->clength     = dz->wanted / 2;
-        dz->chwidth     = dz->nyquist/(double)(dz->clength-1);
-        dz->halfchwidth = dz->chwidth/2.0;
-        if((exit_status = fractal_initialise_specenv(&arraycnt,dz))<0) {    
-            print_messages_and_close_sndfiles(exit_status,is_launched,dz);  
-            return(FAILED);
-        }
-        dz->formant_bands = FRAC_FORMANTS;
-        if((exit_status = fractal_set_specenv_frqs(arraycnt,dz))<0) {   
-            print_messages_and_close_sndfiles(exit_status,is_launched,dz);  
-            return(FAILED);
-        }
-    }
-//  handle_extra_infiles() : redundant
-    // handle_outfile() = 
-    if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-
-//  handle_formants()           redundant
-//  handle_formant_quiksearch() redundant
-//  handle_special_data()       redundant
- 
-    strcpy(specialname,cmdline[0]);
-    cmdlinecnt--;
-    cmdline++;
-    if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) {      // CDP LIB
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    if((exit_status = handle_the_special_data(specialname,dz))<0) {
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-//  check_param_validity_and_consistency ..
-    if((exit_status = check_fractal_param_validity_and_consistency(dz))<0) {
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    is_launched = TRUE;
-    if(dz->process == FRACTAL)
-        dz->bufcnt = 4;
-    else
-        dz->bufcnt = 2;
-    if((exit_status = create_fractal_sndbufs(dz))<0) {
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    //param_preprocess()                        redundant
-    //spec_process_file =
-    if((exit_status = fractalise(dz))<0) {
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    if((exit_status = complete_output(dz))<0) {                                     // CDP LIB
-        print_messages_and_close_sndfiles(exit_status,is_launched,dz);
-        return(FAILED);
-    }
-    exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz);       // CDP LIB
-    free(dz);
-    return(SUCCEEDED);
-}
-
-/**********************************************
-        REPLACED CDP LIB FUNCTIONS
-**********************************************/
-
-
-/****************************** SET_PARAM_DATA *********************************/
-
-int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
-{
-    ap->special_data   = (char)special_data;       
-    ap->param_cnt      = (char)paramcnt;
-    ap->max_param_cnt  = (char)maxparamcnt;
-    if(ap->max_param_cnt>0) {
-        if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {    
-            sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
-            return(MEMORY_ERROR);
-        }
-        strcpy(ap->param_list,paramlist); 
-    }
-    return(FINISHED);
-}
-
-/****************************** SET_VFLGS *********************************/
-
-int set_vflgs
-(aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
-{
-    ap->option_cnt   = (char) optcnt;           /*RWD added cast */
-    if(optcnt) {
-        if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
-            return(MEMORY_ERROR);
-        }
-        strcpy(ap->option_list,optlist);
-        if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
-            return(MEMORY_ERROR);
-        }
-        strcpy(ap->option_flags,optflags); 
-    }
-    ap->vflag_cnt = (char) vflagcnt;           
-    ap->variant_param_cnt = (char) vparamcnt;
-    if(vflagcnt) {
-        if((ap->variant_list  = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
-            return(MEMORY_ERROR);
-        }
-        strcpy(ap->variant_list,varlist);       
-        if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
-            return(MEMORY_ERROR);
-        }
-        strcpy(ap->variant_flags,varflags);
-
-    }
-    return(FINISHED);
-}
-
-/***************************** APPLICATION_INIT **************************/
-
-int application_init(dataptr dz)
-{
-    int exit_status;
-    int storage_cnt;
-    int tipc, brkcnt;
-    aplptr ap = dz->application;
-    if(ap->vflag_cnt>0)
-        initialise_vflags(dz);    
-    tipc  = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
-    ap->total_input_param_cnt = (char)tipc;
-    if(tipc>0) {
-        if((exit_status = setup_input_param_range_stores(tipc,ap))<0)             
-            return(exit_status);
-        if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)        
-            return(exit_status);
-        if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)    
-            return(exit_status);
-    }
-    brkcnt = tipc;
-    //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
-    if(brkcnt>0) {
-        if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)              
-            return(exit_status);
-    }
-    if((storage_cnt = tipc + ap->internal_param_cnt)>0) {         
-        if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)   
-            return(exit_status);
-        if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)      
-            return(exit_status);
-    }                                                      
-    if((exit_status = mark_parameter_types(dz,ap))<0)     
-        return(exit_status);
-    
-    // establish_infile_constants() replaced by
-    dz->infilecnt = 1;
-    //establish_bufptrs_and_extra_buffers():
-    return(FINISHED);
-}
-
-/********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
-/* RWD mallo changed to calloc; helps debug verison run as release! */
-
-int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
-{
-    if((dz->param       = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
-        sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->iparam      = (int    *)calloc(storage_cnt, sizeof(int)   ))==NULL) {
-        sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->is_int      = (char   *)calloc(storage_cnt, sizeof(char)))==NULL) {
-        sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->no_brk      = (char   *)calloc(storage_cnt, sizeof(char)))==NULL) {
-        sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
-        return(MEMORY_ERROR);
-    }
-    return(FINISHED);
-}
-
-/************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
-
-int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
-{
-    int n;
-    for(n=0;n<storage_cnt;n++) {
-        dz->is_int[n] = (char)0;
-        dz->no_brk[n] = (char)0;
-    }
-    return(FINISHED);
-}
-
-/***************************** MARK_PARAMETER_TYPES **************************/
-
-int mark_parameter_types(dataptr dz,aplptr ap)
-{
-    int n, m;                           /* PARAMS */
-    for(n=0;n<ap->max_param_cnt;n++) {
-        switch(ap->param_list[n]) {
-        case('0'):  break; /* dz->is_active[n] = 0 is default */
-        case('i'):  dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
-        case('I'):  dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;                         break;
-        case('d'):  dz->is_active[n] = (char)1;                         dz->no_brk[n] = (char)1; break;
-        case('D'):  dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */     break;
-        default:
-            sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
-            return(PROGRAM_ERROR);
-        }
-    }                               /* OPTIONS */
-    for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
-        switch(ap->option_list[n]) {
-        case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
-        case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1;                          break;
-        case('d'): dz->is_active[m] = (char)1;                          dz->no_brk[m] = (char)1; break;
-        case('D'): dz->is_active[m] = (char)1;  /* normal case: double val or brkpnt file */     break;
-        default:
-            sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
-            return(PROGRAM_ERROR);
-        }
-    }                               /* VARIANTS */
-    for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
-        switch(ap->variant_list[n]) {
-        case('0'): break;
-        case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
-        case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1;                          break;
-        case('d'): dz->is_active[m] = (char)1;                          dz->no_brk[m] = (char)1; break;
-        case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */      break;
-        default:
-            sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
-            return(PROGRAM_ERROR);
-        }
-    }                               /* INTERNAL */
-    for(n=0,
-    m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
-        switch(ap->internal_param_list[n]) {
-        case('0'):  break;   /* dummy variables: variables not used: but important for internal paream numbering!! */
-        case('i'):  dz->is_int[m] = (char)1;    dz->no_brk[m] = (char)1;    break;
-        case('d'):                              dz->no_brk[m] = (char)1;    break;
-        default:
-            sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
-            return(PROGRAM_ERROR);
-        }
-    }
-    return(FINISHED);
-}
-
-/************************ HANDLE_THE_OUTFILE *********************/
-
-int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
-{
-    int exit_status;
-    char *filename = (*cmdline)[0];
-    if(filename[0]=='-' && filename[1]=='f') {
-        dz->floatsam_output = 1;
-        dz->true_outfile_stype = SAMP_FLOAT;
-        filename+= 2;
-    }
-    if(!sloom) {
-        if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
-            sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
-            return(DATA_ERROR);
-        }
-    }
-    strcpy(dz->outfilename,filename);      
-    if((exit_status = create_sized_outfile(filename,dz))<0)
-        return(exit_status);
-    (*cmdline)++;
-    (*cmdlinecnt)--;
-    return(FINISHED);
-}
-
-/***************************** ESTABLISH_APPLICATION **************************/
-
-int establish_application(dataptr dz)
-{
-    aplptr ap;
-    if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
-        sprintf(errstr,"establish_application()\n");
-        return(MEMORY_ERROR);
-    }
-    ap = dz->application;
-    memset((char *)ap,0,sizeof(struct applic));
-    return(FINISHED);
-}
-
-/************************* INITIALISE_VFLAGS *************************/
-
-int initialise_vflags(dataptr dz)
-{
-    int n;
-    if((dz->vflag  = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
-        return(MEMORY_ERROR);
-    }
-    for(n=0;n<dz->application->vflag_cnt;n++)
-        dz->vflag[n]  = FALSE;
-    return FINISHED;
-}
-
-/************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
-
-int setup_input_param_defaultval_stores(int tipc,aplptr ap)
-{
-    int n;
-    if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
-        return(MEMORY_ERROR);
-    }
-    for(n=0;n<tipc;n++)
-        ap->default_val[n] = 0.0;
-    return(FINISHED);
-}
-
-/***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
-
-int setup_and_init_input_param_activity(dataptr dz,int tipc)
-{
-    int n;
-    if((dz->is_active = (char   *)malloc((size_t)tipc))==NULL) {
-        sprintf(errstr,"setup_and_init_input_param_activity()\n");
-        return(MEMORY_ERROR);
-    }
-    for(n=0;n<tipc;n++)
-        dz->is_active[n] = (char)0;
-    return(FINISHED);
-}
-
-/************************* SETUP_FRACTAL_APPLICATION *******************/
-
-int setup_fractal_application(dataptr dz)
-{
-    int exit_status;
-    aplptr ap;
-    if((exit_status = establish_application(dz))<0)     // GLOBAL
-        return(FAILED);
-    ap = dz->application;
-    // SEE parstruct FOR EXPLANATION of next 2 functions
-    if(dz->process == FRACTAL) {
-        if (dz->mode == 0)
-            exit_status = set_param_data(ap,FRACSHAPE,1,0,"0");
-        else
-            exit_status = set_param_data(ap,FRACSHAPE,1,1,"d");
-    } else
-        exit_status = set_param_data(ap,FRACSHAPE,1,0,"0");
-
-
-    
-    
-    if(exit_status<0)
-        return(FAILED);
-    if(dz->process == FRACTAL) {
-        if(dz->mode == 0) 
-            exit_status = set_vflgs(ap,"mti",3,"IDD","so",2,0,"00");
-        else
-            exit_status = set_vflgs(ap,"mti",3,"IDD","s",1,0,"0");
-    } else
-        exit_status = set_vflgs(ap,"mti",3,"IDD","sn",2,0,"00");
-    if(exit_status<0)
-        return(FAILED);
-    // set_legal_infile_structure -->
-    dz->has_otherfile = FALSE;
-    // assign_process_logic -->
-    if(dz->process == FRACSPEC) {
-        dz->input_data_type = ANALFILE_ONLY;
-        dz->process_type    = BIG_ANALFILE;
-        dz->outfiletype     = ANALFILE_OUT;
-        dz->maxmode = 0;
-    } else {
-        dz->input_data_type = SNDFILES_ONLY;
-        dz->process_type    = UNEQUAL_SNDFILE;  
-        dz->outfiletype     = SNDFILE_OUT;
-        dz->maxmode = 2;
-    }
-    return application_init(dz);    //GLOBAL
-}
-
-/************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
-
-int parse_infile_and_check_type(char **cmdline,dataptr dz)
-{
-    int exit_status;
-    infileptr infile_info;
-    if(!sloom) {
-        if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
-            return(MEMORY_ERROR);
-        }
-        if((exit_status = cdparse(cmdline[0],infile_info))<0) {
-            sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
-            return(PROGRAM_ERROR);
-        }
-        if(dz->process == FRACTAL) {
-            if(infile_info->filetype != SNDFILE)  {
-                sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
-                return(DATA_ERROR);
-            } 
-            if(dz->mode == 1 && infile_info->channels != 1)  {
-                sprintf(errstr,"File %s is not of correct type (must be mono for mode %d)\n",cmdline[0],dz->mode+1);
-                return(DATA_ERROR);
-            }
-        } else if(infile_info->filetype != ANALFILE)  {
-            sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
-            return(DATA_ERROR);
-        }
-        if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
-            sprintf(errstr,"Failed to copy file parsing information\n");
-            return(PROGRAM_ERROR);
-        }
-        free(infile_info);
-    }
-    return(FINISHED);
-}
-
-/************************* SETUP_FRACTAL_PARAM_RANGES_AND_DEFAULTS *******************/
-
-int setup_fractal_param_ranges_and_defaults(dataptr dz)
-{
-    int exit_status;
-    aplptr ap = dz->application;
-    // set_param_ranges()
-    ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
-    // NB total_input_param_cnt is > 0 !!!
-    if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
-        return(FAILED);
-    // get_param_ranges()
-    if(dz->process == FRACTAL && dz->mode == 1) {
-        ap->lo[FRACDUR] = 1;
-        ap->hi[FRACDUR] = FRAC_MAXDUR;
-        ap->default_val[FRACDUR] = 10;
-    }
-    ap->lo[FRACMAX] = 0;
-    ap->hi[FRACMAX] = FRAC_MAXFRACT;
-    ap->default_val[FRACMAX] = 0;
-    ap->lo[FRACTSTR]    = 1;
-    ap->hi[FRACTSTR]    = 2;
-    ap->default_val[FRACTSTR] = 1;
-    ap->lo[FRACISTR]    = 0;
-    ap->hi[FRACISTR]    = 8;
-    ap->default_val[FRACISTR] = 0;
-    if(dz->process == FRACTAL)  
-        dz->maxmode = 2;
-    else
-        dz->maxmode = 0;
-    if(!sloom)
-        put_default_vals_in_all_params(dz);
-    return(FINISHED);
-}
-
-/********************************* PARSE_SLOOM_DATA *********************************/
-
-int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
-{
-    int exit_status;
-    int cnt = 1, infilecnt;
-    int filesize, insams, inbrksize;
-    double dummy;
-    int true_cnt = 0;
-//    aplptr ap;
-
-    while(cnt<=PRE_CMDLINE_DATACNT) {
-        if(cnt > argc) {
-            sprintf(errstr,"Insufficient data sent from TK\n");
-            return(DATA_ERROR);
-        }
-        switch(cnt) {
-        case(1):    
-            if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
-                sprintf(errstr,"Cannot read process no. sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-
-        case(2):    
-            if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
-                sprintf(errstr,"Cannot read mode no. sent from TK\n");
-                return(DATA_ERROR);
-            }
-            if(dz->mode > 0)
-                dz->mode--;
-            //setup_particular_application() =
-            if((exit_status = setup_fractal_application(dz))<0)
-                return(exit_status);
-//            ap = dz->application;
-            break;
-
-        case(3):    
-            if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
-                sprintf(errstr,"Cannot read infilecnt sent from TK\n");
-                return(DATA_ERROR);
-            }
-            if(infilecnt < 1) {
-                true_cnt = cnt + 1;
-                cnt = PRE_CMDLINE_DATACNT;  /* force exit from loop after assign_file_data_storage */
-            }
-            if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
-                return(exit_status);
-            break;
-        case(INPUT_FILETYPE+4): 
-            if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
-                sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_FILESIZE+4): 
-            if(sscanf(argv[cnt],"%d",&filesize)!=1) {
-                sprintf(errstr,"Cannot read infilesize sent from TK\n");
-                return(DATA_ERROR);
-            }
-            dz->insams[0] = filesize;   
-            break;
-        case(INPUT_INSAMS+4):   
-            if(sscanf(argv[cnt],"%d",&insams)!=1) {
-                sprintf(errstr,"Cannot read insams sent from TK\n");
-                return(DATA_ERROR);
-            }
-            dz->insams[0] = insams; 
-            break;
-        case(INPUT_SRATE+4):    
-            if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
-                sprintf(errstr,"Cannot read srate sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_CHANNELS+4): 
-            if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
-                sprintf(errstr,"Cannot read channels sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_STYPE+4):    
-            if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
-                sprintf(errstr,"Cannot read stype sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_ORIGSTYPE+4):    
-            if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
-                sprintf(errstr,"Cannot read origstype sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_ORIGRATE+4): 
-            if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
-                sprintf(errstr,"Cannot read origrate sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_MLEN+4): 
-            if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
-                sprintf(errstr,"Cannot read Mlen sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_DFAC+4): 
-            if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
-                sprintf(errstr,"Cannot read Dfac sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_ORIGCHANS+4):    
-            if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
-                sprintf(errstr,"Cannot read origchans sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_SPECENVCNT+4):   
-            if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
-                sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
-                return(DATA_ERROR);
-            }
-            dz->specenvcnt = dz->infile->specenvcnt;
-            break;
-        case(INPUT_WANTED+4):   
-            if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
-                sprintf(errstr,"Cannot read wanted sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_WLENGTH+4):  
-            if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
-                sprintf(errstr,"Cannot read wlength sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_OUT_CHANS+4):    
-            if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
-                sprintf(errstr,"Cannot read out_chans sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-            /* RWD these chanegs to samps - tk will have to deal with that! */
-        case(INPUT_DESCRIPTOR_BYTES+4): 
-            if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
-                sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_IS_TRANSPOS+4):  
-            if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
-                sprintf(errstr,"Cannot read is_transpos sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_COULD_BE_TRANSPOS+4):    
-            if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
-                sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_COULD_BE_PITCH+4):   
-            if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
-                sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_DIFFERENT_SRATES+4): 
-            if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
-                sprintf(errstr,"Cannot read different_srates sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_DUPLICATE_SNDS+4):   
-            if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
-                sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_BRKSIZE+4):  
-            if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
-                sprintf(errstr,"Cannot read brksize sent from TK\n");
-                return(DATA_ERROR);
-            }
-            if(inbrksize > 0) {
-                switch(dz->input_data_type) {
-                case(WORDLIST_ONLY):
-                    break;
-                case(PITCH_AND_PITCH):
-                case(PITCH_AND_TRANSPOS):
-                case(TRANSPOS_AND_TRANSPOS):
-                    dz->tempsize = inbrksize;
-                    break;
-                case(BRKFILES_ONLY):
-                case(UNRANGED_BRKFILE_ONLY):
-                case(DB_BRKFILES_ONLY):
-                case(ALL_FILES):
-                case(ANY_NUMBER_OF_ANY_FILES):
-                    if(dz->extrabrkno < 0) {
-                        sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
-                        return(DATA_ERROR);
-                    }
-                    if(dz->brksize == NULL) {
-                        sprintf(errstr,"CDP has not established storage space for input brktable.\n");
-                        return(PROGRAM_ERROR);
-                    }
-                    dz->brksize[dz->extrabrkno] = inbrksize;
-                    break;
-                default:
-                    sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
-                    dz->input_data_type);
-                    return(PROGRAM_ERROR);
-                }
-                break;
-            }
-            break;
-        case(INPUT_NUMSIZE+4):  
-            if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
-                sprintf(errstr,"Cannot read numsize sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_LINECNT+4):  
-            if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
-                sprintf(errstr,"Cannot read linecnt sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_ALL_WORDS+4):    
-            if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
-                sprintf(errstr,"Cannot read all_words sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_ARATE+4):    
-            if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
-                sprintf(errstr,"Cannot read arate sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_FRAMETIME+4):    
-            if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
-                sprintf(errstr,"Cannot read frametime sent from TK\n");
-                return(DATA_ERROR);
-            }
-            dz->frametime = (float)dummy;
-            break;
-        case(INPUT_WINDOW_SIZE+4):  
-            if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
-                sprintf(errstr,"Cannot read window_size sent from TK\n");
-                    return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_NYQUIST+4):  
-            if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
-                sprintf(errstr,"Cannot read nyquist sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_DURATION+4): 
-            if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
-                sprintf(errstr,"Cannot read duration sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_MINBRK+4):   
-            if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
-                sprintf(errstr,"Cannot read minbrk sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_MAXBRK+4):   
-            if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
-                sprintf(errstr,"Cannot read maxbrk sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_MINNUM+4):   
-            if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
-                sprintf(errstr,"Cannot read minnum sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        case(INPUT_MAXNUM+4):   
-            if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
-                sprintf(errstr,"Cannot read maxnum sent from TK\n");
-                return(DATA_ERROR);
-            }
-            break;
-        default:
-            sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
-            return(PROGRAM_ERROR);
-        }
-        cnt++;
-    }
-    if(cnt!=PRE_CMDLINE_DATACNT+1) {
-        sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
-        return(DATA_ERROR);
-    }
-
-    if(true_cnt)
-        cnt = true_cnt;
-    *cmdlinecnt = 0;        
-
-    while(cnt < argc) {
-        if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
-            return(exit_status);
-        cnt++;
-    }
-    return(FINISHED);
-}
-
-/********************************* GET_TK_CMDLINE_WORD *********************************/
-
-int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
-{
-    if(*cmdlinecnt==0) {
-        if((*cmdline = (char **)malloc(sizeof(char *)))==NULL)  {
-            sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
-            return(MEMORY_ERROR);
-        }
-    } else {
-        if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL)    {
-            sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
-            return(MEMORY_ERROR);
-        }
-    }
-    if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL)    {
-        sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
-        return(MEMORY_ERROR);
-    }
-    strcpy((*cmdline)[*cmdlinecnt],q);
-    (*cmdlinecnt)++;
-    return(FINISHED);
-}
-
-
-/****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
-
-int assign_file_data_storage(int infilecnt,dataptr dz)
-{
-    int exit_status;
-    int no_sndfile_system_files = FALSE;
-    dz->infilecnt = infilecnt;
-    if((exit_status = allocate_filespace(dz))<0)
-        return(exit_status);
-    if(no_sndfile_system_files)
-        dz->infilecnt = 0;
-    return(FINISHED);
-}
-
-
-
-/************************* redundant functions: to ensure libs compile OK *******************/
-
-int assign_process_logic(dataptr dz)
-{
-    return(FINISHED);
-}
-
-void set_legal_infile_structure(dataptr dz)
-{}
-
-int set_legal_internalparam_structure(int process,int mode,aplptr ap)
-{
-    return(FINISHED);
-}
-
-int setup_internal_arrays_and_array_pointers(dataptr dz)
-{
-    return(FINISHED);
-}
-
-int establish_bufptrs_and_extra_buffers(dataptr dz)
-{
-    return(FINISHED);
-}
-
-int read_special_data(char *str,dataptr dz) 
-{
-    return(FINISHED);
-}
-
-int inner_loop
-(int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
-{
-    return(FINISHED);
-}
-
-int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
-{
-    return(FINISHED);
-}
-
-
-/******************************** USAGE1 ********************************/
-
-int usage1(void)
-{
-    fprintf(stderr,
-    "USAGE: fractal NAME (mode) infile outfile parameters\n"
-    "\n"
-    "where NAME can be any one of\n"
-    "\n"
-    "wave  spectrum\n"
-    "\n"
-    "Type 'fractal wave'  for more info on fractal wave option... ETC.\n");
-    return(USAGE_ONLY);
-}
-
-
-/********************************************************************************************/
-
-int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
-{
-    if(!strcmp(prog_identifier_from_cmdline,"wave"))                
-        dz->process = FRACTAL;
-    else if(!strcmp(prog_identifier_from_cmdline,"spectrum"))
-        dz->process = FRACSPEC;
-    else {
-        sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
-        return(USAGE_ONLY);
-    }
-    return(FINISHED);
-}
-
-/******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
-
-int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
-{   
-    int n;
-    if((dz->brk      = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->brkptr   = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->brksize  = (int    *)malloc(brkcnt * sizeof(int)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->firstval = (double  *)malloc(brkcnt * sizeof(double)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
-        return(MEMORY_ERROR);                                                 
-    }
-    if((dz->lastind  = (double  *)malloc(brkcnt * sizeof(double)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->lastval  = (double  *)malloc(brkcnt * sizeof(double)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->brkinit  = (int     *)malloc(brkcnt * sizeof(int)))==NULL) {
-        sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
-        return(MEMORY_ERROR);
-    }
-    for(n=0;n<brkcnt;n++) {
-        dz->brk[n]     = NULL;
-        dz->brkptr[n]  = NULL;
-        dz->brkinit[n] = 0;
-        dz->brksize[n] = 0;
-    }
-    return(FINISHED);
-}
-
-/******************************** USAGE2 ********************************/
-
-int usage2(char *str)
-{
-    if(!strcmp(str,"wave")) {
-        fprintf(stderr,
-        "USAGE:\n"
-        "fractal wave 1 inf outf shape     [-mmaxfrac] [-tstr] [-iwarp] [-s] [-o]\n"
-        "fractal wave 2 inf outf shape dur [-mmaxfrac] [-tstr] [-iwarp] [-s]\n"
-        "\n"
-        "Fractally distort (1 or more channel) input sound (Mode 1).\n"
-        "OR generate fractal wave from (mono) input wavecycle (Mode 2)\n"
-        "Fractal is time-pattern of transpositions (and, in Mode 1\n"
-        "causes corresponding time contractions and expansions).\n"
-        "Transposition happens over total duration specified in \"SHAPE\"\n"
-        "and is then repeated over every resulting sub-unit of pattern,\n"
-        "over every sub-sub-unit, etc. until smallest time-unit reached.\n"
-        "\n"
-        "SHAPE   Breakpoint textfile of\n"
-        "        (Mode 1) time-(semitone)transposition pairs, (Range -12 to 12)\n"
-        "        (Mode 2) time-MIDIpitch pairs, (Range 0 to 127)\n"
-        "        defining pitch-time contour of the (largest) fractal shape.\n"
-        "        Times must start at zero and increase,\n"
-        "        with final time indicating duration of pattern.\n"
-        "        (Value at final time will be ignored).\n"
-        "\n"
-        "DUR     (Mode 2) Output duration (secs) (max 2 hours).\n"
-        "MAXFRAC Max degree of fractalisation.  (Time-variable). If not set (or zero),\n"
-        "        fractalisation proceeds until min possible wavelength reached.\n"
-        "STR     Time stretch of fractal pattern (Time-variable : values >= 1).\n"
-        "        If set to zero, no timestretching is done.\n"
-        "WARP    Interval warping of fractal pattern (Time-variable).\n"
-        "        If set to zero, no warping is done.\n"
-        "\n"
-        "-s      Shrink pitch-intervals as fractal time-scales shrink.\n"
-        "-o      Brkpnt data read using time in outfile (default: Use time in infile).\n"
-        "\n");
-    } else if(!strcmp(str,"spectrum")) {
-        fprintf(stderr,
-        "USAGE:\n"
-        "fractal spectrum inf outf shape [-mmaxfrac] [-tstr] [-iwarp] [-s] [-n]\n"
-        "\n"
-        "Fractally distort input spectrum by transposition.\n"
-        "Transposition happens over total duration specified in \"SHAPE\"\n"
-        "and is then repeated over every resulting sub-unit of pattern,\n"
-        "over every sub-sub-unit, etc. until smallest time-unit reached.\n"
-        "\n"
-        "SHAPE   Breakpoint textfile of\n"
-        "        Time-(semitone)transposition pairs, (Range -12 to 12)\n"
-        "        defining pitch-time contour of the (largest) fractal shape.\n"
-        "        Times must start at zero and increase,\n"
-        "        with final time indicating duration of pattern.\n"
-        "        (Value at final time will be ignored).\n"
-        "\n"
-        "MAXFRAC Max degree of fractalisation.  (Time-variable). If not set (or zero),\n"
-        "        fractalisation proceeds until min possible wavelength reached.\n"
-        "STR     Time stretch of fractal pattern (Time-variable : values >= 1).\n"
-        "        If set to zero, no timestretching is done.\n"
-        "WARP    Interval warping of fractal pattern (Time-variable).\n"
-        "        If set to zero, no warping is done.\n"
-        "\n"
-        "-s      Shrink pitch-intervals as fractal time-scales shrink.\n"
-        "-n      Transposition only (default, retain formant envelope).\n"
-        "\n");
-    } else
-        fprintf(stdout,"Unknown option '%s'\n",str);
-    return(USAGE_ONLY);
-}
-
-int usage3(char *str1,char *str2)
-{
-    fprintf(stderr,"Insufficient parameters on command line.\n");
-    return(USAGE_ONLY);
-}
-
-/****************************** GET_MODE *********************************/
-
-int get_the_mode_from_cmdline(char *str,dataptr dz)
-{
-    char temp[200], *p;
-    if(sscanf(str,"%s",temp)!=1) {
-        sprintf(errstr,"Cannot read mode of program.\n");
-        return(USAGE_ONLY);
-    }
-    p = temp + strlen(temp) - 1;
-    while(p >= temp) {
-        if(!isdigit(*p)) {
-            fprintf(stderr,"Invalid mode of program entered.\n");
-            return(USAGE_ONLY);
-        }
-        p--;
-    }
-    if(sscanf(str,"%d",&dz->mode)!=1) {
-        fprintf(stderr,"Cannot read mode of program.\n");
-        return(USAGE_ONLY);
-    }
-    if(dz->mode <= 0 || dz->mode > dz->maxmode) {
-        fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
-        return(USAGE_ONLY);
-    }
-    dz->mode--;     /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
-    return(FINISHED);
-}
-
-/**************************** HANDLE_THE_SPECIAL_DATA ****************************/
-
-int handle_the_special_data(char *str,dataptr dz)
-{
-    int exit_status, n, m, cnt;
-    FILE *fp;
-    char temp[200], *p;
-    double dummy = 0, lasttime = 0.0, lastmintrans = 0, lastmaxtrans = 0, mintrans = 0, maxtrans = 0, fracmax = 0.0;
-    double firstmidi = 0, lastmaxpitch = 0, lastminpitch = 0, maxpitch = 0, minpitch = 0, max_step, min_step, srate = (double)dz->infile->srate;
-    double *fractemplate, *fracintvl, *fractimes;
-    double mindur_maxtrans, mindur_mintrans, maxelement, minelement, thisdur, min_step_now, max_step_now;
-
-    if(dz->process == FRACTAL)
-        dz->mintime = (float)(4.0/srate);                   //  Minimum duration of fractal pattern (> 4 samples)
-    else {
-        dz->frametime  = (float)(1.0/dz->infile->arate);
-        dz->mintime = dz->frametime;                        //  Minimum duration of fractal pattern (> 1 analysis window)
-    }
-    dz->maxtrnsp =  256.0;                                  //  8 octaves
-    dz->maxfractalise = 0;
-    dz->minstep = HUGE;
-    if((fp = fopen(str,"r"))==NULL) {
-        sprintf(errstr,"Cannot open file %s to read clip lengths.\n",str);
-        return(DATA_ERROR);
-    }
-    cnt = 0;
-    lasttime = 0;
-    while(fgets(temp,200,fp)!=NULL) {
-        p = temp;
-        while(isspace(*p))
-            p++;
-        if(*p == ';' || *p == ENDOFSTR) //  Allow comments in file
-            continue;
-        while(get_float_from_within_string(&p,&dummy)) {
-
-            if (EVEN(cnt)) {                                //  TIMES MUST START AT ZERO AND INCREASE
-                if(cnt == 0) {
-                    if(dummy != 0.0) {
-                        sprintf(errstr,"Invalid initial time (%lf) in file %s. (Should be zero).\n",dummy,str);
-                        return DATA_ERROR;
-                    }
-                } else {
-                    if(dummy <= lasttime) {
-                        sprintf(errstr,"Times do not increase at (%lf %lf) in file %s.\n",lasttime,dummy,str);
-                        return DATA_ERROR;
-                    }
-                    dz->minstep = min(dz->minstep,dummy - lasttime);//  Find smallest time-step in fractal-pattern
-                }
-                lasttime = dummy;
-            } else {                                        //  VALUES MUSY LIE WITHIN RANGE
-                if(dz->process == FRACTAL && dz->mode == 1) {       //  as pitch-pattern
-                    if(dummy < FRAC_MINMIDI || dummy > FRAC_MAXMIDI) {
-                        sprintf(errstr,"MIDIpitch (%lf) out of range (%lf to %lf) in file %s.\n",dummy,FRAC_MINMIDI,FRAC_MAXMIDI,str);
-                        return DATA_ERROR;
-                    }   
-                    if(cnt == 1) {      
-                        firstmidi = dummy;                  //  Note initial MIDI pitch
-                        lastmaxpitch = dummy;               //  And search for max and min pitches
-                        lastminpitch = dummy;               //  NB maximum and minimum search IGNORES last value in table
-                    } else {
-                        maxpitch = lastmaxpitch;
-                        minpitch = lastminpitch;            
-                        lastmaxpitch = max(lastmaxpitch,dummy);
-                        lastminpitch = min(lastminpitch,dummy);
-                    }
-                } else {                                    //  as semitone-transposition-pattern   
-                    if(dummy < FRAC_MINTRNS || dummy > FRAC_MAXTRNS) {
-                        sprintf(errstr,"Transposition (%lf semitones) out of range (%lf to %lf) in file %s.\n",dummy,FRAC_MINTRNS,FRAC_MAXTRNS,str);
-                        return DATA_ERROR;
-                    }
-                    if(cnt == 1) {
-                        lastmintrans = dummy;               //  Search for max and min transpositions
-                        lastmaxtrans = dummy;               //  NB maximum and minimum search IGNORES last value in table
-                    } else {
-                        mintrans = lastmintrans;
-                        maxtrans = lastmaxtrans;
-                        lastmintrans = min(lastmintrans,dummy);
-                        lastmaxtrans = max(lastmaxtrans,dummy);
-                    }
-                }
-            }
-            cnt++;
-        }
-    }
-    if(cnt == 0) {                                          //  Check data count
-        sprintf(errstr,"No data found in file %s.\n",str);
-        return DATA_ERROR;
-    }
-    if(ODD(cnt)) {
-        sprintf(errstr,"Values not correctly paired in file %s.\n",str);
-        return DATA_ERROR;
-    }
-    if(cnt < 4) {
-        sprintf(errstr,"Insufficient values for a fractal shape (needs 2 times and 2 vals = 4 total) in file %s.\n",str);
-        return DATA_ERROR;
-    }
-    dz->fracdur = lasttime;                                 //  Last time in data indicates total duration of fractal-shape
-    if(dz->process == FRACTAL && dz->mode == 1)
-        dz->startfrq = (float)miditohz(firstmidi);          //  In mode 1 (fractal-template of pitches), find initial frq of pattern
-
-    dz->itemcnt = cnt/2;
-
-    if((dz->parray = (double **)malloc(6 * sizeof(double *)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create fractalisation calculation arrays.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->parray[3] = (double *)malloc((dz->itemcnt * 2) * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to store fractalisation data.\n");      //  fractemplate : original (input) fractal template data       
-        return(MEMORY_ERROR);                                                 
-    }
-    fractemplate = dz->parray[3];   //  Original fractal template time-val pairs
-
-    cnt = 0;
-    fseek(fp,0,0);
-    while(fgets(temp,200,fp)!=NULL) {
-        p = temp;
-        while(isspace(*p))
-            p++;
-        if(*p == ';' || *p == ENDOFSTR) //  Allow comments in file
-            continue;
-        while(get_float_from_within_string(&p,&dummy))
-            fractemplate[cnt++] = dummy;
-    }
-    if(dz->process == FRACTAL && dz->mode == 1) {
-        for(n=1;n<dz->itemcnt*2;n+=2)       //  Convert pitch input to transpositions of initial pitch
-            fractemplate[n] -= firstmidi;
-    }
-
-    //  CHECK TIME LIMITS
-
-    if(dz->process == FRACTAL && dz->mode == 1) {
-        if(dz->fracdur > FRAC_MAXDUR) {                                             
-            fprintf(stdout,"WARNING: Pattern total duration (%lf) greater than %.2lf hours, in file %s.\n",dz->fracdur,FRAC_MAXDUR/3600.0,str);
-            fflush(stdout);
-        }
-    }
-    if(dz->brksize[FRACTSTR]) {                             //  If fractal-shape time-stretched anywhere, get maximal tstretch,
-        if((exit_status = get_maxvalue_in_brktable(&fracmax,FRACTSTR,dz))<0)
-            return exit_status;
-        dz->param[FRACTSTR] = (int)round(fracmax);
-    }
-
-    //  CHECK MAXIMUM FRACTALISATION
-
-    dz->minfracratio = dz->minstep/dz->fracdur;
-    get_max_fractalisation(dz);
-
-    if(dz->maxfractalise < 1) {
-        sprintf(errstr,"Smallest time-unit in pattern (%lf) too short to allow fractalisation.\n",dz->minstep);
-        return DATA_ERROR;
-    }
-    if(dz->brksize[FRACMAX]) {                              //  If maximum fractalisation is preset by user
-        if((exit_status = get_maxvalue_in_brktable(&fracmax,FRACMAX,dz))<0)
-            return exit_status;
-        dz->iparam[FRACMAX] = (int)round(fracmax);
-    }                                                       //  compare it with the max possible fractalisation
-    if(dz->iparam[FRACMAX] >  dz->maxfractalise) {
-        fprintf(stdout,"WARNING: Max fractalisation will be restricted to %d because of time proportions in given shape data.\n",dz->maxfractalise);
-        fflush(stdout);
-    } else if (dz->iparam[FRACMAX] > 0 && dz->iparam[FRACMAX] < dz->maxfractalise)
-        dz->maxfractalise = dz->iparam[FRACMAX];
-
-    if(dz->brksize[FRACISTR]) {
-        if((exit_status = get_maxvalue_in_brktable(&fracmax,FRACISTR,dz))<0)
-            return exit_status;
-        dz->param[FRACISTR] = fracmax;
-    }
-
-    //  CHECK RESTRICTIONS ON FRACTALISATION TRANSPOSITION-DEPTH CAUSED BY CHAINED-TRANSPOSITIONS
-    
-    //  FinD time-shrinkage at maximum amd minimum pitch (transposition) elements of fractal shape
-
-    if(dz->vflag[FRAC_SHRINK]) {
-        mindur_maxtrans = HUGE;
-        mindur_mintrans = HUGE;
-        if(dz->process == FRACTAL && dz->mode == 1) {
-            maxelement = maxpitch - firstmidi;
-            minelement = minpitch - firstmidi;
-        } else {
-            maxelement = maxtrans;
-            minelement = mintrans;
-        }
-        for(n = 1; n < (dz->itemcnt -1) * 2; n+= 2) {
-            if(fractemplate[n] == maxelement) {
-                thisdur = fractemplate[n+1] - fractemplate[n-1];
-                mindur_maxtrans = min(mindur_maxtrans,thisdur);
-            }
-            if(fractemplate[n] == minelement) {
-                thisdur = fractemplate[n+1] - fractemplate[n-1];
-                mindur_mintrans = min(mindur_mintrans,thisdur);
-            }
-        }
-        if(mindur_maxtrans == HUGE || mindur_mintrans == HUGE) {
-            sprintf(errstr,"Problem determining duration of max:min elements in fractal.\n");
-            return PROGRAM_ERROR;
-        }
-        dz->maxtransshrink = mindur_maxtrans/dz->fracdur;
-        dz->mintransshrink = mindur_mintrans/dz->fracdur;
-    }
-
-    //  Check what happens to maximum and minimum transpositions, after maximium fractalisation.
-
-    if(dz->process == FRACTAL && dz->mode == 1)
-        max_step = maxpitch - firstmidi;                //  Base-pitch assumed to be first pitch of pattern
-    else
-        max_step = maxtrans;
-    if(dz->param[FRACISTR] > 1.0)
-        max_step *= dz->param[FRACISTR];
-    if(max_step > 0.0) {                                //  If highest pitch in fractal-shape is above initial pitch
-        if(dz->vflag[FRAC_SHRINK]) {
-            max_step_now = max_step;
-            max_step = 0;
-            for(n = 0;n < dz->maxfractalise;n++) {
-                max_step += max_step_now;
-                max_step_now *= dz->maxtransshrink;
-            }
-        } else
-            max_step *= dz->maxfractalise;              //  calculate how mich this will step upwards in successive fractalisations
-        if(dz->process == FRACTAL && dz->mode == 1) {
-            maxpitch += max_step ;                          
-            if(maxpitch > MIDIMAX) {
-                sprintf(errstr,"Max pitch after max fractalisation (%d times) (MIDI %.2lf) exceeds limit (127).\n",dz->maxfractalise,maxpitch);
-                return DATA_ERROR;
-            }
-        } else {                                        //  Convert to frq ratio
-            maxtrans = pow(2.0,(max_step/SEMITONES_PER_OCTAVE));
-            if(maxtrans > dz->maxtrnsp) {
-                sprintf(errstr,"Max transpos after max fractalisation (%d times) (%lf octaves) exceeds limit (8).\n",dz->maxfractalise,LOG2(maxtrans));
-                return DATA_ERROR;
-            }
-        }
-    }
-    if(dz->process == FRACTAL && dz->mode == 1)
-        min_step = minpitch - firstmidi;
-    else
-        min_step = mintrans;
-    if(dz->param[FRACISTR] > 1.0)
-        min_step *= dz->param[FRACISTR];
-    if(min_step < 0.0) {                                //  If lowest pitch in fractal-shape is below initial pitch
-        if(dz->vflag[FRAC_SHRINK]) {
-            min_step_now = min_step;
-            min_step = 0;
-            for(n = 0;n < dz->maxfractalise;n++) {
-                min_step += min_step_now;
-                min_step_now *= dz->mintransshrink;
-            }
-        } else
-            min_step *= dz->maxfractalise;              //  calculate how mich this will step downwardsupwards in successive fractalisations
-        if(dz->process == FRACTAL && dz->mode == 1) {
-            minpitch += min_step;
-            if(minpitch < 0) {
-                sprintf(errstr,"Min pitch after max fractalisation (%d times) (MIDI %lf) falls below low limit (0).\n",dz->maxfractalise,minpitch);
-                return DATA_ERROR;
-            }
-        } else {
-            mintrans = pow(2.0,(mintrans/SEMITONES_PER_OCTAVE));
-            mintrans = pow(mintrans,dz->maxfractalise);
-            if(mintrans < 1.0/dz->maxtrnsp) {
-                sprintf(errstr,"Max transpos down after max fractalisation (%d times) (%lf octaves) exceeds limit (-8).\n",dz->maxfractalise,LOG2(mintrans));
-                return DATA_ERROR;
-            }
-        }
-    }
-
-    //  CREATE WORKING ARRAYS, now we know maximum depth of fractalisation (dz->maxfractalise)
-
-    dz->arraysize = dz->itemcnt - 1;                                        //  Number of fractal elements
-    dz->arraysize = (int)round(pow(dz->arraysize,dz->maxfractalise));       //  Number of entries needed for (largest) fractalisation
-    dz->arraysize *= 2;                                                     //  .. then include space for timing entries ....
-    dz->arraysize += 64;                                                    //  SAFETY
-
-    if((dz->parray[0] = (double *)malloc(dz->arraysize * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create fractalisation array.\n");
-        return(MEMORY_ERROR);                                               //  fracpattern : Stores final conmplete fractalisation of data
-    }
-    if((dz->parray[1] = (double *)malloc(dz->arraysize * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create swap buffer 1.\n");
-        return(MEMORY_ERROR);                                               //  swapbuffer1 : 1st itermediate buffers to calc fractalisation, stage by stage
-    }
-    if((dz->parray[2] = (double *)malloc(dz->arraysize * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create swap buffer 2.\n");
-        return(MEMORY_ERROR);                                               //  swapbuffer2 : 2nd itermediate buffers to calc fractalisation, stage by stage
-    }
-    if((dz->parray[4] = (double *)malloc(dz->itemcnt * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to store transposing data.\n"); //  fracintvl : Mode 0 : Intvls in fractal template
-        return(MEMORY_ERROR);                                               //              Mode 1 : Intvls btwn pitches in orig fractal pitch-template
-    }
-    if((dz->parray[5] = (double *)malloc(dz->itemcnt * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to store element duations.\n");
-        return(MEMORY_ERROR);                                               //  fractimes : Onset times of each element in fractal template
-    }
-
-    fracintvl    = dz->parray[4];   //  Intervals between pitches in original fractal pitch-template
-    fractimes    = dz->parray[5];   //  Fractal template element-start-times
-
-    for(n=0, m=0; n < (dz->itemcnt-1) * 2; n +=2, m++) {        //  Stores dz->itemcnt-1 items
-        fractimes[m] = fractemplate[n];
-        fracintvl[m] = fractemplate[n+1];
-    }
-    dz->itemcnt--;                                              //  Last element of fractal template was needed only to specify total pattern's duration. So now ignore
-                                                                //  dz->itemcnt is number of elements in fractal-template
-
-    return FINISHED;
-}
-
-/************************************* CREATE_FRACTAL_PATTERN ***************************/
-
-int create_fractal_pattern(dataptr dz)
-{
-    int fractalcnt = dz->itemcnt, total_fractalcnt, k, n, nn, t, v, ocnt = 0;
-    double *fracpattern = dz->parray[0];    //  Stores final conmplete fractalisation of data
-    double *swapbuffer1 = dz->parray[1];    //  Intermediate buffers to calc fractalisation, stage by stage
-    double *swapbuffer2 = dz->parray[2];
-    double *thisbuf = NULL, *thatbuf = NULL; 
-    double *fractemplate = dz->parray[3];   //  Original fractal template time-val pairs
-    double *fracintvl    = dz->parray[4];   //  Intervals between pitches in original fractal pitch-template
-    double *fractimes    = dz->parray[5];   //  Fractal template element-start-times
-    double starttime, startval, duration, shrinkage;
-
-    memset((char *)fracpattern,0,dz->arraysize * sizeof(double));   
-    memset((char *)swapbuffer1,0,dz->arraysize * sizeof(double));   
-    memset((char *)swapbuffer2,0,dz->arraysize * sizeof(double));
-    memcpy((char *)swapbuffer1,(char *)fractemplate,(dz->itemcnt+1) * 2 * sizeof(double));  //  Get original fractal-shape, with wraparound time
-                                                                                            //  mode 0 = semitone transpos : mode1 = MIDIpitch 
-    total_fractalcnt = fractalcnt;                                                          //  If fractalise only once, this is enough
-    if(dz->maxfractalise == 1)
-        thatbuf = swapbuffer1;
-    else {
-        for(k = 1; k < dz->maxfractalise;k++) {
-            ocnt = 0;
-            if(ODD(k))  {
-                thisbuf = swapbuffer1;
-                thatbuf = swapbuffer2;
-            } else {        
-                thisbuf = swapbuffer2;
-                thatbuf = swapbuffer1;
-            }
-            memset((char *)thatbuf,0,dz->arraysize * sizeof(double));   
-            for(n = 0, t = 0, v = 1; n < total_fractalcnt; n++,t+=2,v+=2) {     //  Fractalise every element of the "total_fractalcnt" elements existing at this stage.
-                starttime  = thisbuf[t];
-                startval   = thisbuf[v];
-                duration   = thisbuf[t+2] - thisbuf[t];                         //  There is a wrap-around time-point in orig fractal-template
-                shrinkage  = duration/dz->fracdur;
-                for(nn = 0; nn < fractalcnt; nn++) {
-                    if(ocnt + 2 >= dz->arraysize) {
-                        sprintf(errstr,"Array overrun in generating fractal.\n");
-                        return PROGRAM_ERROR;
-                    }
-                    thatbuf[ocnt++] = starttime + (fractimes[nn] * shrinkage);
-                    if(dz->vflag[FRAC_SHRINK])
-                        thatbuf[ocnt++] = startval + (fracintvl[nn] * shrinkage);
-                    else
-                        thatbuf[ocnt++] = startval + fracintvl[nn];
-                }
-            }
-            total_fractalcnt = ocnt/2;                                          //  No of fractal elements after this fractalisation now increaaed to new "total_fractalcnt"
-            if(ocnt >= dz->arraysize - 1) {
-                sprintf(errstr,"Array overrun in generating last timepoint of fractal.\n");
-                return PROGRAM_ERROR;
-            }
-            thatbuf[ocnt++] = fractemplate[dz->itemcnt*2];                      //  Retain wraparound time-point
-        }
-    }
-    for(n = 0, t = 0, v = 1; n < total_fractalcnt; n++,t+=2,v+=2) {
-        fracpattern[t] = thatbuf[t];
-        if((dz->brksize[FRACISTR] > 0) || (dz->param[FRACISTR] > 0.0))          //  If fractal is interval warped, do it here
-            thatbuf[v] *= dz->param[FRACISTR];
-        fracpattern[v] = pow(2.0,(thatbuf[v]/SEMITONES_PER_OCTAVE));            //  Convert to 8va-transpos
-    }
-    fracpattern[t] = thatbuf[t];                                                //  Store wraparound time-point     
-
-    if(dz->param[FRACTSTR] > 0.0) {
-        for(t=0;t <= total_fractalcnt * 2; t+=2)                                //  If fractal is time-warped, do the timewarp
-            fracpattern[t] *= dz->param[FRACTSTR];
-    }
-    dz->fracsize = total_fractalcnt;                                            //  Remember length of fractal pattern
-    return FINISHED;
-}
-
-/************************************* CHECK_FRACTAL_PARAM_VALIDITY_AND_CONSISTENCY ***************************/
-
-int check_fractal_param_validity_and_consistency(dataptr dz)
-{
-    int exit_status;
-    double minwarp = 0.0;
-    dz->timevary = 0;
-    if(dz->brksize[FRACMAX] || dz->brksize[FRACTSTR] || dz->brksize[FRACISTR])
-        dz->timevary = 1;
-    if(dz->brksize[FRACTSTR]) {
-        if((exit_status = get_minvalue_in_brktable(&minwarp,FRACTSTR,dz))<0)
-            return exit_status;
-        if(minwarp < 1.0) {
-            sprintf(errstr,"Values in timewarp table must be >= 1.0\n");
-            return DATA_ERROR;
-        }
-    } else if(dz->param[FRACTSTR] > 0.0 && dz->param[FRACTSTR] < 1.0) {
-        sprintf(errstr,"Non-zero timewarp value must be >= 1.\n");
-        return DATA_ERROR;
-    }
-    if(dz->process == FRACTAL) {
-        dz->splicesmps = (int)ceil(FRAC_SPLICELEN * MS_TO_SECS * (double)dz->infile->srate);
-        dz->total_splice = dz->splicesmps * dz->infile->channels;
-        if(dz->mode == 1) {
-            if(dz->insams[0] < dz->total_splice) {
-                fprintf(stdout,"WARNING: Infile too short to enable endsplice to be made.\n");
-                fflush(stdout);
-                dz->total_splice = 0;   //  Don't attempt endsplice
-            }
-        } else
-            dz->total_splice = 0;       //  No endsplice needed in mode 0
-    } else {
-        dz->splicesmps = 0;             //  Probably redundant
-        dz->total_splice = 0;
-    }
-    return FINISHED;
-}
-
-/************************************* FRACTALISE ***************************/
-
-int fractalise(dataptr dz)
-{
-    int exit_status, chans = dz->infile->channels, done = 0, ch, nxt, n, m;
-    double intime = 0.0, outtime = 0.0, ztime, localtime, srate = (double)dz->infile->srate;
-    int ibufpos = 0, gpibufpos = 0, obufpos = 0, fracindex = 0, bufcnt = 0, abs_input_start_samp = 0, nextfracsampcnt, zsamps;
-    int   gpbuflen = dz->buflen/chans, abs_window_cnt = 0, next_abs_window_cnt = 0;
-    double dibufpos = 0.0, localsampcnt, incr, frac, diff, spliceval, abs_time = 0, nexttime = 0.0, transpose = 1.0;
-    double *fracpattern = dz->parray[0];
-    float *ibuf, *obuf, *ovflwbuf = NULL;
-    double *val;
-    double *fractemplate = dz->parray[3];
-    if(dz->process == FRACTAL) {
-        ibuf = dz->sampbuf[0];
-        /* input overflow in = dz->sampbuf[1] */ 
-        obuf = dz->sampbuf[2];
-        ovflwbuf = dz->sampbuf[3];
-    } else {
-        ibuf = dz->sampbuf[0];
-        obuf = dz->sampbuf[1];
-    }
-    if((val = (double *)malloc(chans * sizeof(double))) == NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create intermediate value storage.\n");
-        return(MEMORY_ERROR);
-    }
-    if(!dz->timevary) {                                     //  If fractal does not vary
-        if((exit_status = create_fractal_pattern(dz)) < 0)
-            return exit_status;                             //  Create fixed fractal pattern
-    }
-    if(dz->process == FRACTAL) {
-                                //  FRACTAL reads a double buffer, so that we have wraparound points to use
-        if(dz->mode == 0) {                             //  (If mode 1, source used as "table", and is already in buffer)   
-            dz->buflen *= 2;
-            if((exit_status = read_samps(ibuf,dz))<0)
-                return(exit_status);                        
-            abs_input_start_samp = 0;
-            dz->buflen /= 2;
-        }
-        for(ch = 0;ch < chans; ch++)                        //  Read initial src/table values to output value store
-            val[ch] = ibuf[ch];
-    } else {                                                //  FRACSPEC reads a single buffer of analysis samples  
-        dz->flbufptr[0] = ibuf;
-        dz->flbufptr[1] = obuf;
-        if((exit_status = read_samps(ibuf,dz))<0)
-            return(exit_status);
-        memcpy((char *)obuf,(char *)ibuf,dz->wanted * sizeof(float));
-        abs_time = dz->frametime;                           //  First window is copied (below)
-        abs_window_cnt = 1;
-        dz->flbufptr[0] += dz->wanted;                      //  flbufptrs advance
-        dz->flbufptr[1] += dz->wanted;
-    }
-    while(!done) {
-        if(dz->timevary) {                                  //  If fractal varies in time
-            if(dz->mode == 1 || (dz->process == FRACTAL && dz->vflag[FRAC_OUTIMES])) {  //  Read brkpoint data using either time in infile or time in outfile
-                if((exit_status = read_values_from_all_existing_brktables(outtime,dz))<0)
-                    return exit_status;
-            } else {
-                if((exit_status = read_values_from_all_existing_brktables(intime,dz))<0)
-                    return exit_status;
-            }
-            if(dz->iparam[FRACMAX] > 0)                     //  Find maximum fractalisation     
-                dz->maxfractalise = dz->iparam[FRACMAX];
-            else
-                get_max_fractalisation(dz);
-            if(dz->maxfractalise > 0)                       //  Create the fractal pattern, and remember length of fractal-pattern (dz->fracsize)
-                create_fractal_pattern(dz);
-        }
-        ztime = fractemplate[dz->itemcnt * 2];
-        if(dz->maxfractalise == 0) {
-            if(dz->process == FRACTAL) {
-                zsamps  = (int)round(ztime * srate);
-                gpibufpos = (int)round(dibufpos);               //  Approximation of interpolating pointer involved here
-                ibufpos = gpibufpos * chans;
-                for(n = 0; n <zsamps; n++) {
-                    if(ibufpos >= dz->buflen) {
-                        if(dz->mode == 0) {                 //  If reading countinuous input, advance by buflen
-                            memset((char *)ibuf,0,dz->buflen * 2 * sizeof(float));
-                            bufcnt++;
-                            if(dz->buflen * bufcnt >= dz->insams[0]) {
-                                done = 1;                           //  Exit if attempted samps_read looks beyound input file end
-                                break;
-                            }
-                            sndseekEx(dz->ifd[0],dz->buflen * bufcnt,0);
-                            dz->buflen *= 2;                        //   and read 2 * buflen (so we have wraparound)
-                            abs_input_start_samp += dz->ssampsread/2;
-                            if((exit_status = read_samps(ibuf,dz))<0)
-                                return(exit_status);
-                            dz->buflen /= 2;
-                            if(dz->ssampsread == 0) {               //  Exit if no more samples to read (should be redundant as trap at snd seek above)
-                                done = 1;
-                                break;
-                            }
-                        }
-                        ibufpos -= dz->buflen;
-                    }
-                    if(obufpos >= dz->buflen + dz->total_splice) {  //  Allow enough samples on end of output to perform splice. (ALPHA)
-                        if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
-                            return(exit_status);                    //  Write to outfile, then copy back ovflow into obuf
-                        memset((char *)obuf,0,dz->buflen * sizeof(float));
-                        memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
-                        memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
-                        obufpos -= dz->buflen;                      //  and reset obufptr
-                    }
-                    for(ch = 0;ch<chans;ch++)
-                        obuf[obufpos++] = ibuf[ibufpos++];
-                }
-                gpibufpos  = ibufpos/chans;
-                dibufpos = (double)gpibufpos;
-                intime  += ztime;                                   //  overflow point in fractal template contains its duration, so advance time in input file
-                outtime += ztime;                                   //  time in output file
-            } else {    //   FRACSPEC
-                next_abs_window_cnt = (int)round(ztime/dz->frametime);
-                while(abs_window_cnt < next_abs_window_cnt) {
-                    memcpy((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],dz->wanted * sizeof(float));
-                    dz->flbufptr[0] += dz->wanted;
-                    dz->flbufptr[1] += dz->wanted;
-                    if(dz->flbufptr[0] >= obuf) {
-                        if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
-                            return(exit_status);
-                        memset((char *)ibuf,0,dz->buflen * sizeof(float));
-                        memset((char *)obuf,0,dz->buflen * sizeof(float));
-                        if((exit_status = read_samps(ibuf,dz))<0)
-                            return(exit_status);
-                        if(dz->ssampsread == 0) {
-                            done = 1;
-                            break;
-                        }
-                        dz->flbufptr[0] = ibuf;
-                        dz->flbufptr[1] = obuf;
-                    }
-                    abs_window_cnt++;
-                    abs_time += dz->frametime;
-                    if(abs_window_cnt >= dz->wlength) {
-                        done = 1;
-                        break;
-                    }
-                }
-            }
-        } else {
-            if(dz->process == FRACTAL) {
-                localsampcnt = 0;                                   //  This is a count in gp-samples
-                fracindex = 0;
-                while(fracindex < dz->fracsize * 2) {               //  For each unit of the fractal (2 entries - time:val - per fractal element)
-                    nextfracsampcnt = (int)round(fracpattern[fracindex + 2] * srate);
-                    while(localsampcnt > nextfracsampcnt) {
-                        fracindex += 2;
-                        if(fracindex >= dz->fracsize)
-                            break;
-                        nextfracsampcnt = (int)round(fracpattern[fracindex + 2] * srate);
-                    }
-                    incr = fracpattern[fracindex + 1];              //  Get current input-read increment
-                    while(localsampcnt < nextfracsampcnt) {         //  While we're still using the current increment
-                        for(ch = 0;ch < chans; ch++)
-                            obuf[obufpos++] = (float)val[ch];       //  Copy current value from input to output
-                        if(obufpos >= dz->buflen + dz->total_splice) {//    Allow enough samples on end of output to perform splice. (ALPHA)
-                            if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
-                                return(exit_status);                //  Write to outfile, then copy back ovflow into obuf
-                            memset((char *)obuf,0,dz->buflen * sizeof(float));
-                            memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
-                            memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
-                            obufpos -= dz->buflen;                  //  and reset obufptr
-                        }
-                        if(dz->mode == 1) {
-                            dibufpos += incr * dz->convertor;       //  Advance in table-read
-                            gpibufpos = (int)floor(dibufpos);
-                            ibufpos = gpibufpos;                    //  Mono
-                        }else {
-                            dibufpos += incr;                       //  Advance pointer in infile src
-                            gpibufpos = (int)floor(dibufpos);
-                            ibufpos = gpibufpos * chans;            //  In mode 1, if run off end of input file, quit
-                            if(abs_input_start_samp + ibufpos >= dz->insams[0]) {               
-                                done = 1;
-                                break;
-                            }
-                        }
-                        frac = dibufpos - (double)gpibufpos;            
-                        if(gpibufpos >= gpbuflen) {             
-                            if(dz->mode == 0) {                     //  If reading countinuous input, advance by buflen
-                                memset((char *)ibuf,0,dz->buflen * 2 * sizeof(float));
-                                bufcnt++;
-                                if(dz->buflen * bufcnt >= dz->insams[0]) {
-                                    done = 1;                       //  Exit if attempted samps_read looks beyound input file end
-                                    break;
-                                }
-                                sndseekEx(dz->ifd[0],dz->buflen * bufcnt,0);
-                                dz->buflen *= 2;                    //   and read 2 * buflen (so we have wraparound)
-                                abs_input_start_samp += dz->ssampsread/2;
-                                if((exit_status = read_samps(ibuf,dz))<0)
-                                    return(exit_status);
-                                dz->buflen /= 2;
-                                if(dz->ssampsread == 0) {           //  Exit if no more samples to read (should be redundant as trap at snd seek above)
-                                    done = 1;
-                                    break;
-                                }
-                            }
-                            gpibufpos -= gpbuflen;
-                            dibufpos  -= (double)gpbuflen;
-                            ibufpos = gpibufpos * chans;
-                        }                                           //  Working in absolute sample-frame get interpolated value(s) from src/table
-                        for(ch = 0,nxt = chans;ch < chans;ch++,nxt++) {
-                            val[ch]  = ibuf[ibufpos + ch];
-                            diff     = ibuf[ibufpos + nxt] - val[ch];
-                            val[ch] += diff * frac;
-                        }
-                        localsampcnt += incr;                       //  Advance by given samp-time incr
-                        if(localsampcnt >= nextfracsampcnt)         //  If we reach time of next fractal (we will therefore exit inner loop)
-                            fracindex += 2;                         //  incr fracindex-value, hence advance in fractal pattern in outer loop
-                    }
-                    if(done)
-                        break;
-                }
-                intime += fracpattern[dz->fracsize];                //  overflow point in fractal table contains its duration, so advance time in input file
-                outtime = (double)((dz->total_samps_written + obufpos)/chans)/srate;    //  time in output file
-                if(dz->mode == 1) {
-                    if(outtime >= dz->param[FRACDUR])
-                        done = 1;
-                } else {
-                    if(intime >= dz->duration)
-                        done = 1;
-                }
-            } else {    //   FRACSPEC
-                localtime = 0.0;
-                fracindex = 0;
-                while(fracindex < dz->fracsize * 2) {               //  For each unit of the fractal (2 entries - time:val - per fractal element)
-                    nexttime  = fracpattern[fracindex + 2];
-                    transpose = fracpattern[fracindex + 1];
-                    while(localtime < nexttime) {
-                        if((exit_status = fractal_spectrnsf(transpose,dz))<0)
-                            return(exit_status);
-                        memcpy((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],dz->wanted * sizeof(float));
-                        dz->flbufptr[0] += dz->wanted;
-                        dz->flbufptr[1] += dz->wanted;
-                        if(dz->flbufptr[0] >= obuf) {   //  obuf abutts to end of ibuf
-                            if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
-                                return(exit_status);
-                            memset((char *)ibuf,0,dz->buflen * sizeof(float));
-                            memset((char *)obuf,0,dz->buflen * sizeof(float));
-                            if((exit_status = read_samps(ibuf,dz))<0)
-                                return(exit_status);
-                            if(dz->ssampsread == 0) {
-                                done = 1;
-                                break;
-                            }
-                            dz->flbufptr[0] = ibuf;
-                            dz->flbufptr[1] = obuf;
-                        }
-                        abs_window_cnt++;
-                        abs_time  += dz->frametime;
-                        localtime += dz->frametime;
-                        if(abs_time >= dz->duration) {
-                            done = 1;
-                            break;
-                        }
-                    }
-                    fracindex += 2;
-                if(done)
-                    break;
-                }
-
-            }
-        }
-    }
-    if(obufpos > 0) {
-        if(dz->process == FRACTAL) {
-            if(dz->mode == 1 && dz->total_splice > 0) {
-                for(n=0,m = obufpos - chans;n < dz->splicesmps;n++,m -= chans) {
-                    spliceval = (double)n/(double)dz->splicesmps;   
-                    for(ch = 0;ch < chans;ch++)                 //  Splice end of output
-                        obuf[m+ch] = (float)(obuf[m+ch] * spliceval);
-                }
-            }
-        }
-        if((exit_status = write_samps(obuf,obufpos,dz))<0)
-            return(exit_status);                            //  Write last samples to outfile
-    }
-    return FINISHED;
-}
-
-/**************************** GET_MAX_FRACTALISATION ****************************/
-
-void get_max_fractalisation(dataptr dz)
-{
-    double minlen = dz->minstep;                            //  minimum duration in fractal-shape   
-    dz->maxfractalise = 0;
-    if(dz->param[FRACTSTR] > 1.0)                           //  If fractal-shape gets stretched anywhere, expand minlen appropriately
-        minlen *= dz->param[FRACTSTR];
-    while(minlen > dz->mintime) {                           //  Calculate the max possible fractalisation
-        minlen *= dz->minfracratio;
-        dz->maxfractalise++;
-    }
-}
-
-/**************************** CREATE_FRACTAL_SNDBUFS ****************************/
-
-int create_fractal_sndbufs(dataptr dz)
-{
-    int exit_status, n;
-    int bigbufsize, secsize, m;
-    int framesize = F_SECSIZE * dz->infile->channels;
-    double srate = (double)dz->infile->srate;
-
-    if(dz->process == FRACTAL) {
-        if (dz->mode == 1)  //  Mode 1, source file is used as a table to read cyclically
-            bigbufsize = dz->insams[0] * sizeof(float);
-        else
-            bigbufsize = (int)Malloc(-1);
-     secsize = bigbufsize/framesize;
-        if(secsize * framesize < bigbufsize) {
-            secsize++;
-            bigbufsize = secsize * framesize;
-        }
-    } else
-        bigbufsize = dz->wanted * BUF_MULTIPLIER * sizeof(float);
-    dz->buflen = bigbufsize/sizeof(float);
-    if(bigbufsize * dz->bufcnt <= 0) {
-        if(dz->process == FRACTAL && dz->mode == 1)
-            sprintf(errstr,"Infile too large to create sound buffers.\n");
-        else
-            sprintf(errstr,"Insufficent memory to create sound buffers.\n");
-        return(PROGRAM_ERROR);
-    }
-    if((dz->bigbuf = (float *)malloc(bigbufsize * dz->bufcnt)) == NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
-        return(PROGRAM_ERROR);
-    }
-    if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
-        return(MEMORY_ERROR);
-    }
-    if(dz->process == FRACSPEC) {
-        if((dz->flbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
-            sprintf(errstr,"INSUFFICIENT MEMORY for float sample buffers.\n");
-            return(MEMORY_ERROR);
-        }
-        for(n = 0;n <dz->bufcnt; n++)
-            dz->flbufptr[n] = NULL;
-    }
-
-    for(n=0;n<dz->bufcnt;n++)
-        dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
-    dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
-    // FRACTAL
-    // dz->sampbuf[0] ibuf
-    // dz->sampbuf[1] iovflwbuf
-    // dz->sampbuf[2] obuf
-    // dz->sampbuf[3] ovflwbuf      dz->sampbuf[4] end of ovflwbuf
-    // FRACSPEC
-    // dz->sampbuf[0] ibuf
-    // dz->sampbuf[1] obuf
-
-    if(dz->process == FRACTAL && dz->mode == 1) {
-        if((exit_status = read_samps(dz->sampbuf[0],dz))<0) //  Read source into buffer
-            return(exit_status);
-        for(n=0, m = dz->insams[0];n < dz->infile->channels;n++,m++)
-            dz->sampbuf[0][m] = 0;                          //  wraparound points go into iovflwbuf
-        dz->convertor = (double)dz->insams[0]/srate;        //  Table-read convertor for a 1Hz read
-        dz->convertor *= dz->startfrq;                      //  Table-read convertor for a fractal-startfrq read
-    }
-    return FINISHED;
-}
-
-/********************************** SPECTRNSF **********************************
- *
- * transpose spectrum, but retain original spectral envelope.
- */
-
-int fractal_spectrnsf(double transpose,dataptr dz)
-{
-    int exit_status;
-    double pre_totalamp, post_totalamp;
-    int cc, vc;
-    rectify_window(dz->flbufptr[0],dz);
-    if((exit_status = fractal_extract_specenv(dz))<0)
-        return(exit_status);
-    if((exit_status = get_totalamp(&pre_totalamp,dz->flbufptr[0],dz->wanted))<0)
-        return(exit_status);
-    if(dz->vflag[1]) {
-        for(cc = 0, vc = 0; cc < dz->clength; cc++, vc += 2)
-            dz->flbufptr[0][FREQ] = (float)(fabs(dz->flbufptr[0][FREQ])*transpose);
-    } else {
-        for(cc = 0, vc = 0; cc < dz->clength; cc++, vc += 2) {
-            if((exit_status = fractal_tranpose_within_formant_envelope(vc,transpose,dz))<0)
-                return(exit_status);
-        }
-    }
-    if((exit_status = fractal_reposition_partials_in_appropriate_channels(transpose,dz))<0)
-        return(exit_status);
-    if((exit_status = get_totalamp(&post_totalamp,dz->flbufptr[0],dz->wanted))<0)
-        return(exit_status);
-    return normalise(pre_totalamp,post_totalamp,dz);
-}
-
-    /************************** TRANPOSE_WITHIN_FORMANT_ENVELOPE *****************************/
-
-int fractal_tranpose_within_formant_envelope(int vc,double transpose,dataptr dz)
-{
-    int exit_status;
-    double thisspecamp, newspecamp, thisamp, formantamp_ratio; 
-    if((exit_status = fractal_getspecenvamp(&thisspecamp,(double)dz->flbufptr[0][FREQ],dz))<0)
-        return(exit_status);
-    dz->flbufptr[0][FREQ] = (float)(fabs(dz->flbufptr[0][FREQ])*transpose);
-    if(dz->flbufptr[0][FREQ] < dz->nyquist) {
-        if(thisspecamp < VERY_TINY_VAL)
-            dz->flbufptr[0][AMPP] = 0.0f;
-        else {
-            if((exit_status = fractal_getspecenvamp(&newspecamp,(double)dz->flbufptr[0][FREQ],dz))<0)
-                return(exit_status);
-            if(newspecamp < VERY_TINY_VAL)
-                dz->flbufptr[0][AMPP] = 0.0f;
-            else {
-                formantamp_ratio = newspecamp/thisspecamp;
-                if((thisamp = dz->flbufptr[0][AMPP] * formantamp_ratio) < VERY_TINY_VAL)
-                    dz->flbufptr[0][AMPP] = 0.0f;
-                else
-                    dz->flbufptr[0][AMPP] = (float)thisamp;
-            }
-        }
-    }
-    return(FINISHED);
-}
-
-/************************ REPOSITION_PARTIALS_IN_APPROPRIATE_CHANNELS *************************
- *
- * (1)  At each pass, preset store-buffer channel amps to zero.
- * (2)  Move frq data into appropriate channels, carrying the
- *      amplitude information along with them.
- *      Work down spectrum  for upward transposition, and
- * (3)  up spectrum for downward transposition,
- *      so that we do not overwrite transposed data before we move it.
- * (4)  Put new frqs back into src buff.
- */
-
-int fractal_reposition_partials_in_appropriate_channels(double transpose,dataptr dz)
-{
-    int exit_status;
-    int truecc,truevc;
-    int cc, vc;
-    for(vc = 0, cc= 0; vc < dz->wanted; vc+=2, cc++) {                      /* 1 */
-        dz->windowbuf[0][AMPP] = 0.0f;
-        dz->windowbuf[0][FREQ] = (float)(cc * dz->chwidth);
-    }
-    if(transpose > 1.0f) {          /* 2 */
-        for(cc=dz->clength-1,vc = dz->wanted-2; cc>=0; cc--, vc-=2) {
-            if(dz->flbufptr[0][FREQ] < dz->nyquist && dz->flbufptr[0][AMPP] > 0.0f) {
-                if((exit_status = fractal_get_channel_corresponding_to_frq(&truecc,(double)dz->flbufptr[0][FREQ],dz))<0)
-                    return(exit_status);
-                truevc = truecc * 2;
-                if((exit_status = move_data_into_appropriate_channel(vc,truevc,dz->flbufptr[0][AMPP],dz->flbufptr[0][FREQ],dz))<0)
-                    return(exit_status);
-            }
-        }
-        for(vc = 0; vc < dz->wanted; vc++)
-            dz->flbufptr[0][vc] = dz->windowbuf[0][vc]; 
-    } else if(transpose < 1.0f){        /* 3 */
-        for(cc=0,vc = 0; cc < dz->clength; cc++, vc+=2) {
-            if(dz->flbufptr[0][FREQ] < dz->nyquist && dz->flbufptr[0][FREQ]>0.0) {
-                if((exit_status = fractal_get_channel_corresponding_to_frq(&truecc,(double)dz->flbufptr[0][FREQ],dz))<0)
-                    return(exit_status);
-                truevc = truecc * 2;
-                if((exit_status = move_data_into_appropriate_channel(vc,truevc,dz->flbufptr[0][AMPP],dz->flbufptr[0][FREQ],dz))<0)
-                    return(exit_status);
-            }
-        }
-        for(vc = 0; vc < dz->wanted; vc++)
-            dz->flbufptr[0][vc] = dz->windowbuf[0][vc];     /* 4 */
-    }
-    return(FINISHED);
-}
-
-/******************* ZERO_OUTOFRANGE_CHANNELS *****************/
-
-int fractal_zero_outofrange_channels(double *totalamp,double lofrq_limit,double hifrq_limit,dataptr dz)
-{
-    int cc, vc;
-    *totalamp = 0.0;
-    for(cc = 0,vc = 0; cc < dz->clength; cc++, vc += 2) {
-        if(dz->flbufptr[0][FREQ] < lofrq_limit || dz->flbufptr[0][FREQ] > hifrq_limit)
-            dz->flbufptr[0][AMPP] = 0.0f;
-        else
-            *totalamp += dz->flbufptr[0][AMPP];
-    }
-    return(FINISHED);
-}
-
-/**************************** GETSPECENVAMP *************************/
-
-int fractal_getspecenvamp(double *thisamp,double thisfrq,dataptr dz)
-{
-    double pp, ratio, ampdiff;
-    int z = 1;
-    if(thisfrq<0.0) {   /* NOT SURE THIS IS CORRECT */
-        *thisamp = 0.0; /* SHOULD WE PHASE INVERT & RETURN A -ve AMP ?? */
-        return(FINISHED);   
-    }
-    if(thisfrq<=1.0)
-        pp = 0.0;
-    else
-        pp = log10(thisfrq); 
-    while( dz->specenvpch[z] < pp){
-        z++;
-        /*RWD may need to trap on size of array? */
-        if(z == dz->infile->specenvcnt -1)
-            break;
-    }
-    ratio    = (pp - dz->specenvpch[z-1])/(dz->specenvpch[z] - dz->specenvpch[z-1]);
-    ampdiff  = dz->specenvamp[z] - dz->specenvamp[z-1];
-    *thisamp = dz->specenvamp[z-1] + (ampdiff * ratio);
-    *thisamp = max(0.0,*thisamp);
-    return(FINISHED);
-}
-
-/********************** EXTRACT_SPECENV *******************/
-
-int fractal_extract_specenv(dataptr dz)
-{
-    int    n, cc, vc, specenvcnt_less_one;
-    int    botchan, topchan;
-    double botfreq, topfreq;
-    double bwidth_in_chans;
-    specenvcnt_less_one = dz->infile->specenvcnt - 1;
-    vc = 0;
-    //  RECTIFY_CHANNEL_FRQ_ORDER
-    for(n=0;n<dz->infile->specenvcnt;n++)
-        dz->specenvamp[n] = (float)0.0;
-    topfreq = 0.0f;
-    n = 0;
-    while(n < specenvcnt_less_one) {
-        botfreq  = topfreq;
-        botchan  = (int)((botfreq + dz->halfchwidth)/dz->chwidth); /* TRUNCATE */
-        botchan -= 4;   //  CHAN_SRCHRANGE_F
-        botchan  =  max(botchan,0);
-        topfreq  = dz->specenvtop[n];
-        topchan  = (int)((topfreq + dz->halfchwidth)/dz->chwidth); /* TRUNCATE */
-        topchan += 4;   //  CHAN_SRCHRANGE_F;
-        topchan  =  min(topchan,dz->clength);
-        for(cc = botchan,vc = botchan * 2; cc < topchan; cc++,vc += 2) {
-            if(dz->flbufptr[0][FREQ] >= botfreq && dz->flbufptr[0][FREQ] < topfreq)
-                dz->specenvamp[n] = (float)(dz->specenvamp[n] + dz->flbufptr[0][AMPP]);
-        }
-        bwidth_in_chans   = (double)(topfreq - botfreq)/dz->chwidth;
-        dz->specenvamp[n] = (float)(dz->specenvamp[n]/bwidth_in_chans);
-        n++;
-    }
-    return(FINISHED);
-}
-
-/************************** INITIALISE_SPECENV *********************
- *
- *  MAR 1998: not sure if the follwoing comment is relevant any more
- *  but I wont risk changing it at this stage.
- *
- *  WANTED and CLENGTH are calculated from scratch here, as dz->wanted
- *  gets set equal to dz->specenvcnt for calculations on formant data,
- *  while dz->clength may not yet be set!!      
- */
-
-int fractal_initialise_specenv(int *arraycnt,dataptr dz)
-{
-    *arraycnt   = (dz->infile->channels/2) + 1;
-    if((dz->specenvfrq = (float *)malloc((*arraycnt) * sizeof(float)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for formant frq array.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->specenvpch = (float *)malloc((*arraycnt) * sizeof(float)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for formant pitch array.\n");
-        return(MEMORY_ERROR);
-    }
-    /*RWD  zero the data */
-    memset(dz->specenvpch,0,*arraycnt * sizeof(float));
-
-    if((dz->specenvamp = (float *)malloc((*arraycnt) * sizeof(float)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for formant aplitude array.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->specenvtop = (float *)malloc((*arraycnt) * sizeof(float)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for formant frq limit array.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->windowbuf = (float **)malloc(sizeof(float *)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for extra float sample buffers.\n");
-        return(MEMORY_ERROR);
-    }
-    if((dz->windowbuf[0] = (float *)malloc(dz->wanted * sizeof(float)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY for extra float sample buffer 0.\n");
-        return(MEMORY_ERROR);
-    }
-    return(FINISHED);
-}
-
-/************************************ FRACTAL_SET_SPECENV_FRQS ****************************/
-
-int fractal_set_specenv_frqs(int arraycnt,dataptr dz)
-{
-    int exit_status;
-    double bandbot;
-    double *interval;
-    int m, n, k = 0, cc;
-    //  PICHWISE_FORMANTS
-    if((exit_status = fractal_setup_octaveband_steps(&interval,dz))<0)
-        return(exit_status);
-    if((exit_status = fractal_setup_low_octave_bands(arraycnt,dz))<0)
-        return(exit_status);
-    k  = 4; //  TOP_OF_LOW_OCTAVE_BANDS
-    cc = 8; //  CHAN_ABOVE_LOW_OCTAVES
-    while(cc <= dz->clength) {
-        m = 0;
-        if((bandbot = dz->chwidth * (double)cc) >= dz->nyquist)
-            break;
-        for(n=0;n<dz->formant_bands;n++) {
-            if(k >= arraycnt) {
-                sprintf(errstr,"Formant array too small: fractal_set_specenv_frqs()\n");
-                return(PROGRAM_ERROR);
-            }
-            dz->specenvfrq[k]   = (float)(bandbot * interval[m++]);
-            dz->specenvpch[k]   = (float)log10(dz->specenvfrq[k]);
-            dz->specenvtop[k++] = (float)(bandbot * interval[m++]);
-        }   
-        cc *= 2;        /* 8-16: 16-32: 32-64 etc as 8vas, then split into bands */
-    }
-    dz->specenvfrq[k] = (float)dz->nyquist;
-    dz->specenvpch[k] = (float)log10(dz->nyquist);
-    dz->specenvtop[k] = (float)dz->nyquist;
-    dz->specenvamp[k] = (float)0.0;
-    k++;
-    dz->infile->specenvcnt = k;
-    return(FINISHED);
-}
-
-/************************* SETUP_OCTAVEBAND_STEPS ************************/
-
-int fractal_setup_octaveband_steps(double **interval,dataptr dz)
-{
-    double octave_step;
-    int n = 1, m = 0, halfbands_per_octave = dz->formant_bands * 2;
-    if((*interval = (double *)malloc(halfbands_per_octave * sizeof(double)))==NULL) {
-        sprintf(errstr,"INSUFFICIENT MEMORY establishing interval array for formants.\n");
-        return(MEMORY_ERROR);
-    }
-    while(n < halfbands_per_octave) {
-        octave_step   = (double)n++/(double)halfbands_per_octave;
-        (*interval)[m++] = pow(2.0,octave_step);
-    }
-    (*interval)[m] = 2.0;
-    return(FINISHED);
-}
-
-/************************ SETUP_LOW_OCTAVE_BANDS ***********************
- *
- * Lowest PVOC channels span larger freq steps and therefore we must
- * group them in octave bands, rather than in anything smaller.
- */
-
-int fractal_setup_low_octave_bands(int arraycnt,dataptr dz)
-{
-    int n;
-    if(arraycnt < LOW_OCTAVE_BANDS) {
-        sprintf(errstr,"Insufficient array space for low_octave_bands\n");
-        return(PROGRAM_ERROR);
-    }
-    for(n=0;n<LOW_OCTAVE_BANDS;n++) {
-        switch(n) {
-        case(0):
-            dz->specenvfrq[0] = (float)1.0;                 /* frq whose log is 0 */
-            dz->specenvpch[0] = (float)0.0;
-            dz->specenvtop[0] = (float)dz->chwidth;         /* 8VA wide bands */
-            break;
-        case(1):
-            dz->specenvfrq[1] = (float)(dz->chwidth * 1.5); /* Centre Chs 1-2 */    
-            dz->specenvpch[1] = (float)log10(dz->specenvfrq[1]);
-            dz->specenvtop[1] = (float)(dz->chwidth * 2.0);
-            break;
-        case(2):
-            dz->specenvfrq[2] = (float)(dz->chwidth * 3.0); /* Centre Chs 2-4 */
-            dz->specenvpch[2] = (float)log10(dz->specenvfrq[2]);
-            dz->specenvtop[2] = (float)(dz->chwidth * 4.0);
-            break;
-        case(3):
-            dz->specenvfrq[3] = (float)(dz->chwidth * 6.0); /* Centre Chs 4-8 */    
-            dz->specenvpch[3] = (float)log10(dz->specenvfrq[3]);
-            dz->specenvtop[3] = (float)(dz->chwidth * 8.0);
-            break;
-        default:
-            sprintf(errstr,"Insufficient low octave band setups in fractal_setup_low_octave_bands()\n");
-            return(PROGRAM_ERROR);
-        }
-    }
-    return(FINISHED);
-}
-
-/**************************** GET_CHANNEL_CORRESPONDING_TO_FRQ ***************************/
-
-int fractal_get_channel_corresponding_to_frq(int *chan,double thisfrq,dataptr dz)
-{   
-    if(dz->chwidth <= 0.0) {
-        sprintf(errstr,"chwidth not set in fractal_get_channel_corresponding_to_frq()\n");
-        return(PROGRAM_ERROR);
-    }
-    if(thisfrq < 0.0) {
-        sprintf(errstr,"-ve frequency in fractal_get_channel_corresponding_to_frq()\n");
-        return(PROGRAM_ERROR);
-    }
-    if(thisfrq > dz->nyquist) {
-        sprintf(errstr,"frequency beyond nyquist in fractal_get_channel_corresponding_to_frq()\n");
-        return(PROGRAM_ERROR);
-    }
-    *chan = (int)((fabs(thisfrq) + dz->halfchwidth)/dz->chwidth);  /* TRUNCATE */
-    if(*chan >= dz->clength) {
-        sprintf(errstr,"chan (%d) beyond clength-1 (%d) returned: fractal_get_channel_corresponding_to_frq()\n",
-        *chan,(dz->clength)-1);
-        return(PROGRAM_ERROR);
-    }
-    return(FINISHED);
-}
-