synfilt.c 100 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495
  1. /*
  2. * Copyright (c) 1983-2023 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. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <pnames.h>
  26. #include <flags.h>
  27. #include <filetype.h>
  28. #include <processno.h>
  29. #include <modeno.h>
  30. #include <logic.h>
  31. #include <globcon.h>
  32. #include <cdpmain.h>
  33. #include <math.h>
  34. #include <osbind.h>
  35. #include <standalone.h>
  36. #include <science.h>
  37. #include <ctype.h>
  38. #include <sfsys.h>
  39. #include <string.h>
  40. #include <srates.h>
  41. #include <filtcon.h>
  42. #include <arrays.h>
  43. #include <string.h>
  44. #include <special.h>
  45. #include <memory.h>
  46. #ifndef cdp_round
  47. extern int cdp_round(double a);
  48. #endif
  49. #ifdef unix
  50. #define round(x) lround((x))
  51. #else
  52. #define round(x) cdp_round((x))
  53. #endif
  54. #define MINUS96DB (0.000016)
  55. #define SYNFLT_TAIL 1000
  56. #define SYNFDOVE 15 // Size of dovetails at start and end of noise source
  57. #define SYNFLEV 0.90 // Level limit for both synth and filter output
  58. #define outsams rampbrksize
  59. #define synfgain is_sharp
  60. #define synfdove is_flat
  61. #ifdef unix
  62. #define round(x) lround((x))
  63. #endif
  64. char errstr[2400];
  65. int anal_infiles = 1;
  66. int sloom = 0;
  67. int sloombatch = 0;
  68. const char* cdp_version = "8.0.0";
  69. //CDP LIB REPLACEMENTS
  70. static int check_synfilt_param_validity_and_consistency(double *flt_inv_sr,dataptr dz);
  71. static int setup_synfilt_application(dataptr dz);
  72. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  73. static int setup_synflt_param_ranges_and_defaults(dataptr dz);
  74. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  75. static int open_the_outfile(dataptr dz);
  76. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  77. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  78. static int establish_application(dataptr dz);
  79. static int initialise_vflags(dataptr dz);
  80. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  81. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  82. static int mark_parameter_types(dataptr dz,aplptr ap);
  83. static int assign_file_data_storage(int infilecnt,dataptr dz);
  84. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  85. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  86. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  87. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  88. static int synfilter_pconsistency(int flt_wordcnt,int flt_entrycnt,int *flt_cnt,int flt_timeslots,int *flt_frq_index,dataptr dz);
  89. static int force_start_and_end_val(dataptr dz);
  90. static void initialise_filter_table_read(int param,dataptr dz);
  91. static int allocate_tvarying_filter_arrays(int flt_timeslots,int *flt_cnt,int harmonics_cnt,dataptr dz);
  92. static int put_tvarying_filter_data_in_arrays(double *fbrk,int flt_worcdnt,int flt_entrycnt,int flt_cnt,int flt_timeslots,dataptr dz);
  93. static int initialise_fltbankv_internal_params(int fltcnt,int *flt_frq_index,dataptr dz);
  94. static int synfilter_preprocess(int flt_cnt,double flt_inv_sr,dataptr dz);
  95. static int allocate_filter_internalparam_arrays(int fltcnt,dataptr dz);
  96. static int initialise_filter_params(int flt_cnt,double flt_inv_sr,dataptr dz);
  97. static int getmaxlinelen(int *maxcnt,FILE *fp);
  98. static int check_seq_and_range_of_filter_data(double *fbrk,int flt_entrycnt,int total_wordcnt,double *endtime,dataptr dz);
  99. static void get_syncoeffs1(int n,double flt_inv_sr,dataptr dz);
  100. static void get_syncoeffs2(int n,dataptr dz);
  101. static int read_the_special_data(char *str,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz);
  102. static int get_data_from_tvary_infile(char *filename,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz);
  103. static int get_data_from_fsyn_infile(char *filename,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz);
  104. static int getmaxlinelen(int *maxcnt,FILE *fp);
  105. static int check_filter_data(int flt_entrycnt,int *flt_wordcnt,int *flt_timeslots,dataptr dz);
  106. static int allocate_filter_frq_amp_arrays(int fltcnt,dataptr dz);
  107. static int filter_process(double flt_inv_sr,int flt_cnt,int flt_timeslots,dataptr dz);
  108. static void filtering(int n,int chans,float *buf,double *a,double *b,double *y,double *z,double *d,double *e,double *ampl,int flt_cnt,int *flt_ovflw,
  109. int running,dataptr dz);
  110. static double check_float_limits(double sum, int *flt_ovflw,dataptr dz);
  111. static int newq(double *flt_q_incr, int *flt_sams, dataptr dz);
  112. static int newfval(int *fsams,int flt_cnt,int flt_timeslots,int *flt_frq_index,int *flt_times_cnt,dataptr dz);
  113. static int do_fvary_filters(double flt_inv_sr,int flt_cnt,int *flt_times_cnt,int *flt_sams,double *flt_q_incr,int *flt_blokcnt,
  114. int *flt_ovflw,int flt_timeslots,int *flt_frq_index,int running,dataptr dz);
  115. static void gen_noise(float *buf,dataptr dz);
  116. /**************************************** MAIN *********************************************/
  117. int main(int argc,char *argv[])
  118. {
  119. int exit_status;
  120. dataptr dz = NULL;
  121. char **cmdline, sfnam[400];
  122. int cmdlinecnt;
  123. int n;
  124. // aplptr ap;
  125. int is_launched = FALSE;
  126. double flt_inv_sr;
  127. int flt_cnt=0, flt_timeslots=0, flt_wordcnt=0, flt_entrycnt = 0, flt_frq_index = 0;
  128. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  129. fprintf(stdout,"%s\n",cdp_version);
  130. fflush(stdout);
  131. return 0;
  132. }
  133. /* CHECK FOR SOUNDLOOM */
  134. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  135. sloom = 0;
  136. sloombatch = 1;
  137. }
  138. if(sflinit("cdp")){
  139. sfperror("cdp: initialisation\n");
  140. return(FAILED);
  141. }
  142. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  143. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  144. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  145. return(FAILED);
  146. }
  147. if(!sloom) {
  148. if(argc == 1) {
  149. usage1();
  150. return(FAILED);
  151. } else if(argc == 2) {
  152. usage2(argv[1]);
  153. return(FAILED);
  154. }
  155. }
  156. if(!sloom) {
  157. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  158. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  159. return(FAILED);
  160. }
  161. cmdline = argv;
  162. cmdlinecnt = argc;
  163. if((get_the_process_no(argv[0],dz))<0)
  164. return(FAILED);
  165. cmdline++;
  166. cmdlinecnt--;
  167. dz->maxmode = 2;
  168. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  169. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  170. return(exit_status);
  171. }
  172. cmdline++;
  173. cmdlinecnt--;
  174. // setup_particular_application =
  175. if((exit_status = setup_synfilt_application(dz))<0) {
  176. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(FAILED);
  178. }
  179. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  180. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  181. return(FAILED);
  182. }
  183. } else {
  184. //parse_TK_data() =
  185. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  186. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  187. return(exit_status);
  188. }
  189. }
  190. // ap = dz->application;
  191. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0) {
  192. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  193. return(FAILED);
  194. }
  195. // parse_infile_and_hone_type()
  196. // setup_param_ranges_and_defaults() =
  197. if((exit_status = setup_synflt_param_ranges_and_defaults(dz))<0) {
  198. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  199. return(FAILED);
  200. }
  201. // open_first_infile() : redundant
  202. // handle_extra_infiles() : redundant
  203. // handle_outfile() =
  204. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  205. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  206. return(FAILED);
  207. }
  208. // handle_formants() redundant
  209. // handle_formant_quiksearch() redundant
  210. // handle_special_data() = copy name of special-data file here
  211. strcpy(sfnam,cmdline[0]);
  212. cmdlinecnt--;
  213. cmdline++;
  214. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  215. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  216. return(FAILED);
  217. }
  218. // check_param_validity_and_consistency....
  219. if((exit_status = check_synfilt_param_validity_and_consistency(&flt_inv_sr,dz))<0) {
  220. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  221. return(FAILED);
  222. }
  223. // srate and chans obtained from params
  224. if((exit_status = open_the_outfile(dz))<0) {
  225. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  226. return(FAILED);
  227. }
  228. // Can only run these once srate and chans set
  229. if((exit_status = read_the_special_data(sfnam,&flt_wordcnt,&flt_entrycnt,&flt_cnt,&flt_timeslots,dz))<0) {
  230. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  231. return(exit_status);
  232. }
  233. if((exit_status = check_filter_data(flt_entrycnt,&flt_wordcnt,&flt_timeslots,dz))<0) {
  234. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  235. return(exit_status);
  236. }
  237. if((exit_status = synfilter_pconsistency(flt_wordcnt,flt_entrycnt,&flt_cnt,flt_timeslots,&flt_frq_index,dz))<0) {
  238. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  239. return(exit_status);
  240. }
  241. is_launched = TRUE;
  242. dz->bufcnt = 1;
  243. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  244. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  245. return(MEMORY_ERROR);
  246. }
  247. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  248. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  249. return(MEMORY_ERROR);
  250. }
  251. for(n = 0;n <dz->bufcnt; n++)
  252. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  253. dz->sampbuf[n] = (float *)0;
  254. if((exit_status = create_sndbufs(dz))<0) { // CDP LIB
  255. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  256. return(FAILED);
  257. }
  258. //param_preprocess() =
  259. if((exit_status = synfilter_preprocess(flt_cnt,flt_inv_sr,dz))<0) {
  260. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  261. return(FAILED);
  262. }
  263. if((exit_status = filter_process(flt_inv_sr,flt_cnt,flt_timeslots,dz)) < 0) {
  264. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  265. return(FAILED);
  266. }
  267. if((exit_status = complete_output(dz))<0) { // CDP LIB
  268. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  269. return(FAILED);
  270. }
  271. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  272. free(dz);
  273. return(SUCCEEDED);
  274. }
  275. /**********************************************
  276. REPLACED CDP LIB FUNCTIONS
  277. **********************************************/
  278. /****************************** SET_PARAM_DATA *********************************/
  279. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  280. {
  281. ap->special_data = (char)special_data;
  282. ap->param_cnt = (char)paramcnt;
  283. ap->max_param_cnt = (char)maxparamcnt;
  284. if(ap->max_param_cnt>0) {
  285. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  286. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  287. return(MEMORY_ERROR);
  288. }
  289. strcpy(ap->param_list,paramlist);
  290. }
  291. return(FINISHED);
  292. }
  293. /****************************** SET_VFLGS *********************************/
  294. int set_vflgs
  295. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  296. {
  297. ap->option_cnt = (char) optcnt; /*RWD added cast */
  298. if(optcnt) {
  299. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  300. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  301. return(MEMORY_ERROR);
  302. }
  303. strcpy(ap->option_list,optlist);
  304. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  305. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  306. return(MEMORY_ERROR);
  307. }
  308. strcpy(ap->option_flags,optflags);
  309. }
  310. ap->vflag_cnt = (char) vflagcnt;
  311. ap->variant_param_cnt = (char) vparamcnt;
  312. if(vflagcnt) {
  313. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  314. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  315. return(MEMORY_ERROR);
  316. }
  317. strcpy(ap->variant_list,varlist);
  318. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  319. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  320. return(MEMORY_ERROR);
  321. }
  322. strcpy(ap->variant_flags,varflags);
  323. }
  324. return(FINISHED);
  325. }
  326. /***************************** APPLICATION_INIT **************************/
  327. int application_init(dataptr dz)
  328. {
  329. int exit_status;
  330. int storage_cnt;
  331. int tipc, brkcnt;
  332. aplptr ap = dz->application;
  333. if(ap->vflag_cnt>0)
  334. initialise_vflags(dz);
  335. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  336. ap->total_input_param_cnt = (char)tipc;
  337. if(tipc>0) {
  338. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  339. return(exit_status);
  340. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  341. return(exit_status);
  342. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  343. return(exit_status);
  344. }
  345. brkcnt = tipc;
  346. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  347. if(brkcnt>0) {
  348. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  349. return(exit_status);
  350. }
  351. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  352. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  353. return(exit_status);
  354. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  355. return(exit_status);
  356. }
  357. if((exit_status = mark_parameter_types(dz,ap))<0)
  358. return(exit_status);
  359. // establish_infile_constants() replaced by
  360. dz->infilecnt = 1;
  361. //establish_bufptrs_and_extra_buffers():
  362. return(FINISHED);
  363. }
  364. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  365. /* RWD mallo changed to calloc; helps debug verison run as release! */
  366. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  367. {
  368. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  369. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  370. return(MEMORY_ERROR);
  371. }
  372. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  373. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  374. return(MEMORY_ERROR);
  375. }
  376. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  377. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  378. return(MEMORY_ERROR);
  379. }
  380. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  381. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  382. return(MEMORY_ERROR);
  383. }
  384. return(FINISHED);
  385. }
  386. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  387. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  388. {
  389. int n;
  390. for(n=0;n<storage_cnt;n++) {
  391. dz->is_int[n] = (char)0;
  392. dz->no_brk[n] = (char)0;
  393. }
  394. return(FINISHED);
  395. }
  396. /***************************** MARK_PARAMETER_TYPES **************************/
  397. int mark_parameter_types(dataptr dz,aplptr ap)
  398. {
  399. int n, m; /* PARAMS */
  400. for(n=0;n<ap->max_param_cnt;n++) {
  401. switch(ap->param_list[n]) {
  402. case('0'): break; /* dz->is_active[n] = 0 is default */
  403. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  404. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  405. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  406. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  407. default:
  408. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  409. return(PROGRAM_ERROR);
  410. }
  411. } /* OPTIONS */
  412. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  413. switch(ap->option_list[n]) {
  414. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  415. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  416. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  417. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  418. default:
  419. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  420. return(PROGRAM_ERROR);
  421. }
  422. } /* VARIANTS */
  423. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  424. switch(ap->variant_list[n]) {
  425. case('0'): break;
  426. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  427. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  428. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  429. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  430. default:
  431. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  432. return(PROGRAM_ERROR);
  433. }
  434. } /* INTERNAL */
  435. for(n=0,
  436. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  437. switch(ap->internal_param_list[n]) {
  438. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  439. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  440. case('d'): dz->no_brk[m] = (char)1; break;
  441. default:
  442. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  443. return(PROGRAM_ERROR);
  444. }
  445. }
  446. return(FINISHED);
  447. }
  448. /************************ HANDLE_THE_OUTFILE *********************/
  449. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  450. {
  451. char *filename = (*cmdline)[0];
  452. if(filename[0]=='-' && filename[1]=='f') {
  453. dz->floatsam_output = 1;
  454. dz->true_outfile_stype = SAMP_FLOAT;
  455. filename+= 2;
  456. }
  457. if(!sloom) {
  458. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  459. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  460. return(DATA_ERROR);
  461. }
  462. }
  463. strcpy(dz->outfilename,filename);
  464. (*cmdline)++;
  465. (*cmdlinecnt)--;
  466. return(FINISHED);
  467. }
  468. /************************ OPEN_THE_OUTFILE *********************/
  469. int open_the_outfile(dataptr dz)
  470. {
  471. int exit_status;
  472. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  473. return(exit_status);
  474. return(FINISHED);
  475. }
  476. /***************************** ESTABLISH_APPLICATION **************************/
  477. int establish_application(dataptr dz)
  478. {
  479. aplptr ap;
  480. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  481. sprintf(errstr,"establish_application()\n");
  482. return(MEMORY_ERROR);
  483. }
  484. ap = dz->application;
  485. memset((char *)ap,0,sizeof(struct applic));
  486. return(FINISHED);
  487. }
  488. /************************* INITIALISE_VFLAGS *************************/
  489. int initialise_vflags(dataptr dz)
  490. {
  491. int n;
  492. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  493. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  494. return(MEMORY_ERROR);
  495. }
  496. for(n=0;n<dz->application->vflag_cnt;n++)
  497. dz->vflag[n] = FALSE;
  498. return FINISHED;
  499. }
  500. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  501. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  502. {
  503. int n;
  504. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  505. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  506. return(MEMORY_ERROR);
  507. }
  508. for(n=0;n<tipc;n++)
  509. ap->default_val[n] = 0.0;
  510. return(FINISHED);
  511. }
  512. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  513. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  514. {
  515. int n;
  516. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  517. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  518. return(MEMORY_ERROR);
  519. }
  520. for(n=0;n<tipc;n++)
  521. dz->is_active[n] = (char)0;
  522. return(FINISHED);
  523. }
  524. /************************* SETUP_SYNFILT_APPLICATION *******************/
  525. int setup_synfilt_application(dataptr dz)
  526. {
  527. int exit_status;
  528. aplptr ap;
  529. if((exit_status = establish_application(dz))<0) // GLOBAL
  530. return(FAILED);
  531. ap = dz->application;
  532. // SEE parstruct FOR EXPLANATION of next 2 functions
  533. if(dz->mode== 0)
  534. exit_status = set_param_data(ap,SYN_FILTERBANK,6,6,"iiDidi");
  535. else
  536. exit_status = set_param_data(ap,TIMEVARYING_FILTERBANK,6,6,"iiDidi");
  537. if(exit_status < 0)
  538. return(FAILED);
  539. if((exit_status = set_vflgs(ap,"",0,"","do",2,0,"00"))<0)
  540. return(FAILED);
  541. // set_legal_infile_structure -->
  542. dz->has_otherfile = FALSE;
  543. // assign_process_logic -->
  544. dz->input_data_type = NO_FILE_AT_ALL;
  545. dz->process_type = UNEQUAL_SNDFILE;
  546. dz->outfiletype = SNDFILE_OUT;
  547. return application_init(dz); //GLOBAL
  548. }
  549. /************************* SETUP_SYNFLT_PARAM_RANGES_AND_DEFAULTS *******************/
  550. int setup_synflt_param_ranges_and_defaults(dataptr dz)
  551. {
  552. int exit_status;
  553. aplptr ap = dz->application;
  554. // set_param_ranges()
  555. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  556. // NB total_input_param_cnt is > 0 !!!
  557. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  558. return(FAILED);
  559. // get_param_ranges()
  560. ap->lo[SYNFLT_SRATE] = 44100.0;
  561. ap->hi[SYNFLT_SRATE] = 96000.0;
  562. ap->default_val[SYNFLT_SRATE] = 44100.0;
  563. ap->lo[SYNFLT_CHANS] = 1;
  564. ap->hi[SYNFLT_CHANS] = 2;
  565. ap->default_val[SYNFLT_CHANS] = 1;
  566. ap->lo[SYNFLT_Q] = MINQ;
  567. ap->hi[SYNFLT_Q] = MAXQ;
  568. ap->default_val[SYNFLT_Q] = FLT_DEFAULT_Q;
  569. ap->lo[SYNFLT_HARMCNT] = 1.0;
  570. ap->hi[SYNFLT_HARMCNT] = FLT_MAXHARMS;
  571. ap->default_val[SYNFLT_HARMCNT] = FLT_DEFAULT_HCNT;
  572. ap->lo[SYNFLT_ROLLOFF] = MIN_DB_ON_16_BIT;
  573. ap->hi[SYNFLT_ROLLOFF] = 0.0;
  574. ap->default_val[SYNFLT_ROLLOFF] = FLT_DEFAULT_ROLLOFF;
  575. ap->lo[SYNFLT_SEED] = 0;
  576. ap->hi[SYNFLT_SEED] = 32767;
  577. ap->default_val[SYNFLT_SEED] = 0;
  578. dz->maxmode = 2;
  579. if(!sloom)
  580. put_default_vals_in_all_params(dz);
  581. return(FINISHED);
  582. }
  583. /********************************* PARSE_SLOOM_DATA *********************************/
  584. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  585. {
  586. int exit_status;
  587. int cnt = 1, infilecnt;
  588. int filesize, insams, inbrksize;
  589. double dummy;
  590. int true_cnt = 0;
  591. // aplptr ap;
  592. while(cnt<=PRE_CMDLINE_DATACNT) {
  593. if(cnt > argc) {
  594. sprintf(errstr,"Insufficient data sent from TK\n");
  595. return(DATA_ERROR);
  596. }
  597. switch(cnt) {
  598. case(1):
  599. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  600. sprintf(errstr,"Cannot read process no. sent from TK\n");
  601. return(DATA_ERROR);
  602. }
  603. break;
  604. case(2):
  605. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  606. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  607. return(DATA_ERROR);
  608. }
  609. if(dz->mode > 0)
  610. dz->mode--;
  611. //setup_particular_application() =
  612. if((exit_status = setup_synfilt_application(dz))<0)
  613. return(exit_status);
  614. // ap = dz->application;
  615. break;
  616. case(3):
  617. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  618. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  619. return(DATA_ERROR);
  620. }
  621. if(infilecnt < 1) {
  622. true_cnt = cnt + 1;
  623. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  624. }
  625. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  626. return(exit_status);
  627. break;
  628. case(INPUT_FILETYPE+4):
  629. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  630. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  631. return(DATA_ERROR);
  632. }
  633. break;
  634. case(INPUT_FILESIZE+4):
  635. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  636. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  637. return(DATA_ERROR);
  638. }
  639. dz->insams[0] = filesize;
  640. break;
  641. case(INPUT_INSAMS+4):
  642. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  643. sprintf(errstr,"Cannot read insams sent from TK\n");
  644. return(DATA_ERROR);
  645. }
  646. dz->insams[0] = insams;
  647. break;
  648. case(INPUT_SRATE+4):
  649. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  650. sprintf(errstr,"Cannot read srate sent from TK\n");
  651. return(DATA_ERROR);
  652. }
  653. break;
  654. case(INPUT_CHANNELS+4):
  655. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  656. sprintf(errstr,"Cannot read channels sent from TK\n");
  657. return(DATA_ERROR);
  658. }
  659. break;
  660. case(INPUT_STYPE+4):
  661. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  662. sprintf(errstr,"Cannot read stype sent from TK\n");
  663. return(DATA_ERROR);
  664. }
  665. break;
  666. case(INPUT_ORIGSTYPE+4):
  667. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  668. sprintf(errstr,"Cannot read origstype sent from TK\n");
  669. return(DATA_ERROR);
  670. }
  671. break;
  672. case(INPUT_ORIGRATE+4):
  673. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  674. sprintf(errstr,"Cannot read origrate sent from TK\n");
  675. return(DATA_ERROR);
  676. }
  677. break;
  678. case(INPUT_MLEN+4):
  679. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  680. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  681. return(DATA_ERROR);
  682. }
  683. break;
  684. case(INPUT_DFAC+4):
  685. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  686. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  687. return(DATA_ERROR);
  688. }
  689. break;
  690. case(INPUT_ORIGCHANS+4):
  691. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  692. sprintf(errstr,"Cannot read origchans sent from TK\n");
  693. return(DATA_ERROR);
  694. }
  695. break;
  696. case(INPUT_SPECENVCNT+4):
  697. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  698. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  699. return(DATA_ERROR);
  700. }
  701. dz->specenvcnt = dz->infile->specenvcnt;
  702. break;
  703. case(INPUT_WANTED+4):
  704. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  705. sprintf(errstr,"Cannot read wanted sent from TK\n");
  706. return(DATA_ERROR);
  707. }
  708. break;
  709. case(INPUT_WLENGTH+4):
  710. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  711. sprintf(errstr,"Cannot read wlength sent from TK\n");
  712. return(DATA_ERROR);
  713. }
  714. break;
  715. case(INPUT_OUT_CHANS+4):
  716. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  717. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  718. return(DATA_ERROR);
  719. }
  720. break;
  721. /* RWD these chanegs to samps - tk will have to deal with that! */
  722. case(INPUT_DESCRIPTOR_BYTES+4):
  723. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  724. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  725. return(DATA_ERROR);
  726. }
  727. break;
  728. case(INPUT_IS_TRANSPOS+4):
  729. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  730. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  731. return(DATA_ERROR);
  732. }
  733. break;
  734. case(INPUT_COULD_BE_TRANSPOS+4):
  735. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  736. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  737. return(DATA_ERROR);
  738. }
  739. break;
  740. case(INPUT_COULD_BE_PITCH+4):
  741. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  742. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  743. return(DATA_ERROR);
  744. }
  745. break;
  746. case(INPUT_DIFFERENT_SRATES+4):
  747. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  748. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  749. return(DATA_ERROR);
  750. }
  751. break;
  752. case(INPUT_DUPLICATE_SNDS+4):
  753. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  754. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  755. return(DATA_ERROR);
  756. }
  757. break;
  758. case(INPUT_BRKSIZE+4):
  759. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  760. sprintf(errstr,"Cannot read brksize sent from TK\n");
  761. return(DATA_ERROR);
  762. }
  763. if(inbrksize > 0) {
  764. switch(dz->input_data_type) {
  765. case(WORDLIST_ONLY):
  766. break;
  767. case(PITCH_AND_PITCH):
  768. case(PITCH_AND_TRANSPOS):
  769. case(TRANSPOS_AND_TRANSPOS):
  770. dz->tempsize = inbrksize;
  771. break;
  772. case(BRKFILES_ONLY):
  773. case(UNRANGED_BRKFILE_ONLY):
  774. case(DB_BRKFILES_ONLY):
  775. case(ALL_FILES):
  776. case(ANY_NUMBER_OF_ANY_FILES):
  777. if(dz->extrabrkno < 0) {
  778. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  779. return(DATA_ERROR);
  780. }
  781. if(dz->brksize == NULL) {
  782. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  783. return(PROGRAM_ERROR);
  784. }
  785. dz->brksize[dz->extrabrkno] = inbrksize;
  786. break;
  787. default:
  788. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  789. dz->input_data_type);
  790. return(PROGRAM_ERROR);
  791. }
  792. break;
  793. }
  794. break;
  795. case(INPUT_NUMSIZE+4):
  796. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  797. sprintf(errstr,"Cannot read numsize sent from TK\n");
  798. return(DATA_ERROR);
  799. }
  800. break;
  801. case(INPUT_LINECNT+4):
  802. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  803. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  804. return(DATA_ERROR);
  805. }
  806. break;
  807. case(INPUT_ALL_WORDS+4):
  808. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  809. sprintf(errstr,"Cannot read all_words sent from TK\n");
  810. return(DATA_ERROR);
  811. }
  812. break;
  813. case(INPUT_ARATE+4):
  814. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  815. sprintf(errstr,"Cannot read arate sent from TK\n");
  816. return(DATA_ERROR);
  817. }
  818. break;
  819. case(INPUT_FRAMETIME+4):
  820. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  821. sprintf(errstr,"Cannot read frametime sent from TK\n");
  822. return(DATA_ERROR);
  823. }
  824. dz->frametime = (float)dummy;
  825. break;
  826. case(INPUT_WINDOW_SIZE+4):
  827. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  828. sprintf(errstr,"Cannot read window_size sent from TK\n");
  829. return(DATA_ERROR);
  830. }
  831. break;
  832. case(INPUT_NYQUIST+4):
  833. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  834. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  835. return(DATA_ERROR);
  836. }
  837. break;
  838. case(INPUT_DURATION+4):
  839. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  840. sprintf(errstr,"Cannot read duration sent from TK\n");
  841. return(DATA_ERROR);
  842. }
  843. break;
  844. case(INPUT_MINBRK+4):
  845. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  846. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  847. return(DATA_ERROR);
  848. }
  849. break;
  850. case(INPUT_MAXBRK+4):
  851. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  852. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  853. return(DATA_ERROR);
  854. }
  855. break;
  856. case(INPUT_MINNUM+4):
  857. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  858. sprintf(errstr,"Cannot read minnum sent from TK\n");
  859. return(DATA_ERROR);
  860. }
  861. break;
  862. case(INPUT_MAXNUM+4):
  863. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  864. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  865. return(DATA_ERROR);
  866. }
  867. break;
  868. default:
  869. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  870. return(PROGRAM_ERROR);
  871. }
  872. cnt++;
  873. }
  874. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  875. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  876. return(DATA_ERROR);
  877. }
  878. if(true_cnt)
  879. cnt = true_cnt;
  880. *cmdlinecnt = 0;
  881. while(cnt < argc) {
  882. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  883. return(exit_status);
  884. cnt++;
  885. }
  886. return(FINISHED);
  887. }
  888. /********************************* GET_TK_CMDLINE_WORD *********************************/
  889. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  890. {
  891. if(*cmdlinecnt==0) {
  892. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  893. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  894. return(MEMORY_ERROR);
  895. }
  896. } else {
  897. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  898. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  899. return(MEMORY_ERROR);
  900. }
  901. }
  902. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  903. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  904. return(MEMORY_ERROR);
  905. }
  906. strcpy((*cmdline)[*cmdlinecnt],q);
  907. (*cmdlinecnt)++;
  908. return(FINISHED);
  909. }
  910. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  911. int assign_file_data_storage(int infilecnt,dataptr dz)
  912. {
  913. int exit_status;
  914. int no_sndfile_system_files = FALSE;
  915. dz->infilecnt = infilecnt;
  916. if((exit_status = allocate_filespace(dz))<0)
  917. return(exit_status);
  918. if(no_sndfile_system_files)
  919. dz->infilecnt = 0;
  920. return(FINISHED);
  921. }
  922. /****************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS *********************************/
  923. int setup_internal_arrays_and_array_pointers(dataptr dz)
  924. {
  925. int n;
  926. dz->array_cnt = 19;
  927. dz->larray_cnt = 1;
  928. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  929. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  930. return(MEMORY_ERROR);
  931. }
  932. for(n=0;n<dz->array_cnt;n++)
  933. dz->parray[n] = NULL;
  934. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  935. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  936. return(MEMORY_ERROR);
  937. }
  938. for(n=0;n<dz->larray_cnt;n++)
  939. dz->lparray[n] = NULL;
  940. return(FINISHED);
  941. }
  942. /************************* redundant functions: to ensure libs compile OK *******************/
  943. int assign_process_logic(dataptr dz)
  944. {
  945. return(FINISHED);
  946. }
  947. void set_legal_infile_structure(dataptr dz)
  948. {}
  949. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  950. {
  951. return(FINISHED);
  952. }
  953. int establish_bufptrs_and_extra_buffers(dataptr dz)
  954. {
  955. return(FINISHED);
  956. }
  957. int read_special_data(char *str,dataptr dz)
  958. {
  959. return(FINISHED);
  960. }
  961. int inner_loop
  962. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  963. {
  964. return(FINISHED);
  965. }
  966. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  967. {
  968. return(FINISHED);
  969. }
  970. /******************************** USAGE1 ********************************/
  971. int usage1(void)
  972. {
  973. usage2("synfilt");
  974. return(USAGE_ONLY);
  975. }
  976. /**************************** CHECK_SYNFILT_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  977. int check_synfilt_param_validity_and_consistency(double *flt_inv_sr,dataptr dz)
  978. {
  979. dz->param[SYNFLT_ROLLOFF] = dbtogain(dz->param[SYNFLT_ROLLOFF]);
  980. if(BAD_SR(dz->iparam[SYNFLT_SRATE])) {
  981. sprintf(errstr,"Invalid sample rate.\n");
  982. return(DATA_ERROR);
  983. }
  984. dz->infile->srate = dz->iparam[SYNFLT_SRATE];
  985. dz->infile->channels = dz->iparam[SYNFLT_CHANS];
  986. *flt_inv_sr = 1.0/(double)dz->infile->srate;
  987. return FINISHED;
  988. }
  989. /********************************************************************************************/
  990. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  991. {
  992. if(!strcmp(prog_identifier_from_cmdline,"synfilt")) dz->process = SYNFILT;
  993. else {
  994. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  995. return(USAGE_ONLY);
  996. }
  997. return(FINISHED);
  998. }
  999. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1000. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1001. {
  1002. int n;
  1003. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1004. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1005. return(MEMORY_ERROR);
  1006. }
  1007. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1008. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1009. return(MEMORY_ERROR);
  1010. }
  1011. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1012. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1013. return(MEMORY_ERROR);
  1014. }
  1015. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1016. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1017. return(MEMORY_ERROR);
  1018. }
  1019. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1020. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1021. return(MEMORY_ERROR);
  1022. }
  1023. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1024. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1025. return(MEMORY_ERROR);
  1026. }
  1027. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1028. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1029. return(MEMORY_ERROR);
  1030. }
  1031. for(n=0;n<brkcnt;n++) {
  1032. dz->brk[n] = NULL;
  1033. dz->brkptr[n] = NULL;
  1034. dz->brkinit[n] = 0;
  1035. dz->brksize[n] = 0;
  1036. }
  1037. return(FINISHED);
  1038. }
  1039. /******************************** USAGE2 ********************************/
  1040. int usage2(char *str)
  1041. {
  1042. if(!strcmp(str,"synfilt")) {
  1043. fprintf(stderr,
  1044. "NOISE FILTERED BY TIME_VARYING FILTERBANK,WITH TIME-VARIABLE Q\n\n"
  1045. "USAGE: synfilt synfilt\n"
  1046. "mode outfile data dur srate chans Q gain hcnt rolloff seed [-d] [-o] [-n]\n\n"
  1047. "\n"
  1048. "MODES ARE...\n"
  1049. "1) Single (varying) pitch : Enter filter-pitch as time MIDI-value pairs.\n"
  1050. "2) Simultaneous pitches : Enter filter-pitches as varibank style datafile.\n\n"
  1051. " Datafile has lines of data for filter bands at successive times.\n"
  1052. " Each line contains the following items\n"
  1053. " Time: MIDIPitch1 Amp1 [MIDIPitch2 Amp2 etc....].\n"
  1054. " Pitch and Amp values must be paired:\n"
  1055. " any number of pairs can be used in a line,\n"
  1056. " BUT each line must have SAME number of pairs on it.\n"
  1057. " (To eliminate a band in any line(s), set its amplitude to 0.0).\n"
  1058. " Time values (in secs) must be in ascending order (and >=0.0)\n"
  1059. " and the MAXIMUM TIME must be greater than 0.03 secs (30mS).\n"
  1060. " Amp values may be numeric, or dB values (e.g. -4.1dB).\n"
  1061. " Comment-lines may be used: start these with ';'.\n\n"
  1062. " Im both modes, duration of output set by last entry in datafile.\n\n"
  1063. "Q Q (tightness) of filter : Range(%lf to %.1lf).\n"
  1064. "SRATE Sample rate of output file.\n"
  1065. "CHANS Output mono (1) or stereo (2).\n"
  1066. "HCNT No of harmonics of each pitch to use: Default 1.\n"
  1067. " High harmonics of high pitches may be beyond nyquist.\n"
  1068. " (No-of-pitches times no-of-harmonics determines program speed).\n"
  1069. "ROLLOFF Level drop (in dB) from one harmonic to next. Range(0 to %.1lf)\n"
  1070. "SEED Initialises random-noise generation.\n"
  1071. "-d double filtering.\n"
  1072. "-o Drop out if filter overflows.\n", MINQ, MAXQ,MIN_DB_ON_16_BIT); //RWD added args
  1073. } else
  1074. fprintf(stdout,"Unknown option '%s'\n",str);
  1075. return(USAGE_ONLY);
  1076. }
  1077. int usage3(char *str1,char *str2)
  1078. {
  1079. fprintf(stderr,"Insufficient parameters on command line.\n");
  1080. return(USAGE_ONLY);
  1081. }
  1082. /****************************** GET_MODE *********************************/
  1083. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1084. {
  1085. char temp[200], *p;
  1086. if(sscanf(str,"%s",temp)!=1) {
  1087. sprintf(errstr,"Cannot read mode of program.\n");
  1088. return(USAGE_ONLY);
  1089. }
  1090. p = temp + strlen(temp) - 1;
  1091. while(p >= temp) {
  1092. if(!isdigit(*p)) {
  1093. fprintf(stderr,"Invalid mode of program entered.\n");
  1094. return(USAGE_ONLY);
  1095. }
  1096. p--;
  1097. }
  1098. if(sscanf(str,"%d",&dz->mode)!=1) {
  1099. fprintf(stderr,"Cannot read mode of program.\n");
  1100. return(USAGE_ONLY);
  1101. }
  1102. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1103. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1104. return(USAGE_ONLY);
  1105. }
  1106. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1107. return(FINISHED);
  1108. }
  1109. /************************************* SYNFILTER_PCONSISTENCY *********************************/
  1110. int synfilter_pconsistency(int flt_wordcnt,int flt_entrycnt,int *flt_cnt,int flt_timeslots,int *flt_frq_index,dataptr dz)
  1111. {
  1112. int exit_status;
  1113. initrand48();
  1114. /* preset internal counters, or defaulted variables */
  1115. if(dz->brksize[SYNFLT_Q]) {
  1116. if((exit_status = force_start_and_end_val(dz))<0)
  1117. return(exit_status);
  1118. initialise_filter_table_read(SYNFLT_Q,dz);
  1119. }
  1120. dz->param[SYNFLT_ROLLOFF] = dbtogain(dz->param[SYNFLT_ROLLOFF]);
  1121. if((exit_status = allocate_tvarying_filter_arrays(flt_timeslots,flt_cnt,dz->iparam[SYNFLT_HARMCNT],dz))<0)
  1122. return(exit_status);
  1123. if((exit_status = put_tvarying_filter_data_in_arrays(dz->parray[FLT_FBRK],flt_wordcnt,flt_entrycnt,*flt_cnt,flt_timeslots,dz))<0)
  1124. return(exit_status);
  1125. if((exit_status = initialise_fltbankv_internal_params(*flt_cnt,flt_frq_index,dz))<0)
  1126. return(exit_status);
  1127. return(FINISHED);
  1128. }
  1129. /*************************************** FORCE_START_AND_END_VAL **************************************/
  1130. int force_start_and_end_val(dataptr dz)
  1131. {
  1132. double lasttime, filedur, firsttime, *p;
  1133. int k, n;
  1134. firsttime = *(dz->brk[SYNFLT_Q]);
  1135. if(firsttime < 0.0) {
  1136. sprintf(errstr,"First time in Q file is -ve: Can't proceed\n");
  1137. return(DATA_ERROR);
  1138. }
  1139. if(flteq(firsttime,0.0))
  1140. *(dz->brk[SYNFLT_Q]) = 0.0;
  1141. else { /* FORCE VALUE AT TIME 0 */
  1142. dz->brksize[SYNFLT_Q]++;
  1143. if((dz->brk[SYNFLT_Q] = (double *)realloc(dz->brk[SYNFLT_Q],dz->brksize[SYNFLT_Q] * 2 * sizeof(double)))==NULL) {
  1144. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate filter Q array.\n");
  1145. return(MEMORY_ERROR);
  1146. }
  1147. k = dz->brksize[SYNFLT_Q] * 2;
  1148. for(n=k-1;n>=2;n--)
  1149. dz->brk[SYNFLT_Q][n] = dz->brk[SYNFLT_Q][n-2];
  1150. dz->brk[SYNFLT_Q][0] = 0.0;
  1151. dz->brk[SYNFLT_Q][1] = dz->brk[SYNFLT_Q][3];
  1152. }
  1153. lasttime = *(dz->brk[SYNFLT_Q] + ((dz->brksize[SYNFLT_Q]-1) * 2));
  1154. filedur = (double)(dz->outsams/dz->infile->channels)/(double)dz->infile->srate;
  1155. if(lasttime >= filedur + SYNFLT_TAIL)
  1156. return(FINISHED); /* FORCE Q VALUE AT (BEYOND) END OF FILE */
  1157. dz->brksize[SYNFLT_Q]++;
  1158. if((dz->brk[SYNFLT_Q] = (double *)realloc(dz->brk[SYNFLT_Q],dz->brksize[SYNFLT_Q] * 2 * sizeof(double)))==NULL) {
  1159. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate filter array.\n");
  1160. return(MEMORY_ERROR);
  1161. }
  1162. p = (dz->brk[SYNFLT_Q] + ((dz->brksize[SYNFLT_Q]-1) * 2));
  1163. *p++ = filedur + SYNFLT_TAIL + 1.0;
  1164. *p = *(p-2);
  1165. return(FINISHED);
  1166. }
  1167. /************************************* INITIALISE_FILTER_TABLE_READ *********************************/
  1168. void initialise_filter_table_read(int param,dataptr dz)
  1169. {
  1170. dz->lastind[param] = (double)round((*dz->brk[param]) * dz->infile->srate);
  1171. dz->lastval[param] = *(dz->brk[param]+1);
  1172. dz->brkptr[param] = dz->brk[param] + 2;
  1173. }
  1174. /**************************** ALLOCATE_TVARYING_FILTER_ARRAYS *******************************/
  1175. int allocate_tvarying_filter_arrays(int flt_timeslots,int *flt_cnt,int harmonics_cnt,dataptr dz)
  1176. {
  1177. (*flt_cnt) *= harmonics_cnt;
  1178. if((dz->lparray[FLT_SAMPTIME] = (int *)calloc(flt_timeslots * sizeof(int),sizeof(char)))==NULL
  1179. || (dz->parray[FLT_INFRQ] = (double *)calloc((*flt_cnt) * flt_timeslots * sizeof(double),sizeof(char)))==NULL
  1180. || (dz->parray[FLT_INAMP] = (double *)calloc((*flt_cnt) * flt_timeslots * sizeof(double),sizeof(char)))==NULL
  1181. || (dz->parray[FLT_FINCR] = (double *)calloc((*flt_cnt) * sizeof(double),sizeof(char)))==NULL
  1182. || (dz->parray[FLT_AINCR] = (double *)calloc((*flt_cnt) * sizeof(double),sizeof(char)))==NULL
  1183. || (dz->parray[FLT_LASTFVAL] = (double *)calloc((*flt_cnt) * sizeof(double),sizeof(char)))==NULL
  1184. || (dz->parray[FLT_LASTAVAL] = (double *)calloc((*flt_cnt) * sizeof(double),sizeof(char)))==NULL) {
  1185. sprintf(errstr,"INSUFFICIENT MEMORY for filter coefficients.\n");
  1186. return(MEMORY_ERROR);
  1187. }
  1188. return(FINISHED);
  1189. }
  1190. /**************************** PUT_TVARYING_FILTER_DATA_IN_ARRAYS *******************************/
  1191. int put_tvarying_filter_data_in_arrays(double *fbrk,int flt_wordcnt,int flt_entrycnt,int flt_cnt,int flt_timeslots,dataptr dz)
  1192. {
  1193. int timescnt = 0, freqcnt = 0, ampcnt = 0, n, m;
  1194. double atten;
  1195. int total_frq_cnt = flt_cnt * flt_timeslots;
  1196. int j;
  1197. int srate = dz->infile->srate;
  1198. if(dz->parray[FLT_INFRQ]==NULL) {
  1199. sprintf(errstr,"FLT_INFRQ array not established: put_tvarying_filter_data_in_arrays()\n");
  1200. return(PROGRAM_ERROR);
  1201. }
  1202. if(dz->parray[FLT_INAMP]==NULL) {
  1203. sprintf(errstr,"FLT_INAMP array not established: put_tvarying_filter_data_in_arrays()\n");
  1204. return(PROGRAM_ERROR);
  1205. }
  1206. if(dz->lparray[FLT_SAMPTIME]==NULL) {
  1207. sprintf(errstr,"FLT_SAMPTIME array not established: put_tvarying_filter_data_in_arrays()\n");
  1208. return(PROGRAM_ERROR);
  1209. }
  1210. for(n=0;n<flt_wordcnt;n++) {
  1211. m = n%flt_entrycnt;
  1212. if(m==0) {
  1213. if(timescnt >= flt_timeslots) {
  1214. sprintf(errstr,"Error 0 in filter counting: put_tvarying_filter_data_in_arrays()\n");
  1215. return(PROGRAM_ERROR);
  1216. }
  1217. dz->lparray[FLT_SAMPTIME][timescnt++] = round(fbrk[n] * dz->infile->srate);
  1218. } else if(ODD(m)) {
  1219. for(j=1;j<=dz->iparam[SYNFLT_HARMCNT];j++) {
  1220. if(freqcnt >= total_frq_cnt) {
  1221. sprintf(errstr,"Error 1 in filter counting: put_tvarying_filter_data_in_arrays()\n");
  1222. return(PROGRAM_ERROR);
  1223. }
  1224. if((dz->parray[FLT_INFRQ][freqcnt] = fbrk[n] * (double)j) > FLT_MAXFRQ) {
  1225. sprintf(errstr,"Filter Harmonic %d of %.1lfHz = %.1lfHz beyond filter limit %.1lf.\n",
  1226. j,fbrk[n],dz->parray[FLT_INFRQ][freqcnt],FLT_MAXFRQ);
  1227. return(DATA_ERROR);
  1228. }
  1229. freqcnt++;
  1230. }
  1231. } else {
  1232. atten = 1.0;
  1233. for(j=1;j<=dz->iparam[SYNFLT_HARMCNT];j++) {
  1234. if(ampcnt >= total_frq_cnt) {
  1235. sprintf(errstr,"Error 2 in filter counting: put_tvarying_filter_data_in_arrays()\n");
  1236. return(PROGRAM_ERROR);
  1237. }
  1238. dz->parray[FLT_INAMP][ampcnt] = fbrk[n] * atten;
  1239. ampcnt++;
  1240. atten *= dz->param[SYNFLT_ROLLOFF];
  1241. }
  1242. }
  1243. }
  1244. if(freqcnt != total_frq_cnt || ampcnt != freqcnt || timescnt != flt_timeslots) {
  1245. sprintf(errstr,"Filter data accounting problem: read_time_varying_filter_data()\n");
  1246. return(PROGRAM_ERROR);
  1247. }
  1248. return(FINISHED);
  1249. }
  1250. /**************************** INITALISE_FLTBANKV_INTERNAL_PARAMS **********************/
  1251. int initialise_fltbankv_internal_params(int flt_cnt,int *flt_frq_index,dataptr dz)
  1252. {
  1253. int exit_status;
  1254. int n;
  1255. if((exit_status = allocate_filter_frq_amp_arrays(flt_cnt,dz))<0)
  1256. return(exit_status);
  1257. for(n = 0;n<flt_cnt;n++) {
  1258. dz->parray[FLT_FRQ][n] = dz->parray[FLT_INFRQ][n];
  1259. dz->parray[FLT_AMP][n] = dz->parray[FLT_INAMP][n];
  1260. dz->parray[FLT_LASTFVAL][n] = dz->parray[FLT_FRQ][n];
  1261. dz->parray[FLT_LASTAVAL][n] = dz->parray[FLT_AMP][n];
  1262. }
  1263. *flt_frq_index = flt_cnt;
  1264. dz->iparam[FLT_TIMES_CNT] = 1;
  1265. return(FINISHED);
  1266. }
  1267. /****************************** FILTER_PROCESS *************************/
  1268. int filter_process(double flt_inv_sr,int flt_cnt,int flt_timeslots,dataptr dz)
  1269. {
  1270. int exit_status = FINISHED;
  1271. int flt_frq_index = flt_cnt, flt_times_cnt = 1, flt_blokcnt = 0, flt_sams = 0, flt_ovflw = 0, startup;
  1272. double flt_q_incr = 0.0, srate = (double)dz->infile->srate;
  1273. int tail_extend = 0, /* was_tail_extend = 0, bufspace,*/ extraspace = 0;
  1274. int chans = dz->infile->channels, sndendset = 0, /*gotend = 0,*/ tail_done = 0;
  1275. double inmaxsamp = 0.0, outmaxsamp = 0.0, maxsamp = 0.0;
  1276. double tailmaxsamp = 0.0, tailfade = 1.0, tailincr = 1.0;
  1277. int tailmaxpos = 0;
  1278. float *buf = dz->sampbuf[0];
  1279. int n, m, k, sndend = 0;
  1280. int framend, framestart, framesize = F_SECSIZE, framecnt = dz->buflen/framesize;
  1281. int synfsplic, downsplicestart, gap_from_end;
  1282. double splincr, splice;
  1283. synfsplic = (int)round(SYNFDOVE * MS_TO_SECS * srate);
  1284. downsplicestart = dz->outsams - (synfsplic * chans);
  1285. splincr = 1.0/(double)synfsplic;
  1286. splice = 0.0;
  1287. dz->synfgain = 1.0; // Initialise filter process gain
  1288. dz->scalefact = 1.0; // Initial noise gain set to 1.0
  1289. dz->tempsize = dz->outsams; // Temporarily set param for write_display
  1290. dz->process = GREV;
  1291. display_virtual_time(0,dz);
  1292. dz->process = SYNFILT;
  1293. // GENERATE THE NOISE SOURCE TO CHECK ITS LEVEL
  1294. fprintf(stdout,"INFO: Assessing synth source level.\n");
  1295. fflush(stdout);
  1296. srand((int)dz->iparam[SYNFLT_SEED]);
  1297. while(dz->samps_left > 0) {
  1298. gen_noise(buf,dz);
  1299. for(n = 0;n < dz->ssampsread;n++)
  1300. inmaxsamp = max(inmaxsamp,fabs(buf[n]));
  1301. dz->total_samps_written = dz->outsams - dz->samps_left;
  1302. dz->process = GREV;
  1303. display_virtual_time(dz->total_samps_written,dz);
  1304. dz->process = SYNFILT;
  1305. }
  1306. if(inmaxsamp <= 0.0) {
  1307. sprintf(errstr,"No level found in input signal\n");
  1308. return DATA_ERROR;
  1309. }
  1310. if(inmaxsamp > SYNFLEV)
  1311. dz->scalefact = SYNFLEV/inmaxsamp; // Reduce synthesis gain
  1312. // RUN FILTER TO ASSESS LEVEL OF OUTPUT, AND HENCE SET AN APPROPRIATE GAIN
  1313. dz->total_samps_written = 0; // Reset output counters
  1314. dz->samps_left = dz->outsams;
  1315. dz->total_samps_read = 0;
  1316. if((exit_status = newfval(&(dz->iparam[FLT_FSAMS]),flt_cnt,flt_timeslots,&flt_frq_index,&flt_times_cnt,dz))<0)
  1317. return(exit_status);
  1318. dz->process = GREV;
  1319. display_virtual_time(0,dz);
  1320. dz->process = SYNFILT;
  1321. fprintf(stdout,"INFO: Assessing output level.\n");
  1322. fflush(stdout);
  1323. srand((int)dz->iparam[SYNFLT_SEED]); // Reset random generator
  1324. startup = 1;
  1325. while(dz->samps_left > 0) {
  1326. memset((char *)dz->sampbuf[0],0,(size_t) (dz->buflen * sizeof(float)));
  1327. if(tail_extend)
  1328. dz->ssampsread = 0;
  1329. else {
  1330. gen_noise(buf,dz);
  1331. if(startup) { // Fade-up splice at start of synth material
  1332. for(n = 0;n < synfsplic*chans; n+=chans) {
  1333. for(m = 0; m < chans; m++)
  1334. buf[n+m] = (float)(buf[n+m] * splice);
  1335. splice += splincr;
  1336. }
  1337. startup = 0; // Fade-down splice at end of synth material
  1338. } else if((gap_from_end = dz->total_samps_read - downsplicestart) >= 0) {
  1339. n = (dz->total_samps_read % dz->buflen) - gap_from_end;
  1340. splice = 1.0;
  1341. k = 0;
  1342. while(n < 0) {
  1343. splice -= splincr;
  1344. n += chans;
  1345. k++;
  1346. }
  1347. while(k < synfsplic) {
  1348. for(m=0;m<chans;m++)
  1349. buf[n+m] = (float)(buf[n+m] * splice);
  1350. splice -= splincr;
  1351. k++;
  1352. if((n += chans) >= dz->buflen)
  1353. break;
  1354. }
  1355. }
  1356. if(dz->samps_left <= 0) {
  1357. // was_tail_extend = 1;
  1358. tail_extend = 1;
  1359. }
  1360. }
  1361. if(tail_extend) {
  1362. // bufspace = dz->buflen;
  1363. dz->ssampsread = dz->buflen;
  1364. extraspace += dz->buflen; // Extra space needed for progress-bar display
  1365. }
  1366. if((exit_status = do_fvary_filters(flt_inv_sr,flt_cnt,&flt_times_cnt,&flt_sams,&flt_q_incr,&flt_blokcnt,&flt_ovflw,flt_timeslots,&flt_frq_index,0,dz)) <0)
  1367. return(exit_status);
  1368. if(tail_extend) {
  1369. sndend = dz->buflen;
  1370. framend = dz->buflen;
  1371. for(k = framecnt; k > 0; k--) { // Search backwards thro buffer, frame by frame
  1372. framestart = framend - framesize;
  1373. maxsamp = 0.0;
  1374. for(n = framend-chans;n >= framestart;n-=chans) {
  1375. for(m=0;m<chans;m++) { // Search backwards thro frame, samp-grup by samp-group
  1376. if(fabs(buf[n+m]) > maxsamp) {
  1377. if(!sndendset) { // If samples cease to be zero
  1378. sndend = n + chans; // Mark start of end-zeros in buffer
  1379. sndendset = 1; // and flag that snd end has been found
  1380. }
  1381. maxsamp = fabs(buf[n+m]);
  1382. }
  1383. }
  1384. if(maxsamp < MINUS96DB) { // If max level in frame falls below -96dB
  1385. if(sndendset) { // If we found a place in buffer after which samples were all zero
  1386. dz->ssampsread = sndend; // Mark this as end of output, and quit the main filtering loop
  1387. tail_extend = 0; // by setting tail_extend to zero
  1388. dz->samps_left = 0; // SAFETY
  1389. break;
  1390. } else // If we didn't find place ....
  1391. sndend = framestart; // Then all samples in the frame are zero.
  1392. } // So move snd end to start of current frame.
  1393. } // .. and search backwards thro previous frame
  1394. if(tail_extend == 0) {
  1395. extraspace -= dz->buflen - sndend; // Reduce extra space needed for progress-bar display
  1396. break;
  1397. }
  1398. framend = framestart;
  1399. }
  1400. }
  1401. if(tail_extend)
  1402. tail_extend++;
  1403. if(dz->ssampsread > 0) {
  1404. for(n = 0;n < dz->ssampsread;n++)
  1405. outmaxsamp = max(outmaxsamp,(double)fabs(buf[n]));
  1406. dz->process = GREV;
  1407. dz->total_samps_written = dz->outsams - dz->samps_left;
  1408. display_virtual_time(dz->total_samps_written,dz);
  1409. dz->process = SYNFILT;
  1410. }
  1411. }
  1412. if(outmaxsamp <= 0.0) {
  1413. sprintf(errstr,"No level found in output signal.\n");
  1414. return DATA_ERROR;
  1415. }
  1416. dz->synfgain = (inmaxsamp/outmaxsamp) * SYNFLEV; /* Normalise */
  1417. if(dz->synfgain <= dbtogain(-90.0)) {
  1418. sprintf(errstr,"FILTER BLEW UP: REDUCE NUMBER OF HARMONICS, OR INCREASE Q\n");
  1419. return GOAL_FAILED;
  1420. }
  1421. // IF FILTER-PROCESS AMPLIFIES INPUT, PRE-CHECK ANY POSSIBLE RUNAWAY LOUDNESS IN TAIL.
  1422. if(outmaxsamp < inmaxsamp) {
  1423. dz->total_samps_written = 0; // Reset output counters
  1424. dz->samps_left = dz->outsams;
  1425. dz->total_samps_read = 0;
  1426. for(n = 0;n<flt_cnt;n++) {
  1427. dz->parray[FLT_FRQ][n] = dz->parray[FLT_INFRQ][n];
  1428. dz->parray[FLT_AMP][n] = dz->parray[FLT_INAMP][n];
  1429. dz->parray[FLT_LASTFVAL][n] = dz->parray[FLT_FRQ][n];
  1430. dz->parray[FLT_LASTAVAL][n] = dz->parray[FLT_AMP][n];
  1431. }
  1432. flt_frq_index = flt_cnt;
  1433. flt_times_cnt = 1;
  1434. sndendset = 0;
  1435. sndend = 0;
  1436. tail_extend = 0;
  1437. // was_tail_extend = 0;
  1438. // gotend = 0;
  1439. if((exit_status = newfval(&(dz->iparam[FLT_FSAMS]),flt_cnt,flt_timeslots,&flt_frq_index,&flt_times_cnt,dz))<0)
  1440. return(exit_status);
  1441. dz->process = GREV;
  1442. display_virtual_time(0,dz);
  1443. dz->process = SYNFILT;
  1444. fprintf(stdout,"INFO: Reassessing output level, as process will amplify signal.\n");
  1445. fflush(stdout);
  1446. srand((int)dz->iparam[SYNFLT_SEED]); // Reset random generator
  1447. startup = 1;
  1448. while(dz->samps_left > 0 || tail_extend) {
  1449. memset((char *)dz->sampbuf[0],0,(size_t) (dz->buflen * sizeof(float)));
  1450. if(tail_extend)
  1451. dz->ssampsread = 0;
  1452. else {
  1453. gen_noise(buf,dz);
  1454. if(startup) { // Fade-up splice at start of synth material
  1455. for(n = 0;n < synfsplic*chans; n+=chans) {
  1456. for(m = 0; m < chans; m++)
  1457. buf[n+m] = (float)(buf[n+m] * splice);
  1458. splice += splincr;
  1459. }
  1460. startup = 0; // Fade-down splice at end of synth material
  1461. } else if((gap_from_end = dz->total_samps_read - downsplicestart) >= 0) {
  1462. n = (dz->total_samps_read % dz->buflen) - gap_from_end;
  1463. splice = 1.0;
  1464. k = 0;
  1465. while(n < 0) {
  1466. splice -= splincr;
  1467. n += chans;
  1468. k++;
  1469. }
  1470. while(k < synfsplic) {
  1471. for(m=0;m<chans;m++)
  1472. buf[n+m] = (float)(buf[n+m] * splice);
  1473. splice -= splincr;
  1474. k++;
  1475. if((n += chans) >= dz->buflen)
  1476. break;
  1477. }
  1478. }
  1479. if(dz->samps_left <= 0) {
  1480. // was_tail_extend = 1;
  1481. tail_extend = 1;
  1482. }
  1483. }
  1484. if(tail_extend) {
  1485. // bufspace = dz->buflen;
  1486. dz->ssampsread = dz->buflen;
  1487. }
  1488. if((exit_status = do_fvary_filters(flt_inv_sr,flt_cnt,&flt_times_cnt,&flt_sams,&flt_q_incr,&flt_blokcnt,&flt_ovflw,flt_timeslots,&flt_frq_index,0,dz)) <0)
  1489. return(exit_status);
  1490. if(tail_extend) {
  1491. for(n = 0;n < dz->buflen;n++) {
  1492. if(fabs(buf[n]) > tailmaxsamp) {
  1493. tailmaxsamp = fabs(buf[n]);
  1494. tailmaxpos = n + ((tail_extend - 1) * dz->buflen);
  1495. }
  1496. }
  1497. sndend = dz->buflen;
  1498. framend = dz->buflen;
  1499. for(k = framecnt; k > 0; k--) { // Search backwards thro buffer, frame by frame
  1500. framestart = framend - framesize;
  1501. maxsamp = 0.0;
  1502. for(n = framend-chans;n >= framestart;n-=chans) {
  1503. for(m=0;m<chans;m++) { // Search backwards thro frame, samp-grup by samp-group
  1504. if(fabs(buf[n+m]) > maxsamp) {
  1505. if(!sndendset) { // If samples cease to be zero
  1506. sndend = n + chans; // Mark start of end-zeros in buffer
  1507. sndendset = 1; // and flag that snd end has been found
  1508. }
  1509. maxsamp = fabs(buf[n+m]);
  1510. }
  1511. }
  1512. if(maxsamp < MINUS96DB) { // If max level in frame falls below -96dB
  1513. if(sndendset) { // If we found a place in buffer after which samples were all zero
  1514. dz->ssampsread = sndend; // Mark this as end of output, and quit the main filtering loop
  1515. tail_extend = 0; // by setting tail_extend to zero
  1516. dz->samps_left = 0; // SAFETY
  1517. break;
  1518. } else // If we didn't find place ....
  1519. sndend = framestart; // Then all samples in the frame are zero.
  1520. } // So move snd end to start of current frame.
  1521. } // .. and search backwards thro previous frame
  1522. if(tail_extend == 0) {
  1523. tail_done = 1;
  1524. break;
  1525. }
  1526. framend = framestart;
  1527. }
  1528. }
  1529. if(tail_extend)
  1530. tail_extend++;
  1531. if(dz->ssampsread > 0) {
  1532. if(!tail_extend && !tail_done) {
  1533. for(n = 0;n < dz->ssampsread;n++) {
  1534. outmaxsamp = max(outmaxsamp,(double)fabs(buf[n]));
  1535. tailmaxsamp = outmaxsamp;
  1536. }
  1537. }
  1538. dz->process = GREV;
  1539. dz->total_samps_written = dz->outsams - dz->samps_left;
  1540. display_virtual_time(dz->total_samps_written,dz);
  1541. dz->process = SYNFILT;
  1542. }
  1543. }
  1544. if(tailmaxsamp > outmaxsamp) // If filter tail grows loud, set up a fader process
  1545. tailincr = pow(outmaxsamp/tailmaxsamp,(double)(1.0/tailmaxpos));
  1546. fprintf(stdout,"WARNING: * !$$~* EXPLODING TAIL !$$~* \n"); //RWD Xcode/clang doesn't like £ character
  1547. fflush(stdout);
  1548. }
  1549. // RUN THE FILTER
  1550. dz->total_samps_written = 0; // Reset output counters
  1551. dz->samps_left = dz->outsams;
  1552. dz->total_samps_read = 0;
  1553. for(n = 0;n<flt_cnt;n++) {
  1554. dz->parray[FLT_FRQ][n] = dz->parray[FLT_INFRQ][n];
  1555. dz->parray[FLT_AMP][n] = dz->parray[FLT_INAMP][n];
  1556. dz->parray[FLT_LASTFVAL][n] = dz->parray[FLT_FRQ][n];
  1557. dz->parray[FLT_LASTAVAL][n] = dz->parray[FLT_AMP][n];
  1558. }
  1559. dz->tempsize = dz->outsams + extraspace; // Reset param for write_display
  1560. flt_frq_index = flt_cnt;
  1561. flt_times_cnt = 1;
  1562. sndendset = 0;
  1563. sndend = 0;
  1564. tail_extend = 0;
  1565. // was_tail_extend = 0;
  1566. // gotend = 0;
  1567. dz->process = GREV;
  1568. display_virtual_time(0,dz);
  1569. dz->process = SYNFILT;
  1570. fprintf(stdout,"INFO: Running filter.\n");
  1571. fflush(stdout);
  1572. if((exit_status = newfval(&(dz->iparam[FLT_FSAMS]),flt_cnt,flt_timeslots,&flt_frq_index,&flt_times_cnt,dz))<0)
  1573. return(exit_status);
  1574. srand((int)dz->iparam[SYNFLT_SEED]); // Reset random generator
  1575. startup = 1;
  1576. while(dz->samps_left > 0 || tail_extend) {
  1577. memset((char *)buf,0,(size_t) (dz->buflen * sizeof(float)));
  1578. if(tail_extend)
  1579. dz->ssampsread = 0;
  1580. else {
  1581. gen_noise(buf,dz);
  1582. if(startup) { // Fade-up splice at start of synth material
  1583. for(n = 0;n < synfsplic*chans; n+=chans) {
  1584. for(m = 0; m < chans; m++)
  1585. buf[n+m] = (float)(buf[n+m] * splice);
  1586. splice += splincr;
  1587. }
  1588. startup = 0; // Fade-down splice at end of synth material
  1589. } else if((gap_from_end = dz->total_samps_read - downsplicestart) >= 0) {
  1590. n = (dz->total_samps_read % dz->buflen) - gap_from_end;
  1591. splice = 1.0;
  1592. k = 0;
  1593. while(n < 0) {
  1594. splice -= splincr;
  1595. n += chans;
  1596. k++;
  1597. }
  1598. while(k < synfsplic) {
  1599. for(m=0;m<chans;m++)
  1600. buf[n+m] = (float)(buf[n+m] * splice);
  1601. splice -= splincr;
  1602. k++;
  1603. if((n += chans) >= dz->buflen)
  1604. break;
  1605. }
  1606. }
  1607. if(dz->samps_left <= 0) {
  1608. // was_tail_extend = 1;
  1609. tail_extend = 1;
  1610. fprintf(stdout,"INFO: Writing Filter tail.\n");
  1611. fflush(stdout);
  1612. }
  1613. }
  1614. if(tail_extend) {
  1615. // bufspace = dz->buflen;
  1616. dz->ssampsread = dz->buflen;
  1617. }
  1618. if((exit_status = do_fvary_filters(flt_inv_sr,flt_cnt,&flt_times_cnt,&flt_sams,&flt_q_incr,&flt_blokcnt,&flt_ovflw,flt_timeslots,&flt_frq_index,1,dz))<0)
  1619. return(exit_status);
  1620. if(tail_extend) {
  1621. if(tailincr != 1.0) { // If tail is to nbe daded
  1622. for(n=0;n<dz->buflen;n++) { // Envelope it here
  1623. buf[n] = (float)(buf[n] * tailfade);
  1624. tailfade *= tailincr;
  1625. }
  1626. }
  1627. sndend = dz->buflen;
  1628. framend = dz->buflen;
  1629. for(k = framecnt; k > 0; k--) { // Search backwards thro buffer, frame by frame
  1630. framestart = framend - framesize;
  1631. maxsamp = 0.0;
  1632. for(n = framend-chans;n >= framestart;n-=chans) {
  1633. for(m=0;m<chans;m++) { // Search backwards thro frame, samp-grup by samp-group
  1634. if(fabs(buf[n+m]) > maxsamp) {
  1635. if(!sndendset) { // If samples cease to be zero
  1636. sndend = n + chans; // Mark start of end-zeros in buffer
  1637. sndendset = 1; // and flag that snd end has been found
  1638. }
  1639. maxsamp = fabs(buf[n+m]);
  1640. }
  1641. }
  1642. if(maxsamp < MINUS96DB) { // If max level in frame falls below -96dB
  1643. if(sndendset) { // If we found a place in buffer after which samples were all zero
  1644. dz->ssampsread = sndend; // Mark this as end of output, and quit the main filtering loop
  1645. tail_extend = 0; // by setting tail_extend to zero
  1646. dz->samps_left = 0; // SAFETY
  1647. break;
  1648. } else // If we didn't find place ....
  1649. sndend = framestart; // Then all samples in the frame are zero.
  1650. } // So move snd end to start of current frame.
  1651. } // .. and search backwards thro previous frame
  1652. if(tail_extend == 0) {
  1653. break;
  1654. }
  1655. framend = framestart;
  1656. }
  1657. if((maxsamp < MINUS96DB) && !sndendset) { // Entire buffer is "zero"
  1658. tail_extend = 0; // Force exit by seting tail_extend to zero
  1659. dz->samps_left = 0; // SAFETY // DO NOT set samps_read to 0, as there may be input samples still to write
  1660. }
  1661. }
  1662. if(tail_extend)
  1663. tail_extend++;
  1664. if(dz->ssampsread > 0) {
  1665. dz->process = GREV; // Forces correct progress-bar write
  1666. if((exit_status = write_samps(dz->sampbuf[0],dz->ssampsread,dz))<0)
  1667. return(exit_status);
  1668. dz->process = SYNFILT;
  1669. }
  1670. }
  1671. if(flt_ovflw > 0) {
  1672. fprintf(stdout,"INFO: Number of overflows: %d\n",flt_ovflw);
  1673. fflush(stdout);
  1674. }
  1675. return(FINISHED);
  1676. }
  1677. /*************************** DO_FVARY_FILTERS *****************************/
  1678. int do_fvary_filters
  1679. (double flt_inv_sr,int flt_cnt,int *flt_times_cnt,int *flt_sams,double *flt_q_incr,int *flt_blokcnt,int *flt_ovflw,
  1680. int flt_timeslots,int *flt_frq_index,int running,dataptr dz)
  1681. {
  1682. int exit_status;
  1683. int n, m, fno, chans = dz->infile->channels;
  1684. float *buf = dz->sampbuf[0];
  1685. double *fincr = dz->parray[FLT_FINCR];
  1686. double *aincr = dz->parray[FLT_AINCR];
  1687. double *ampl = dz->parray[FLT_AMPL];
  1688. double *a = dz->parray[FLT_A];
  1689. double *b = dz->parray[FLT_B];
  1690. double *y = dz->parray[FLT_Y];
  1691. double *z = dz->parray[FLT_Z];
  1692. double *d = dz->parray[FLT_D];
  1693. double *e = dz->parray[FLT_E];
  1694. int fsams = dz->iparam[FLT_FSAMS];
  1695. if (dz->vflag[DROP_OUT_AT_OVFLOW]) {
  1696. for (n = 0; n < dz->ssampsread; n += chans) {
  1697. if(fsams <= 0) {
  1698. if((exit_status = newfval(&fsams,flt_cnt,flt_timeslots,flt_frq_index,flt_times_cnt,dz))<0)
  1699. return(exit_status);
  1700. }
  1701. if(dz->brksize[SYNFLT_Q]) {
  1702. if((*flt_sams -= chans) <= 0) {
  1703. if(!newq(flt_q_incr,flt_sams,dz)) {
  1704. sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
  1705. return(PROGRAM_ERROR);
  1706. }
  1707. *flt_sams *= chans;
  1708. }
  1709. }
  1710. if((*flt_blokcnt -= chans) <= 0) {
  1711. for (fno = 0; fno < flt_cnt; fno++) {
  1712. get_syncoeffs1(fno,flt_inv_sr,dz);
  1713. get_syncoeffs2(fno,dz);
  1714. }
  1715. if(dz->brksize[SYNFLT_Q])
  1716. dz->param[SYNFLT_Q] *= *flt_q_incr;
  1717. for(m=0;m<flt_cnt;m++) {
  1718. dz->parray[FLT_FRQ][m] *= fincr[m];
  1719. dz->parray[FLT_AMP][m] *= aincr[m];
  1720. }
  1721. *flt_blokcnt = BSIZE * chans;
  1722. }
  1723. filtering(n,chans,buf,a,b,y,z,d,e,ampl,flt_cnt,flt_ovflw,running,dz);
  1724. if(*flt_ovflw > 0) {
  1725. sprintf(errstr,"Filter overflowed\n");
  1726. return(GOAL_FAILED);
  1727. }
  1728. fsams--;
  1729. }
  1730. } else {
  1731. for (n = 0; n < dz->ssampsread; n += chans) {
  1732. if(fsams <= 0) {
  1733. if((exit_status = newfval(&fsams,flt_cnt,flt_timeslots,flt_frq_index,flt_times_cnt,dz))<0)
  1734. return(exit_status);
  1735. }
  1736. if(dz->brksize[SYNFLT_Q]) {
  1737. if((*flt_sams -= chans) <= 0) {
  1738. if(!newq(flt_q_incr,flt_sams,dz)) {
  1739. sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
  1740. return(PROGRAM_ERROR);
  1741. }
  1742. *flt_sams *= chans;
  1743. }
  1744. }
  1745. if((*flt_blokcnt -= chans) <= 0) {
  1746. for (fno = 0; fno < flt_cnt; fno++) {
  1747. get_syncoeffs1(fno,flt_inv_sr,dz);
  1748. get_syncoeffs2(fno,dz);
  1749. }
  1750. if(dz->brksize[SYNFLT_Q])
  1751. dz->param[SYNFLT_Q] *= *flt_q_incr;
  1752. for(m=0;m<flt_cnt;m++) {
  1753. dz->parray[FLT_FRQ][m] *= fincr[m];
  1754. dz->parray[FLT_AMP][m] *= aincr[m];
  1755. }
  1756. *flt_blokcnt = BSIZE * chans;
  1757. }
  1758. filtering(n,chans,buf,a,b,y,z,d,e,ampl,flt_cnt,flt_ovflw,running,dz);
  1759. fsams--;
  1760. }
  1761. }
  1762. dz->iparam[FLT_FSAMS] = fsams;
  1763. return(CONTINUE);
  1764. }
  1765. /******************************* NEWQ ***************************
  1766. *
  1767. * VAL is the base value from which we calculate.
  1768. * VALINCR is the value increment per block of samples.
  1769. * SAMPCNT is the number of samples from 1 brkpnt val to next.
  1770. */
  1771. int newq(double *flt_q_incr, int *flt_sams, dataptr dz)
  1772. {
  1773. double *p;
  1774. double ratio, one_over_steps;
  1775. double thistime;
  1776. double thisval;
  1777. p = dz->brkptr[SYNFLT_Q];
  1778. if(p - dz->brk[SYNFLT_Q] >= dz->brksize[SYNFLT_Q] * 2)
  1779. return(FALSE);
  1780. thistime = (double)round((*p++) * dz->infile->srate);
  1781. thisval = *p++;
  1782. *flt_sams = round(thistime - dz->lastind[SYNFLT_Q]);
  1783. /* steps = no_of_samples/sampsize_of_blok: therefore.. */
  1784. one_over_steps = (double)BSIZE/(double)(*flt_sams);
  1785. ratio = (thisval/dz->lastval[SYNFLT_Q]);
  1786. *flt_q_incr = pow(ratio,(one_over_steps));
  1787. dz->param[SYNFLT_Q] = dz->lastval[SYNFLT_Q];
  1788. dz->lastval[SYNFLT_Q] = thisval;
  1789. dz->lastind[SYNFLT_Q] = thistime;
  1790. dz->brkptr[SYNFLT_Q] = p;
  1791. return(TRUE);
  1792. }
  1793. /******************************* NEWFVAL ***************************
  1794. *
  1795. * VAL is the base value from which we calculate.
  1796. * VALINCR is the value increment per block of samples.
  1797. * FSAMS is the number of samples (per channel) from 1 brkpnt val to next.
  1798. * brk is the particular table we're accessing.
  1799. */
  1800. int newfval(int *fsams,int flt_cnt,int flt_timeslots,int *flt_frq_index,int *flt_times_cnt,dataptr dz)
  1801. {
  1802. int thistime, lasttime;
  1803. double rratio, one_over_steps;
  1804. int n,m,k;
  1805. double thisval;
  1806. double *lastfval = dz->parray[FLT_LASTFVAL];
  1807. double *lastaval = dz->parray[FLT_LASTAVAL];
  1808. double *aincr = dz->parray[FLT_AINCR];
  1809. double *fincr = dz->parray[FLT_FINCR];
  1810. int total_frqcnt = flt_cnt * flt_timeslots;
  1811. if(*flt_times_cnt>flt_timeslots) {
  1812. sprintf(errstr,"Ran off end of filter data: newfval()\n");
  1813. return(PROGRAM_ERROR);
  1814. }
  1815. k = *flt_times_cnt;
  1816. lasttime = dz->lparray[FLT_SAMPTIME][k-1];
  1817. thistime = dz->lparray[FLT_SAMPTIME][k];
  1818. *fsams = thistime - lasttime;
  1819. /* steps = fsams/BSIZE: therefore ... */
  1820. one_over_steps = (double)BSIZE/(double)(*fsams);
  1821. if(*flt_frq_index >= total_frqcnt)
  1822. return(FINISHED);
  1823. for(n=0, m= *flt_frq_index;n<flt_cnt;n++,m++) {
  1824. /* FREQUENCY */
  1825. thisval = dz->parray[FLT_INFRQ][m];
  1826. if(flteq(lastfval[n],thisval))
  1827. fincr[n] = 1.0;
  1828. else {
  1829. rratio = (thisval/lastfval[n]);
  1830. fincr[n] = pow(rratio,one_over_steps);
  1831. }
  1832. dz->parray[FLT_FRQ][n] = lastfval[n];
  1833. lastfval[n] = thisval;
  1834. /* AMPLITUDE */
  1835. thisval = dz->parray[FLT_INAMP][m];
  1836. if(flteq(thisval,lastaval[n]))
  1837. aincr[n] = 1.0;
  1838. else {
  1839. rratio = (thisval/lastaval[n]);
  1840. aincr[n] = pow(rratio,one_over_steps);
  1841. }
  1842. dz->parray[FLT_AMP][n] = lastaval[n];
  1843. lastaval[n] = thisval;
  1844. }
  1845. *flt_frq_index += flt_cnt;
  1846. (*flt_times_cnt)++;
  1847. return(FINISHED);
  1848. }
  1849. /************************** FILTERING ****************************/
  1850. void filtering(int n,int chans,float *buf,double *a,double *b,double *y,double *z,
  1851. double *d,double *e,double *ampl,int flt_cnt,int *flt_ovflw,int running,dataptr dz)
  1852. {
  1853. double input, sum, xx;
  1854. int chno, this_samp, fno, i;
  1855. for(chno = 0; chno < chans; chno++) {
  1856. this_samp = n + chno;
  1857. input = (double)buf[this_samp];
  1858. sum = 0.0;
  1859. for (fno = 0; fno < flt_cnt; fno++) {
  1860. i = (fno * chans) + chno;
  1861. xx = input + (a[fno] * y[i]) + (b[fno] * z[i]);
  1862. z[i] = y[i];
  1863. y[i] = xx;
  1864. if(dz->vflag[FLT_DBLFILT]) {
  1865. xx += (a[fno] * d[i]) + (b[fno] * e[i]);
  1866. e[i] = d[i];
  1867. d[i] = xx;
  1868. }
  1869. sum += (xx * ampl[fno]);
  1870. }
  1871. sum *= dz->synfgain;
  1872. if(running)
  1873. sum = check_float_limits(sum,flt_ovflw,dz);
  1874. buf[this_samp] = (float) sum;
  1875. }
  1876. }
  1877. /************************ CHECK_FLOAT_LIMITS **************************/
  1878. //TODO: if shorts o/p - do clipping; if floatsams, report but don't change!
  1879. double check_float_limits(double sum,int *flt_ovflw,dataptr dz)
  1880. {
  1881. double peak = fabs(sum);
  1882. #ifdef NOTDEF
  1883. //do this when 'modify loudness' can handle floatsams!
  1884. if(dz->true_outfile_stype== SAMP_FLOAT){
  1885. if(peak > 1.0){
  1886. (*flt_ovflw)++;
  1887. dz->peak_fval = max(dz->peak_fval,peak);
  1888. }
  1889. }
  1890. else {
  1891. #endif
  1892. if (sum > 1.0) {
  1893. //TW SUGGEST KEEP THIS; prevents FILTER BLOWING UP: see notes
  1894. dz->synfgain *= 0.9999;
  1895. (*flt_ovflw)++;
  1896. dz->peak_fval = max(dz->peak_fval,peak);
  1897. //return(1.0);
  1898. if(dz->clip_floatsams)
  1899. sum = 1.0;
  1900. }
  1901. if (sum < -1.0) {
  1902. //TW SUGGEST KEEP THIS; prevents FILTER BLOWING UP: see notes
  1903. dz->synfgain *= 0.9999;
  1904. (flt_ovflw)++;
  1905. dz->peak_fval = max(dz->peak_fval,peak);
  1906. //return(-1.0);
  1907. if(dz->clip_floatsams)
  1908. sum = -1.0;
  1909. }
  1910. #ifdef NOTDEF
  1911. }
  1912. #endif
  1913. return sum;
  1914. }
  1915. /************************ GEN_NOISE **************************/
  1916. void gen_noise(float *buf,dataptr dz)
  1917. {
  1918. int n;
  1919. dz->ssampsread = min(dz->buflen,dz->samps_left);
  1920. for(n=0;n<dz->ssampsread;n++)
  1921. buf[n] = (float)(((drand48() * 2.0) - 1.0) * dz->scalefact);
  1922. dz->total_samps_read += dz->ssampsread;
  1923. dz->samps_left -= dz->ssampsread;
  1924. }
  1925. /************************** SYNFILTER_PREPROCESS **************************/
  1926. int synfilter_preprocess(int flt_cnt,double flt_inv_sr,dataptr dz)
  1927. {
  1928. int exit_status;
  1929. if((exit_status = allocate_filter_internalparam_arrays(flt_cnt,dz))<0)
  1930. return(exit_status);
  1931. if((exit_status = initialise_filter_params(flt_cnt,flt_inv_sr,dz))<0)
  1932. return(exit_status);
  1933. return(FINISHED);
  1934. }
  1935. /**************************** ALLOCATE_FILTER_INTERNALPARAM_ARRAYS *******************************/
  1936. int allocate_filter_internalparam_arrays(int fltcnt,dataptr dz)
  1937. {
  1938. int chans = dz->infile->channels;
  1939. if((dz->parray[FLT_AMPL] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1940. || (dz->parray[FLT_A] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1941. || (dz->parray[FLT_B] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1942. || (dz->parray[FLT_WW] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1943. || (dz->parray[FLT_COSW] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1944. || (dz->parray[FLT_SINW] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  1945. || (dz->parray[FLT_Y] = (double *)calloc(fltcnt * chans * sizeof(double),sizeof(char)))==NULL
  1946. || (dz->parray[FLT_Z] = (double *)calloc(fltcnt * chans * sizeof(double),sizeof(char)))==NULL) {
  1947. sprintf(errstr,"INSUFFICIENT MEMORY for arrays of filter parameters.\n");
  1948. return(MEMORY_ERROR);
  1949. }
  1950. if(dz->vflag[FLT_DBLFILT]) {
  1951. if((dz->parray[FLT_D] = (double *)calloc(fltcnt * chans * sizeof(double),sizeof(char)))==NULL
  1952. || (dz->parray[FLT_E] = (double *)calloc(fltcnt * chans * sizeof(double),sizeof(char)))==NULL) {
  1953. sprintf(errstr,"INSUFFICIENT MEMORY for double filtering parameters.\n");
  1954. return(MEMORY_ERROR);
  1955. }
  1956. }
  1957. return(FINISHED);
  1958. }
  1959. /************************ INITIALISE_FILTER_PARAMS ***************************/
  1960. int initialise_filter_params(int flt_cnt,double flt_inv_sr,dataptr dz)
  1961. {
  1962. int n, chno, k;
  1963. int chans = dz->infile->channels;
  1964. for(n=0;n<flt_cnt;n++) {
  1965. get_syncoeffs1(n,flt_inv_sr,dz);
  1966. get_syncoeffs2(n,dz);
  1967. for(chno=0;chno<chans;chno++) {
  1968. k = (n*chans)+chno;
  1969. if(dz->vflag[FLT_DBLFILT]) {
  1970. dz->parray[FLT_D][k] = 0.0;
  1971. dz->parray[FLT_E][k] = 0.0;
  1972. }
  1973. dz->parray[FLT_Y][k] = 0.0;
  1974. dz->parray[FLT_Z][k] = 0.0;
  1975. }
  1976. }
  1977. return(FINISHED);
  1978. }
  1979. /*********************** GET_COEFFS1 *************************/
  1980. void get_syncoeffs1(int n,double flt_inv_sr,dataptr dz)
  1981. {
  1982. dz->parray[FLT_WW][n] = 2.0 * PI * dz->parray[FLT_FRQ][n] * flt_inv_sr;
  1983. dz->parray[FLT_COSW][n] = cos(dz->parray[FLT_WW][n]);
  1984. dz->parray[FLT_SINW][n] = sin(dz->parray[FLT_WW][n]);
  1985. }
  1986. /*********************** GET_COEFFS2 ***************************/
  1987. void get_syncoeffs2(int n,dataptr dz)
  1988. {
  1989. double g, r;
  1990. r = exp( -(dz->parray[FLT_WW][n])/(2.0 * dz->param[SYNFLT_Q]));
  1991. dz->parray[FLT_A][n] = 2.0 * r * dz->parray[FLT_COSW][n];
  1992. dz->parray[FLT_B][n] = -(r) * r;
  1993. g = 1.0 / ((1.0 + dz->parray[FLT_B][n]) * dz->parray[FLT_SINW][n]);
  1994. dz->parray[FLT_AMPL][n] = dz->parray[FLT_AMP][n]/g;
  1995. if(dz->vflag[FLT_DBLFILT])
  1996. dz->parray[FLT_AMPL][n] /= g;
  1997. }
  1998. /********************** READ_THE_SPECIAL_DATA ************************/
  1999. int read_the_special_data(char *str,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz)
  2000. {
  2001. // int exit_status = FINISHED;
  2002. aplptr ap = dz->application;
  2003. dz->application->min_special = unchecked_hztomidi(FLT_MINFRQ);
  2004. dz->application->max_special = MIDIMAX;
  2005. switch(ap->special_data) {
  2006. case(SYN_FILTERBANK): return get_data_from_fsyn_infile(str,flt_wordcnt,flt_entrycnt,flt_cnt,flt_timeslots,dz);
  2007. case(TIMEVARYING_FILTERBANK): return get_data_from_tvary_infile(str,flt_wordcnt,flt_entrycnt,flt_cnt,flt_timeslots,dz);
  2008. default:
  2009. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  2010. return(PROGRAM_ERROR);
  2011. }
  2012. return(FINISHED);
  2013. }
  2014. /**************************** ALLOCATE_FILTER_FRQ_AMP_ARRAYS *******************************/
  2015. int allocate_filter_frq_amp_arrays(int fltcnt,dataptr dz)
  2016. {
  2017. if((dz->parray[FLT_AMP] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL
  2018. || (dz->parray[FLT_FRQ] = (double *)calloc(fltcnt * sizeof(double),sizeof(char)))==NULL) {
  2019. sprintf(errstr,"INSUFFICIENT MEMORY for filter amp and frq arrays.\n");
  2020. return(MEMORY_ERROR);
  2021. }
  2022. return(FINISHED);
  2023. }
  2024. /**************************** GET_DATA_FROM_TVARY_INFILE *******************************/
  2025. int get_data_from_tvary_infile(char *filename,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz)
  2026. {
  2027. int exit_status, addrow = 0;
  2028. char *temp, *p, *thisword;
  2029. int maxlinelen, frqcnt;
  2030. int total_wordcnt = 0, n, k;
  2031. int columns_in_this_row, columns_in_row = 0, number_of_rows = 0;
  2032. double val;
  2033. if((dz->fp = fopen(filename,"r"))==NULL) {
  2034. sprintf(errstr,"Cannot open datafile %s\n",filename);
  2035. return(DATA_ERROR);
  2036. }
  2037. if((exit_status = getmaxlinelen(&maxlinelen,dz->fp))<0)
  2038. return(exit_status);
  2039. if((fseek(dz->fp,0,0))<0) {
  2040. sprintf(errstr,"Seek failed in get_data_from_tvary_infile()\n");
  2041. return(SYSTEM_ERROR);
  2042. }
  2043. if((temp = (char *)malloc((maxlinelen+2) * sizeof(char)))==NULL) {
  2044. sprintf(errstr,"INSUFFICIENT MEMORY for temporary line storage.\n");
  2045. return(MEMORY_ERROR);
  2046. }
  2047. while(fgets(temp,maxlinelen,dz->fp)!=NULL) {
  2048. columns_in_this_row = 0;
  2049. if(is_an_empty_line_or_a_comment(temp))
  2050. continue;
  2051. p = temp;
  2052. while(get_word_from_string(&p,&thisword)) {
  2053. if((exit_status = get_level(thisword,&val))<0) { /* reads vals or dB vals */
  2054. return(exit_status);
  2055. }
  2056. if(number_of_rows == 0 && total_wordcnt == 0) { /* Need ot insert value agt time 0.0 */
  2057. if(!flteq(val,0.0))
  2058. addrow = 1;
  2059. }
  2060. columns_in_this_row++;
  2061. total_wordcnt++;
  2062. }
  2063. if(number_of_rows==0) {
  2064. if((columns_in_row = columns_in_this_row)<3) {
  2065. sprintf(errstr,"Insufficient filter data in row 1 of file %s.\n",filename);
  2066. return(DATA_ERROR);
  2067. } else if (ODD(columns_in_row - 1)) {
  2068. sprintf(errstr,"Frq and Amp data not paired correctly (or no Time) in row 1 of file %s.\n",filename);
  2069. return(DATA_ERROR);
  2070. }
  2071. } else if(columns_in_this_row!=columns_in_row) {
  2072. if(columns_in_this_row < columns_in_row)
  2073. sprintf(errstr,"Not enough entries in row %d of file %s\n",number_of_rows+1,filename);
  2074. else
  2075. sprintf(errstr,"Too many entries in row %d of file %s\n",number_of_rows+1,filename);
  2076. return(DATA_ERROR);
  2077. }
  2078. number_of_rows++;
  2079. }
  2080. if(columns_in_row<3) {
  2081. sprintf(errstr,"Insufficient data in each row, to define filters.\n");
  2082. return(DATA_ERROR);
  2083. }
  2084. if(number_of_rows<2) {
  2085. sprintf(errstr,"Insufficient data in. Must be at least 2 lines in file %s.\n",filename); //RWD final ) in wrong place!
  2086. return(DATA_ERROR);
  2087. }
  2088. frqcnt = columns_in_row - 1;
  2089. if(ODD(frqcnt)) {
  2090. sprintf(errstr,"amplitude and freq data not correctly paired in rows.\n");
  2091. return(DATA_ERROR);
  2092. }
  2093. *flt_wordcnt = total_wordcnt;
  2094. if(addrow) {
  2095. *flt_wordcnt += columns_in_row;
  2096. number_of_rows++;
  2097. }
  2098. if((dz->parray[FLT_FBRK] = (double *)malloc(*flt_wordcnt * sizeof(double)))==NULL) {
  2099. sprintf(errstr,"INSUFFICIENT MEMORY to allocate filter brktable.\n");
  2100. return(MEMORY_ERROR);
  2101. }
  2102. *flt_entrycnt = columns_in_row;
  2103. *flt_cnt = frqcnt/2;
  2104. *flt_timeslots = number_of_rows;
  2105. fseek(dz->fp,0,0);
  2106. total_wordcnt = 0;
  2107. if(addrow)
  2108. total_wordcnt += columns_in_row; // Leave space for zero-time line
  2109. while(fgets(temp,maxlinelen,dz->fp)!=NULL) {
  2110. columns_in_this_row = 0;
  2111. if(is_an_empty_line_or_a_comment(temp))
  2112. continue;
  2113. p = temp;
  2114. while(get_word_from_string(&p,&thisword)) {
  2115. if((exit_status = get_level(thisword,&val))<0) { /* reads vals or dB vals */
  2116. return(exit_status);
  2117. }
  2118. dz->parray[FLT_FBRK][total_wordcnt] = val;
  2119. total_wordcnt++;
  2120. }
  2121. }
  2122. if(fclose(dz->fp)<0) {
  2123. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2124. fflush(stdout);
  2125. }
  2126. if(addrow) { // Add row at time 0, by duplicating vals in next row
  2127. k = columns_in_row;
  2128. for(n=0; n < columns_in_row;n++,k++)
  2129. dz->parray[FLT_FBRK][n] = dz->parray[FLT_FBRK][k];
  2130. dz->parray[FLT_FBRK][0] = 0.0;
  2131. }
  2132. return(FINISHED);
  2133. }
  2134. /**************************** GET_DATA_FROM_FSYN_INFILE *******************************/
  2135. int get_data_from_fsyn_infile(char *filename,int *flt_wordcnt,int *flt_entrycnt,int *flt_cnt,int *flt_timeslots,dataptr dz)
  2136. {
  2137. int exit_status, addrow = 0;
  2138. char *temp, *p, *thisword;
  2139. int maxlinelen;
  2140. int total_wordcnt = 0;
  2141. int columns_in_this_row, number_of_rows = 0;
  2142. double zval = 0.0;
  2143. double val;
  2144. if((dz->fp = fopen(filename,"r"))==NULL) {
  2145. sprintf(errstr,"Cannot open datafile %s\n",filename);
  2146. return(DATA_ERROR);
  2147. }
  2148. if((exit_status = getmaxlinelen(&maxlinelen,dz->fp))<0)
  2149. return(exit_status);
  2150. if((fseek(dz->fp,0,0))<0) {
  2151. sprintf(errstr,"Seek failed in get_data_from_tvary_infile()\n");
  2152. return(SYSTEM_ERROR);
  2153. }
  2154. if((temp = (char *)malloc((maxlinelen+2) * sizeof(char)))==NULL) {
  2155. sprintf(errstr,"INSUFFICIENT MEMORY for temporary line storage.\n");
  2156. return(MEMORY_ERROR);
  2157. }
  2158. while(fgets(temp,maxlinelen,dz->fp)!=NULL) {
  2159. columns_in_this_row = 0;
  2160. if(is_an_empty_line_or_a_comment(temp))
  2161. continue;
  2162. p = temp;
  2163. while(get_word_from_string(&p,&thisword)) {
  2164. if((exit_status = get_level(thisword,&val))<0) { /* reads vals or dB vals */
  2165. return(exit_status);
  2166. }
  2167. if(number_of_rows == 0) {
  2168. if(total_wordcnt == 0) {
  2169. if(!flteq(val,0.0))
  2170. addrow = 1;
  2171. } else
  2172. zval = val;
  2173. }
  2174. columns_in_this_row++;
  2175. total_wordcnt++;
  2176. }
  2177. if(columns_in_this_row!=2) {
  2178. sprintf(errstr,"Wrong number of entries in row %d of file %s\n",number_of_rows+1,filename);
  2179. return(DATA_ERROR);
  2180. }
  2181. number_of_rows++;
  2182. }
  2183. if(number_of_rows < 2) {
  2184. sprintf(errstr,"Insufficient data in file %s (at least 2 lines required)\n",filename);
  2185. return(DATA_ERROR);
  2186. }
  2187. if(ODD(total_wordcnt)) {
  2188. sprintf(errstr,"Data in file %s not paired correctly\n",filename);
  2189. return(DATA_ERROR);
  2190. }
  2191. if(addrow) {
  2192. number_of_rows++;
  2193. total_wordcnt += 2; // Space for extra row at time 0
  2194. }
  2195. *flt_wordcnt = (total_wordcnt/2) * 3; // Amplitude info (1.0) is added as a srd row
  2196. if((dz->parray[FLT_FBRK] = (double *)malloc(*flt_wordcnt * sizeof(double)))==NULL) {
  2197. sprintf(errstr,"INSUFFICIENT MEMORY to allocate filter brktable.\n");
  2198. return(MEMORY_ERROR);
  2199. }
  2200. fseek(dz->fp,0,0);
  2201. total_wordcnt = 0;
  2202. if(addrow) { // Add line at zero time, if ness
  2203. dz->parray[FLT_FBRK][total_wordcnt++] = 0.0;
  2204. dz->parray[FLT_FBRK][total_wordcnt++] = zval;
  2205. dz->parray[FLT_FBRK][total_wordcnt++] = 1.0;
  2206. }
  2207. while(fgets(temp,maxlinelen,dz->fp)!=NULL) {
  2208. if(is_an_empty_line_or_a_comment(temp))
  2209. continue;
  2210. p = temp;
  2211. while(get_word_from_string(&p,&thisword)) {
  2212. if((exit_status = get_level(thisword,&val))<0) { /* reads vals or dB vals */
  2213. return(exit_status);
  2214. }
  2215. dz->parray[FLT_FBRK][total_wordcnt] = val;
  2216. total_wordcnt++;
  2217. }
  2218. dz->parray[FLT_FBRK][total_wordcnt] = 1.0; /* once line is read, add a standard amp of 1.0 */
  2219. total_wordcnt++;
  2220. }
  2221. *flt_entrycnt = 3; /* number of entries in line is standard 3 */
  2222. *flt_cnt = 1; /* number of frqs in each line is 1 */
  2223. *flt_timeslots = number_of_rows;
  2224. if(fclose(dz->fp)<0) {
  2225. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2226. fflush(stdout);
  2227. }
  2228. return(FINISHED);
  2229. }
  2230. /**************************** GETMAXLINELEN *******************************/
  2231. int getmaxlinelen(int *maxcnt,FILE *fp)
  2232. {
  2233. int thiscnt = 0;
  2234. char c;
  2235. *maxcnt = 0;
  2236. while((c= (char)fgetc(fp))!=EOF) {
  2237. if(c=='\n' || c == ENDOFSTR) {
  2238. *maxcnt = max(*maxcnt,thiscnt);
  2239. thiscnt = 0;
  2240. } else
  2241. thiscnt++;
  2242. }
  2243. *maxcnt = (int)max(*maxcnt,thiscnt);
  2244. *maxcnt += 4; /* NEWLINE, ENDOFSTR and safety!! */
  2245. return(FINISHED);
  2246. }
  2247. /**************************** CHECK_FILTER_DATA *******************************/
  2248. int check_filter_data(int flt_entrycnt,int *flt_wordcnt,int *flt_timeslots,dataptr dz)
  2249. {
  2250. int exit_status;
  2251. int n /*, lastfilt*/;
  2252. double endtime;
  2253. int total_wordcnt = *flt_wordcnt;
  2254. if(dz->parray[FLT_FBRK][0] < 0.0) {
  2255. sprintf(errstr,"Negative time value (%lf) on line 1.\n",dz->parray[FLT_FBRK][0]);
  2256. return(DATA_ERROR);
  2257. }
  2258. if(flteq(dz->parray[FLT_FBRK][0],0.0))
  2259. dz->parray[FLT_FBRK][0] = 0.0; /* FORCE A FILTER SETTING AT TIME ZERO */
  2260. else {
  2261. if((dz->parray[FLT_FBRK] =
  2262. (double *)realloc(dz->parray[FLT_FBRK],(total_wordcnt+flt_entrycnt) * sizeof(double)))==NULL) {
  2263. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate filter brktable.\n");
  2264. return(MEMORY_ERROR);
  2265. }
  2266. for(n=total_wordcnt-1; n>=0; n--)
  2267. dz->parray[FLT_FBRK][n + flt_entrycnt] = dz->parray[FLT_FBRK][n];
  2268. total_wordcnt += flt_entrycnt;
  2269. dz->parray[FLT_FBRK][0] = 0.0;
  2270. (*flt_timeslots)++;
  2271. }
  2272. if((exit_status = check_seq_and_range_of_filter_data(dz->parray[FLT_FBRK],flt_entrycnt,total_wordcnt,&endtime,dz))<0)
  2273. return(exit_status);
  2274. /* FORCE A FILTER SETTING AT (BEYOND) END OF FILE */
  2275. if(endtime <= SYNFDOVE * 2 * MS_TO_SECS) {
  2276. sprintf(errstr,"Data too short (timewise) for synthesis: must be > 30mS.\n");
  2277. return DATA_ERROR;
  2278. }
  2279. // lastfilt = total_wordcnt - flt_entrycnt;
  2280. dz->outsams = (int)round(endtime * (double)dz->iparam[SYNFLT_SRATE]) * dz->iparam[SYNFLT_CHANS];
  2281. dz->samps_left = dz->outsams;
  2282. if(*flt_timeslots < 2) {
  2283. sprintf(errstr,"Error in timeslot logic: check_filter_data()\n");
  2284. return(PROGRAM_ERROR);
  2285. }
  2286. *flt_wordcnt = total_wordcnt;
  2287. return(FINISHED);
  2288. }
  2289. /**************************** CHECK_SEQ_AND_RANGE_OF_FILTER_DATA *******************************/
  2290. int check_seq_and_range_of_filter_data(double *fbrk,int flt_entrycnt,int flt_wordcnt,double *endtime,dataptr dz)
  2291. {
  2292. double lasttime = 0.0;
  2293. int n, m, lineno;
  2294. for(n=1;n<flt_wordcnt;n++) {
  2295. m = n%flt_entrycnt;
  2296. lineno = (n/flt_entrycnt)+1; /* original line-no : ignoring comments */
  2297. if(m==0) {
  2298. if(fbrk[n] <= lasttime) {
  2299. sprintf(errstr,"Time is out of sequence on line %d\n",lineno);
  2300. return(DATA_ERROR);
  2301. }
  2302. lasttime = fbrk[n];
  2303. } else if(ODD(m)) {
  2304. if(fbrk[n]<dz->application->min_special || fbrk[n]>dz->application->max_special) {
  2305. sprintf(errstr,"frq_or_midi value [%.3lf] out of range (%.1f - %.1f) on line %d\n",
  2306. fbrk[n],dz->application->min_special,dz->application->max_special,lineno);
  2307. return(DATA_ERROR);
  2308. }
  2309. fbrk[n] = miditohz(fbrk[n]);
  2310. } else
  2311. fbrk[n] = max(fbrk[n],MINFILTAMP); /* Zero filter amp, forced to +ve, but effectively zero */
  2312. }
  2313. *endtime = lasttime;
  2314. return(FINISHED);
  2315. }