| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850 |
- /*
- * 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
- *
- */
- /*
- * Generating melodic (etc) output using tones of defined spectrum, in non-tempered tunings.
- *
- * Get list of notes, times, amplitudes, durs from textlisting or MIDI device: LOOM INTERFACE
- *
- * Map to a different temperament if required : LOOM INTERFACE
- *
- * Generate list of frequencies, amplitudes, durations required
- * Find the MAXIMUM duration at each frequency
- *
- * Define the spectrum of the synthesized tones,
- * from a listing of harmonics and their relative amplitudes: LOOM INTERFACE
- *
- * Synthesis the max-duration(+safety note) required at each frequency
- *
- * Cut shorter notes to size by editing the maxlength notes
- * Here must associate each output file with appropriate output time/amp info (for mix)
- *
- * Employ any envelope-shaping, vib, trem, jitter required
- * Create a mixfile to mix the resulting events
- * Check output level, reset mixamplitude
- * Run mix
- */
- // USAGE: newscales outfile datafile spectrumfile srate
- #define SC_SYN_SRATE (0)
- #define MAXLEVEL (0.9)
- #include <stdio.h>
- #include <stdlib.h>
- #include <structures.h>
- #include <tkglobals.h>
- #include <globcon.h>
- #include <cdpmain.h>
- #include <synth.h>
- #include <processno.h>
- #include <modeno.h>
- #include <pnames.h>
- #include <flags.h>
- #include <arrays.h>
- #include <math.h>
- #include <logic.h>
- #include <speccon.h>
- #include <sfsys.h>
- #include <osbind.h>
- #include <string.h>
- //TW UPDATE
- #include <limits.h>
- #include <filetype.h>
- #include <filetype.h>
- #include <ctype.h>
- #include <srates.h>
- #ifdef unix
- #define round(x) lround((x))
- #endif
- char errstr[2400];
- int anal_infiles = 1;
- int sloom = 0;
- int sloombatch = 0;
- const char* cdp_version = "6.1.0";
- /**************************** SYNTHESIS STAGE ****************************/
- #define SC_SYN_TABSIZE 4096
- static int generate_all_tones(double *frq,int frqcnt,int *duration,double **harm,double **amp, dataptr dz);
- static int gentable(double *tab,int tabsize,dataptr dz);
- static int gen_sound(double frq, double *tab,int sampdur,double sr,double *harm,double *amp, int harmcnt,dataptr dz);
- static double getval(double *tab,int i,double fracstep,double amp);
- static void advance_in_table(double frq,int *i,double convertor,double *step,double *fracstep,double dtabsize);
- static int read_srate(char *str,dataptr dz);
- static int setup_newscales_application(dataptr dz);
- static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
- static int read_spectrum_data(char **cmdline,double ***harm,double ***amp,double maxfrq,dataptr dz);
- static int read_newscales_data(char **cmdline,double **frq,int **duration,double *maxfrq,dataptr dz);
- static int establish_application(dataptr dz);
- /*
- * Params must be a special data file containing
- * (1) A list of frequencies to synthesize (each required frq synthd only ONCE
- * (2) A list of their durations (these are > maximum duration used by any frequency in the original input melody)
- * (3) A list of harmonics
- * (4) A list of harmonic amplitudes
- */
- /**************************************** MAIN *********************************************/
- int main(int argc,char *argv[])
- {
- int exit_status;
- dataptr dz = NULL;
- char **cmdline;
- int cmdlinecnt;
- int n;
- int is_launched = FALSE;
- double *frq, **harm, **amp, maxfrq;
- int *duration;
-
- 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(argc < 4 || argc > 5) {
- usage2("dummy");
- return(FAILED);
- }
- if(argc == 5){
- if((exit_status = read_srate(argv[4],dz))<0) {
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- } else
- dz->infile->srate = 44100;
- dz->nyquist = dz->infile->srate/2.0;
- cmdline = argv;
- cmdlinecnt = argc;
- if((exit_status = setup_newscales_application(dz))<0) {
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- cmdline++;
- cmdlinecnt--;
- if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- if((exit_status = read_newscales_data(cmdline,&frq,&duration,&maxfrq,dz))<0) {
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- cmdline++;
- cmdlinecnt--;
- if((exit_status = read_spectrum_data(cmdline,&harm,&,maxfrq,dz))<0) {
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- dz->infile->channels = 1;
- is_launched = TRUE;
- dz->bufcnt = 1;
- 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);
- }
- for(n = 0;n <dz->bufcnt; n++)
- dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
- dz->sampbuf[n] = (float *)0;
- if((exit_status = create_sndbufs(dz))<0) { // CDP LIB
- print_messages_and_close_sndfiles(exit_status,is_launched,dz);
- return(FAILED);
- }
- if((exit_status = generate_all_tones(frq,dz->itemcnt,duration,harm,amp,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);
- }
- int generate_all_tones(double *frq,int frqcnt,int *duration,double **harm,double **amp,dataptr dz)
- {
- int exit_status;
- double *tab;
- int n, sampdur;
- double sr = (double)dz->infile->srate;
- char outfilename[200], temp[4];
- if((dz->insams = (int *)malloc(1 * sizeof(int)))==NULL) {
- sprintf(errstr,"Insufficient memory for insams arrays.\n");
- return(MEMORY_ERROR);
- }
- if((tab = (double *)malloc((SC_SYN_TABSIZE+1) * sizeof(double)))==NULL) {
- sprintf(errstr,"Insufficient memory for wave table.\n");
- return(MEMORY_ERROR);
- }
- if((exit_status = gentable(tab,SC_SYN_TABSIZE,dz))<0)
- return(exit_status);
- n = 0;
- while(n < frqcnt) {
- strcpy(outfilename,dz->outfilename);
- sprintf(temp,"%d",n);
- strcat(outfilename,temp);
- strcat(outfilename,".wav");
- sampdur = duration[n];
- dz->insams[0] = duration[n];
- dz->process_type = EQUAL_SNDFILE; /* allow sndfile to be created */
- if((exit_status = create_sized_outfile(outfilename,dz))<0) {
- sprintf(errstr, "Failed to open file %s\n",outfilename);
- /*free(outfilename);*/
- dz->ofd = -1;
- dz->process_type = OTHER_PROCESS;
- return(GOAL_FAILED);
- }
- reset_filedata_counters(dz);
- //HEREH, DEPENDING ON WHICH NOTE IT IS, WE GET THE HARMONIC COUNT FROM wordcnt[n],
-
- if((exit_status = gen_sound(frq[n],tab,sampdur,sr,harm[n],amp[n],dz->wordcnt[n],dz))<0) {
- fprintf(stdout,"Synthesis %d failed.\n",n+1);
- fflush(stdout);
- return(GOAL_FAILED);
- }
- if((exit_status = headwrite(dz->ofd,dz))<0) {
- fprintf(stdout,"Failed to write header to synthed output %d.\n",n+1);
- fflush(stdout);
- return(exit_status);
- }
- n++;
- if((exit_status = reset_peak_finder(dz))<0) {
- if(n < frqcnt) {
- fprintf(stdout,"Failed to reset peakfinder for synthesis %d.\n",n+1);
- fflush(stdout);
- return(exit_status);
- }
- }
- if(sndcloseEx(dz->ofd)<0) {
- sprintf(errstr,"Failed to close output soundfile for synthesis %d.\n",n);
- return(SYSTEM_ERROR);
- }
- dz->ofd = -1;
- }
- return(FINISHED);
- }
- /******************************* GENTABLE ******************************/
- int gentable(double *tab,int tabsize,dataptr dz)
- {
- int n;
- double step;
- step = (2.0 * PI)/(double)tabsize;
- for(n=0;n<tabsize;n++)
- tab[n] = sin(step * (double)n) * F_MAXSAMP;
- tab[tabsize] = 0.0;
- return(FINISHED);
- }
- /****************************** GEN_SOUND *************************/
- int gen_sound(double frq, double *tab,int sampdur,double sr,double *harm,double *amp, int harmcnt,dataptr dz)
- {
- int exit_status;
- double inverse_sr = 1.0/sr;
- double *step;
- double dtabsize = (double)SC_SYN_TABSIZE;
- double convertor = dtabsize * inverse_sr, maxsamp, normaliser;
- int n, m, *i;
- int chans = dz->infile->channels;
- double harmfrq, harmamp;
- double *fracstep, val;
- int do_start = 1;
- int synth_splicelen = SYNTH_SPLICELEN * chans;
- int total_samps = 0;
- int startj = 0, endj = SYNTH_SPLICELEN;
- int total_samps_left = sampdur;
- int endsplicestart = sampdur - synth_splicelen;
- int todo;
- if((step = (double *)malloc(harmcnt * sizeof(double)))==NULL) {
- sprintf(errstr,"Insufficient memory all harmonic wave table step counters.\n");
- return(MEMORY_ERROR);
- }
- if((fracstep = (double *)malloc(harmcnt * sizeof(double)))==NULL) {
- sprintf(errstr,"Insufficient memory all harmonic wave table step counters.\n");
- return(MEMORY_ERROR);
- }
- if((i = (int *)malloc(harmcnt * sizeof(int)))==NULL) {
- sprintf(errstr,"Insufficient memory all harmonic wave table position indicators.\n");
- return(MEMORY_ERROR);
- }
- for(n = 0;n < harmcnt;n++) {
- step[n] = 0.0;
- fracstep[n] = 0.0;
- i[n] = 0;
- }
- if(sampdur < (synth_splicelen * 2) + chans) {
- fprintf(stdout,"ERROR: Specified output duration is less then available splicing length.\n");
- return(DATA_ERROR);
- }
- maxsamp = 0.0;
- /* FIRST PASS: ADD UP ALL HARMONICS, AND GET MAX OUTPUT LEVEL */
-
- while(total_samps_left > 0) {
- memset((char *)dz->bigbuf,0,dz->buflen * sizeof(float));
- if(total_samps_left/dz->buflen <= 0)
- todo = total_samps_left;
- else
- todo = dz->buflen;
- for(n = 0;n < harmcnt;n++) {
- harmfrq = frq * harm[n];
- harmamp = amp[n];
- m = 0;
- while(m < todo) {
- val = getval(tab,i[n],fracstep[n],harmamp);
- dz->bigbuf[m] = (float)(dz->bigbuf[m] + val);
- m++;
- advance_in_table(harmfrq,&(i[n]),convertor,&(step[n]),&(fracstep[n]),dtabsize);
- }
- }
- m = 0;
- while(m < todo) {
- if(fabs(dz->bigbuf[m]) > maxsamp)
- maxsamp = fabs(dz->bigbuf[m]);
- m++;
- }
- total_samps_left -= dz->buflen;
- }
- normaliser = 1.0;
- if(maxsamp > MAXLEVEL)
- normaliser = MAXLEVEL/maxsamp;
- total_samps_left = sampdur;
- while(total_samps_left > 0) {
- memset((char *)dz->bigbuf,0,dz->buflen * sizeof(float));
- if(total_samps_left/dz->buflen <= 0)
- todo = total_samps_left;
- else
- todo = dz->buflen;
- for(n = 0;n < harmcnt;n++) {
- harmfrq = frq * harm[n];
- harmamp = amp[n];
- m = 0;
- while(m < todo) {
- val = getval(tab,i[n],fracstep[n],harmamp);
- dz->bigbuf[m] = dz->bigbuf[m] + (float)val;
- m++;
- advance_in_table(harmfrq,&(i[n]),convertor,&(step[n]),&(fracstep[n]),dtabsize);
- }
- }
- m = 0;
- while(m < todo) {
- dz->bigbuf[m] = (float)(dz->bigbuf[m] * normaliser);
- if(do_start) {
- dz->bigbuf[m] = (float)(dz->bigbuf[m] * (startj++/(double)SYNTH_SPLICELEN));
- if(startj >= SYNTH_SPLICELEN)
- do_start = 0;
- }
- if(total_samps >= endsplicestart)
- dz->bigbuf[m] = (float)(dz->bigbuf[m] * (endj--/(double)SYNTH_SPLICELEN));
- total_samps++;
- m++;
- }
- if(todo) {
- if((exit_status = write_samps(dz->bigbuf,todo,dz))<0)
- return(exit_status);
- }
- total_samps_left -= dz->buflen;
- }
- return(FINISHED);
- }
-
- /****************************** GETVAL *************************/
- double getval(double *tab,int i,double fracstep,double amp)
- {
- double diff, val = tab[i];
-
- diff = tab[i+1] - val;
- val += diff * fracstep;
- val *= amp;
- return(val);
- }
- /****************************** ADVANCE_IN_TABLE *************************/
- static void advance_in_table(double frq,int *i,double convertor,double *step,double *fracstep,double dtabsize)
- {
- *step += frq * convertor;
- while(*step >= dtabsize)
- *step -= dtabsize;
- *i = (int)(*step); /* TRUNCATE */
- *fracstep = *step - (double)(*i);
- }
- /************************ HANDLE_THE_OUTFILE *********************/
- int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
- {
- int len;
- char *filename = (*cmdline)[0], *p, *q, *full_filename;
- if(filename[0]=='-' && filename[1]=='f') {
- dz->floatsam_output = 1;
- dz->true_outfile_stype = SAMP_FLOAT;
- filename+= 2;
- }
- full_filename = filename;
- len = strlen(filename);
- q = filename;
- p = filename + len;
- p--;
- while(p >= q) { /* Sesparate off path */
- if(*p == '/' || *p == '\\') {
- filename = p+1;
- break;
- }
- p--;
- }
- if((len = strlen(filename)) <= 0) {
- sprintf(errstr,"Invalid outfilename (path only).\n");
- return(MEMORY_ERROR);
- }
- q = filename;
- len = strlen(filename);
- p = filename + len;
- p--;
- while(p >= q) {
- if(*p == '.') { /* Snip off file extension */
- *p = ENDOFSTR;
- break;
- }
- p--;
- }
- if((len = strlen(filename)) <= 0) {
- sprintf(errstr,"Invalid outfilename.\n");
- return(MEMORY_ERROR);
- }
- p = filename + len;
- p--;
- if(isdigit(*p)) {
- sprintf(errstr,"Invalid outfilename (ends in number).\n");
- return(MEMORY_ERROR);
- }
- filename = full_filename;
- len = strlen(filename);
- len++;
- if((dz->outfilename = (char *)malloc(len * sizeof(char)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store output filename.\n");
- return(MEMORY_ERROR);
- }
- strcpy(dz->outfilename,filename);
- (*cmdline)++;
- (*cmdlinecnt)--;
- return(FINISHED);
- }
- /************************* SETUP_NEWSCALES_APPLICATION *******************/
- int setup_newscales_application(dataptr dz)
- {
- int exit_status;
- // aplptr ap;
- if((exit_status = establish_application(dz))<0) // GLOBAL
- return(FAILED);
- // ap = dz->application;
- // set_legal_infile_structure -->
- dz->has_otherfile = FALSE;
- // assign_process_logic -->
- dz->input_data_type = NO_FILE_AT_ALL;
- dz->process_type = UNEQUAL_SNDFILE;
- dz->outfiletype = SNDFILE_OUT;
- return(FINISHED);
- }
- /************************* READ_SRATE *******************/
- int read_srate(char *str,dataptr dz)
- {
- int dummy;
- if(sscanf(str,"%d",&dummy) != 1) {
- sprintf(errstr,"Failed to read output sample rate.\n");
- return(DATA_ERROR);
- }
- if(BAD_SR(dummy)) {
- sprintf(errstr,"Invalid sample rate.\n");
- return(DATA_ERROR);
- }
- dz->infile->srate = dummy;
- return(FINISHED);
- }
- /************************* READ_NEWSCALES_DATA *******************/
- int read_newscales_data(char **cmdline,double **frq,int **duration,double *maxfrq,dataptr dz)
- {
- double *f, dummy;
- int n = 0, dur, *d;
- char temp[200], *q;
- int isfrq;
- FILE *fp;
- if((fp = fopen(cmdline[0],"r"))==NULL) {
- sprintf(errstr, "Can't open datafile %s to read data.\n",cmdline[0]);
- return(DATA_ERROR);
- }
- n = 0;
- while(fgets(temp,200,fp)==temp) { /* READ AND TEST VALS */
- q = temp;
- if(*q == ';') // Allow comments in file
- continue;
- while(get_float_from_within_string(&q,&dummy)) {
- n++;
- }
- }
- if(n <= 0) {
- sprintf(errstr,"NO DATA Found in datafile.\n");
- return(DATA_ERROR);
- }
- if(ODD(n)) {
- sprintf(errstr,"DATA INCORRECTLY PAIRED in datafile %s.\n",cmdline[0]);
- return(DATA_ERROR);
- }
- n = n/2;
- dz->itemcnt = n;
- if((*frq = (double *)malloc(n * sizeof(double)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store note frequencies.\n");
- return(MEMORY_ERROR);
- }
- if((*duration = (int *)malloc(n * sizeof(int)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store note max-durations.\n");
- return(MEMORY_ERROR);
- }
- fseek(fp,0,0);
- f = *frq;
- d = *duration;
- n = 0;
- isfrq = 1;
- *maxfrq = 0.0;
- while(fgets(temp,200,fp)==temp) { /* READ AND STORE VALS */
- q = temp;
- if(*q == ';') // Allow comments in file
- continue;
- while(get_float_from_within_string(&q,&dummy)) {
- if(isfrq) {
- if(dummy <= 5) {
- sprintf(errstr,"Frq <= 5: too low for this application.\n");
- return(DATA_ERROR);
- }
- if(dummy > *maxfrq)
- *maxfrq = dummy;
- *f = dummy;
- f++;
- } else {
- if(dummy > 3600) {
- sprintf(errstr,"Duration greater than an hour: too long for this application.\n");
- return(DATA_ERROR);
- } else if (dummy <= 0.03) {
- sprintf(errstr,"Duration less than30 mS: too short for this application.\n");
- return(DATA_ERROR);
- }
- dur = (int)(round(dummy * dz->infile->srate));
- *d = dur;
- d++;
- }
- isfrq = !isfrq;
- }
- }
- return(FINISHED);
- }
- /************************* READ_SPECTRUM_DATA *******************/
- int read_spectrum_data(char **cmdline,double ***harm,double ***amp,double maxfrq,dataptr dz)
- {
- double *h, *a, dummy;
- int /*harmcnt,*/ linecnt, k;
- char temp[200], *q;
- int isharm;
- FILE *fp;
- if((fp = fopen(cmdline[0],"r"))==NULL) {
- sprintf(errstr, "Can't open datafile %s to read data.\n",cmdline[0]);
- return(DATA_ERROR);
- }
- // harmcnt = 0;
- linecnt = 0;
- while(fgets(temp,200,fp)==temp) { /* READ AND TEST VALS */
- q = temp;
- if(*q == ';') // Allow comments in file
- continue;
- k = 0;
- while(get_float_from_within_string(&q,&dummy)) {
- k++;
- }
- if(k == 0) {
- continue;
- }
- linecnt++;
- }
- if(linecnt != 1 && linecnt != dz->itemcnt) {
- sprintf(errstr,"No. of lines of spectral data (%d) does NOT = no. of notes entered (%d).\n",linecnt,dz->itemcnt);
- return(DATA_ERROR);
- }
- if((*harm = (double **)malloc(dz->itemcnt * sizeof(double *)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store harmonics info.\n");
- return(MEMORY_ERROR);
- }
- if((*amp = (double **)malloc(dz->itemcnt * sizeof(double *)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store amplitudes of harmonics.\n");
- return(MEMORY_ERROR);
- }
- if((dz->wordcnt = (int *)malloc(dz->itemcnt * sizeof(int)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store count of harmonics for each note.\n");
- return(MEMORY_ERROR);
- }
- linecnt = 0;
- fseek(fp,0,0);
- while(fgets(temp,200,fp)==temp) { /* READ AND TEST VALS */
- q = temp;
- if(*q == ';') // Allow comments in file
- continue;
- k = 0;
- while(get_float_from_within_string(&q,&dummy)) {
- k++;
- }
- if(k == 0) {
- continue;
- }
- if(k == 0 || ODD(k)) {
- sprintf(errstr,"SPECTRAL DATA INCORRECTLY PAIRED in datafile %s line %d\n",cmdline[0],linecnt+1);
- return(DATA_ERROR);
- }
- k /= 2;
- if(((*harm)[linecnt] = (double *)malloc(k * sizeof(double)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store harmonics info for note %d.\n",linecnt+1);
- return(MEMORY_ERROR);
- }
- if(((*amp)[linecnt] = (double *)malloc(k * sizeof(double)))==NULL) {
- sprintf(errstr,"INSUFFICIENT MEMORY to store amplitudes of harmonics for note %d.\n",linecnt+1);
- return(MEMORY_ERROR);
- }
- dz->wordcnt[linecnt] = k;
- linecnt++;
- } /* IF ONLY ONE SPECTRAL DATA LINE, ASSIGN SAME SPECTRUM TO ALL INPUT NOTES */
- fseek(fp,0,0);
- isharm = 1;
- linecnt = 0;
- while(fgets(temp,200,fp)==temp) { /* READ AND STORE VALS */
- h = (*harm)[linecnt];
- a = (*amp)[linecnt];
- q = temp;
- if(*q == ';') // Allow comments in file
- continue;
- k = 0;
- while(get_float_from_within_string(&q,&dummy)) {
- if(isharm) {
- if(dummy < 1) {
- sprintf(errstr,"Invalid harmonic value (< 1).\n");
- return(DATA_ERROR);
- } else if(dummy * maxfrq > dz->nyquist) {
- sprintf(errstr,"Harmonic value (%lf) too high for max frequency (%lf) being used\n",dummy,maxfrq);
- return(DATA_ERROR);
- }
- *h = dummy;
- h++;
- } else {
- if(dummy > 1 || dummy <= 0) {
- sprintf(errstr,"Harmonic amplitude out of range (>0 - 1).\n");
- return(DATA_ERROR);
- }
- *a = dummy;
- a++;
- }
- isharm = !isharm;
- }
- linecnt++;
- }
- if(linecnt == 1) {
- while(linecnt < dz->itemcnt) {
- (*harm)[linecnt] = (*harm)[0];
- (*amp)[linecnt] = (*amp)[0];
- dz->wordcnt[linecnt] = dz->wordcnt[0];
- linecnt++;
- }
- }
- return(FINISHED);
- }
- int usage2(char *dummy)
- {
- fprintf(stderr,"USAGE: newscales outfile datafile spectrumfile [srate]\n");
- fprintf(stderr,"outfile Generic name for output soundfiles (must not end with a number)\n");
- fprintf(stderr,"datafile Frq-amp pairs defining note-events in output\n");
- fprintf(stderr,"spectrumfile Harmonicnumber-amplitude pairs, define spectrum of note.\n");
- fprintf(stderr," One line for all notes\n");
- fprintf(stderr," OR\n");
- fprintf(stderr," One line for each note in the frq-list.\n");
- fprintf(stderr," (First line corresponds to lowest note, etc.)\n");
- return(FAILED);
- }
- /****************************** 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);
- }
- 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 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 *str,dataptr dz)
- {
- return(FINISHED);
- }
- int usage3(char *str1,char *str2)
- {
- return(FINISHED);
- }
- int usage1(void)
- {
- return(FINISHED);
- }
- int read_special_data(char *str,dataptr dz)
- {
- 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;
- //
- // if(dz->input_data_type==BRKFILES_ONLY
- // || dz->input_data_type==UNRANGED_BRKFILE_ONLY
- // || dz->input_data_type==DB_BRKFILES_ONLY
- // || dz->input_data_type==SNDFILE_AND_BRKFILE
- // || dz->input_data_type==SNDFILE_AND_UNRANGED_BRKFILE
- // || dz->input_data_type==SNDFILE_AND_DB_BRKFILE
- // || dz->input_data_type==ALL_FILES
- // || dz->input_data_type==ANY_NUMBER_OF_ANY_FILES
- // || dz->outfiletype==BRKFILE_OUT) {
- // dz->extrabrkno = brkcnt;
- // brkcnt++; /* extra brktable for input or output brkpntfile data */
- // }
- // 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);
- //
- // if((exit_status = establish_infile_constants(dz))<0)
- // return(exit_status);
- // if((exit_status = establish_bufptrs_and_extra_buffers(dz))<0)
- // return(exit_status);
- // if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
- // return(exit_status);
- // return(FINISHED);
- //}
|