tklib3.c 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #ifdef WIN32
  24. #include <malloc.h>
  25. #else
  26. #include <memory.h>
  27. #endif
  28. #include <ctype.h>
  29. #include <string.h>
  30. #include <structures.h>
  31. #include <flags.h>
  32. #include <speccon.h>
  33. #include <arrays.h>
  34. #include <special.h>
  35. #include <formants.h>
  36. #include <cdpmain.h>
  37. #include <tkglobals.h>
  38. #include <processno.h>
  39. #include <modeno.h>
  40. #include <globcon.h>
  41. #include <logic.h>
  42. #include <filetype.h>
  43. #include <stdlib.h>
  44. #include <mixxcon.h>
  45. #include <sfsys.h>
  46. #include <osbind.h>
  47. #include <math.h>
  48. #include <filetype.h>
  49. #include <pnames.h>
  50. #include <srates.h>
  51. #include <vowels.h>
  52. //#ifdef unix
  53. #define round(x) lround((x))
  54. //#endif
  55. /******************************************************************************/
  56. /************************* FORMERLY IN procspec.c *****************************/
  57. /******************************************************************************/
  58. static int extend_ring(int change_in_size,dataptr dz);
  59. static int shrink_ring(int change_in_size,dataptr dz);
  60. static int zero_channels_between_partials(int *vvc,double frq_close_below_next_partial,dataptr dz);
  61. static int eliminate_all_but_loudest_channel_near_this_partial_frq
  62. (int *vvc,double frq_close_above_next_partial,dataptr dz);
  63. static int keep_all_channels_near_partial_frq(int *vvc,double frq_close_above_next_partial,dataptr dz);
  64. static int do_amplitude_poll(int bot,int top,dataptr dz);
  65. /******************************************************************************/
  66. /************************* FORMERLY IN aplinit.c ******************************/
  67. /******************************************************************************/
  68. static int establish_application(dataptr dz);
  69. static int application_init(dataptr dz);
  70. static int initialise_vflags(dataptr dz);
  71. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  72. static int setup_and_init_input_brktable_constants(dataptr dz,int tipc);
  73. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  74. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  75. static int mark_parameter_types(dataptr dz,aplptr ap);
  76. static int establish_infile_constants(dataptr dz);
  77. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  78. static int get_domain_and_image(char *str,char **domain, char **image);
  79. static int consistent_domain_and_image(int dmncnt,int imgcnt,char *domain,char *image,dataptr dz);
  80. static int make_map(int dmncnt,int imgcnt,int mapping,char *domain,char *image,dataptr dz);
  81. /**************************** SETUP_PARTICULAR_APPLICATION *******************************/
  82. int setup_particular_application(dataptr dz)
  83. {
  84. int exit_status;
  85. aplptr ap;
  86. if((exit_status = establish_application(dz))<0)
  87. return(exit_status);
  88. ap = dz->application;
  89. if((exit_status = set_legal_param_structure(dz->process,dz->mode,ap))<0)
  90. return(exit_status); /* GLOBAL LIBRARY */
  91. if((exit_status = set_legal_option_and_variant_structure(dz->process,dz->mode,ap))<0)
  92. return(exit_status); /* GLOBAL LIBRARY */
  93. set_formant_flags(dz->process,dz->mode,ap); /* GLOBAL LIBRARY */
  94. if((exit_status = set_legal_internalparam_structure(dz->process,dz->mode,ap))<0)
  95. return(exit_status); /* LIBRARY */
  96. set_legal_infile_structure(dz); /* IN THIS FILE */
  97. assign_process_logic(dz); /* IN THIS FILE */
  98. if((exit_status = application_init(dz))<0) /* IN THIS FILE */
  99. return(exit_status);
  100. return(FINISHED);
  101. }
  102. /****************************** ESTABLISH_APPLICATION *******************************/
  103. int establish_application(dataptr dz)
  104. {
  105. aplptr ap;
  106. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  107. sprintf(errstr,"establish_application()\n");
  108. return(MEMORY_ERROR);
  109. }
  110. ap = dz->application;
  111. memset((char *)ap,0,sizeof(struct applic));
  112. return(FINISHED);
  113. }
  114. /***************************** APPLICATION_INIT **************************/
  115. int application_init(dataptr dz)
  116. {
  117. int exit_status;
  118. int storage_cnt;
  119. int tipc, brkcnt;
  120. aplptr ap = dz->application;
  121. if(ap->vflag_cnt>0)
  122. initialise_vflags(dz);
  123. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  124. ap->total_input_param_cnt = (char)tipc;
  125. if(tipc>0) {
  126. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  127. return(exit_status);
  128. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  129. return(exit_status);
  130. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  131. return(exit_status);
  132. }
  133. brkcnt = tipc;
  134. if(dz->input_data_type==BRKFILES_ONLY
  135. || dz->input_data_type==UNRANGED_BRKFILE_ONLY
  136. || dz->input_data_type==DB_BRKFILES_ONLY
  137. || dz->input_data_type==SNDFILE_AND_BRKFILE
  138. || dz->input_data_type==SNDFILE_AND_UNRANGED_BRKFILE
  139. || dz->input_data_type==SNDFILE_AND_DB_BRKFILE
  140. || dz->input_data_type==ALL_FILES
  141. || dz->input_data_type==ANY_NUMBER_OF_ANY_FILES
  142. || dz->outfiletype==BRKFILE_OUT) {
  143. dz->extrabrkno = brkcnt;
  144. brkcnt++; /* extra brktable for input or output brkpntfile data */
  145. }
  146. if(brkcnt>0) {
  147. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  148. return(exit_status);
  149. }
  150. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  151. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  152. return(exit_status);
  153. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  154. return(exit_status);
  155. }
  156. if((exit_status = mark_parameter_types(dz,ap))<0)
  157. return(exit_status);
  158. if((exit_status = establish_infile_constants(dz))<0)
  159. return(exit_status);
  160. if((exit_status = establish_bufptrs_and_extra_buffers(dz))<0)
  161. return(exit_status);
  162. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
  163. return(exit_status);
  164. return(FINISHED);
  165. }
  166. /************************* INITIALISE_VFLAGS *************************/
  167. int initialise_vflags(dataptr dz)
  168. {
  169. int n;
  170. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  171. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  172. return(MEMORY_ERROR);
  173. }
  174. for(n=0;n<dz->application->vflag_cnt;n++)
  175. dz->vflag[n] = FALSE;
  176. return FINISHED;
  177. }
  178. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  179. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  180. {
  181. int n;
  182. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  183. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  184. return(MEMORY_ERROR);
  185. }
  186. for(n=0;n<tipc;n++)
  187. dz->is_active[n] = (char)0;
  188. return(FINISHED);
  189. }
  190. /***************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS **************************/
  191. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  192. {
  193. int n;
  194. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  195. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  196. return(MEMORY_ERROR);
  197. }
  198. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  199. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  200. return(MEMORY_ERROR);
  201. }
  202. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int) ))==NULL) {
  203. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  204. return(MEMORY_ERROR);
  205. }
  206. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double) ))==NULL) {
  207. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  208. return(MEMORY_ERROR);
  209. }
  210. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double) ))==NULL) {
  211. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  212. return(MEMORY_ERROR);
  213. }
  214. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double) ))==NULL) {
  215. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  216. return(MEMORY_ERROR);
  217. }
  218. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int) ))==NULL) {
  219. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  220. return(MEMORY_ERROR);
  221. }
  222. for(n=0;n<brkcnt;n++) {
  223. dz->brk[n] = NULL;
  224. dz->brkptr[n] = NULL;
  225. dz->brkinit[n] = 0;
  226. dz->brksize[n] = 0;
  227. }
  228. return(FINISHED);
  229. }
  230. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  231. /* RWD malloc changed to calloc; helps debug verison run as release! */
  232. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  233. {
  234. // RWD Apr 20100 add extra element
  235. storage_cnt += 1;
  236. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  237. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  238. return(MEMORY_ERROR);
  239. }
  240. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  241. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  242. return(MEMORY_ERROR);
  243. }
  244. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  245. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  246. return(MEMORY_ERROR);
  247. }
  248. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  249. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  250. return(MEMORY_ERROR);
  251. }
  252. return(FINISHED);
  253. }
  254. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  255. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  256. {
  257. int n;
  258. for(n=0;n<storage_cnt;n++) {
  259. dz->is_int[n] = (char)0;
  260. dz->no_brk[n] = (char)0;
  261. }
  262. return(FINISHED);
  263. }
  264. /***************************** MARK_PARAMETER_TYPES **************************/
  265. int mark_parameter_types(dataptr dz,aplptr ap)
  266. {
  267. int n, m; /* PARAMS */
  268. for(n=0;n<ap->max_param_cnt;n++) {
  269. switch(ap->param_list[n]) {
  270. case('0'): break; /* dz->is_active[n] = 0 is default */
  271. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  272. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  273. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  274. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  275. default:
  276. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  277. return(PROGRAM_ERROR);
  278. }
  279. } /* OPTIONS */
  280. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  281. switch(ap->option_list[n]) {
  282. //TW JULY 2006
  283. case('0'): break;
  284. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  285. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  286. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  287. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  288. default:
  289. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  290. return(PROGRAM_ERROR);
  291. }
  292. } /* VARIANTS */
  293. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  294. switch(ap->variant_list[n]) {
  295. case('0'): break;
  296. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  297. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  298. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  299. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  300. default:
  301. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  302. return(PROGRAM_ERROR);
  303. }
  304. } /* INTERNAL */
  305. for(n=0,
  306. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  307. switch(ap->internal_param_list[n]) {
  308. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  309. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  310. case('d'): dz->no_brk[m] = (char)1; break;
  311. default:
  312. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  313. return(PROGRAM_ERROR);
  314. }
  315. }
  316. return(FINISHED);
  317. }
  318. /******************** ESTABLISH_SPEC_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  319. int establish_spec_bufptrs_and_extra_buffers(dataptr dz)
  320. {
  321. int n;
  322. if(dz->extra_bufcnt) {
  323. if((dz->windowbuf = (float **)malloc(sizeof(float *) * dz->extra_bufcnt))==NULL) {
  324. sprintf(errstr,"INSUFFICIENT MEMORY for extra float sample buffers.\n");
  325. return(MEMORY_ERROR);
  326. }
  327. for(n = 0; n < dz->extra_bufcnt;n++)
  328. dz->windowbuf[n] = NULL;
  329. }
  330. if(dz->bptrcnt) {
  331. if((dz->flbufptr = (float **)malloc(sizeof(float *) * dz->bptrcnt))==NULL) {
  332. sprintf(errstr,"INSUFFICIENT MEMORY for float sample buffers.\n");
  333. return(MEMORY_ERROR);
  334. }
  335. for(n = 0;n <dz->bptrcnt; n++)
  336. dz->flbufptr[n] = NULL;
  337. }
  338. return(FINISHED);
  339. }
  340. /******************** ESTABLISH_GROUCHO_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  341. int establish_groucho_bufptrs_and_extra_buffers(dataptr dz)
  342. {
  343. int n;
  344. if(dz->bufcnt < 0) {
  345. sprintf(errstr,"bufcnt has not been set: establish_groucho_bufptrs_and_extra_buffers()\n");
  346. return(PROGRAM_ERROR);
  347. }
  348. if(dz->extra_bufcnt < 0) {
  349. sprintf(errstr,"extrs_bufcnt has not been set: establish_groucho_bufptrs_and_extra_buffers()\n");
  350. return(PROGRAM_ERROR);
  351. }
  352. if(dz->bufcnt) {
  353. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  354. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  355. return(MEMORY_ERROR);
  356. }
  357. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  358. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  359. return(MEMORY_ERROR);
  360. }
  361. for(n = 0;n <dz->bufcnt; n++)
  362. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  363. dz->sampbuf[n] = (float *)0;
  364. }
  365. if(dz->extra_bufcnt) {
  366. if((dz->extrabuf = (float **)malloc(sizeof(float *) * (dz->extra_bufcnt+1)))==NULL) {
  367. sprintf(errstr,"INSUFFICIENT MEMORY establishing extra buffers.\n");
  368. return(MEMORY_ERROR);
  369. }
  370. if((dz->extrabufptr = (float **)malloc(sizeof(float *) * (dz->extra_bufcnt+1)))==NULL) {
  371. sprintf(errstr,"INSUFFICIENT MEMORY establishing extrabuffer pointers.\n");
  372. return(MEMORY_ERROR);
  373. }
  374. for(n = 0;n <dz->extra_bufcnt; n++)
  375. dz->extrabuf[n] = dz->extrabufptr[n] = (float *)0;
  376. dz->extrabuf[n] = (float *)0;
  377. }
  378. return(FINISHED);
  379. }
  380. /***************************** ESTABLISH_INFILE_CONSTANTS **************************/
  381. int establish_infile_constants(dataptr dz)
  382. {
  383. switch(dz->input_data_type) {
  384. case(MIXFILES_ONLY): case(SNDLIST_ONLY):
  385. case(SND_OR_MIXLIST_ONLY): case(SND_SYNC_OR_MIXLIST_ONLY):
  386. case(BRKFILES_ONLY): case(DB_BRKFILES_ONLY): case(UNRANGED_BRKFILE_ONLY):
  387. case(WORDLIST_ONLY):
  388. dz->infilecnt = ONE_NONSND_FILE;
  389. break;
  390. case(NO_FILE_AT_ALL):
  391. dz->infilecnt = 0;
  392. break;
  393. case(ALL_FILES): case(SNDFILES_ONLY): case(ENVFILES_ONLY):
  394. case(ANALFILE_ONLY): case(PITCHFILE_ONLY): case(PITCH_OR_TRANSPOS):
  395. case(FORMANTFILE_ONLY):
  396. dz->infilecnt = 1;
  397. break;
  398. case(TWO_SNDFILES):
  399. case(SNDFILE_AND_ENVFILE): case(SNDFILE_AND_BRKFILE): case(SNDFILE_AND_DB_BRKFILE):
  400. case(TWO_ANALFILES): case(ANAL_WITH_PITCHDATA): case(ANAL_WITH_TRANSPOS):
  401. case(ANAL_AND_FORMANTS): case(PITCH_AND_FORMANTS): case(PITCH_AND_PITCH):
  402. case(PITCH_AND_TRANSPOS): case(TRANSPOS_AND_TRANSPOS):case(SNDFILE_AND_UNRANGED_BRKFILE):
  403. dz->infilecnt = 2;
  404. break;
  405. case(THREE_ANALFILES):
  406. //TW NEW CASE
  407. case(PFE):
  408. dz->infilecnt = 3;
  409. break;
  410. case(MANY_ANALFILES):
  411. case(MANY_SNDFILES):
  412. dz->infilecnt = -2; /* flags 2 or more */
  413. break;
  414. case(ONE_OR_MANY_SNDFILES):
  415. //TW NEW CASE
  416. case(ONE_OR_MORE_SNDSYS):
  417. case(ANY_NUMBER_OF_ANY_FILES):
  418. dz->infilecnt = -1; /* flags 1 or more */
  419. break;
  420. default:
  421. sprintf(errstr,"Unknown input_process-type: establish_infile_constants()\n");
  422. return(PROGRAM_ERROR);
  423. }
  424. return(FINISHED);
  425. }
  426. /****************************** SETUP_PROCESS_LOGIC *********************************/
  427. void setup_process_logic(int input,int processing,int output,dataptr dz)
  428. {
  429. dz->input_data_type = input;
  430. dz->process_type = processing;
  431. dz->outfiletype = output;
  432. }
  433. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  434. // RWD Apr 2011 added extra element
  435. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  436. {
  437. int n;
  438. tipc += 1;
  439. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  440. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  441. return(MEMORY_ERROR);
  442. }
  443. for(n=0;n<tipc;n++)
  444. ap->default_val[n] = 0.0;
  445. return(FINISHED);
  446. }
  447. /******************************************************************************/
  448. /************************* FORMERLY IN internal.c *****************************/
  449. /******************************************************************************/
  450. /******** SET_INTERNALPARAM_DATA ***********************/
  451. int set_internalparam_data(const char *this_paramlist,aplptr ap)
  452. {
  453. int count;
  454. if((count = (int)strlen(this_paramlist))>0) {
  455. if((ap->internal_param_list = (char *)malloc((size_t)(count+1)))==NULL) {
  456. sprintf(errstr,"set_internalparam_data()\n");
  457. return(MEMORY_ERROR);
  458. }
  459. strcpy(ap->internal_param_list,this_paramlist);
  460. }
  461. ap->internal_param_cnt = (char ) count; /*RWD added cast */
  462. return(FINISHED);
  463. }
  464. /******************************************************************************/
  465. /************************* FORMERLY IN sinlib.c *******************************/
  466. /******************************************************************************/
  467. /************************* READ_SAMPS **************************/
  468. //TW removed NOTDEF: not certain how to get to not-NOTDEF option
  469. int read_samps(float *bbuf,dataptr dz)
  470. {
  471. if((dz->ssampsread = fgetfbufEx(bbuf, dz->buflen,dz->ifd[0],0)) < 0) {
  472. sprintf(errstr,"Can't read samples from input soundfile.\n");
  473. return(SYSTEM_ERROR);
  474. }
  475. dz->samps_left -= dz->ssampsread;
  476. dz->total_samps_read += dz->ssampsread;
  477. return(FINISHED);
  478. }
  479. /*************************** READ_VALUES_FROM_ALL_EXISTING_BRKTABLES **************************/
  480. int read_values_from_all_existing_brktables(double thistime,dataptr dz)
  481. {
  482. int exit_status;
  483. aplptr ap = dz->application;
  484. int n;
  485. for(n=0;n<ap->total_input_param_cnt;n++) {
  486. if(dz->brksize[n]) {
  487. if((exit_status = read_value_from_brktable(thistime,n,dz))<0)
  488. return(exit_status);
  489. }
  490. }
  491. return(FINISHED);
  492. }
  493. /**************************** READ_VALUE_FROM_BRKTABLE *****************************/
  494. int read_value_from_brktable(double thistime,int paramno,dataptr dz)
  495. {
  496. double *endpair, *p, val;
  497. double hival, loval, hiind, loind;
  498. if(!dz->brkinit[paramno]) {
  499. dz->brkptr[paramno] = dz->brk[paramno];
  500. dz->firstval[paramno] = *(dz->brk[paramno]+1);
  501. endpair = dz->brk[paramno] + ((dz->brksize[paramno]-1)*2);
  502. dz->lastind[paramno] = *endpair;
  503. dz->lastval[paramno] = *(endpair+1);
  504. dz->brkinit[paramno] = 1;
  505. }
  506. p = dz->brkptr[paramno];
  507. if(thistime <= *(dz->brk[paramno])) {
  508. dz->param[paramno] = dz->firstval[paramno];
  509. if(dz->is_int[paramno])
  510. dz->iparam[paramno] = round(dz->param[paramno]);
  511. return(FINISHED);
  512. } else if(thistime >= dz->lastind[paramno]) {
  513. dz->param[paramno] = dz->lastval[paramno];
  514. if(dz->is_int[paramno])
  515. dz->iparam[paramno] = round(dz->param[paramno]);
  516. return(FINISHED);
  517. }
  518. if(thistime > *(p)) {
  519. while(*(p)<thistime)
  520. p += 2;
  521. } else {
  522. while(*(p)>=thistime)
  523. p -= 2;
  524. p += 2;
  525. }
  526. hival = *(p+1);
  527. hiind = *p;
  528. loval = *(p-1);
  529. loind = *(p-2);
  530. val = (thistime - loind)/(hiind - loind);
  531. val *= (hival - loval);
  532. val += loval;
  533. dz->param[paramno] = val;
  534. if(dz->is_int[paramno])
  535. dz->iparam[paramno] = round(dz->param[paramno]);
  536. dz->brkptr[paramno] = p;
  537. return(FINISHED);
  538. }
  539. /************************** GET_TOTALAMP ***********************/
  540. int get_totalamp(double *totalamp,float *sbuf,int wanted)
  541. {
  542. int vc;
  543. *totalamp = 0.0;
  544. for(vc = 0; vc < wanted; vc += 2)
  545. *totalamp += sbuf[AMPP];
  546. return(FINISHED);
  547. }
  548. /******************************************************************************/
  549. /************************* FORMERLY IN specialin.c ****************************/
  550. /******************************************************************************/
  551. /************** READ_NEW_FILENAME ***********/
  552. int read_new_filename(char *filename,dataptr dz)
  553. {
  554. if(dz->wordstor!=NULL) {
  555. if((dz->wordstor = (char **)realloc(dz->wordstor,(dz->all_words+1) * sizeof(char *)))==NULL) {
  556. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate word stores.\n");
  557. return(MEMORY_ERROR);
  558. }
  559. } else {
  560. if(dz->all_words!=0 || dz->extra_word!=-1) {
  561. sprintf(errstr,"Array allocation error: read_new_filename().\n");
  562. return(PROGRAM_ERROR);
  563. }
  564. if((dz->wordstor = (char **)malloc((dz->all_words+1) * sizeof(char *)))==NULL) {
  565. sprintf(errstr,"INSUFFICIENT MEMORY to create word stores.\n");
  566. return(MEMORY_ERROR);
  567. }
  568. }
  569. dz->extra_word = dz->all_words;
  570. dz->all_words++;
  571. if((dz->wordstor[dz->extra_word] = (char *)malloc((strlen(filename)+1) * sizeof(char)))==NULL) {
  572. sprintf(errstr,"INSUFFICIENT MEMORY to create extra word store.\n");
  573. return(MEMORY_ERROR);
  574. }
  575. strcpy(dz->wordstor[dz->extra_word],filename);
  576. return(FINISHED);
  577. }
  578. /**************************** READ_SHUFFLE_DATA **************************/
  579. int read_shuffle_data(int dmnparam,int imgparam,int mapparam,char *str,dataptr dz)
  580. {
  581. int exit_status;
  582. char *domain, *image;
  583. if((exit_status = get_domain_and_image(str,&domain,&image))<0)
  584. return(exit_status);
  585. dz->iparam[dmnparam] = (int)strlen(domain);
  586. dz->iparam[imgparam] = (int)strlen(image);
  587. if((exit_status = consistent_domain_and_image(dmnparam,imgparam,domain,image,dz))!=TRUE)
  588. return(DATA_ERROR);
  589. return make_map(dmnparam,imgparam,mapparam,domain,image,dz);
  590. }
  591. /************************** GET_DOMAIN_AND_IMAGE ********************************/
  592. int get_domain_and_image(char *str,char **domain, char **image)
  593. {
  594. char *p = str, *q = str;
  595. while(*p!='-' && *p != ':') {
  596. if(*p == ENDOFSTR) {
  597. sprintf(errstr,"Bad string for shuffle data: separator missing\n");
  598. return(DATA_ERROR);
  599. } else if(!isalpha(*p)) {
  600. sprintf(errstr,"Invalid character ('%c') in string for shuffle data.\n",*p);
  601. return(DATA_ERROR);
  602. }
  603. p++;
  604. }
  605. if(p-q <=0) {
  606. sprintf(errstr,"Bad string for shuffle data: domain missing\n");
  607. return(DATA_ERROR);
  608. }
  609. *p = ENDOFSTR;
  610. *domain = q;
  611. p++;
  612. q = p;
  613. while(*p!=ENDOFSTR) {
  614. if(!isalpha(*p)) {
  615. sprintf(errstr,"Invalid character ('%d') in string for shuffle data.\n",*p);
  616. return(DATA_ERROR);
  617. }
  618. p++;
  619. }
  620. if(p-q <=0) {
  621. sprintf(errstr,"Bad string for shuffle data: image missing\n");
  622. return(DATA_ERROR);
  623. }
  624. *image = q;
  625. return(FINISHED);
  626. }
  627. /************************** MAKE_MAP ********************************/
  628. int make_map(int dmncnt,int imgcnt,int mapping,char *domain,char *image,dataptr dz)
  629. {
  630. int n, m, OK;
  631. if((dz->iparray[mapping] = (int *)malloc(dz->iparam[imgcnt] * sizeof(int)))==NULL) {
  632. sprintf(errstr,"INSUFFICIENT MEMORY for map.\n");
  633. return(MEMORY_ERROR);
  634. }
  635. for(n=0;n<dz->iparam[imgcnt];n++) {
  636. OK = 0;
  637. for(m=0;m<dz->iparam[dmncnt];m++) {
  638. if(image[n] == domain[m]) {
  639. dz->iparray[mapping][n] = m;
  640. OK = 1;
  641. break;
  642. }
  643. }
  644. if(!OK) {
  645. sprintf(errstr,"Programming Problem: no match in make_map().\n");
  646. return(PROGRAM_ERROR);
  647. }
  648. }
  649. return(FINISHED);
  650. }
  651. /************************** CONSISTENT_DOMAIN_AND_IMAGE ********************************/
  652. int consistent_domain_and_image(int dmncnt,int imgcnt,char *domain,char *image,dataptr dz)
  653. {
  654. int n, m, OK;
  655. for(n=0;n<dz->iparam[dmncnt]-1;n++) {
  656. for(m=n+1;m<dz->iparam[dmncnt];m++) {
  657. if(domain[n]==domain[m]) {
  658. sprintf(errstr,"Duplicated symbol [%c] in domain string.\n",domain[n]);
  659. return(FALSE);
  660. }
  661. }
  662. }
  663. for(n=0;n<dz->iparam[imgcnt];n++) {
  664. OK = 0;
  665. for(m=0;m<dz->iparam[dmncnt];m++) {
  666. if(image[n] == domain[m]) {
  667. OK = 1;
  668. break;
  669. }
  670. }
  671. if(!OK) {
  672. sprintf(errstr,"Image symbol [%c] not in domain.\n",image[n]);
  673. return(FALSE);
  674. }
  675. }
  676. return(TRUE);
  677. }
  678. /******************************************************************************/
  679. /************************* FORMERLY IN preprocess.c ***************************/
  680. /******************************************************************************/
  681. /***************************** FORCE_VALUE_AT_ZERO_TIME ******************************/
  682. int force_value_at_zero_time(int paramno,dataptr dz)
  683. {
  684. double *p, *pend;
  685. double thistime,lasttime,timediff,timeratio,thisval,lastval,valdiff,val;
  686. int n;
  687. if(flteq(dz->brk[paramno][0],0.0)) {
  688. dz->brk[paramno][0] = 0.0;
  689. return(FINISHED);
  690. }
  691. if(dz->brk[paramno][0] > 0.0) {
  692. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),(dz->brksize[paramno]+1) * 2 * sizeof(double)))==NULL) {
  693. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate to force zero-time value.\n");
  694. return(MEMORY_ERROR);
  695. }
  696. for(n = (dz->brksize[paramno] * 2) - 1; n>=0;n--)
  697. dz->brk[paramno][n+2] = dz->brk[paramno][n];
  698. dz->brk[paramno][0] = 0.0;
  699. dz->brk[paramno][1] = dz->brk[paramno][3];
  700. dz->brksize[paramno]++;
  701. } else {
  702. p = dz->brk[paramno];
  703. pend = p + (dz->brksize[paramno] * 2);
  704. while(*p < 0.0) {
  705. p += 2;
  706. if(p >= pend) {
  707. p -= 2;
  708. memmove((char *)(dz->brk[paramno]),(char *)p,2 * sizeof(double));
  709. dz->brk[paramno][0] = 0.0;
  710. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),2 * sizeof(double)))==NULL) {
  711. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate to force zero-time value.\n");
  712. return(MEMORY_ERROR);
  713. }
  714. dz->brksize[paramno] = 1;
  715. return(FINISHED);
  716. }
  717. }
  718. if(*p > 0.0) {
  719. thistime = *p;
  720. lasttime = *(p-2);
  721. timediff = thistime - lasttime;
  722. timeratio = -(lasttime)/timediff; /* lasttime is -ve */
  723. thisval = *(p+1);
  724. lastval = *(p-1);
  725. valdiff = thisval - lastval;
  726. val = lastval + (valdiff * timeratio);
  727. p -= 2;
  728. *p = 0.0;
  729. *(p+1) = val;
  730. }
  731. dz->brksize[paramno] = (pend - p)/2;
  732. memmove((char *)(dz->brk[paramno]),(char *)p,dz->brksize[paramno] * 2 * sizeof(double));
  733. if((dz->brk[paramno] = (double *)realloc((char *)(dz->brk[paramno]),dz->brksize[paramno] * 2 * sizeof(double)))==NULL) {
  734. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate to force zero-time value.\n");
  735. return(MEMORY_ERROR);
  736. }
  737. }
  738. dz->brkptr[paramno] = dz->brk[paramno];
  739. return(FINISHED);
  740. }
  741. /***************************** INITIALISE_RANDOM_SEQUENCE ***************************/
  742. void initialise_random_sequence(int seed_flagno,int seed_paramno,dataptr dz)
  743. {
  744. if(dz->vflag[seed_flagno])
  745. srand((int)dz->iparam[seed_paramno]);
  746. else
  747. initrand48();
  748. }
  749. /******************** CONVERT_MSECS_TO_SECS **********************/
  750. int convert_msecs_to_secs(int brktableno,dataptr dz)
  751. {
  752. double *p, *pend;
  753. if(dz->brksize[brktableno]) {
  754. p = dz->brk[brktableno];
  755. pend = p + (dz->brksize[brktableno] * 2);
  756. while(p < pend) {
  757. *p *= MS_TO_SECS;
  758. p+=2;
  759. }
  760. } else
  761. dz->param[brktableno] *= MS_TO_SECS;
  762. return(FINISHED);
  763. }
  764. /***************************** ESTABLISH_BOTTOM_FRQS_OF_CHANNELS **************/
  765. int establish_bottom_frqs_of_channels(dataptr dz)
  766. {
  767. int cc;
  768. if((dz->windowbuf[CHBOT] = (float *) realloc((char *)dz->windowbuf[CHBOT],dz->clength * sizeof(float)))==NULL) {
  769. sprintf(errstr,"INSUFFICIENT MEMORY for channel bottom frqs array.\n");
  770. return(MEMORY_ERROR);
  771. }
  772. dz->windowbuf[CHBOT][0] = 0.0f;
  773. dz->windowbuf[CHBOT][1] = (float)dz->halfchwidth;
  774. for(cc = 2 ;cc < dz->clength; cc++)
  775. dz->windowbuf[CHBOT][cc] = (float)(dz->windowbuf[CHBOT][cc-1] + dz->chwidth);
  776. return(FINISHED);
  777. }
  778. /***************************** ESTABLISH_TESTTONE_AMPS *************************/
  779. int establish_testtone_amps(dataptr dz)
  780. {
  781. int n;
  782. if((dz->windowbuf[TESTPAMP] =
  783. (float *)realloc((char *)dz->windowbuf[TESTPAMP],PARTIALS_IN_TEST_TONE * sizeof(float)))==NULL) {
  784. sprintf(errstr,"INSUFFICIENT MEMORY for testtone amp array.\n");
  785. return(MEMORY_ERROR);
  786. }
  787. if((dz->windowbuf[TOTPAMP] =
  788. (float *)realloc((char *)dz->windowbuf[TOTPAMP],PARTIALS_IN_TEST_TONE * sizeof(float)))==NULL) {
  789. sprintf(errstr,"INSUFFICIENT MEMORY for testtone totalamp array.\n");
  790. return(MEMORY_ERROR);
  791. }
  792. dz->windowbuf[TOTPAMP][0] = dz->windowbuf[TESTPAMP][0] = 1.0f;
  793. for(n = 1; n < PARTIALS_IN_TEST_TONE; n++) /* ACTUAL PARTIAL AMPS */
  794. dz->windowbuf[TESTPAMP][n]
  795. = (float)(dz->windowbuf[TESTPAMP][n-1] * PARTIAL_DECIMATION);
  796. for(n = 1; n < PARTIALS_IN_TEST_TONE; n++) /* SUM OF PARTIAL AMPS */
  797. dz->windowbuf[TOTPAMP][n] =
  798. (float)(dz->windowbuf[TOTPAMP][n-1] + dz->windowbuf[TESTPAMP][n]);
  799. return(FINISHED);
  800. }
  801. /************************** SETUP_RING ******************************/
  802. int setup_ring(dataptr dz)
  803. {
  804. chvptr /*last,*/ head;
  805. if((dz->ringhead = (chvptr)malloc(sizeof(struct chanval)))==NULL) {
  806. sprintf(errstr,"INSUFFICIENT MEMORY for ring buffer.\n");
  807. return(MEMORY_ERROR);
  808. }
  809. head = dz->ringhead;
  810. head->next = head; /* Initialise its pointers to self-point */
  811. head->last = head;
  812. // last = head; /* Mark current end of ring at ringhead */
  813. dz->ringsize = 1;
  814. return(FINISHED);
  815. }
  816. /************ SETUP_INTERNAL_BITFLAGS *************/
  817. int setup_internal_bitflags(int bflag_array_no,int longpow,int divmask, dataptr dz)
  818. {
  819. int exit_status;
  820. if((exit_status = log2_of_the_number_which_is_a_power_of_2(&(dz->iparam[longpow]),sizeof(int) * CHARBITSIZE))<0)
  821. return(exit_status); /* sizeof(int) in bytes as pow of 2 */
  822. dz->iparam[divmask] = (int)(two_to_the_power_of(dz->iparam[longpow]) - 1); /* mask to calc MOD(longpow2) */
  823. return init_bitflags_to_zero(bflag_array_no,dz); /* Create and set-to-zero bitflags */
  824. }
  825. /********** LOG2_OF_THE_NUMBER_WHICH_IS_A_POWER_OF_2 *********/
  826. int log2_of_the_number_which_is_a_power_of_2(int *n,int k)
  827. {
  828. int mask = 1;
  829. int m = 0;
  830. if(k < 0) {
  831. sprintf(errstr,"-ve number submiited to log2_of_the_number_which_is_a_power_of_2()\n");
  832. return(PROGRAM_ERROR);
  833. }
  834. while(!(mask & k)) {
  835. mask <<= 1;
  836. m++;
  837. }
  838. *n = m;
  839. return(FINISHED);
  840. }
  841. /*********************** TWO_TO_THE_POWER_OF **********************
  842. *
  843. * Find 2-to-power-of-k.
  844. */
  845. int two_to_the_power_of(int k)
  846. {
  847. int n = 1;
  848. n <<= k;
  849. return(n);
  850. }
  851. /***************************** INIT_BITFLAGS_TO_ZERO ***************************/
  852. int init_bitflags_to_zero(int bflag_array_no,dataptr dz)
  853. {
  854. int n;
  855. int flgsize = (dz->clength/(sizeof(int) * CHARBITSIZE)) + 1;
  856. if((dz->lparray[bflag_array_no] = (int *)malloc(flgsize * sizeof(int)))==NULL) {
  857. sprintf(errstr,"INSUFFICIENT MEMORY for bitflags.\n");
  858. return(MEMORY_ERROR);
  859. }
  860. for(n=0;n<flgsize;n++)
  861. dz->lparray[bflag_array_no][n] = 0;
  862. return(FINISHED);
  863. }
  864. /****************************** SETUP_STABILITY_ARRAYS_AND_CONSTANTS **************/
  865. int setup_stability_arrays_and_constants(int stability_val,int sval_less_one,dataptr dz)
  866. {
  867. int n;
  868. if((dz->stable = (stabptr)malloc(sizeof(struct stability)))==NULL) {
  869. sprintf(errstr,"INSUFFICIENT MEMORY for stability array.\n");
  870. return(MEMORY_ERROR);
  871. }
  872. if(dz->wlength < dz->iparam[stability_val]) {
  873. sprintf(errstr,"File too short to use this program option.\nTry smaller value with '-s' (stability) flag.\n");
  874. return(DATA_ERROR);
  875. }
  876. dz->stable->offset = dz->iparam[stability_val]/2; /* stabl is always ODD : gives middle window of windows buffer */
  877. if((dz->stable->sbufstore = (float *)malloc(((dz->wanted*dz->iparam[stability_val])+1) * sizeof(float)))==NULL) {
  878. sprintf(errstr,"INSUFFICIENT MEMORY for stability buffer store.\n");
  879. return(MEMORY_ERROR);
  880. }
  881. /* baktraking windows buf */
  882. if((dz->stable->sbuf = (float **)malloc((dz->iparam[stability_val]+1) * sizeof(float *)))==NULL) {
  883. sprintf(errstr,"INSUFFICIENT MEMORY for stability backtracking buffer.\n");
  884. return(MEMORY_ERROR);
  885. }
  886. /* ptrs to wndws within it */
  887. dz->stable->sbuf[0] = dz->stable->sbufstore;
  888. for(n=1;n<dz->iparam[stability_val]+1;n++)
  889. dz->stable->sbuf[n] = dz->stable->sbuf[n-1] + dz->wanted;
  890. if((dz->stable->specstore =
  891. (float *)malloc(((dz->infile->specenvcnt * dz->iparam[stability_val])+1) * sizeof(float)))==NULL) {
  892. sprintf(errstr,"INSUFFICIENT MEMORY for stability spectral store.\n");
  893. return(MEMORY_ERROR);
  894. }
  895. if((dz->stable->spec = (float **)malloc((dz->iparam[stability_val]+1) * sizeof(float*)))==NULL) {
  896. sprintf(errstr,"INSUFFICIENT MEMORY for stability spectrum store.\n");
  897. return(MEMORY_ERROR);
  898. }
  899. dz->stable->spec[0] = dz->stable->specstore;
  900. for(n=1;n<dz->iparam[stability_val]+1;n++)
  901. dz->stable->spec[n] = dz->stable->spec[n-1] + dz->infile->specenvcnt;
  902. if((dz->stable->fpkstore =
  903. (int *)malloc(((dz->iparam[stability_val] * dz->infile->specenvcnt)+1)*sizeof(int)))==NULL) {
  904. sprintf(errstr,"INSUFFICIENT MEMORY for stability peaks store.\n");
  905. return(MEMORY_ERROR);
  906. }
  907. /* baktraking spectral-peaks buf */
  908. if((dz->stable->fpk = (int **)malloc((dz->iparam[stability_val]+1) * sizeof(int *)))==NULL) {
  909. sprintf(errstr,"INSUFFICIENT MEMORY for stability peaks backtrack store.\n");
  910. return(MEMORY_ERROR);
  911. }
  912. /* pointers to peakstores within it */
  913. dz->stable->fpk[0] = dz->stable->fpkstore;
  914. for(n=1;n<dz->iparam[stability_val]+1;n++)
  915. dz->stable->fpk[n] = dz->stable->fpk[n-1] + dz->infile->specenvcnt;
  916. if((dz->stable->total_pkcnt = (int *)malloc((dz->iparam[stability_val]+1) * sizeof(int)))==NULL) {
  917. sprintf(errstr,"INSUFFICIENT MEMORY for stability peakcount store.\n");
  918. return(MEMORY_ERROR);
  919. }
  920. /* cnt of total peaks found per baktrak buf */
  921. if((dz->stable->design_score = (int *)malloc((dz->infile->specenvcnt+1) * sizeof(int)))==NULL) {
  922. sprintf(errstr,"INSUFFICIENT MEMORY for stability design score store.\n");
  923. return(MEMORY_ERROR);
  924. }
  925. /* array for designing filter */
  926. if((dz->stable->des = (desptr *)malloc((dz->infile->specenvcnt+1) * sizeof(desptr)))==NULL) {
  927. sprintf(errstr,"INSUFFICIENT MEMORY for stability design store.\n");
  928. return(MEMORY_ERROR);
  929. }
  930. dz->iparam[sval_less_one] = dz->iparam[stability_val]- 1;
  931. /* SET SAFETY VALUES */
  932. dz->stable->specstore[dz->infile->specenvcnt * dz->iparam[stability_val]] = 0.0f;
  933. dz->stable->spec[dz->iparam[stability_val]] = (float *)0;
  934. dz->stable->fpkstore[dz->iparam[stability_val] * dz->infile->specenvcnt] = 0;
  935. dz->stable->fpk[dz->iparam[stability_val]] = (int *)0;
  936. dz->stable->total_pkcnt[dz->iparam[stability_val]] = 0;
  937. dz->stable->design_score[dz->infile->specenvcnt] = 0; /* array for designing filter */
  938. dz->stable->des[dz->infile->specenvcnt] = (desptr)0;
  939. dz->stable->sbufstore[dz->wanted * dz->iparam[stability_val]] = 0.0f;
  940. dz->stable->sbuf[dz->iparam[stability_val]] = 0;
  941. return(FINISHED);
  942. }
  943. /******************************************************************************/
  944. /************************* FORMERLY IN procgrou.c *****************************/
  945. /******************************************************************************/
  946. /***************************** ZERO_SOUND_BUFFERS **************************/
  947. int zero_sound_buffers(dataptr dz)
  948. {
  949. int n;
  950. for(n=0;n<dz->bufcnt;n++)
  951. memset((char *)dz->sampbuf[n],0,(size_t)(dz->buflen * sizeof(float)));
  952. return(FINISHED);
  953. }
  954. /******************************************************************************/
  955. /************************* FORMERLY IN procspec.c *****************************/
  956. /******************************************************************************/
  957. /***************************** RECTIFY_WINDOW ******************************/
  958. void rectify_window(float *flbuf,dataptr dz)
  959. {
  960. int vc;
  961. for(vc = 0; vc < dz->wanted; vc += 2) {
  962. if(flbuf[FREQ] < 0.0) {
  963. flbuf[FREQ] = -flbuf[FREQ];
  964. // FEB 2010 TW
  965. // if(dz->is_rectified==FALSE) {
  966. // fprintf(stdout,"WARNING: Negative frq(s) in source data: rectified.\n");
  967. // fflush(stdout);
  968. // dz->is_rectified = TRUE;
  969. // }
  970. }
  971. }
  972. }
  973. /**************************** OUTER_LOOP ****************************/
  974. int outer_loop(dataptr dz)
  975. {
  976. int exit_status;
  977. int samps_read, got, windows_in_buf,peakscore = 0, pitchcnt = 0;
  978. int in_start_portion = TRUE, least = 0, descnt = 0;
  979. dz->time = 0.0f;
  980. if(dz->bptrcnt <= 0) {
  981. sprintf(errstr,"flbufptr[0] not established by outer_loop()\n");
  982. return(PROGRAM_ERROR);
  983. }
  984. while((samps_read = fgetfbufEx(dz->bigfbuf, dz->buflen,dz->ifd[0],0)) > 0) {
  985. got = samps_read;
  986. dz->flbufptr[0] = dz->bigfbuf;
  987. windows_in_buf = got/dz->wanted;
  988. if((exit_status = inner_loop(&peakscore,&descnt,&in_start_portion,&least,&pitchcnt,windows_in_buf,dz))<0)
  989. return(exit_status);
  990. if((exit_status = write_exact_samps(dz->bigfbuf,samps_read,dz))<0)
  991. return(exit_status);
  992. }
  993. if(samps_read < 0) {
  994. sprintf(errstr,"Sound read error.\n");
  995. return(SYSTEM_ERROR);
  996. }
  997. return(FINISHED);
  998. }
  999. /*********************** INITIALISE_WINDOW_FRQS **********************
  1000. *
  1001. * Give start values for channel frqs in zero-amp 1st window.
  1002. */
  1003. int initialise_window_frqs(dataptr dz)
  1004. { int cc, vc;
  1005. double thisfrq = GLIS_REFERENCE_FRQ;
  1006. if(dz->mode!=SELFGLIS) {
  1007. do {
  1008. cc = (int)((thisfrq + dz->halfchwidth)/dz->chwidth); /* TRUNCATE */
  1009. vc = cc * 2;
  1010. dz->flbufptr[0][FREQ] = (float)thisfrq;
  1011. thisfrq += dz->chwidth;
  1012. } while (thisfrq < dz->nyquist);
  1013. }
  1014. return(FINISHED);
  1015. }
  1016. /******************************** GET_AMP_AND_FRQ ******************************/
  1017. int get_amp_and_frq(float *floatbuf,dataptr dz)
  1018. {
  1019. int cc, vc;
  1020. for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2){
  1021. dz->amp[cc] = floatbuf[AMPP];
  1022. dz->freq[cc] = floatbuf[FREQ];
  1023. }
  1024. return(FINISHED);
  1025. }
  1026. /******************************** PUT_AMP_AND_FRQ ******************************/
  1027. int put_amp_and_frq(float *floatbuf,dataptr dz)
  1028. {
  1029. int cc, vc;
  1030. for(cc = 0, vc = 0; cc < dz->clength; cc++, vc += 2){
  1031. floatbuf[AMPP] = dz->amp[cc];
  1032. floatbuf[FREQ] = dz->freq[cc];
  1033. }
  1034. return(FINISHED);
  1035. }
  1036. /**************************** NORMALISE ***************************/
  1037. int normalise(double pre_totalamp,double post_totalamp,dataptr dz)
  1038. {
  1039. double normaliser;
  1040. int vc;
  1041. if(post_totalamp < VERY_TINY_VAL) {
  1042. if(!dz->zeroset) {
  1043. fprintf(stdout,"WARNING: Zero-amp spectral window(s) encountered: orig window(s) substituted.\n");
  1044. fflush(stdout);
  1045. dz->zeroset = TRUE;
  1046. }
  1047. } else {
  1048. normaliser = pre_totalamp/post_totalamp; /* REMOVED a multiplier of 0.5 : APRIL 1998 */
  1049. for(vc = 0; vc < dz->wanted; vc += 2)
  1050. dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] * normaliser);
  1051. }
  1052. return(FINISHED);
  1053. }
  1054. /*************************** INITIALISE_RING_VALS ***************************/
  1055. int initialise_ring_vals(int thissize,double initial_amp,dataptr dz)
  1056. {
  1057. int exit_status;
  1058. chvptr tthis;
  1059. int change_in_size;
  1060. if((change_in_size = thissize - dz->ringsize)!=0) {
  1061. if(change_in_size>0) {
  1062. if((exit_status = extend_ring(change_in_size,dz))<0) /* If ring gets bigger, extend it */
  1063. return(exit_status);
  1064. } else {
  1065. if((exit_status = shrink_ring(-change_in_size,dz))<0) /* If ring gets smaller, shrink it */
  1066. return(exit_status);
  1067. }
  1068. }
  1069. tthis = dz->ringhead;
  1070. do { /* Enter initval at all ring locations */
  1071. tthis->val = (float)initial_amp;
  1072. } while ((tthis = tthis->next) != dz->ringhead);
  1073. dz->ringsize = thissize;
  1074. return(FINISHED);
  1075. }
  1076. /************************* EXTEND_RING *****************************/
  1077. int extend_ring(int change_in_size,dataptr dz)
  1078. { int n;
  1079. chvptr tthis, head, last;
  1080. head = dz->ringhead;
  1081. last = head->last; /* Mark current end of ring */
  1082. for(n=0;n<change_in_size;n++) { /* create new ring locations */
  1083. if((tthis = (chvptr)malloc(sizeof(struct chanval)))==NULL) {
  1084. sprintf(errstr,"INSUFFICIENT MEMORY to create noew ring buffer location.\n");
  1085. return(MEMORY_ERROR);
  1086. }
  1087. last->next = tthis; /* Connect new location to end of ring */
  1088. tthis->last = last;
  1089. tthis->next = head;/* Connect new location to start of ring */
  1090. head->last = tthis;
  1091. last = tthis; /* Mark curent end of ring */
  1092. }
  1093. return(FINISHED);
  1094. }
  1095. /************************* SHRINK_RING *****************************/
  1096. int shrink_ring(int change_in_size,dataptr dz)
  1097. { int n;
  1098. chvptr tthat, head, tthis;
  1099. head = dz->ringhead;
  1100. tthis = head->last;
  1101. for(n=0;n<change_in_size;n++)
  1102. tthis = tthis->last; /* Find new end of ring */
  1103. tthat = tthis->next; /* Point to start of redundant items */
  1104. while(tthat!=head) {
  1105. tthat = tthat->next; /* Delete redundant items */
  1106. free(tthat->last);
  1107. }
  1108. tthis->next = head; /* Connect new-end-of-ring to ringhead */
  1109. head->last = tthis;
  1110. return(FINISHED);
  1111. }
  1112. /************************** IF_ONE_OF_LOUDEST_CHANS_STORE_IN_RING *****************************/
  1113. int if_one_of_loudest_chans_store_in_ring(int vc,dataptr dz)
  1114. {
  1115. int exit_status;
  1116. chvptr loudest = dz->ringhead;
  1117. do { /* COMPARE LOUDNESS WITH THOSE IN RING */
  1118. if(dz->flbufptr[0][vc] > loudest->val) { /* IF LOUDER */
  1119. if((exit_status = rearrange_ring_to_allow_new_entry_and_return_entry_address(&loudest,dz))<0)
  1120. return(exit_status);
  1121. loudest->loc = vc;
  1122. loudest->val = dz->flbufptr[0][vc];
  1123. break;
  1124. }
  1125. } while((loudest = loudest->next)!=dz->ringhead);
  1126. return(FINISHED);
  1127. }
  1128. /************************** IF_ONE_OF_QUIETEST_CHANS_STORE_IN_RING *****************************/
  1129. int if_one_of_quietest_chans_store_in_ring(int vc,dataptr dz)
  1130. {
  1131. int exit_status;
  1132. chvptr quietest = dz->ringhead;
  1133. do { /* COMPARE QUIETNESS WITH THOSE IN RING */
  1134. if(dz->flbufptr[0][vc] < quietest->val) { /* IF QUIETER */
  1135. if((exit_status = rearrange_ring_to_allow_new_entry_and_return_entry_address(&quietest,dz))<0)
  1136. return(exit_status);
  1137. quietest->loc = vc;
  1138. quietest->val = dz->flbufptr[0][vc];
  1139. break;
  1140. }
  1141. } while((quietest = quietest->next)!=dz->ringhead);
  1142. return(FINISHED);
  1143. }
  1144. /**************** REARRANGE_RING_TO_ALLOW_NEW_ENTRY_AND_RETURN_ENTRY_ADDRESS *************
  1145. *
  1146. * Shuffle the items in the list of loudest/quietest chans.
  1147. */
  1148. int rearrange_ring_to_allow_new_entry_and_return_entry_address(chvptr *here,dataptr dz)
  1149. {
  1150. chvptr head = dz->ringhead;
  1151. chvptr this, prethis, prehere;
  1152. if(*here == head->last) /* If place of insertion is lastplace in ring */
  1153. return(FINISHED); /* Final item in ring just gets written over. */
  1154. if(*here==head) { /* IF place of insertion is start of ring.... */
  1155. dz->ringhead = head->last; /* Move head of ring back one place. */
  1156. *here = dz->ringhead; /* New value will be written there, */
  1157. return(FINISHED);
  1158. } /* automatically deleting previous final item in ring. */
  1159. this = head->last; /* OTHERWISE: unlink last item from ring */
  1160. prethis = this->last;
  1161. head->last = prethis;
  1162. prethis->next = head;
  1163. prehere = (*here)->last;/* Reuse adr-space ('this') by splicing */
  1164. this->last = prehere; /* it into ring at current position (here) */
  1165. prehere->next = this;
  1166. this->next = *here;
  1167. (*here)->last = this;
  1168. *here = this; /* Return address of new current position ('this') */
  1169. return(FINISHED);
  1170. }
  1171. /****************************** CHOOSE_BITFLAG_AND_RESET_MASK_IF_NESS ****************************/
  1172. int choose_bflagno_and_reset_mask_if_ness(int *bflagno,int cc,int *mask,int longpow2,int divmask)
  1173. {
  1174. *bflagno = cc >> longpow2; /* bflagno chooses which bitflag */
  1175. if(!(cc & divmask)) /* If cc divisible by bitflag length */
  1176. *mask = 1; /* reset bitmask to 1, for next bitflag */
  1177. return(FINISHED);
  1178. }
  1179. /******************* MOVE_DATA_INTO_APPROPRIATE_CHANNEL *****************
  1180. *
  1181. * If there turns out to be more than one partial to a channel,
  1182. * keep partial that was loudest in orig sound, retaining its
  1183. * loudness for further comparison.
  1184. */
  1185. int move_data_into_appropriate_channel(int vc,int truevc,float thisamp,float thisfrq,dataptr dz)
  1186. {
  1187. if(dz->flbufptr[0][AMPP] > dz->windowbuf[0][truevc]) {
  1188. dz->windowbuf[0][truevc++] = thisamp;
  1189. dz->windowbuf[0][truevc] = thisfrq;
  1190. }
  1191. return(FINISHED);
  1192. }
  1193. /******************* MOVE_DATA_INTO_SOME_APPROPRIATE_CHANNEL *****************
  1194. *
  1195. * On assumption that frq does NOT have to be in exact channel!!
  1196. * Replace simpler idea....above....
  1197. * which tends to see several significant pieces of data disappear
  1198. * as they overwrite one another in the same channel... BY ....
  1199. *
  1200. * (1) Put in correct empty channel IF POSSIBLE
  1201. * (2) ELSE Put in an adj empty chan
  1202. * (3) below
  1203. * (4) ELSE above
  1204. * (5) ELSE Replace val in true chan
  1205. * (6) ELSE Replace val in adj chan
  1206. * (7) below
  1207. * (8) ELSE above
  1208. *
  1209. */
  1210. int move_data_into_some_appropriate_channel(int truevc,float thisamp,float thisfrq,dataptr dz)
  1211. {
  1212. #define THISCHANSCAN (4)
  1213. int minscan, maxscan, n;
  1214. if(dz->windowbuf[0][truevc] == 0.0f) { /* 1 */
  1215. dz->windowbuf[0][truevc++] = thisamp;
  1216. dz->windowbuf[0][truevc] = thisfrq;
  1217. return(FINISHED);
  1218. }
  1219. minscan = max(0,truevc - (THISCHANSCAN * 2)); /* 2 */
  1220. maxscan = min(dz->clength-1,truevc + (THISCHANSCAN * 2)); /* 3 */
  1221. for(n=truevc-2;n>minscan;n-=2) {
  1222. if(dz->windowbuf[0][n] == 0.0f) {
  1223. dz->windowbuf[0][n++] = thisamp;
  1224. dz->windowbuf[0][n] = thisfrq;
  1225. return(FINISHED);
  1226. }
  1227. }
  1228. for(n=truevc+2;n<maxscan;n+=2) { /* 4 */
  1229. if(dz->windowbuf[0][n] == 0.0f) {
  1230. dz->windowbuf[0][n++] = thisamp;
  1231. dz->windowbuf[0][n] = thisfrq;
  1232. return(FINISHED);
  1233. }
  1234. }
  1235. if(thisamp > dz->flbufptr[0][truevc]) { /* 5 */
  1236. dz->windowbuf[0][truevc++] = thisamp;
  1237. dz->windowbuf[0][truevc] = thisfrq;
  1238. return(FINISHED);
  1239. }
  1240. for(n=truevc-2;n>minscan;n-=2) { /* 6 */
  1241. if(thisamp > dz->windowbuf[0][n]) { /* 7 */
  1242. dz->windowbuf[0][n++] = thisamp;
  1243. dz->windowbuf[0][n] = thisfrq;
  1244. return(FINISHED);
  1245. }
  1246. }
  1247. for(n=truevc+2;n<maxscan;n+=2) { /* 8 */
  1248. if(thisamp > dz->windowbuf[0][n]) {
  1249. dz->windowbuf[0][n++] = thisamp;
  1250. dz->windowbuf[0][n] = thisfrq;
  1251. return(FINISHED);
  1252. }
  1253. }
  1254. return(FINISHED);
  1255. }
  1256. /******************** GET_AMP ********************/
  1257. int get_amp(float *floatbuf,dataptr dz)
  1258. {
  1259. int cc, vc;
  1260. for(cc = 0, vc = 0; cc < dz->clength; cc++, vc += 2)
  1261. dz->amp[cc] = floatbuf[vc];
  1262. return(FINISHED);
  1263. }
  1264. /******************** PUT_AMP ********************/
  1265. int put_amp(float *floatbuf,dataptr dz)
  1266. {
  1267. int cc, vc;
  1268. for(cc = 0, vc = 0; cc < dz->clength; cc++, vc += 2)
  1269. floatbuf[vc] = dz->amp[cc];
  1270. return(FINISHED);
  1271. }
  1272. /*************************** ADVANCE_ONE_2FILEINPUT_WINDOW ***********************/
  1273. int advance_one_2fileinput_window(dataptr dz)
  1274. {
  1275. dz->flbufptr[0] += dz->wanted;
  1276. dz->flbufptr[1] += dz->wanted;
  1277. dz->total_windows++;
  1278. dz->time = (float)(dz->time + dz->frametime);
  1279. return(FINISHED);
  1280. }
  1281. /***************************** SPECBARE *********************************/
  1282. int specbare(int *pitchcnt,dataptr dz)
  1283. {
  1284. int exit_status;
  1285. double error_range = SPAN_FACTOR * SEMITONE_INTERVAL; /* +or- error in finding pitch of partial */
  1286. double pitch;
  1287. double thisfrq /* = pitch */, frq_close_above_next_partial, frq_close_below_next_partial;
  1288. int n = 0;
  1289. int vc = 0;
  1290. double one_over_error_range = 1.0/error_range;
  1291. double upper_freqdiff,lower_freqdiff;
  1292. pitch = dz->pitches[(*pitchcnt)++];
  1293. if(pitch < 0.0) /* UNPITCHED WINDOW : marked in specpich */
  1294. return(FINISHED);
  1295. upper_freqdiff = (pitch * error_range) - pitch;
  1296. lower_freqdiff = pitch - (pitch * one_over_error_range);
  1297. while(vc < dz->wanted && (thisfrq = pitch * (double)++n) < dz->nyquist) {
  1298. frq_close_above_next_partial = thisfrq + upper_freqdiff;
  1299. frq_close_below_next_partial = thisfrq - lower_freqdiff;
  1300. if((exit_status = zero_channels_between_partials(&vc,frq_close_below_next_partial,dz))<0)
  1301. return(exit_status);
  1302. if(vc >= dz->wanted)
  1303. break;
  1304. if(dz->flbufptr[0][FREQ]>frq_close_above_next_partial)
  1305. continue;
  1306. else if(dz->vflag[BARE_LESS_BODY]) {
  1307. if((exit_status = eliminate_all_but_loudest_channel_near_this_partial_frq
  1308. (&vc,frq_close_above_next_partial,dz))<0)
  1309. return(exit_status);
  1310. } else {
  1311. if((exit_status = keep_all_channels_near_partial_frq(&vc,frq_close_above_next_partial,dz))<0)
  1312. return(exit_status);
  1313. }
  1314. }
  1315. return(FINISHED);
  1316. }
  1317. /************** ZERO_CHANNELS_BETWEEN_PARTIALS ****************/
  1318. int zero_channels_between_partials(int *vvc,double frq_close_below_next_partial,dataptr dz)
  1319. {
  1320. int vc = *vvc;
  1321. while(dz->flbufptr[0][FREQ] < frq_close_below_next_partial) {
  1322. dz->flbufptr[0][AMPP] = 0.0f;
  1323. if((vc += 2) >= dz->wanted)
  1324. break;
  1325. }
  1326. *vvc = vc;
  1327. return(FINISHED);
  1328. }
  1329. /******** ELIMINATE_ALL_BUT_LOUDEST_CHANNEL_NEAR_THIS_PARTIAL_FRQ *********/
  1330. int eliminate_all_but_loudest_channel_near_this_partial_frq(int *vvc,double frq_close_above_next_partial,dataptr dz)
  1331. {
  1332. int vc = *vvc;
  1333. double maxamp = dz->flbufptr[0][AMPP]; /* SET MAXAMP TO 1ST IN-RANGE CH */
  1334. int k, maxloc = vc; /* NOTE NO. OF THE CH THUS MARKD */
  1335. int firstloc = vc; /* MARK FIRST CH IN SET */
  1336. while((vc += 2) < dz->wanted) {
  1337. if(dz->flbufptr[0][FREQ]>frq_close_above_next_partial) /* IF BEYOND CURRENT RANGE, STOP */
  1338. break;
  1339. if(dz->flbufptr[0][vc]>maxamp) { /* IF LOUDER THAN MAX,RESET MAX */
  1340. maxamp = dz->flbufptr[0][AMPP]; /* AND RESET MAXAMP CHANNEL NO. */
  1341. maxloc = vc;
  1342. }
  1343. }
  1344. for(k=firstloc; k<vc; k+=2) { /* FOR THE WHOLE SET THUS DONE */
  1345. if(k!=maxloc) /* ZERO ALL CHS OTHER THAN MAX */
  1346. dz->flbufptr[0][k] = 0.0f;
  1347. }
  1348. *vvc = vc;
  1349. return(FINISHED);
  1350. }
  1351. /*********************** KEEP_ALL_CHANNELS_NEAR_PARTIAL_FRQ ******************/
  1352. int keep_all_channels_near_partial_frq(int *vvc,double frq_close_above_next_partial,dataptr dz)
  1353. {
  1354. int vc = *vvc;
  1355. while((vc += 2) < dz->wanted) {
  1356. if(dz->flbufptr[0][FREQ]>frq_close_above_next_partial) /* IF BEYOND CURRENT RANGE, STOP */
  1357. break;
  1358. }
  1359. *vvc = vc;
  1360. return(FINISHED);
  1361. }
  1362. /****************************** GEN_AMPLITUDE_IN_LO_HALF_FILTERBAND ***************************/
  1363. int gen_amplitude_in_lo_half_filterband(double *thisamp,double thisfrq,double filt_centre_frq,dataptr dz)
  1364. {
  1365. double val;
  1366. val = -LOG2(thisfrq/filt_centre_frq); /* octave distance from filter centre-frq */
  1367. val *= dz->scalefact; /* convert to a fraction of halfbwidth (range 0-1) &
  1368. convert to range 0-PI */
  1369. val = cos(val); /* get cos val between 1 & -1 */
  1370. val += 1.0; /* convert range to 2 -> 0 */
  1371. val /= 2.0; /* convert range to 1 -> 0 */
  1372. *thisamp = val;
  1373. return(FINISHED);
  1374. }
  1375. /****************************** GEN_AMPLITUDE_IN_HI_HALF_FILTERBAND ***************************/
  1376. int gen_amplitude_in_hi_half_filterband(double *thisamp,double thisfrq,double filt_centre_frq,dataptr dz)
  1377. {
  1378. double val;
  1379. val = LOG2(thisfrq/filt_centre_frq); /* octave distance from filter centre-frq */
  1380. val *= dz->scalefact; /* convert to a fraction of halfbwidth (range 0-1) &
  1381. convert to range 0-PI */
  1382. val = cos(val); /* get cos val between 1 & -1 */
  1383. val += 1.0; /* convert range to 2 -> 0 */
  1384. val /= 2.0; /* convert range to 1 -> 0 */
  1385. *thisamp = val;
  1386. return(FINISHED);
  1387. }
  1388. /****************************** FILTER_BAND_TEST ***************************
  1389. *
  1390. * CHeck that filter values are within range - and that there ARE values there!!!
  1391. */
  1392. int filter_band_test(dataptr dz)
  1393. {
  1394. int OK = 0, cc;
  1395. for(cc=0;cc<dz->clength;cc++) {
  1396. if(dz->fsampbuf[cc]>1.0 || dz->fsampbuf[cc]<0.0) {
  1397. sprintf(errstr,"filter contour out of range. (item[%d] = %f): filter_band_test()\n",cc,dz->fsampbuf[cc]);
  1398. return(PROGRAM_ERROR);
  1399. }
  1400. if(dz->fsampbuf[cc] > 0.0)
  1401. OK = 1;
  1402. }
  1403. if(!OK && !dz->fzeroset) {
  1404. fprintf(stdout,"WARNING: ZERO filter contour at window %d time %lf\n",
  1405. dz->total_windows+1,dz->total_windows * dz->frametime);
  1406. fflush(stdout);
  1407. dz->fzeroset = TRUE;
  1408. } else
  1409. dz->fzeroset = FALSE;
  1410. return(FINISHED);
  1411. }
  1412. /************************** GET_STATECHANGES ************************/
  1413. int get_statechanges(int avcnt,int scantableno,int avpitcharrayno,int statechangearrayno,
  1414. double min_up_interval,double min_dn_interval,int datatype,dataptr dz)
  1415. {
  1416. #define RISING (1)
  1417. #define FALLING (2)
  1418. #define ONLEVEL (3)
  1419. int exit_status;
  1420. int n, window_cnt, pblok;
  1421. double ttime = 0.0, intvl = 0.0;
  1422. int *bbrk;
  1423. if((bbrk = (int *)malloc(avcnt * sizeof(int)))==NULL) {
  1424. sprintf(errstr,"INSUFFICIENT MEMORY for statechange array.\n");
  1425. return(MEMORY_ERROR);
  1426. }
  1427. memset((char *)bbrk,0,avcnt * sizeof(int));
  1428. if(dz->brksize[scantableno]) {
  1429. if((exit_status = read_value_from_brktable(ttime,scantableno,dz))<0)
  1430. return(exit_status);
  1431. }
  1432. window_cnt = round(dz->param[scantableno]/dz->frametime);
  1433. if((pblok = round(window_cnt/BLOKCNT))<2) {
  1434. sprintf(errstr,"scanning-contour time_scale too short for this data.\n");
  1435. return(DATA_ERROR);
  1436. }
  1437. if(pblok >= avcnt) {
  1438. sprintf(errstr,"scanning-contour time_scale too long for this data.\n");
  1439. return(DATA_ERROR);
  1440. }
  1441. for(n=pblok;n<avcnt;n++) {
  1442. switch(datatype) {
  1443. case(IS_PITCH): intvl = dz->parray[avpitcharrayno][n] - dz->parray[avpitcharrayno][n-pblok];
  1444. break;
  1445. case(IS_FRQ): intvl = dz->parray[avpitcharrayno][n]/dz->parray[avpitcharrayno][n-pblok];
  1446. break;
  1447. }
  1448. if(intvl > min_up_interval)
  1449. bbrk[n] = RISING;
  1450. else if(intvl < min_dn_interval)
  1451. bbrk[n] = FALLING;
  1452. else
  1453. bbrk[n] = ONLEVEL;
  1454. if(dz->brksize[scantableno]) {
  1455. /* move along by an (averaged) BLOK of windows */
  1456. ttime += dz->frametime * BLOKCNT;
  1457. if((exit_status = read_value_from_brktable(ttime,scantableno,dz))<0)
  1458. return(exit_status);
  1459. window_cnt = round(dz->param[scantableno]/dz->frametime);
  1460. if((pblok = round(window_cnt/BLOKCNT))<2) {
  1461. sprintf(errstr,"scanning-contour time_scale too short for this data.\n");
  1462. return(DATA_ERROR);
  1463. }
  1464. }
  1465. }
  1466. n = 0;
  1467. /* Set types at very start, equal to actual first type already set */
  1468. while(!bbrk[n]) {
  1469. if(++n >= avcnt)
  1470. break;
  1471. }
  1472. if(n<avcnt) {
  1473. n--;
  1474. while(n>=0) {
  1475. bbrk[n] = bbrk[n+1];
  1476. if(--n < 0)
  1477. break;
  1478. }
  1479. }
  1480. memset(dz->iparray[statechangearrayno],0,avcnt * sizeof(int));
  1481. dz->iparray[statechangearrayno][0] = 1; /* initial state change */
  1482. for(n=1;n<avcnt;n++) {
  1483. if(bbrk[n]!=bbrk[n-1])
  1484. dz->iparray[statechangearrayno][n] = 1;
  1485. }
  1486. free(bbrk);
  1487. return(FINISHED);
  1488. }
  1489. /**************************** RECTIFY_FRQS ****************************/
  1490. int rectify_frqs(float *floatbuf,dataptr dz)
  1491. {
  1492. int vc;
  1493. for(vc = 0; vc < dz->wanted; vc += 2) {
  1494. if(floatbuf[FREQ] < 0.0f)
  1495. floatbuf[FREQ] = (float)(-(floatbuf[FREQ]));
  1496. }
  1497. return(FINISHED);
  1498. }
  1499. /******************************* MOVE_ALONG_FORMANT_BUFFER ************************/
  1500. int move_along_formant_buffer(dataptr dz)
  1501. {
  1502. int samps_read;
  1503. if((dz->flbufptr[1] += dz->infile->specenvcnt) >= dz->flbufptr[3]) {
  1504. if((samps_read = fgetfbufEx(dz->flbufptr[2],dz->buflen2,dz->ifd[1],0))<0) {
  1505. sprintf(errstr,"fgetfbufEx failure, move_along_formant_buffer()\n");
  1506. return(SYSTEM_ERROR);
  1507. }
  1508. if(samps_read <= 0)
  1509. return(FINISHED);
  1510. dz->flbufptr[1] = dz->flbufptr[2];
  1511. }
  1512. return(CONTINUE);
  1513. }
  1514. /*************************** GET_LONGER_FILE ***********************/
  1515. int get_longer_file(dataptr dz)
  1516. {
  1517. int file_to_keep = 1;
  1518. if(dz->insams[0] < dz->insams[1])
  1519. /* allows larger infile2 to be copied after infile1 finished */
  1520. file_to_keep = 2;
  1521. return(file_to_keep);
  1522. }
  1523. /*************************** READ_BOTH_FILES ***********************/
  1524. int read_both_files(int *windows_in_buf,int *got,dataptr dz)
  1525. {
  1526. int samps_read, samps_read2;
  1527. memset((char *)dz->bigfbuf,0,dz->buflen * sizeof(float));
  1528. if((samps_read = fgetfbufEx(dz->bigfbuf, dz->buflen,dz->ifd[0],0)) < 0) {
  1529. sprintf(errstr,"Failed to read data from first file.\n");
  1530. return(SYSTEM_ERROR);
  1531. }
  1532. memset((char *)dz->flbufptr[2],0,dz->buflen* sizeof(float));
  1533. if((samps_read2 = fgetfbufEx(dz->flbufptr[2], dz->buflen,dz->ifd[1],0)) < 0) {
  1534. sprintf(errstr,"Failed to read data from second file.\n");
  1535. return(SYSTEM_ERROR);
  1536. }
  1537. *got = max(samps_read,samps_read2);
  1538. dz->flbufptr[0] = dz->bigfbuf;
  1539. dz->flbufptr[1] = dz->flbufptr[2];
  1540. *windows_in_buf = *got/dz->wanted;
  1541. return(FINISHED);
  1542. }
  1543. /*************************** KEEP_EXCESS_BYTES_FROM_CORRECT_FILE ***********************/
  1544. #ifdef NOTDEF
  1545. int keep_excess_bytes_from_correct_file(int *bytes_to_write,int file_to_keep,int got,int wc,dataptr dz)
  1546. {
  1547. int floats_to_keep = got - ((wc+1) * dz->wanted);
  1548. if(file_to_keep) {
  1549. if(file_to_keep==2 && floats_to_keep > 0)
  1550. memmove((char *)dz->flbufptr[0],(char *)dz->flbufptr[1],floats_to_keep * sizeof(float));
  1551. dz->flbufptr[0] += floats_to_keep;
  1552. }
  1553. *bytes_to_write = (dz->flbufptr[0] - dz->bigfbuf) * sizeof(float);
  1554. return(FINISHED);
  1555. }
  1556. #else
  1557. /*************************** KEEP_EXCESS_SAMPS_FROM_CORRECT_FILE ***********************/
  1558. int keep_excess_samps_from_correct_file(int *samps_to_write,int file_to_keep,int got,int wc,dataptr dz)
  1559. {
  1560. int floats_to_keep = got - ((wc+1) * dz->wanted);
  1561. if(file_to_keep) {
  1562. if(file_to_keep==2 && floats_to_keep > 0)
  1563. memmove((char *)dz->flbufptr[0],(char *)dz->flbufptr[1],floats_to_keep * sizeof(float));
  1564. dz->flbufptr[0] += floats_to_keep;
  1565. }
  1566. //TW CORRECTED
  1567. // *samps_to_write = (dz->flbufptr[0] - dz->bigfbuf) * sizeof(float);
  1568. *samps_to_write = dz->flbufptr[0] - dz->bigfbuf;
  1569. return(FINISHED);
  1570. }
  1571. #endif
  1572. /*************************** READ_EITHER_FILE ***********************/
  1573. int read_either_file(int *samps_read,int file_to_keep,dataptr dz)
  1574. {
  1575. if(file_to_keep==2) {
  1576. if((*samps_read = fgetfbufEx(dz->bigfbuf, dz->buflen,dz->ifd[1],0))<0) {
  1577. sprintf(errstr,"Failed to read samples from file 2\n");
  1578. return(SYSTEM_ERROR);
  1579. }
  1580. } else {
  1581. if((*samps_read = fgetfbufEx(dz->bigfbuf, dz->buflen,dz->ifd[0],0))<0) {
  1582. sprintf(errstr,"Failed to read samples from file 1\n");
  1583. return(SYSTEM_ERROR);
  1584. }
  1585. }
  1586. return(FINISHED);
  1587. }
  1588. /****************************** SCORE_PEAKS ******************************/
  1589. int score_peaks(int *peakscore,int sl1_var,int stabl_var,dataptr dz)
  1590. {
  1591. int n, m;
  1592. if(dz->total_windows>dz->iparam[sl1_var]) {
  1593. for(n = 0;n < dz->stable->total_pkcnt[dz->iparam[sl1_var]]; n++) { /* Add in the peaks in the last buf calcd */
  1594. dz->stable->design_score[dz->stable->fpk[dz->iparam[sl1_var]][n]]++; /* to the existing scores!! */
  1595. (*peakscore)++;
  1596. }
  1597. } else {
  1598. for(m=0;m<dz->iparam[stabl_var];m++) { /* For every stored array of peaks */
  1599. for(n = 0;n < dz->stable->total_pkcnt[m]; n++) { /* For every peak within that store */
  1600. dz->stable->design_score[dz->stable->fpk[m][n]]++; /* Score a point for each occurence of a specenvchan */
  1601. (*peakscore)++; /* Check to see if there are ANY peaks at all */
  1602. }
  1603. }
  1604. }
  1605. return(FINISHED);
  1606. }
  1607. /****************************** COLLECT_SCORES ******************************
  1608. *
  1609. * If any channel is used as a peak (score > 0),store channel-no and score
  1610. * in a design_struct, and preset the amp_total to zero (see amplitude_poll).
  1611. * Count the total number of such peaks.
  1612. */
  1613. int collect_scores(int *cnt,int *descnt,dataptr dz)
  1614. {
  1615. int n;
  1616. *cnt = 0;
  1617. for(n=0;n<dz->infile->specenvcnt;n++) {
  1618. if(dz->stable->design_score[n]) {
  1619. if(*cnt >= *descnt) { /* If this number of design_structs don't exist, make another */
  1620. if((dz->stable->des[*cnt] = (desptr)malloc(sizeof(struct design)))==NULL) {
  1621. sprintf(errstr,"INSUFFICIENT MEMORY for scoring array.\n");
  1622. return(MEMORY_ERROR);
  1623. }
  1624. (*descnt)++;
  1625. }
  1626. dz->stable->des[*cnt]->chan = n;
  1627. dz->stable->des[*cnt]->score = dz->stable->design_score[n];
  1628. dz->stable->des[*cnt]->amp = 0.0;
  1629. (*cnt)++;
  1630. }
  1631. }
  1632. return(FINISHED);
  1633. }
  1634. /****************************** SORT_DESIGN ***************************
  1635. *
  1636. * Sort peak channels into descending order ofabundance
  1637. */
  1638. int sort_design(int no_of_design_elements,dataptr dz)
  1639. {
  1640. int n, m, a, b;
  1641. for(n=1;n<no_of_design_elements;n++) {
  1642. a = dz->stable->des[n]->chan;
  1643. b = dz->stable->des[n]->score;
  1644. m = n-1;
  1645. while(m >= 0 && dz->stable->des[m]->score < b) {
  1646. dz->stable->des[m+1]->chan = dz->stable->des[m]->chan;
  1647. dz->stable->des[m+1]->score = dz->stable->des[m]->score;
  1648. m--;
  1649. }
  1650. dz->stable->des[m+1]->chan = a;
  1651. dz->stable->des[m+1]->score = b;
  1652. }
  1653. return(FINISHED);
  1654. }
  1655. /****************************** SORT_EQUIVALENT_SCORES ******************************
  1656. *
  1657. * For channels with equivalent scores. Find the bottom and top of the range of
  1658. * channels with equivalent scores. Save those below the bottom of the range as
  1659. * acceptable peaks (they have higher scores than those in the range).
  1660. * For the rest, select those channels having the maximum amplitude over the
  1661. * whole timespan of the stabilise buffers.
  1662. */
  1663. int sort_equivalent_scores(int this_pkcnt,dataptr dz)
  1664. {
  1665. int bot, top, n;
  1666. if(dz->stable->des[dz->itemcnt-1]->score < dz->stable->des[dz->itemcnt]->score) {
  1667. sprintf(errstr,"Problem in peak sorting: sort_equivalent_scores()\n");
  1668. return(PROGRAM_ERROR);
  1669. }
  1670. n = dz->itemcnt-1;
  1671. while(n >= 0) {
  1672. if(dz->stable->des[n]->score == dz->stable->des[dz->itemcnt]->score)
  1673. n--;
  1674. else
  1675. break;
  1676. }
  1677. bot = n+1;
  1678. n = dz->itemcnt+1;
  1679. while(n <this_pkcnt) {
  1680. if(dz->stable->des[n]->score == dz->stable->des[dz->itemcnt]->score)
  1681. n++;
  1682. else
  1683. break;
  1684. }
  1685. top = n;
  1686. for(n=0;n<bot;n++)
  1687. dz->peakno[n] = dz->stable->des[n]->chan; /* keep peaks that have definitely higher scores */
  1688. return do_amplitude_poll(bot,top,dz);
  1689. }
  1690. /****************************** DO_AMPLITUDE_POLL ***************************/
  1691. int do_amplitude_poll(int bot,int top,dataptr dz)
  1692. {
  1693. int n, m, here = 0, thischan;
  1694. int nextpeak = bot; /* peaknumber of first of peaks still to allocate */
  1695. double thisamp, ampmax;
  1696. for(n=bot;n<top;n++) { /* For every channel in the set of possible channels */
  1697. thischan = dz->stable->des[n]->chan;
  1698. for(m=0;m<dz->iparam[FOCU_STABL];m++) /* sum amplitudes in that chan across all specenv buffers */
  1699. dz->stable->des[n]->amp += dz->stable->spec[m][thischan]; /* and store in des-array assocd with channel */
  1700. }
  1701. while(nextpeak < dz->itemcnt) { /* while there are still peaks to be chosen */
  1702. ampmax = 0.0;
  1703. for(n=bot;n<top;n++) { /* Find maximum among these amplitude-totals */
  1704. if((thisamp = dz->stable->des[n]->amp)>ampmax) {
  1705. ampmax = thisamp;
  1706. here = n;
  1707. }
  1708. }
  1709. dz->peakno[nextpeak++] = dz->stable->des[here]->chan; /* Set next peak channel to this maxamp channel */
  1710. dz->stable->des[here]->amp = 0.0; /* zero amptotal in chosen des, to eliminate from next search */
  1711. }
  1712. return(FINISHED);
  1713. }
  1714. /****************************** UNSCORE_PEAKS ******************************/
  1715. int unscore_peaks(int *peakscore,dataptr dz)
  1716. {
  1717. int n;
  1718. for(n = 0;n < dz->stable->total_pkcnt[0]; n++) { /* Subtract score of peaks buffer no longer in use */
  1719. dz->stable->design_score[dz->stable->fpk[0][n]]--; /* from the existing scores!! */
  1720. (*peakscore)--;
  1721. }
  1722. return(FINISHED);
  1723. }
  1724. /******************************************************************************/
  1725. /************************* FORMERLY IN pconsistency.c *************************/
  1726. /******************************************************************************/
  1727. static void setup_pitchzero(int paramno,dataptr dz);
  1728. /************************** HANDLE_PITCH_ZEROS ********************************/
  1729. void handle_pitch_zeros(dataptr dz)
  1730. {
  1731. switch(dz->process) {
  1732. case(ARPE):
  1733. setup_pitchzero(ARPE_LOFRQ,dz);
  1734. setup_pitchzero(ARPE_HIFRQ,dz);
  1735. break;
  1736. case(CHORD):
  1737. setup_pitchzero(CHORD_LOFRQ,dz);
  1738. setup_pitchzero(CHORD_HIFRQ,dz);
  1739. break;
  1740. case(CLEAN):
  1741. if(dz->mode==FILTERING)
  1742. setup_pitchzero(CL_FRQ,dz);
  1743. break;
  1744. case(FOCUS):
  1745. setup_pitchzero(FOCU_LOFRQ,dz);
  1746. setup_pitchzero(FOCU_HIFRQ,dz);
  1747. break;
  1748. case(FOLD):
  1749. setup_pitchzero(FOLD_LOFRQ,dz);
  1750. setup_pitchzero(FOLD_HIFRQ,dz);
  1751. break;
  1752. case(FORM):
  1753. setup_pitchzero(FORM_FTOP,dz);
  1754. setup_pitchzero(FORM_FBOT,dz);
  1755. break;
  1756. case(MEAN):
  1757. setup_pitchzero(MEAN_LOF,dz);
  1758. setup_pitchzero(MEAN_HIF,dz);
  1759. break;
  1760. case(P_FIX):
  1761. setup_pitchzero(PF_LOF,dz);
  1762. setup_pitchzero(PF_HIF,dz);
  1763. break;
  1764. case(PEAK):
  1765. setup_pitchzero(PEAK_CUTOFF,dz);
  1766. break;
  1767. case(REPORT):
  1768. setup_pitchzero(REPORT_LOFRQ,dz);
  1769. setup_pitchzero(REPORT_HIFRQ,dz);
  1770. break;
  1771. case(SHIFTP):
  1772. setup_pitchzero(SHIFTP_FFRQ,dz);
  1773. break;
  1774. case(STRETCH):
  1775. setup_pitchzero(STR_FFRQ,dz);
  1776. break;
  1777. case(S_TRACE):
  1778. setup_pitchzero(TRAC_LOFRQ,dz);
  1779. setup_pitchzero(TRAC_HIFRQ,dz);
  1780. break;
  1781. case(TRNSF):
  1782. setup_pitchzero(TRNSF_HIFRQ,dz);
  1783. setup_pitchzero(TRNSF_LOFRQ,dz);
  1784. break;
  1785. case(TRNSP):
  1786. setup_pitchzero(TRNSP_HIFRQ,dz);
  1787. setup_pitchzero(TRNSP_LOFRQ,dz);
  1788. break;
  1789. case(TUNE):
  1790. setup_pitchzero(TUNE_BFRQ,dz);
  1791. break;
  1792. case(VOCODE):
  1793. setup_pitchzero(VOCO_LOF,dz);
  1794. setup_pitchzero(VOCO_HIF,dz);
  1795. break;
  1796. case(WAVER):
  1797. setup_pitchzero(WAVER_LOFRQ,dz);
  1798. break;
  1799. }
  1800. }
  1801. /****************************** SETUP_PITCHZERO *******************************/
  1802. void setup_pitchzero(int paramno,dataptr dz)
  1803. {
  1804. double *p, *end;
  1805. if(dz->brksize[paramno]) {
  1806. p = dz->brk[paramno] + 1;
  1807. end = dz->brk[paramno] + (dz->brksize[paramno] * 2);
  1808. while(p < end) {
  1809. if(*p < SPEC_MINFRQ)
  1810. *p = SPEC_MINFRQ;
  1811. p+=2;
  1812. }
  1813. } else if(dz->param[paramno] < SPEC_MINFRQ)
  1814. dz->param[paramno] = 0.0;
  1815. }
  1816. /************************************ CHECK_DEPTH_VALS *************************************/
  1817. int check_depth_vals(int param_no,dataptr dz)
  1818. {
  1819. double *p;
  1820. int n = 0;
  1821. if(dz->brksize[param_no]==0) {
  1822. if(flteq(dz->param[param_no],0.0)) {
  1823. sprintf(errstr,
  1824. "A non-varying depth value of zero will not change your source file.\n");
  1825. return(DATA_ERROR);
  1826. }
  1827. } else {
  1828. p = dz->brk[param_no]+1;
  1829. n = 0;
  1830. while(n < dz->brksize[param_no]) {
  1831. if(!flteq(*p,0.0))
  1832. return(FINISHED);
  1833. p += 2;
  1834. n++;
  1835. }
  1836. sprintf(errstr,
  1837. "A non-varying depth value of zero will not change your source file.\n");
  1838. return(DATA_ERROR);
  1839. }
  1840. return(FINISHED);
  1841. }
  1842. /*********************** CONVERT_SHIFTP_VALS ***********************/
  1843. void convert_shiftp_vals(dataptr dz)
  1844. {
  1845. switch(dz->mode) {
  1846. case(P_SHFT_UP_AND_DN):
  1847. dz->param[SHIFTP_SHF1] *= OCTAVES_PER_SEMITONE;
  1848. dz->param[SHIFTP_SHF1] = pow(2.0,dz->param[SHIFTP_SHF1]);
  1849. dz->param[SHIFTP_SHF2] *= OCTAVES_PER_SEMITONE;
  1850. dz->param[SHIFTP_SHF2] = pow(2.0,dz->param[SHIFTP_SHF2]);
  1851. break;
  1852. case(P_SHFT_DN):
  1853. dz->param[SHIFTP_SHF1] *= OCTAVES_PER_SEMITONE;
  1854. dz->param[SHIFTP_SHF1] = pow(2.0,dz->param[SHIFTP_SHF1]);
  1855. break;
  1856. case(P_SHFT_UP):
  1857. dz->param[SHIFTP_SHF1] *= OCTAVES_PER_SEMITONE;
  1858. dz->param[SHIFTP_SHF1] = pow(2.0,dz->param[SHIFTP_SHF1]);
  1859. break;
  1860. }
  1861. }
  1862. /******************************************************************************/
  1863. /************************* FORMERLY IN buffers.c ******************************/
  1864. /******************************************************************************/
  1865. /*************************** CREATE_SNDBUFS **************************/
  1866. /* 2009 MULTICHANNEL */
  1867. /* TW update Nov 2022, correct buflen for large anal chans */
  1868. int create_sndbufs(dataptr dz)
  1869. {
  1870. int n;
  1871. size_t bigbufsize;
  1872. int framesize;
  1873. framesize = F_SECSIZE * dz->infile->channels;
  1874. if(dz->sbufptr == 0 || dz->sampbuf==0) {
  1875. sprintf(errstr,"buffer pointers not allocated: create_sndbufs()\n");
  1876. return(PROGRAM_ERROR);
  1877. }
  1878. bigbufsize = (size_t) Malloc(-1);
  1879. bigbufsize /= dz->bufcnt;
  1880. if(bigbufsize <=0)
  1881. bigbufsize = framesize * sizeof(float);
  1882. dz->buflen = (int)(bigbufsize / sizeof(float));
  1883. // NEW TW NOV 26 : 2022 -->
  1884. if(dz->buflen < framesize)
  1885. dz->buflen = framesize;
  1886. else
  1887. // <-- NEW TW NOV 26 : 2022
  1888. dz->buflen = (dz->buflen / framesize) * framesize;
  1889. bigbufsize = dz->buflen * sizeof(float);
  1890. if((dz->bigbuf = (float *)malloc(bigbufsize * dz->bufcnt)) == NULL) {
  1891. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1892. return(PROGRAM_ERROR);
  1893. }
  1894. for(n=0;n<dz->bufcnt;n++)
  1895. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1896. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1897. return(FINISHED);
  1898. }
  1899. /**************************** ALLOCATE_SINGLE_BUFFER ******************************/
  1900. //TW REVISED: buffers no longer multiples of secsize
  1901. int allocate_single_buffer(dataptr dz)
  1902. {
  1903. // int bigbufsize;
  1904. // int exit_status;
  1905. unsigned int buffersize;
  1906. if(dz->bptrcnt <= 0) {
  1907. sprintf(errstr,"bufptr not established in allocate_single_buffer()\n");
  1908. return(PROGRAM_ERROR);
  1909. }
  1910. //TW
  1911. // buffersize = dz->sampswanted * BUF_MULTIPLIER;
  1912. buffersize = dz->wanted * BUF_MULTIPLIER;
  1913. //TW MOVED THIS LINE: to get correct value of buflen (NOT after the +1)
  1914. dz->buflen = buffersize;
  1915. buffersize += 1;
  1916. if((dz->bigfbuf = (float*) malloc(buffersize * sizeof(float)))==NULL) {
  1917. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1918. return(MEMORY_ERROR);
  1919. }
  1920. dz->big_fsize = dz->buflen;
  1921. dz->bigfbuf[dz->big_fsize] = 0.0f; /* safety value */
  1922. return(FINISHED);
  1923. }
  1924. /**************************** ALLOCATE_DOUBLE_BUFFER ******************************/
  1925. /* RWD MUST recheck this! */
  1926. int allocate_double_buffer(dataptr dz)
  1927. {
  1928. // int exit_status;
  1929. unsigned int buffersize;
  1930. if(dz->bptrcnt < 4) {
  1931. sprintf(errstr,"Insufficient bufptrs established in allocate_double_buffer()\n");
  1932. return(PROGRAM_ERROR);
  1933. }
  1934. //TW REVISED: buffers don't need to be multiples of secsize
  1935. buffersize = dz->wanted * BUF_MULTIPLIER;
  1936. dz->buflen = buffersize;
  1937. if((dz->bigfbuf = (float*)malloc(dz->buflen*2 * sizeof(float)))==NULL) {
  1938. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1939. return(MEMORY_ERROR);
  1940. }
  1941. dz->big_fsize = dz->buflen;
  1942. dz->flbufptr[2] = dz->bigfbuf + dz->big_fsize;
  1943. dz->flbufptr[3] = dz->flbufptr[2] + dz->big_fsize;
  1944. return(FINISHED);
  1945. }
  1946. /**************************** ALLOCATE_TRIPLE_BUFFER ******************************/
  1947. int allocate_triple_buffer(dataptr dz)
  1948. {
  1949. unsigned int buffersize;
  1950. if(dz->bptrcnt < 5) {
  1951. sprintf(errstr,"Insufficient bufptrs established in allocate_triple_buffer()\n");
  1952. return(PROGRAM_ERROR);
  1953. }
  1954. //TW REVISED: buffers don't need to be multiples of secsize
  1955. buffersize = dz->wanted;
  1956. dz->buflen = buffersize;
  1957. if((dz->bigfbuf = (float*)malloc(dz->buflen*3 * sizeof(float)))==NULL) {
  1958. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1959. return(MEMORY_ERROR);
  1960. }
  1961. dz->big_fsize = dz->buflen;
  1962. dz->flbufptr[2] = dz->bigfbuf + dz->big_fsize;
  1963. dz->flbufptr[3] = dz->flbufptr[2] + dz->big_fsize;
  1964. dz->flbufptr[4] = dz->flbufptr[3] + dz->big_fsize;
  1965. return(FINISHED);
  1966. }
  1967. /*************************** ALLOCATE_ANALDATA_PLUS_FORMANTDATA_BUFFER ****************************/
  1968. int allocate_analdata_plus_formantdata_buffer(dataptr dz)
  1969. {
  1970. int exit_status;
  1971. unsigned int buffersize;
  1972. /*int cnt = 0;*/
  1973. if(dz->bptrcnt < 4) {
  1974. sprintf(errstr,"Insufficient bufptrs established in allocate_analdata_plus_formantdata_buffer()\n");
  1975. return(PROGRAM_ERROR);
  1976. }
  1977. if(dz->infile->specenvcnt==0) {
  1978. sprintf(errstr,"specenvcnt not set: allocate_analdata_plus_formantdata_buffer()\n");
  1979. return(PROGRAM_ERROR);
  1980. }
  1981. if((exit_status = calculate_analdata_plus_formantdata_buffer(&buffersize,dz))<0)
  1982. return(exit_status);
  1983. if((dz->bigfbuf = (float*)malloc((size_t)buffersize * sizeof(float)))==NULL) {
  1984. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1985. return(MEMORY_ERROR);
  1986. }
  1987. dz->big_fsize = /*dz->bigbufsize/sizeof(float);*/dz->buflen;
  1988. dz->flbufptr[2] = dz->bigfbuf + dz->big_fsize;
  1989. dz->flbufptr[3] = dz->flbufptr[2] + /*(dz->bigbufsize2/sizeof(float));*/ dz->buflen2;
  1990. return(FINISHED);
  1991. }
  1992. /******************************* CALCULATE_ANALDATA_PLUS_FORMANTDATA_BUFFER **************************/
  1993. int calculate_analdata_plus_formantdata_buffer(unsigned int *buffersize,dataptr dz)
  1994. {
  1995. // int exit_status;
  1996. int cnt = 0;
  1997. unsigned int orig_buffersize = 0;
  1998. dz->buflen2 = 0;
  1999. //TW REVISED: no secsize-multiple restriction on buffers
  2000. *buffersize = (dz->wanted + dz->infile->specenvcnt) * BUF_MULTIPLIER;
  2001. while(dz->buflen2 < dz->descriptor_samps) {
  2002. if(cnt == 0)
  2003. orig_buffersize = *buffersize;
  2004. else
  2005. *buffersize += orig_buffersize;
  2006. cnt++;
  2007. dz->buflen = dz->wanted * BUF_MULTIPLIER * cnt;
  2008. dz->buflen2 = dz->infile->specenvcnt * BUF_MULTIPLIER * cnt;
  2009. }
  2010. return(FINISHED);
  2011. }
  2012. /******************************* ALLOCATE_SINGLE_BUFFER_PLUS_EXTRA_POINTER **************************/
  2013. int allocate_single_buffer_plus_extra_pointer(dataptr dz)
  2014. {
  2015. int exit_status;
  2016. if((exit_status = allocate_single_buffer(dz))<0)
  2017. return(exit_status);
  2018. if(dz->bptrcnt < 2) {
  2019. sprintf(errstr,"dz->flbufptr[1] not established: allocate_larger_buffers()\n");
  2020. return(PROGRAM_ERROR);
  2021. }
  2022. dz->flbufptr[1] = dz->bigfbuf + dz->big_fsize;
  2023. return(FINISHED);
  2024. }
  2025. /******************************************************************************/
  2026. /************************* FORMERLY IN cmdline.c *****************************/
  2027. /******************************************************************************/
  2028. /************************** GET_PROCESS_AND_MODE_FROM_CMDLINE *****************************/
  2029. int get_process_and_mode_from_cmdline(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2030. {
  2031. int exit_status;
  2032. if((exit_status = get_process_no((*cmdline)[0],dz))<0)
  2033. return(exit_status);
  2034. (*cmdline)++;
  2035. (*cmdlinecnt)--;
  2036. if((dz->maxmode = get_maxmode(dz->process))<0)
  2037. return(PROGRAM_ERROR);
  2038. if(dz->maxmode > 0) {
  2039. if(*cmdlinecnt<=0) {
  2040. sprintf(errstr,"Too few commandline parameters.\n");
  2041. return(USAGE_ONLY);
  2042. }
  2043. if((exit_status = get_mode_from_cmdline((*cmdline)[0],dz))<0)
  2044. return(exit_status);
  2045. (*cmdline)++;
  2046. (*cmdlinecnt)--;
  2047. }
  2048. return(FINISHED);
  2049. }
  2050. /****************************** GET_MODE *********************************/
  2051. int get_mode_from_cmdline(char *str,dataptr dz)
  2052. {
  2053. if(sscanf(str,"%d",&dz->mode)!=1) {
  2054. sprintf(errstr,"Cannot read mode of program.\n");
  2055. return(USAGE_ONLY);
  2056. }
  2057. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  2058. sprintf(errstr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  2059. return(USAGE_ONLY);
  2060. }
  2061. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  2062. return(FINISHED);
  2063. }
  2064. /******************************************************************************/
  2065. /************************* FORMERLY IN usage.c ********************************/
  2066. /******************************************************************************/
  2067. /******************************** USAGE1 ********************************/
  2068. int usage(int argc,char *argv[])
  2069. {
  2070. switch(argc) {
  2071. case(1): return usage1();
  2072. case(2): return usage2(argv[1]);
  2073. case(3): return usage3(argv[1],argv[2]);
  2074. }
  2075. sprintf(errstr,"Incorrect call to usage()\n");
  2076. return(PROGRAM_ERROR);
  2077. }
  2078. /******************************** USAGE1 ********************************/
  2079. //TW NEW CODE BELOW
  2080. /******************************** GET_THE_VOWELS ********************************/
  2081. int get_the_vowels(char *filename,double **times,int **vowels,int *vcnt,dataptr dz)
  2082. {
  2083. FILE *fp;
  2084. double *t, lasttime = 0.0, endtime;
  2085. int *v, vv;
  2086. int only_one_vowel = 0, non_zero_start = 0;
  2087. int arraysize = BIGARRAY, n = 0;
  2088. char temp[200], *q, *p;
  2089. int istime;
  2090. if((vv = get_vowel(filename))>=0) {
  2091. if((*times = (double *)malloc(2 * sizeof(double)))==NULL) {
  2092. sprintf(errstr,"INSUFFICIENT MEMORY for time data.\n");
  2093. return(MEMORY_ERROR);
  2094. }
  2095. if((*vowels = (int *)malloc(2 * sizeof(int)))==NULL) {
  2096. sprintf(errstr,"INSUFFICIENT MEMORY for vowels data.\n");
  2097. return(MEMORY_ERROR);
  2098. }
  2099. (*times)[0] = 0.0;
  2100. (*times)[1] = 0.0;
  2101. (*vowels)[0] = vv;
  2102. (*vowels)[1] = vv;
  2103. return(FINISHED);
  2104. }
  2105. if((fp = fopen(filename,"r"))==NULL) {
  2106. sprintf(errstr, "Can't open textfile %s to read vowel data.\n",filename);
  2107. return(DATA_ERROR);
  2108. }
  2109. if((*times = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  2110. sprintf(errstr,"INSUFFICIENT MEMORY for time data.\n");
  2111. return(MEMORY_ERROR);
  2112. }
  2113. if((*vowels = (int *)malloc(arraysize * sizeof(int)))==NULL) {
  2114. sprintf(errstr,"INSUFFICIENT MEMORY for vowels data.\n");
  2115. return(MEMORY_ERROR);
  2116. }
  2117. t = *times;
  2118. v = *vowels;
  2119. istime = 1;
  2120. while(fgets(temp,200,fp)==temp) {
  2121. q = temp;
  2122. if(*q == ';') // Allow comments in file
  2123. continue;
  2124. while(get_word_from_string(&q,&p)) {
  2125. if(istime) {
  2126. if(sscanf(p,"%lf",t)!=1) {
  2127. sprintf(errstr,"No time for time-vowel pair %d\n",n+1);
  2128. return(DATA_ERROR);
  2129. }
  2130. if(n==0) {
  2131. if(*t < 0.0) {
  2132. sprintf(errstr,"First time is less than zero in vowel data\n");
  2133. return(DATA_ERROR);
  2134. } else if(*t > 0.0) {
  2135. print_outwarning_flush("FIRST TIME in vowel data IS NOT ZERO : assuming first vowel runs from time zero\n");
  2136. non_zero_start = 1;
  2137. t++;
  2138. *t = *(t-1);
  2139. *(t-1) = 0.0;
  2140. }
  2141. } else {
  2142. if (*t <= lasttime) {
  2143. sprintf(errstr,"Times do not advance (from %lf to %lf at pair %d) in vowel data\n",
  2144. lasttime,*t,n+1);
  2145. return(DATA_ERROR);
  2146. }
  2147. }
  2148. lasttime = *t++;
  2149. } else {
  2150. if((*v = get_vowel(p))<0) {
  2151. sprintf(errstr,"Unrecognised vowel string %s at pair %d in vowel datafile\n",p,n+1);
  2152. return(DATA_ERROR);
  2153. }
  2154. if((n==0) && non_zero_start) {
  2155. v++;
  2156. *v = *(v-1);
  2157. n++;
  2158. }
  2159. v++;
  2160. if(++n >= arraysize) {
  2161. arraysize += BIGARRAY;
  2162. if((*times = (double *)realloc((char *)(*times),arraysize * sizeof(double)))==NULL) {
  2163. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate table of vowel-times.\n");
  2164. return(MEMORY_ERROR);
  2165. }
  2166. if((*vowels = (int *)realloc((char *)(*vowels),arraysize * sizeof(int)))==NULL) {
  2167. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate table of vowels.\n");
  2168. return(MEMORY_ERROR);
  2169. }
  2170. t = *times + n;
  2171. v = *vowels + n;
  2172. }
  2173. }
  2174. istime = !istime;
  2175. }
  2176. }
  2177. if(n == 0) {
  2178. sprintf(errstr,"No data in vowel datafile %s\n",filename);
  2179. return(DATA_ERROR);
  2180. }
  2181. if(!istime) {
  2182. sprintf(errstr,"data in vowel datafile %s not paired correctly\n",filename);
  2183. return(DATA_ERROR);
  2184. }
  2185. endtime = (dz->wlength + 1) * dz->frametime;
  2186. if(n == 1) {
  2187. only_one_vowel = 1;
  2188. *t = endtime;
  2189. *v = *(v-1);
  2190. n = 2;
  2191. } else {
  2192. if(*(t-1) < endtime) { /* Force a time-value beyond end of infile */
  2193. *t = endtime;
  2194. *v = *(v-1);
  2195. n++;
  2196. }
  2197. }
  2198. if((*times = (double *)realloc((char *)(*times),n * sizeof(double)))==NULL) {
  2199. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate vowel-time table.\n");
  2200. return(MEMORY_ERROR);
  2201. }
  2202. if((*vowels = (int *)realloc((char *)(*vowels),n * sizeof(int)))==NULL) {
  2203. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate vowels table.\n");
  2204. return(MEMORY_ERROR);
  2205. }
  2206. if(fclose(fp)<0) {
  2207. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2208. fflush(stdout);
  2209. }
  2210. if(only_one_vowel)
  2211. *vcnt = 0;
  2212. else
  2213. *vcnt = n;
  2214. return(FINISHED);
  2215. }
  2216. /******************************** GET_VOWEL ********************************/
  2217. int get_vowel (char *str)
  2218. {
  2219. if (!strcmp(str,"ee")) return VOWEL_EE;
  2220. else if(!strcmp(str,"i")) return VOWEL_I;
  2221. else if(!strcmp(str,"ai")) return VOWEL_AI;
  2222. else if(!strcmp(str,"aii")) return VOWEL_AII;
  2223. else if(!strcmp(str,"e")) return VOWEL_E;
  2224. else if(!strcmp(str,"a")) return VOWEL_A;
  2225. else if(!strcmp(str,"ar")) return VOWEL_AR;
  2226. else if(!strcmp(str,"o")) return VOWEL_O;
  2227. else if(!strcmp(str,"oo")) return VOWEL_OO;
  2228. else if(!strcmp(str,"oa")) return VOWEL_OA;
  2229. else if(!strcmp(str,"or")) return VOWEL_OR;
  2230. else if(!strcmp(str,"u")) return VOWEL_U;
  2231. else if(!strcmp(str,"ui")) return VOWEL_UI;
  2232. else if(!strcmp(str,"uu")) return VOWEL_UU;
  2233. else if(!strcmp(str,"xx")) return VOWEL_XX;
  2234. else if(!strcmp(str,"x")) return VOWEL_X;
  2235. else if(!strcmp(str,"n")) return VOWEL_N;
  2236. else if(!strcmp(str,"m")) return VOWEL_M;
  2237. else if(!strcmp(str,"r")) return VOWEL_R;
  2238. else if(!strcmp(str,"th")) return VOWEL_TH;
  2239. return -1;
  2240. }
  2241. /************************** CLOSE_AND_DELETE_TEMPFILE ***************************
  2242. *
  2243. * The input file is a temporary file only: needs to be deleted
  2244. *
  2245. */
  2246. int close_and_delete_tempfile(char *newfilename,dataptr dz)
  2247. {
  2248. /*RWD Nov 2003: use sndunlink before calling this for soundfiles! */
  2249. if(sndunlink(dz->ifd[0])){
  2250. fprintf(stdout, "WARNING: Can't delete temporary file %s.\n",newfilename);
  2251. fflush(stdout);
  2252. }
  2253. if(sndcloseEx(dz->ifd[0]) < 0) {
  2254. fprintf(stdout, "WARNING: Can't close temporary file %s\n",newfilename);
  2255. fflush(stdout);
  2256. } else {
  2257. dz->ifd[0] = -1;
  2258. }
  2259. #ifdef NOTDEF
  2260. if(remove(newfilename) < 0) {
  2261. fprintf(stdout, "WARNING: Can't delete temporary file %s.\n",newfilename);
  2262. fflush(stdout);
  2263. }
  2264. #endif
  2265. return FINISHED;
  2266. }