| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707 |
- /*
- * 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
- *
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <structures.h>
- #include <tkglobals.h>
- #include <pnames.h>
- #include <globcon.h>
- #include <modeno.h>
- #include <arrays.h>
- #include <flags.h>
- #include <fmnts.h>
- #include <cdpmain.h>
- #include <formants.h>
- #include <speccon.h>
- #include <sfsys.h>
- #include <string.h>
- #include <fmnts.h>
- static int inner_form_loop(int windows_in_buf,dataptr dz);
- static int do_specform(dataptr dz);
- static int form_filter(dataptr dz);
- static int form_gain(dataptr dz);
- static int vocode_channel(int vc,dataptr dz);
- static int eliminate_out_of_range_data(dataptr dz);
- static int vocogain(dataptr dz);
- static int reset_file_to_start_and_pointers_to_after_descriptor_blocks(int *windows_in_buf,dataptr dz);
- static int renormalise_formsee(dataptr dz);
- //static int setformval(int *thissamp,float inval,double normaliser,double adjuster);
- static int setformval(float *thissamp,float inval,double normaliser,double adjuster);
- static int do_specformants(dataptr dz);
- static int extract_formant_and_place_in_output_buffer(int formantlen,dataptr dz);
- static int get_max_formantval(dataptr dz);
- static int initialise_the_formant_data(int *windows_in_buf,dataptr dz);
- /****************************** SPECFORMANTS ***************************/
- int specformants(dataptr dz)
- {
- int exit_status;
- int wc, windows_in_buf;
- int OK = 1;
- if(sloom)
- dz->total_samps_read = 0L;
- dz->time = 0.0f;
- while(OK) {
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
- return exit_status;
- if(dz->ssampsread <= 0)
- break;
- dz->flbufptr[0] = dz->bigfbuf;
- windows_in_buf = dz->ssampsread/dz->wanted;
- for(wc=0; wc<windows_in_buf; wc++) {
- if(dz->total_windows==0) {
- if((exit_status = skip_or_special_operation_on_window_zero(dz))<0)
- return(exit_status);
- if(exit_status==TRUE) {
- dz->flbufptr[0] += dz->wanted;
- dz->total_windows++;
- dz->time = (float)(dz->time + dz->frametime);
- continue;
- }
- }
- if((exit_status = do_specformants(dz))<0)
- return(exit_status);
- dz->flbufptr[0] += dz->wanted; /* move along bigfbuf */
- dz->total_windows++;
- dz->time = (float)(dz->time + dz->frametime);
- }
- }
- if(dz->iparam[FMNT_SAMPS_TO_WRITE] > 0) {
- if((exit_status = write_samps(dz->flbufptr[2],dz->iparam[FMNT_SAMPS_TO_WRITE],dz))<0)
- return(exit_status);
- }
- return(FINISHED);
- }
- /**************************** DO_SPECFORMANTS ***************************
- *
- * Extract formants from an analfile.
- */
- int do_specformants(dataptr dz)
- {
- int exit_status;
- rectify_window(dz->flbufptr[0],dz);
- if((exit_status = extract_specenv(0,0,dz))<0)
- return(exit_status);
- memmove((char *)dz->flbufptr[1],(char *)dz->specenvamp,(dz->infile->specenvcnt * sizeof(float)));
- if((dz->iparam[FMNT_SAMPS_TO_WRITE] += dz->infile->specenvcnt) >= dz->buflen2) {
- if((exit_status = write_exact_samps(dz->flbufptr[2],dz->buflen2,dz))<0)
- return(exit_status);
- dz->iparam[FMNT_SAMPS_TO_WRITE] = 0L;
- dz->flbufptr[1] = dz->flbufptr[2];
- } else
- dz->flbufptr[1] += dz->infile->specenvcnt; /* move along dz->flbufptr[2] */
- return(FINISHED);
- }
- /****************************** SPECFORM ***************************/
- int specform(dataptr dz)
- {
- int exit_status, current_status;
- int windows_in_buf;
-
- if(sloom)
- dz->total_samps_read = 0L;
- dz->time = 0.0f;
- if((exit_status = setup_formant_params(dz->ifd[1],dz))<0)
- return(exit_status);
- // if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) ALREADY READ IN setup_formant_params()
- // return(exit_status);
- while(dz->ssampsread > 0) {
- dz->flbufptr[0] = dz->bigfbuf;
- windows_in_buf = dz->ssampsread/dz->wanted;
- if((exit_status = inner_form_loop(windows_in_buf,dz))<0) {
- dz->specenvamp2 = (float *)0;
- return(exit_status);
- }
- current_status = exit_status;
- if(dz->flbufptr[0] - dz->bigfbuf > 0) {
- if((exit_status = write_samps(dz->bigfbuf,(dz->flbufptr[0] - dz->bigfbuf),dz))<0) {
- dz->specenvamp2 = NULL;
- return(exit_status);
- }
- }
- if(current_status!=CONTINUE)
- break;
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
- return(exit_status);
- }
- dz->specenvamp2 = NULL;
- return(FINISHED);
- }
- /****************************** INNER_FORM_LOOP ***************************/
- int inner_form_loop(int windows_in_buf,dataptr dz)
- {
- int exit_status;
- int wc;
- double pre_amptotal, post_amptotal;
- for(wc=0; wc<windows_in_buf; wc++) {
- if(dz->total_windows==0) {
- if((exit_status = move_along_formant_buffer(dz))!=CONTINUE)
- return(exit_status);
- dz->flbufptr[0] += dz->wanted;
- dz->total_windows++;
- dz->time = (float)(dz->time + dz->frametime);
- continue; /* SKIP FIRST (ZERO-AMP) WINDOW */
- }
- if(dz->mode==FORM_REPLACE) {
- rectify_window(dz->flbufptr[0],dz);
- if((exit_status = extract_specenv(0,0,dz))<0)
- return(exit_status);
- }
- dz->specenvamp2 = dz->flbufptr[1];
- pre_amptotal = post_amptotal = 0.0;
- if((exit_status = get_totalamp(&pre_amptotal,dz->flbufptr[0],dz->wanted))<0)
- return(exit_status);
- if((exit_status = do_specform(dz))<0)
- return(exit_status);
- if((exit_status = form_filter(dz))<0)
- return(exit_status);
- if((exit_status = get_totalamp(&post_amptotal,dz->flbufptr[0],dz->wanted))<0)
- return(exit_status);
- if((exit_status = normalise(pre_amptotal,post_amptotal,dz))<0)
- return(exit_status);
- if(!flteq(dz->param[FORM_GAIN],1.0)) {
- if((exit_status = form_gain(dz))<0)
- return(exit_status);
- /* NB This check must be BEFORE move_along_formant_buffer() */
- }
- dz->flbufptr[0] += dz->wanted;
- if(++dz->total_windows >= dz->wlength)
- return(FINISHED);
- if((exit_status = move_along_formant_buffer(dz))!=CONTINUE)
- return(exit_status);
- dz->time = (float)(dz->time + dz->frametime);
- }
- return(CONTINUE);
- }
- /**************************** DO_SPECFORM ***************************
- *
- * Impose formants onto an analfile.
- */
- int do_specform(dataptr dz)
- {
- int exit_status;
- int vc;
- double thisspecamp0, thisspecamp1, thisvalue;
- rectify_window(dz->flbufptr[0],dz);
- switch(dz->mode) {
- case(FORM_REPLACE):
- for(vc = 0; vc < dz->wanted ; vc += 2) {
- if((exit_status = getspecenvamp(&thisspecamp0,(double)dz->flbufptr[0][FREQ],0,dz))<0)
- return(exit_status);
- if((exit_status = getspecenvamp(&thisspecamp1,(double)dz->flbufptr[0][FREQ],1,dz))<0)
- return(exit_status);
- if(thisspecamp0 < VERY_TINY_VAL)
- dz->flbufptr[0][AMPP] = 0.0f;
- else {
- if((thisvalue = dz->flbufptr[0][AMPP] * thisspecamp1/thisspecamp0)< VERY_TINY_VAL)
- dz->flbufptr[0][AMPP] = 0.0f;
- else
- dz->flbufptr[0][AMPP] = (float)thisvalue;
- }
- }
- break;
- case(FORM_IMPOSE):
- for(vc = 0; vc < dz->wanted ; vc += 2) {
- if((exit_status = getspecenvamp(&thisspecamp1,(double)dz->flbufptr[0][FREQ],1,dz))<0)
- return(exit_status);
- if((thisvalue = dz->flbufptr[0][AMPP] * thisspecamp1)< VERY_TINY_VAL)
- dz->flbufptr[0][AMPP] = 0.0f;
- else
- dz->flbufptr[0][AMPP] = (float)thisvalue;
- }
- break;
- default:
- sprintf(errstr,"Unknown case in do_specform()\n");
- return(PROGRAM_ERROR);
- }
- return(FINISHED);
- }
- /****************************** FORM_FILTER ***************************/
- int form_filter(dataptr dz)
- {
- int vc;
- for(vc = 0; vc < dz->wanted ; vc += 2) {
- if(dz->flbufptr[0][FREQ] < dz->param[FORM_FBOT]
- || dz->flbufptr[0][FREQ] > dz->param[FORM_FTOP])
- dz->flbufptr[0][AMPP] = 0.0f;
- }
- return(FINISHED);
- }
- /****************************** FORM_GAIN ***************************/
- int form_gain(dataptr dz)
- {
- int vc;
- for(vc=0;vc<dz->wanted;vc+=2)
- dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] * dz->param[FORM_GAIN]);
- return(FINISHED);
- }
- /************************** SPECVOCODE ***********************/
- int specvocode(dataptr dz)
- {
- int exit_status;
- int vc;
- double pre_amptotal, post_amptotal;
- rectify_window(dz->flbufptr[0],dz);
- if((exit_status = extract_specenv(0,0,dz))<0)
- return(exit_status);
- rectify_window(dz->flbufptr[1],dz);
- if((exit_status = extract_specenv(1,1,dz))<0)
- return(exit_status);
- if((exit_status = get_totalamp(&pre_amptotal,dz->flbufptr[0],dz->wanted))<0)
- return(exit_status);
- for(vc = 0; vc < dz->wanted; vc += 2) {
- if((exit_status = vocode_channel(vc,dz))<0)
- return(exit_status);
- }
- if((exit_status = eliminate_out_of_range_data(dz))<0)
- return(exit_status);
- if((exit_status = get_totalamp(&post_amptotal,dz->flbufptr[0],dz->wanted))<0)
- return(exit_status);
- if((exit_status = normalise(pre_amptotal,post_amptotal,dz))<0)
- return(exit_status);
- return vocogain(dz);
- }
- /************************** VOCODE_CHANNEL ***********************/
- int vocode_channel(int vc,dataptr dz)
- {
- int exit_status;
- double thisvalue;
- double thisspecamp1, thisspecamp2;
- if((exit_status = getspecenvamp(&thisspecamp1,(double)dz->flbufptr[0][FREQ],0,dz))<0)
- return(exit_status);
- if((exit_status = getspecenvamp(&thisspecamp2,(double)dz->flbufptr[1][FREQ],1,dz))<0)
- return(exit_status);
- if(thisspecamp1 <= 0.0)
- dz->flbufptr[0][AMPP] = 0.0f;
- else {
- if((thisvalue = dz->flbufptr[0][AMPP] * thisspecamp2/thisspecamp1) < VERY_TINY_VAL)
- dz->flbufptr[0][AMPP] = 0.0f;
- else
- dz->flbufptr[0][AMPP] = (float)thisvalue;
- }
- return(FINISHED);
- }
- /************************** ELIMINATE_OUT_OF_RANGE_DATA ***********************/
- int eliminate_out_of_range_data(dataptr dz)
- {
- int vc;
- for(vc = 0;vc < dz->wanted; vc+=2) {
- if(dz->flbufptr[0][FREQ] < dz->param[VOCO_LOF] || dz->flbufptr[0][FREQ] > dz->param[VOCO_HIF])
- dz->flbufptr[0][AMPP] = 0.0f;
- }
- return(FINISHED);
- }
- /************************** VOCOGAIN ***********************/
- int vocogain(dataptr dz)
- {
- int vc;
- if(!flteq(dz->param[VOCO_GAIN],1.0)) {
- for(vc=0;vc<dz->wanted;vc+=2)
- dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] * dz->param[VOCO_GAIN]);
- }
- return(FINISHED);
- }
- /**************************** SPECFMNTSEE ***************************/
- int specfmntsee(dataptr dz)
- {
- int exit_status;
- double thisval;
- int windows_in_buf, wc;
- int cc;
- double normaliser;
- // double adjuster = (double)MAXSAMP/log(10000.0);
- double adjuster = F_MAXSAMP/log(10000.0);
- int outcnt = 0, outbufcnt = 0;
- if(sloom)
- dz->total_samps_read = 0L;
- if((exit_status = initialise_the_formant_data(&windows_in_buf,dz))<0)
- return(exit_status);
- normaliser = 9999.0/dz->param[FMNTSEE_MAX];
- dz->time = 0.0f;
- do {
- for(wc=0; wc<windows_in_buf; wc++) {
- if(dz->total_windows==0) {
- if((exit_status = skip_or_special_operation_on_window_zero(dz))<0)
- return(exit_status);
- if(exit_status==TRUE) {
- dz->flbufptr[0] += dz->wanted;
- dz->total_windows++;
- dz->time = (float)(dz->time + dz->frametime);
- continue;
- }
- }
- for(cc = 0; cc < dz->wanted; cc++) {
- thisval = log((dz->flbufptr[0][cc] * normaliser) + 1.0);
- thisval *= adjuster;
- // dz->sndbuf[outcnt] = (short)round(thisval);
- dz->sndbuf[outcnt] = (float)thisval;
- if(++outcnt >= (dz->infile->specenvcnt + SPACER) * FMNT_BUFMULT) {
- sprintf(errstr,"buffer accounting error in specfmntsee()\n");
- return(PROGRAM_ERROR);
- }
- }
- for(cc = 0; cc < SPACER; cc++)
- // dz->sndbuf[outcnt++] = (short)0;
- dz->sndbuf[outcnt++] = 0.0f;
- if(++outbufcnt >= FMNT_BUFMULT) {
- if(outcnt != (dz->infile->specenvcnt + SPACER) * FMNT_BUFMULT) {
- sprintf(errstr,"bufcount error in specfmntsee()\n");
- return(PROGRAM_ERROR);
- }
- if(outcnt > 0) {
- if((exit_status = write_samps(dz->sndbuf,outcnt,dz))<0)
- return(exit_status);
- }
- outcnt = 0;
- outbufcnt = 0;
- }
- dz->flbufptr[0] += dz->wanted; /* move along bigfbuf */
- dz->time = (float)(dz->time + dz->frametime);
- }
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
- sprintf(errstr,"Sound read error.\n");
- return(SYSTEM_ERROR);
- }
- dz->flbufptr[0] = dz->bigfbuf;
- windows_in_buf = dz->ssampsread/dz->wanted;
- } while(windows_in_buf > 0);
- if(outcnt) {
- if((exit_status = write_samps(dz->sndbuf,outcnt,dz))<0)
- return(exit_status);
- }
- return(FINISHED);
- }
- /*********************** RESET_FILE_TO_START_AND_POINTERS_TO_AFTER_DESCRIPTOR_BLOCKS **********************/
- int reset_file_to_start_and_pointers_to_after_descriptor_blocks(int *windows_in_buf,dataptr dz)
- {
- int exit_status;
- if(sndseekEx(dz->ifd[0],0L,0)<0) { /* RESET FILE POINTER TO START OF DATA */
- sprintf(errstr,"seek failed in reset_file_to_start_and_pointers_to_after_descriptor_blocks()\n");
- return(SYSTEM_ERROR);
- }
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
- sprintf(errstr,"Read problem after rewind in reset_file_to_start_and_pointers_to_after_descriptor_blocks()\n");
- return(SYSTEM_ERROR);
- }
- *windows_in_buf = dz->ssampsread/dz->wanted;
- if((*windows_in_buf -= DESCRIPTOR_DATA_BLOKS) < 0) {
- sprintf(errstr,"Buffers too SMALL in reset_file_to_start_and_pointers_to_after_descriptor_blocks()\n");
- return(PROGRAM_ERROR);
- }
- dz->flbufptr[0] = dz->bigfbuf + (DESCRIPTOR_DATA_BLOKS * dz->wanted);
- return(FINISHED);
- }
- /**************************** OUTER_FORMSEE_LOOP ****************************/
- int outer_formsee_loop(dataptr dz)
- {
- int exit_status;
- int windows_in_buf, peakscore = 0, pitchcnt = 0;
- int in_start_portion = TRUE, least = 0, descnt = 0;
- if(sloom)
- dz->total_samps_read = 0L;
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
- return(exit_status);
- while(dz->ssampsread > 0) {
- dz->flbufptr[0] = dz->bigfbuf;
- windows_in_buf = dz->ssampsread/dz->wanted;
- if((exit_status = inner_loop(&peakscore,&descnt,&in_start_portion,&least,&pitchcnt,windows_in_buf,dz))<0)
- return(exit_status);
- if((exit_status = write_samps(dz->bigfbuf,dz->ssampsread,dz))<0)
- return(exit_status);
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
- return(exit_status);
- }
- if(dz->ssampsread < 0) {
- sprintf(errstr,"Sound read error.\n");
- return(SYSTEM_ERROR);
- }
- return renormalise_formsee(dz);
- }
- /******************************* RENORMALISE_FORMSEE ****************************
- *
- * Multiply by 9999/formantmax -> range 0 TO 9999.
- * Add 1 -> range 1 TO 10000.
- * Take log : -> range 0 TO log(10000).(log display)
- * Times MAXSAMPP/log(10000) : -> range 0 TO MAXSAMPP (log log display)
- */
- int renormalise_formsee(dataptr dz)
- {
- int exit_status;
- int cc, vc;
- int wc, outcnt, outbufcnt /* , total_samps_read */;
- int ssampsread, total_samps_todo = dz->total_samps_written;
- int windows_in_buf;
- int windows_remaining = dz->wlength;
- float thissamp;
- double normaliser;
- double adjuster = F_MAXSAMP/log(10000.0);
- int chans, stype;
- int srate;
- if(dz->param[FSEE_FMAX] < VERY_TINY_VAL) {
- sprintf(errstr,"No siginificant data found in srcfile\n");
- return(DATA_ERROR);
- }
- //TW NEW MECHANISM writes renormalised vals from original file created (tempfile) into true outfile
- // true outfile gets the name the user originally input
- if(sndcloseEx(dz->ifd[0]) < 0) {
- sprintf(errstr, "WARNING: Can't close input soundfile\n");
- return(SYSTEM_ERROR);
- }
- if(sndcloseEx(dz->ofd) < 0) {
- sprintf(errstr, "WARNING: Can't close output soundfile\n");
- return(SYSTEM_ERROR);
- }
- if((dz->ifd[0] = sndopenEx(dz->outfilename,0,CDP_OPEN_RDWR)) < 0) { /* RWD Nov 2003 was RDONLY */
- sprintf(errstr,"Failure to reopen file %s for renormalisation.\n",dz->outfilename);
- return(SYSTEM_ERROR);
- }
- /* RWD Jumy 2010 no lopmger need this - now built into sndopenEx in sfsys */
- //sndseekEx(dz->ifd[0],0,0);
- chans = dz->infile->channels;
- srate = dz->infile->srate;
- stype = dz->infile->stype;
- dz->infile->channels = 1;
- dz->infile->srate = dz->infile->origrate;
- dz->infile->stype = SAMP_SHORT;
- if((exit_status = create_sized_outfile(dz->wordstor[0],dz))<0) {
- sprintf(errstr,"Failure to create file %s for renormalisation.\n",dz->wordstor[0]);
- return(exit_status);
- }
- dz->infile->channels = chans;
- dz->infile->srate = srate;
- dz->infile->stype = stype;
- if((exit_status = reset_peak_finder(dz))<0)
- return(exit_status);
- normaliser = 9999.0/dz->param[FSEE_FMAX];
- total_samps_todo = dz->total_samps_written;
- outbufcnt = 0L;
- outcnt = 0L;
- // total_samps_read = 0L;
- dz->total_samps_written = 0L;
- dz->total_windows = 0L;
- dz->total_samps_read = 0L;
- while(total_samps_todo > 0) {
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
- sprintf(errstr,"Sound read error.\n");
- close_and_delete_tempfile(dz->outfilename,dz);
- return(SYSTEM_ERROR);
- }
- dz->flbufptr[0] = dz->bigfbuf;
- // total_samps_read += dz->ssampsread;
- ssampsread = dz->ssampsread;
- if(total_samps_todo - ssampsread<0) {
- ssampsread = total_samps_todo;
- total_samps_todo = 0;
- } else
- total_samps_todo -= ssampsread;
- windows_in_buf = ssampsread/dz->wanted;
- if(windows_remaining - windows_in_buf < 0) {
- windows_in_buf = windows_remaining;
- windows_remaining = 0;
- } else
- windows_remaining -= windows_in_buf;
- for(wc=0;wc<windows_in_buf;wc++) {
- if(dz->total_windows==0) {
- for(cc=0;cc<dz->clength;cc++)
- dz->sndbuf[outcnt++] = 0.0f;
- } else {
- for(cc=0,vc=0;cc<dz->iparam[FSEE_FCNT];cc++,vc += 2) { /* 1 */
- if((exit_status = setformval(&thissamp,dz->flbufptr[0][AMPP],normaliser,adjuster))<0)
- return(exit_status);
- dz->sndbuf[outcnt++] = thissamp;
- }
- for(;cc<dz->clength;cc++)
- dz->sndbuf[outcnt++] = 0.0f;
- }
- if(++outbufcnt >= FMNT_BUFMULT) {
- if(outcnt!=dz->clength * FMNT_BUFMULT) {
- sprintf(errstr,"Buffercnt error in renormalise_formsee()\n");
- close_and_delete_tempfile(dz->outfilename,dz);
- return(PROGRAM_ERROR);
- }
- if(outcnt > 0) {
- if((exit_status = write_samps(dz->sndbuf,outcnt,dz))<0) {
- close_and_delete_tempfile(dz->outfilename,dz);
- return(exit_status);
- }
- }
- outcnt = 0;
- outbufcnt = 0;
- }
- dz->flbufptr[0] += dz->wanted;
- dz->total_windows++;
- }
- if(windows_remaining <=0)
- break;
- }
- if(outcnt) {
- if((exit_status = write_samps(dz->sndbuf,outcnt,dz))<0) {
- close_and_delete_tempfile(dz->outfilename,dz);
- return(exit_status);
- }
- }
- close_and_delete_tempfile(dz->outfilename,dz);
- return(FINISHED);
- }
- /****************************** SETFORMVAL ***************************/
- //int setformval(int *thissamp,float inval,double normaliser,double adjuster)
- int setformval(float *thissamp,float inval,double normaliser,double adjuster)
- {
- double thisval = log((inval * normaliser) + 1.0);
- // thisval *= adjuster;
- // *thissamp = round(thisval);
- *thissamp = (float)(thisval * adjuster);
- return(FINISHED);
- }
- /**************************** SPECFORMSEE ***************************/
- int specformsee(dataptr dz)
- {
- int exit_status;
- rectify_window(dz->flbufptr[0],dz);
- if((exit_status = extract_specenv(0,0,dz))<0)
- return(exit_status);
- return extract_formant_and_place_in_output_buffer(dz->iparam[FSEE_FCNT],dz);
- }
-
- /*********************** EXTRACT_FORMANT_AND_PLACE_IN_OUTPUT_BUFFER **********************/
- int extract_formant_and_place_in_output_buffer(int formantlen,dataptr dz)
- {
- int exit_status;
- int cc, vc;
- double thisamp;
- for(cc=0,vc=0;cc<formantlen;cc++,vc+=2) {
- if((exit_status = getspecenvamp(&thisamp,dz->windowbuf[0][cc],0,dz))<0)
- return(exit_status);
- dz->flbufptr[0][AMPP] = (float)thisamp;
- if(dz->flbufptr[0][AMPP] > dz->param[FSEE_FMAX])
- dz->param[FSEE_FMAX] = dz->flbufptr[0][AMPP];
- }
- for(;cc<dz->clength;cc++,vc+=2)
- dz->flbufptr[0][AMPP] = 0.0f;
- return(FINISHED);
- }
- /***************************** GET_MAX_FORMANTVAL *************************/
- int get_max_formantval(dataptr dz)
- {
- int exit_status;
- int total_floats_in_file = (dz->wlength + DESCRIPTOR_DATA_BLOKS) * dz->infile->specenvcnt;
- int floats_read = min(total_floats_in_file,dz->big_fsize);
- float *sbufend = dz->bigfbuf + floats_read;
- float *sbuf = dz->flbufptr[0];
- /* which has already skipped the float descriptor blocks */
- dz->param[FMNTSEE_MAX] = 0.0;
- do {
- while(sbuf < sbufend) {
- if(*sbuf > dz->param[FMNTSEE_MAX])
- dz->param[FMNTSEE_MAX] = *sbuf;
- sbuf++;
- }
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
- sprintf(errstr,"Sound read error.\n");
- return(SYSTEM_ERROR);
- }
- sbuf = dz->bigfbuf;
- sbufend = dz->bigfbuf + dz->ssampsread;
- } while(dz->ssampsread > 0);
- return(FINISHED);
- }
- /***************************** INITIALISE_THE_FORMANT_DATA *************************/
- int initialise_the_formant_data(int *windows_in_buf,dataptr dz)
- {
- int exit_status;
- int fsamps_to_read = dz->descriptor_samps/DESCRIPTOR_DATA_BLOKS;
- if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
- return(exit_status);
- if(dz->ssampsread < dz->descriptor_samps) {
- sprintf(errstr,"No significant data in formantfile.\n");
- return(DATA_ERROR);
- }
- dz->flbufptr[0] = dz->bigfbuf;
- memmove((char *)dz->specenvpch,(char *)dz->flbufptr[0],(size_t)(fsamps_to_read * sizeof(float)));
- dz->flbufptr[0] += dz->infile->specenvcnt;
- memmove((char *)dz->specenvtop,(char *)dz->flbufptr[0],(size_t)(fsamps_to_read * sizeof(float)));
- dz->flbufptr[0] += dz->infile->specenvcnt;
- dz->flbufptr[0] = dz->bigfbuf + (DESCRIPTOR_DATA_BLOKS * dz->wanted);
- *windows_in_buf = dz->ssampsread/dz->wanted;
- if((*windows_in_buf -= DESCRIPTOR_DATA_BLOKS) <= 0) {
- sprintf(errstr,"Buffers too SMALL for formant data.\n");
- return(PROGRAM_ERROR);
- }
- if(dz->vflag[FMNT_VIEW])
- print_formant_params_to_screen(dz);
- if((exit_status = get_max_formantval(dz))<0)
- return(exit_status);
- return reset_file_to_start_and_pointers_to_after_descriptor_blocks(windows_in_buf,dz);
- }
|