envspeak.c 120 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796
  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. /*
  22. * SPLICES NOT WORKING IN REASSEMBLY.
  23. */
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <structures.h>
  27. #include <tkglobals.h>
  28. #include <pnames.h>
  29. #include <filetype.h>
  30. #include <processno.h>
  31. #include <modeno.h>
  32. #include <logic.h>
  33. #include <globcon.h>
  34. #include <cdpmain.h>
  35. #include <math.h>
  36. #include <mixxcon.h>
  37. #include <osbind.h>
  38. #include <standalone.h>
  39. #include <ctype.h>
  40. #include <sfsys.h>
  41. #include <string.h>
  42. #include <envlcon.h>
  43. #include <srates.h>
  44. #ifdef unix
  45. #define round(x) lround((x))
  46. #endif
  47. #define envcnt wlength
  48. #define trofcnt rampbrksize
  49. #define ENV_FSECSIZE 256
  50. #define ENVSPEAK_PKSRCHWIDTH 3
  51. #define MINEVENTFRQ 50 // generates the minimum possible event length for mode 7
  52. #define ESPK_GATED ESPK_REPET
  53. #define ESPK_SEED ESPK_OFFST
  54. #define ESPK_NWISE ESPK_OFFST
  55. #define ESPK_RATIO ESPK_WHICH
  56. #define ESPK_RAND ESPK_GAIN
  57. char errstr[2400];
  58. int anal_infiles = 1;
  59. int sloom = 0;
  60. int sloombatch = 0;
  61. //not used in Soundloom 17.0.4x
  62. const char* cdp_version = "7.0.0";
  63. //CDP LIB REPLACEMENTS
  64. static int check_envspeak_param_validity_and_consistency(dataptr dz);
  65. static int setup_envspeak_application(dataptr dz);
  66. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  67. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  68. static int setup_envspeak_param_ranges_and_defaults(dataptr dz);
  69. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  70. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  71. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  72. static int establish_application(dataptr dz);
  73. static int initialise_vflags(dataptr dz);
  74. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  75. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  76. static int mark_parameter_types(dataptr dz,aplptr ap);
  77. static int assign_file_data_storage(int infilecnt,dataptr dz);
  78. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  79. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  80. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  81. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  82. static int precalculate_peaks_array_and_splice(dataptr dz);
  83. static int envspeak(dataptr dz);
  84. static int getmaxattencnt(dataptr dz);
  85. static int windows_in_sndfile(dataptr dz);
  86. static int getenv_of_buffer(int samps_to_process,float **env,dataptr dz);
  87. static double getmaxsamp(int startsamp, int sampcnt,float *buffer);
  88. static int istrof(float *env,float *envend,float *q,int width);
  89. static int randvary_pklen(int peaklen,dataptr dz);
  90. static double dbtolevel(double val);
  91. static int getmaxwhich(dataptr dz);
  92. static int open_next_file(char *outfilename,int n,dataptr dz);
  93. static void randperm(int z,int setlen,dataptr dz);
  94. static void hinsert(int z,int m,int t,int setlen,dataptr dz);
  95. static void hprefix(int z,int m,int setlen,dataptr dz);
  96. static void hshuflup(int z,int k,int setlen,dataptr dz);
  97. static int getcutdata(int *cmdlinecnt,char ***cmdline,dataptr dz);
  98. /**************************************** MAIN *********************************************/
  99. int main(int argc,char *argv[])
  100. {
  101. int exit_status;
  102. dataptr dz = NULL;
  103. char **cmdline;
  104. int cmdlinecnt;
  105. int n;
  106. // aplptr ap;
  107. int is_launched = FALSE;
  108. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  109. fprintf(stdout,"%s\n",cdp_version);
  110. fflush(stdout);
  111. return 0;
  112. }
  113. /* CHECK FOR SOUNDLOOM */
  114. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  115. sloom = 0;
  116. sloombatch = 1;
  117. }
  118. if(sflinit("cdp")){
  119. sfperror("cdp: initialisation\n");
  120. return(FAILED);
  121. }
  122. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  123. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  124. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(FAILED);
  126. }
  127. dz->trofcnt = 0;
  128. if(!sloom) {
  129. if(argc == 1) {
  130. usage1();
  131. return(FAILED);
  132. } else if(argc == 2) {
  133. usage2(argv[1]);
  134. return(FAILED);
  135. }
  136. }
  137. if(!sloom) {
  138. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  139. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  140. return(FAILED);
  141. }
  142. cmdline = argv;
  143. cmdlinecnt = argc;
  144. if((get_the_process_no(argv[0],dz))<0)
  145. return(FAILED);
  146. cmdline++;
  147. cmdlinecnt--;
  148. dz->maxmode = 25;
  149. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  150. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  151. return(exit_status);
  152. }
  153. cmdline++;
  154. cmdlinecnt--;
  155. // setup_particular_application =
  156. if((exit_status = setup_envspeak_application(dz))<0) {
  157. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  158. return(FAILED);
  159. }
  160. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  161. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  162. return(FAILED);
  163. }
  164. } else {
  165. //parse_TK_data() =
  166. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  167. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  168. return(exit_status);
  169. }
  170. }
  171. // ap = dz->application;
  172. // parse_infile_and_hone_type() =
  173. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  174. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  175. return(FAILED);
  176. }
  177. // setup_param_ranges_and_defaults() =
  178. if((exit_status = setup_envspeak_param_ranges_and_defaults(dz))<0) {
  179. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  180. return(FAILED);
  181. }
  182. // open_first_infile CDP LIB
  183. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  184. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  185. return(FAILED);
  186. }
  187. cmdlinecnt--;
  188. cmdline++;
  189. // handle_extra_infiles() : redundant
  190. // handle_outfile() =
  191. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  192. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  193. return(FAILED);
  194. }
  195. // handle_formants() redundant
  196. // handle_formant_quiksearch() redundant
  197. // handle_special_data() redundant
  198. if(dz->mode >= 12) {
  199. if((exit_status = getcutdata(&cmdlinecnt,&cmdline,dz))<0) {
  200. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  201. return(FAILED);
  202. }
  203. }
  204. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIBs
  205. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  206. return(FAILED);
  207. }
  208. is_launched = TRUE;
  209. dz->bufcnt = 4;
  210. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  211. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  212. return(MEMORY_ERROR);
  213. }
  214. if((dz->sbufptr = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) { //RWD need the extra buf here too
  215. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  216. return(MEMORY_ERROR);
  217. }
  218. for(n = 0;n <dz->bufcnt; n++)
  219. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  220. dz->sampbuf[n] = (float *)0;
  221. // 1 double array for splice
  222. if((dz->parray = (double **)malloc(sizeof(double *))) == NULL) {
  223. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (1).\n");
  224. return(MEMORY_ERROR);
  225. }
  226. // 2 float arrays for trofstore
  227. if((dz->fptr=(float **)malloc(2 * sizeof(float *)))==NULL) {
  228. sprintf(errstr,"INSUFFICIENT MEMORY to store envelope (1).\n");
  229. return(MEMORY_ERROR);
  230. }
  231. // create_sndbufs
  232. if((exit_status = create_sndbufs_for_envel(dz))<0) {
  233. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  234. return(FAILED);
  235. }
  236. if(dz->mode != 24) {
  237. if((exit_status = precalculate_peaks_array_and_splice(dz))<0) {
  238. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  239. return(FAILED);
  240. }
  241. dz->mode %= 12;
  242. // check_param_validity_and_consistency....
  243. if((exit_status = check_envspeak_param_validity_and_consistency(dz))<0) {
  244. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  245. return(FAILED);
  246. }
  247. }
  248. //param_preprocess() redundant
  249. //spec_process_file =
  250. if((exit_status = envspeak(dz))<0) {
  251. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  252. return(FAILED);
  253. }
  254. if((exit_status = complete_output(dz))<0) { // CDP LIB
  255. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  256. return(FAILED);
  257. }
  258. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  259. free(dz);
  260. return(SUCCEEDED);
  261. }
  262. /**********************************************
  263. REPLACED CDP LIB FUNCTIONS
  264. **********************************************/
  265. /****************************** SET_PARAM_DATA *********************************/
  266. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  267. {
  268. ap->special_data = (char)special_data;
  269. ap->param_cnt = (char)paramcnt;
  270. ap->max_param_cnt = (char)maxparamcnt;
  271. if(ap->max_param_cnt>0) {
  272. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  273. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  274. return(MEMORY_ERROR);
  275. }
  276. strcpy(ap->param_list,paramlist);
  277. }
  278. return(FINISHED);
  279. }
  280. /****************************** SET_VFLGS *********************************/
  281. int set_vflgs
  282. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  283. {
  284. ap->option_cnt = (char) optcnt; /*RWD added cast */
  285. if(optcnt) {
  286. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  287. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  288. return(MEMORY_ERROR);
  289. }
  290. strcpy(ap->option_list,optlist);
  291. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  292. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  293. return(MEMORY_ERROR);
  294. }
  295. strcpy(ap->option_flags,optflags);
  296. }
  297. ap->vflag_cnt = (char) vflagcnt;
  298. ap->variant_param_cnt = (char) vparamcnt;
  299. if(vflagcnt) {
  300. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  301. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  302. return(MEMORY_ERROR);
  303. }
  304. strcpy(ap->variant_list,varlist);
  305. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  306. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  307. return(MEMORY_ERROR);
  308. }
  309. strcpy(ap->variant_flags,varflags);
  310. }
  311. return(FINISHED);
  312. }
  313. /***************************** APPLICATION_INIT **************************/
  314. int application_init(dataptr dz)
  315. {
  316. int exit_status;
  317. int storage_cnt;
  318. int tipc, brkcnt;
  319. aplptr ap = dz->application;
  320. if(ap->vflag_cnt>0)
  321. initialise_vflags(dz);
  322. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  323. ap->total_input_param_cnt = (char)tipc;
  324. if(tipc>0) {
  325. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  326. return(exit_status);
  327. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  328. return(exit_status);
  329. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  330. return(exit_status);
  331. }
  332. brkcnt = tipc;
  333. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  334. if(brkcnt>0) {
  335. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  336. return(exit_status);
  337. }
  338. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  339. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  340. return(exit_status);
  341. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  342. return(exit_status);
  343. }
  344. if((exit_status = mark_parameter_types(dz,ap))<0)
  345. return(exit_status);
  346. // establish_infile_constants() replaced by
  347. dz->infilecnt = 1;
  348. //establish_bufptrs_and_extra_buffers():
  349. return(FINISHED);
  350. }
  351. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  352. /* RWD malloc changed to calloc; helps debug version run as release! */
  353. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  354. {
  355. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  356. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  357. return(MEMORY_ERROR);
  358. }
  359. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  360. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  361. return(MEMORY_ERROR);
  362. }
  363. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  364. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  365. return(MEMORY_ERROR);
  366. }
  367. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  368. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  369. return(MEMORY_ERROR);
  370. }
  371. return(FINISHED);
  372. }
  373. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  374. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  375. {
  376. int n;
  377. for(n=0;n<storage_cnt;n++) {
  378. dz->is_int[n] = (char)0;
  379. dz->no_brk[n] = (char)0;
  380. }
  381. return(FINISHED);
  382. }
  383. /***************************** MARK_PARAMETER_TYPES **************************/
  384. int mark_parameter_types(dataptr dz,aplptr ap)
  385. {
  386. int n, m; /* PARAMS */
  387. for(n=0;n<ap->max_param_cnt;n++) {
  388. switch(ap->param_list[n]) {
  389. case('0'): break; /* dz->is_active[n] = 0 is default */
  390. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  391. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  392. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  393. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  394. default:
  395. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  396. return(PROGRAM_ERROR);
  397. }
  398. } /* OPTIONS */
  399. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  400. switch(ap->option_list[n]) {
  401. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  402. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  403. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  404. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  405. default:
  406. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  407. return(PROGRAM_ERROR);
  408. }
  409. } /* VARIANTS */
  410. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  411. switch(ap->variant_list[n]) {
  412. case('0'): break;
  413. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  414. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  415. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  416. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  417. default:
  418. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  419. return(PROGRAM_ERROR);
  420. }
  421. } /* INTERNAL */
  422. for(n=0,
  423. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  424. switch(ap->internal_param_list[n]) {
  425. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  426. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  427. case('d'): dz->no_brk[m] = (char)1; break;
  428. default:
  429. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  430. return(PROGRAM_ERROR);
  431. }
  432. }
  433. return(FINISHED);
  434. }
  435. /************************ HANDLE_THE_OUTFILE *********************/
  436. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  437. {
  438. int exit_status;
  439. char *filename = (*cmdline)[0], *nufilename;
  440. char prefix_units[] = "_00";
  441. if(filename[0]=='-' && filename[1]=='f') {
  442. dz->floatsam_output = 1;
  443. dz->true_outfile_stype = SAMP_FLOAT;
  444. filename+= 2;
  445. }
  446. if(!sloom) {
  447. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  448. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  449. return(DATA_ERROR);
  450. }
  451. }
  452. if(dz->mode == 24) {
  453. strcpy(dz->outfilename,filename);
  454. if((exit_status = create_sized_outfile(filename,dz))<0)
  455. return(exit_status);
  456. (*cmdline)++;
  457. (*cmdlinecnt)--;
  458. return(FINISHED);
  459. }
  460. if(dz->mode == 9 || dz->mode == 21) {
  461. if((dz->wordstor = (char **)malloc(sizeof (char *)))==NULL) {
  462. sprintf(errstr,"Cannot set up storage for infile name (1)\n");
  463. return(MEMORY_ERROR);
  464. }
  465. if((dz->wordstor[0] = (char *)malloc((strlen(filename) + 12) * sizeof (char)))==NULL) {
  466. sprintf(errstr,"Cannot set up storage for infile name (2)\n");
  467. return(MEMORY_ERROR);
  468. }
  469. strcpy(dz->wordstor[0],filename);
  470. }
  471. if((dz->mode == 9 || dz->mode == 21) && !sloom) {
  472. if((nufilename = (char *)malloc((strlen(filename) + 12) * sizeof (char)))==NULL) {
  473. sprintf(errstr,"Cannot set up storage for infile name (2)\n");
  474. return(MEMORY_ERROR);
  475. }
  476. strcpy(nufilename,filename);
  477. insert_new_chars_at_filename_end(nufilename,prefix_units);
  478. insert_new_number_at_filename_end(nufilename,0,0);
  479. strcpy(dz->outfilename,nufilename);
  480. if((exit_status = create_sized_outfile(nufilename,dz))<0)
  481. return(exit_status);
  482. } else {
  483. strcpy(dz->outfilename,filename);
  484. if((exit_status = create_sized_outfile(filename,dz))<0)
  485. return(exit_status);
  486. }
  487. (*cmdline)++;
  488. (*cmdlinecnt)--;
  489. return(FINISHED);
  490. }
  491. /***************************** ESTABLISH_APPLICATION **************************/
  492. int establish_application(dataptr dz)
  493. {
  494. aplptr ap;
  495. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  496. sprintf(errstr,"establish_application()\n");
  497. return(MEMORY_ERROR);
  498. }
  499. ap = dz->application;
  500. memset((char *)ap,0,sizeof(struct applic));
  501. return(FINISHED);
  502. }
  503. /************************* INITIALISE_VFLAGS *************************/
  504. int initialise_vflags(dataptr dz)
  505. {
  506. int n;
  507. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  508. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  509. return(MEMORY_ERROR);
  510. }
  511. for(n=0;n<dz->application->vflag_cnt;n++)
  512. dz->vflag[n] = FALSE;
  513. return FINISHED;
  514. }
  515. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  516. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  517. {
  518. int n;
  519. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  520. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  521. return(MEMORY_ERROR);
  522. }
  523. for(n=0;n<tipc;n++)
  524. ap->default_val[n] = 0.0;
  525. return(FINISHED);
  526. }
  527. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  528. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  529. {
  530. int n;
  531. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  532. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  533. return(MEMORY_ERROR);
  534. }
  535. for(n=0;n<tipc;n++)
  536. dz->is_active[n] = (char)0;
  537. return(FINISHED);
  538. }
  539. /************************* SETUP_ENVSPEAK_APPLICATION *******************/
  540. int setup_envspeak_application(dataptr dz)
  541. {
  542. int exit_status;
  543. aplptr ap;
  544. if((exit_status = establish_application(dz))<0) // GLOBAL
  545. return(FAILED);
  546. ap = dz->application;
  547. switch(dz->mode) {
  548. case(4): // fall thro
  549. case(5): // fall thro
  550. case(0): exit_status = set_param_data(ap,0 ,6,5,"iiiID0"); break; // repet & repet-shrink
  551. case(1): exit_status = set_param_data(ap,0 ,6,3,"iii000"); break; // reverse-repet
  552. case(2): // fall thro
  553. case(3): exit_status = set_param_data(ap,0 ,6,5,"iiiID0"); break; // atten "alternate"
  554. case(6): exit_status = set_param_data(ap,0 ,6,6,"iiiIDI"); break; // repeat part-of
  555. case(7): // fall thro
  556. case(8): exit_status = set_param_data(ap,0 ,6,6,"iiiIDD"); break; // repeat but shrink
  557. case(9): exit_status = set_param_data(ap,0 ,6,2,"ii0000"); break; // extract all
  558. case(10): exit_status = set_param_data(ap,0 ,6,3,"iii000"); break; // permute randomly
  559. case(11): exit_status = set_param_data(ap,0 ,6,3,"iiI000"); break; // permute N-wise
  560. case(16): // fall thro
  561. case(17): // fall thro
  562. case(12): exit_status = set_param_data(ap,XSPK_CUTS ,6,4,"0iiID0"); break; // repet & repet-shrink
  563. case(13): exit_status = set_param_data(ap,XSPK_CUTS ,6,2,"0ii000"); break; // reverse-repet
  564. case(14): // fall thro
  565. case(15): exit_status = set_param_data(ap,XSPK_CUTS ,6,4,"0iiID0"); break; // atten "alternate"
  566. case(18): exit_status = set_param_data(ap,XSPK_CUTS ,6,5,"0iiIDI"); break; // repeat part-of
  567. case(19): // fall thro
  568. case(20): exit_status = set_param_data(ap,XSPK_CUTS ,6,5,"0iiIDD"); break; // repeat but shrink
  569. case(21): exit_status = set_param_data(ap,XSPK_CUTS ,6,1,"0i0000"); break; // extract all
  570. case(22): exit_status = set_param_data(ap,XSPK_CUTS ,6,2,"0ii000"); break; // permute randomly
  571. case(23): exit_status = set_param_data(ap,XSPK_CUTS ,6,2,"0iI000"); break; // permute N-wise
  572. case(24): exit_status = set_param_data(ap,XSPK_CUTS ,0,0,""); break; // remove silences
  573. }
  574. if(exit_status < 0)
  575. return(FAILED);
  576. switch(dz->mode) {
  577. case(6): // fall thro
  578. case(18):
  579. exit_status = set_vflgs(ap,"",0,"","z",1,0,"0");
  580. break;
  581. default:
  582. exit_status = set_vflgs(ap,"",0,"","",0,0,"");
  583. break;
  584. }
  585. if(exit_status < 0)
  586. return(FAILED);
  587. // set_legal_infile_structure -->
  588. dz->has_otherfile = FALSE;
  589. // assign_process_logic -->
  590. dz->input_data_type = SNDFILES_ONLY;
  591. if(dz->mode == 2 || dz->mode == 3 || dz->mode == 14 || dz->mode == 15)
  592. dz->process_type = EQUAL_SNDFILE;
  593. else
  594. dz->process_type = UNEQUAL_SNDFILE;
  595. dz->outfiletype = SNDFILE_OUT;
  596. return application_init(dz); //GLOBAL
  597. }
  598. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  599. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  600. {
  601. int exit_status;
  602. infileptr infile_info;
  603. if(!sloom) {
  604. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  605. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  606. return(MEMORY_ERROR);
  607. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  608. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  609. return(PROGRAM_ERROR);
  610. } else if(infile_info->filetype != SNDFILE) {
  611. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  612. return(DATA_ERROR);
  613. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  614. sprintf(errstr,"Failed to copy file parsing information\n");
  615. return(PROGRAM_ERROR);
  616. }
  617. free(infile_info);
  618. }
  619. return(FINISHED);
  620. }
  621. /************************* SETUP_ENVSPEAK_PARAM_RANGES_AND_DEFAULTS *******************/
  622. int setup_envspeak_param_ranges_and_defaults(dataptr dz)
  623. {
  624. int exit_status;
  625. int mode = dz->mode % 12;
  626. aplptr ap = dz->application;
  627. // set_param_ranges()
  628. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  629. // NB total_input_param_cnt is > 0 !!!
  630. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  631. return(FAILED);
  632. if(dz->mode == 24) {
  633. dz->maxmode = 25;
  634. return(FINISHED);
  635. }
  636. ap->lo[ESPK_WINSZ] = 5; // param 0
  637. ap->hi[ESPK_WINSZ] = 1000;
  638. ap->default_val[ESPK_WINSZ] = 50;
  639. ap->lo[ESPK_SPLEN] = 2; // param 1
  640. ap->hi[ESPK_SPLEN] = 100;
  641. ap->default_val[ESPK_SPLEN] = 5;
  642. if(mode < 9) {
  643. ap->lo[ESPK_OFFST] = 0; // param 2
  644. ap->hi[ESPK_OFFST] = 100;
  645. ap->default_val[ESPK_OFFST] = 0;
  646. switch(mode) {
  647. case(2): // fall thro // SEGMENT DELETIONS
  648. case(3):
  649. ap->lo[ESPK_GAIN] = -96; // param 4 // attenuation of attenuated items
  650. ap->hi[ESPK_GAIN] = 0;
  651. ap->default_val[ESPK_GAIN] = -96;
  652. // fall thro
  653. case(0): // fall thro // REPETITION OF SEGMENTS, OR GROUPSIZE IN SEGMENT DELETIONS
  654. case(4): // fall thro
  655. case(5): // fall thro
  656. case(7): // fall thro
  657. case(8): // fall thro
  658. case(6): // NO OF REPETS OF DIVISION OF SEGMENT = GROUPSIZE TO ATTENUATE
  659. ap->lo[ESPK_REPET] = 1; // param 3 // NB ESPK_REPET = ESPK_GATED
  660. ap->hi[ESPK_REPET] = 100;
  661. ap->default_val[ESPK_REPET] = 2;
  662. break;
  663. }
  664. if(!(mode == 1 || mode == 2 || mode == 3)) {
  665. ap->lo[ESPK_RAND] = 0; // param 4
  666. ap->hi[ESPK_RAND] = 1;
  667. ap->default_val[ESPK_RAND] = 0;
  668. }
  669. switch(mode) {
  670. case(6):
  671. ap->lo[ESPK_WHICH] = 1; // param 5 Which segment of each divided syllable is to be processed
  672. ap->hi[ESPK_WHICH] = 100;
  673. ap->default_val[ESPK_WHICH] = 1;
  674. break;
  675. case(7): // fall thro
  676. case(8):
  677. ap->lo[ESPK_RATIO] = 0.1; // param 5 By what ratio does the length of repeated syllables decrease
  678. ap->hi[ESPK_RATIO] = 1.0;
  679. ap->default_val[ESPK_RATIO] = .5;
  680. break;
  681. }
  682. }
  683. switch(mode) {
  684. case(10):
  685. ap->lo[ESPK_SEED] = 0; // param 3 Random seed for perms
  686. ap->hi[ESPK_SEED] = 64;
  687. ap->default_val[ESPK_SEED] = 0;
  688. break;
  689. case(11):
  690. ap->lo[ESPK_NWISE] = 1; // param 3 Group-size for reversal
  691. ap->hi[ESPK_NWISE] = 100;
  692. ap->default_val[ESPK_NWISE] = 2;
  693. break;
  694. }
  695. dz->maxmode = 25;
  696. if(!sloom)
  697. put_default_vals_in_all_params(dz);
  698. return(FINISHED);
  699. }
  700. /********************************* PARSE_SLOOM_DATA *********************************/
  701. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  702. {
  703. int exit_status;
  704. int cnt = 1, infilecnt;
  705. int filesize, insams, inbrksize;
  706. double dummy;
  707. int true_cnt = 0;
  708. // aplptr ap;
  709. while(cnt<=PRE_CMDLINE_DATACNT) {
  710. if(cnt > argc) {
  711. sprintf(errstr,"Insufficient data sent from TK\n");
  712. return(DATA_ERROR);
  713. }
  714. switch(cnt) {
  715. case(1):
  716. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  717. sprintf(errstr,"Cannot read process no. sent from TK\n");
  718. return(DATA_ERROR);
  719. }
  720. break;
  721. case(2):
  722. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  723. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  724. return(DATA_ERROR);
  725. }
  726. if(dz->mode > 0)
  727. dz->mode--;
  728. //setup_particular_application() =
  729. if((exit_status = setup_envspeak_application(dz))<0)
  730. return(exit_status);
  731. // ap = dz->application;
  732. break;
  733. case(3):
  734. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  735. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  736. return(DATA_ERROR);
  737. }
  738. if(infilecnt < 1) {
  739. true_cnt = cnt + 1;
  740. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  741. }
  742. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  743. return(exit_status);
  744. break;
  745. case(INPUT_FILETYPE+4):
  746. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  747. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  748. return(DATA_ERROR);
  749. }
  750. break;
  751. case(INPUT_FILESIZE+4):
  752. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  753. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  754. return(DATA_ERROR);
  755. }
  756. dz->insams[0] = filesize;
  757. break;
  758. case(INPUT_INSAMS+4):
  759. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  760. sprintf(errstr,"Cannot read insams sent from TK\n");
  761. return(DATA_ERROR);
  762. }
  763. dz->insams[0] = insams;
  764. break;
  765. case(INPUT_SRATE+4):
  766. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  767. sprintf(errstr,"Cannot read srate sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_CHANNELS+4):
  772. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  773. sprintf(errstr,"Cannot read channels sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. break;
  777. case(INPUT_STYPE+4):
  778. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  779. sprintf(errstr,"Cannot read stype sent from TK\n");
  780. return(DATA_ERROR);
  781. }
  782. break;
  783. case(INPUT_ORIGSTYPE+4):
  784. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  785. sprintf(errstr,"Cannot read origstype sent from TK\n");
  786. return(DATA_ERROR);
  787. }
  788. break;
  789. case(INPUT_ORIGRATE+4):
  790. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  791. sprintf(errstr,"Cannot read origrate sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. break;
  795. case(INPUT_MLEN+4):
  796. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  797. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  798. return(DATA_ERROR);
  799. }
  800. break;
  801. case(INPUT_DFAC+4):
  802. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  803. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  804. return(DATA_ERROR);
  805. }
  806. break;
  807. case(INPUT_ORIGCHANS+4):
  808. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  809. sprintf(errstr,"Cannot read origchans sent from TK\n");
  810. return(DATA_ERROR);
  811. }
  812. break;
  813. case(INPUT_SPECENVCNT+4):
  814. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  815. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  816. return(DATA_ERROR);
  817. }
  818. dz->specenvcnt = dz->infile->specenvcnt;
  819. break;
  820. case(INPUT_WANTED+4):
  821. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  822. sprintf(errstr,"Cannot read wanted sent from TK\n");
  823. return(DATA_ERROR);
  824. }
  825. break;
  826. case(INPUT_WLENGTH+4):
  827. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  828. sprintf(errstr,"Cannot read wlength sent from TK\n");
  829. return(DATA_ERROR);
  830. }
  831. break;
  832. case(INPUT_OUT_CHANS+4):
  833. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  834. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  835. return(DATA_ERROR);
  836. }
  837. break;
  838. /* RWD these chanegs to samps - tk will have to deal with that! */
  839. case(INPUT_DESCRIPTOR_BYTES+4):
  840. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  841. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  842. return(DATA_ERROR);
  843. }
  844. break;
  845. case(INPUT_IS_TRANSPOS+4):
  846. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  847. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  848. return(DATA_ERROR);
  849. }
  850. break;
  851. case(INPUT_COULD_BE_TRANSPOS+4):
  852. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  853. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  854. return(DATA_ERROR);
  855. }
  856. break;
  857. case(INPUT_COULD_BE_PITCH+4):
  858. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  859. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  860. return(DATA_ERROR);
  861. }
  862. break;
  863. case(INPUT_DIFFERENT_SRATES+4):
  864. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  865. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  866. return(DATA_ERROR);
  867. }
  868. break;
  869. case(INPUT_DUPLICATE_SNDS+4):
  870. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  871. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  872. return(DATA_ERROR);
  873. }
  874. break;
  875. case(INPUT_BRKSIZE+4):
  876. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  877. sprintf(errstr,"Cannot read brksize sent from TK\n");
  878. return(DATA_ERROR);
  879. }
  880. if(inbrksize > 0) {
  881. switch(dz->input_data_type) {
  882. case(WORDLIST_ONLY):
  883. break;
  884. case(PITCH_AND_PITCH):
  885. case(PITCH_AND_TRANSPOS):
  886. case(TRANSPOS_AND_TRANSPOS):
  887. dz->tempsize = inbrksize;
  888. break;
  889. case(BRKFILES_ONLY):
  890. case(UNRANGED_BRKFILE_ONLY):
  891. case(DB_BRKFILES_ONLY):
  892. case(ALL_FILES):
  893. case(ANY_NUMBER_OF_ANY_FILES):
  894. if(dz->extrabrkno < 0) {
  895. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  896. return(DATA_ERROR);
  897. }
  898. if(dz->brksize == NULL) {
  899. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  900. return(PROGRAM_ERROR);
  901. }
  902. dz->brksize[dz->extrabrkno] = inbrksize;
  903. break;
  904. default:
  905. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  906. dz->input_data_type);
  907. return(PROGRAM_ERROR);
  908. }
  909. break;
  910. }
  911. break;
  912. case(INPUT_NUMSIZE+4):
  913. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  914. sprintf(errstr,"Cannot read numsize sent from TK\n");
  915. return(DATA_ERROR);
  916. }
  917. break;
  918. case(INPUT_LINECNT+4):
  919. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  920. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  921. return(DATA_ERROR);
  922. }
  923. break;
  924. case(INPUT_ALL_WORDS+4):
  925. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  926. sprintf(errstr,"Cannot read all_words sent from TK\n");
  927. return(DATA_ERROR);
  928. }
  929. break;
  930. case(INPUT_ARATE+4):
  931. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  932. sprintf(errstr,"Cannot read arate sent from TK\n");
  933. return(DATA_ERROR);
  934. }
  935. break;
  936. case(INPUT_FRAMETIME+4):
  937. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  938. sprintf(errstr,"Cannot read frametime sent from TK\n");
  939. return(DATA_ERROR);
  940. }
  941. dz->frametime = (float)dummy;
  942. break;
  943. case(INPUT_WINDOW_SIZE+4):
  944. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  945. sprintf(errstr,"Cannot read window_size sent from TK\n");
  946. return(DATA_ERROR);
  947. }
  948. break;
  949. case(INPUT_NYQUIST+4):
  950. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  951. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  952. return(DATA_ERROR);
  953. }
  954. break;
  955. case(INPUT_DURATION+4):
  956. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  957. sprintf(errstr,"Cannot read duration sent from TK\n");
  958. return(DATA_ERROR);
  959. }
  960. break;
  961. case(INPUT_MINBRK+4):
  962. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  963. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  964. return(DATA_ERROR);
  965. }
  966. break;
  967. case(INPUT_MAXBRK+4):
  968. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  969. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  970. return(DATA_ERROR);
  971. }
  972. break;
  973. case(INPUT_MINNUM+4):
  974. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  975. sprintf(errstr,"Cannot read minnum sent from TK\n");
  976. return(DATA_ERROR);
  977. }
  978. break;
  979. case(INPUT_MAXNUM+4):
  980. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  981. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  982. return(DATA_ERROR);
  983. }
  984. break;
  985. default:
  986. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  987. return(PROGRAM_ERROR);
  988. }
  989. cnt++;
  990. }
  991. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  992. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  993. return(DATA_ERROR);
  994. }
  995. if(true_cnt)
  996. cnt = true_cnt;
  997. *cmdlinecnt = 0;
  998. while(cnt < argc) {
  999. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  1000. return(exit_status);
  1001. cnt++;
  1002. }
  1003. return(FINISHED);
  1004. }
  1005. /********************************* GET_TK_CMDLINE_WORD *********************************/
  1006. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  1007. {
  1008. if(*cmdlinecnt==0) {
  1009. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  1010. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1011. return(MEMORY_ERROR);
  1012. }
  1013. } else {
  1014. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  1015. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1016. return(MEMORY_ERROR);
  1017. }
  1018. }
  1019. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  1020. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  1021. return(MEMORY_ERROR);
  1022. }
  1023. strcpy((*cmdline)[*cmdlinecnt],q);
  1024. (*cmdlinecnt)++;
  1025. return(FINISHED);
  1026. }
  1027. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  1028. int assign_file_data_storage(int infilecnt,dataptr dz)
  1029. {
  1030. int exit_status;
  1031. int no_sndfile_system_files = FALSE;
  1032. dz->infilecnt = infilecnt;
  1033. if((exit_status = allocate_filespace(dz))<0)
  1034. return(exit_status);
  1035. if(no_sndfile_system_files)
  1036. dz->infilecnt = 0;
  1037. return(FINISHED);
  1038. }
  1039. /************************* redundant functions: to ensure libs compile OK *******************/
  1040. int assign_process_logic(dataptr dz)
  1041. {
  1042. return(FINISHED);
  1043. }
  1044. void set_legal_infile_structure(dataptr dz)
  1045. {}
  1046. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1047. {
  1048. return(FINISHED);
  1049. }
  1050. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1051. {
  1052. return(FINISHED);
  1053. }
  1054. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1055. {
  1056. return(FINISHED);
  1057. }
  1058. int read_special_data(char *str,dataptr dz)
  1059. {
  1060. return(FINISHED);
  1061. }
  1062. int inner_loop
  1063. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1064. {
  1065. return(FINISHED);
  1066. }
  1067. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1068. {
  1069. return(FINISHED);
  1070. }
  1071. /******************************** USAGE1 ********************************/
  1072. int usage1(void)
  1073. {
  1074. usage2("envspeak");
  1075. return(USAGE_ONLY);
  1076. }
  1077. /**************************** CHECK_ENVSPEAK_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  1078. int check_envspeak_param_validity_and_consistency(dataptr dz)
  1079. {
  1080. // NEEDS TO BE DONE WHEN TROFCNT IS KNOWN AND SPLICELEN IN GPSAMPS KNOWN !!!!
  1081. int lastsamp = 0, n, k, sampsize, maxwhich;
  1082. int chans = dz->infile->channels;
  1083. int offset = dz->iparam[ESPK_OFFST];
  1084. int *trof = dz->lparray[0];
  1085. int splicelen, minseg, shorten, mintrofs_needed;
  1086. splicelen = dz->iparam[ESPK_SPLEN] * chans;
  1087. minseg = (splicelen * 2) + chans;
  1088. if(dz->trofcnt == 0) {
  1089. sprintf(errstr,"Trof array not established before testing parameters.\n");
  1090. return PROGRAM_ERROR;
  1091. }
  1092. if(offset >= dz->trofcnt - 2) {
  1093. if (offset == 0)
  1094. sprintf(errstr,"ERROR: too few peaks found (%d).\n",dz->trofcnt);
  1095. else
  1096. sprintf(errstr,"ERROR: Offset (%d) too large for number of peaks found (%d).\n",offset,dz->trofcnt);
  1097. return DATA_ERROR;
  1098. }
  1099. shorten = 0;
  1100. // 2023
  1101. for(n = 1; n <= dz->trofcnt; n++) {
  1102. sampsize = trof[n] - lastsamp;
  1103. if(sampsize < minseg) {
  1104. fprintf(stdout,"Splice Length too long for some of \"syllables\".\nsampsize = %d minseg = %d trof[%d] = %d\n",sampsize,minseg,n,trof[n]);
  1105. //2023
  1106. fprintf(stdout,"Attempting to delete too short \"syllables\".\n");
  1107. shorten = 1;
  1108. fflush(stdout);
  1109. break;
  1110. }
  1111. lastsamp = trof[n];
  1112. }
  1113. if(shorten) {
  1114. lastsamp = 0;
  1115. //2023
  1116. for(n = 1; n <= dz->trofcnt; n++) {
  1117. sampsize = trof[n] - lastsamp;
  1118. while(sampsize < minseg) {
  1119. if(n < dz->trofcnt) {
  1120. k = n + 1;
  1121. while(n < dz->trofcnt)
  1122. trof[n] = trof[k];
  1123. } else
  1124. trof[dz->trofcnt - 1] = trof[dz->trofcnt];
  1125. dz->trofcnt--; // Delete times until intertrof size big enough : decreasing trofcnt accordingly
  1126. if(dz->trofcnt <= 0) {
  1127. sprintf(errstr,"No long-enough segments found, using this splicelength.\n");
  1128. return DATA_ERROR;
  1129. }
  1130. }
  1131. lastsamp = trof[n];
  1132. }
  1133. }
  1134. if(dz->mode == 2 || dz->mode == 3)
  1135. mintrofs_needed = 1 + offset + getmaxattencnt(dz);
  1136. else
  1137. mintrofs_needed = 1;
  1138. if(dz->trofcnt < mintrofs_needed) {
  1139. sprintf(errstr,"Too few trofs found (%d) for this process and offset (%d)\n",dz->trofcnt,mintrofs_needed);
  1140. return DATA_ERROR;
  1141. }
  1142. if(!(dz->mode == 10 || dz->mode == 11)) {
  1143. if(!dz->brksize[ESPK_REPET] && dz->iparam[ESPK_REPET] <= 1) {
  1144. switch(dz->mode) {
  1145. case(0): // fall thro
  1146. case(4): // fall thro
  1147. case(5):
  1148. fprintf(stdout, "WARNING: A repeat value of 1 or less will have no effect : only useful in a brkpoint file.\n");
  1149. break;
  1150. case(2):
  1151. fprintf(stdout, "WARNING: Attenuation count value of 1 or less as no effect : only useful in a brkpoint file.\n");
  1152. break;
  1153. case(3):
  1154. fprintf(stdout, "WARNING: Attenuation count value of 1 or less will produce a silent file: only useful in a brkpoint file.\n");
  1155. break;
  1156. }
  1157. fflush(stdout);
  1158. }
  1159. }
  1160. switch(dz->mode) {
  1161. case(2): // fall thro
  1162. case(3):
  1163. dz->param[ESPK_GAIN] = dbtolevel(dz->param[ESPK_GAIN]);
  1164. break;
  1165. case(6):
  1166. maxwhich = getmaxwhich(dz);
  1167. if(maxwhich > dz->iparam[ESPK_REPET]) {
  1168. if(dz->brksize[ESPK_WHICH])
  1169. sprintf(errstr,"The (maximum) chosen segment (%d) cannot be beyond the number of divisions (%d)\n",maxwhich,dz->iparam[ESPK_REPET]);
  1170. else
  1171. sprintf(errstr,"The chosen segment (%d) cannot be greater than the number of divisions (%d)\n",maxwhich,dz->iparam[ESPK_REPET]);
  1172. return DATA_ERROR;
  1173. }
  1174. break;
  1175. }
  1176. return FINISHED;
  1177. }
  1178. /********************************************************************************************/
  1179. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1180. {
  1181. if(!strcmp(prog_identifier_from_cmdline,"envspeak")) dz->process = ENVSPEAK;
  1182. else {
  1183. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1184. return(USAGE_ONLY);
  1185. }
  1186. return(FINISHED);
  1187. }
  1188. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1189. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1190. {
  1191. int n;
  1192. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1193. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1194. return(MEMORY_ERROR);
  1195. }
  1196. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1197. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1198. return(MEMORY_ERROR);
  1199. }
  1200. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1201. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1202. return(MEMORY_ERROR);
  1203. }
  1204. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1205. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1206. return(MEMORY_ERROR);
  1207. }
  1208. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1209. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1210. return(MEMORY_ERROR);
  1211. }
  1212. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1213. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1214. return(MEMORY_ERROR);
  1215. }
  1216. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1217. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1218. return(MEMORY_ERROR);
  1219. }
  1220. for(n=0;n<brkcnt;n++) {
  1221. dz->brk[n] = NULL;
  1222. dz->brkptr[n] = NULL;
  1223. dz->brkinit[n] = 0;
  1224. dz->brksize[n] = 0;
  1225. }
  1226. return(FINISHED);
  1227. }
  1228. /******************************** USAGE2 ********************************/
  1229. int usage2(char *str)
  1230. {
  1231. if(!strcmp(str,"envspeak")) {
  1232. fprintf(stderr,
  1233. "USAGE:\n"
  1234. "envspeak envspeak 1,5,6 infile outfile wsize splice offset repet rand\n"
  1235. "envspeak envspeak 2 infile outfile wsize splice offset\n"
  1236. "envspeak envspeak 3-4 infile outfile wsize splice offset attencnt dbatten\n"
  1237. "envspeak envspeak 7 infile outfile wsize splice offset div rand which [-z]\n"
  1238. "envspeak envspeak 8-9 infile outfile wsize splice offset repet rand ratio\n"
  1239. "envspeak envspeak 10 infile outfile wsize splice\n"
  1240. "envspeak envspeak 11 infile outfile wsize splice seed\n"
  1241. "envspeak envspeak 12 infile outfile wsize splice Nwise\n"
  1242. "envspeak envspeak 13-24 AS ABOVE BUT replace \"wsize\" by \"cutsfile\"\n"
  1243. "envspeak envspeak 25 infile outfile timesfile\n"
  1244. " Uses data in \"timesfile\" to remove silent gaps at indicated times.\n"
  1245. "\n"
  1246. "Process speech \"syllables\".\n"
  1247. "\n"
  1248. "Mode 1: Repeat each syllables, \"repet\" times.\n"
  1249. "Mode 2: Reverse-repeat each syllable.\n"
  1250. "Modes 3/4: (3) Attenuate N in N+1 syllabs (4) Attenuate all except.\n"
  1251. "Modes 5/6: (5) Repeat each syllab N times, shrinking from end (6) from start.\n"
  1252. "Mode 7: Divide each syllable into N parts, and repeat one of these N times.\n"
  1253. "Mode 8: For each syllab, Repeat, shortening each repetition, lopping-off end.\n"
  1254. "Mode 9: ditto, lopping-off start.\n"
  1255. "Mode 10: Extract all syllables.\n"
  1256. "Mode 11: Randomly reorder syllables.\n"
  1257. "Mode 12: Reverse order syllabs N-wise (e.g.for N=3 abc|def|ghi -> cba|fed|ihj).\n"
  1258. "\n"
  1259. "WSIZE Size of envelope-search window in mS (default 50).\n"
  1260. "CUTSFILE List of times (apart from 0 & end) where infile cut to create syllables.\n"
  1261. "SPLICE Splice length in mS (default 15) \n"
  1262. "OFFSET Number of initial peaks to output unchanged.\n"
  1263. "REPET Number of repetitions of each syllable (Range 2 upwards).\n"
  1264. "ATTENCNT Groupsize (N) of syllabs ...(Mode 3) to attenuate (4) to NOT attenuate.\n"
  1265. " N means N in N+1 : so \"1\" means 1 in 2, \"3\" means 3 in 4 etc \n"
  1266. "DBATTEN Reduce attenuated segments by ATTEN dB: Modes 3-4. (Range -96 to < 0)\n"
  1267. "DIV Keep 1/DIVth part of syllable, to repeat DIV times.\n"
  1268. "WHICH Which syllable-fraction to keep (Range 1 to DIV)\n"
  1269. "-z Repeated elements do NOT grow in size (machine-like quality).\n"
  1270. "RATIO length of repeated elements reduces by RATIO : Range (> 0.0 to 1)\n"
  1271. "RAND Randomisation of lengths of repeated units.\n"
  1272. "NWISE Reverse order in groups of N.\n"
  1273. "SEED Intialisation for random order permutation (Modes 11 only).\n"
  1274. " If Seed > 0, using same seed again, gives IDENTICAL random output.\n"
  1275. "\n"
  1276. "REPET, ATTENCNT, ATTEN and WHICH may vary over time.\n");
  1277. } else
  1278. fprintf(stdout,"Unknown option '%s'\n",str);
  1279. return(USAGE_ONLY);
  1280. }
  1281. int usage3(char *str1,char *str2)
  1282. {
  1283. fprintf(stderr,"Insufficient parameters on command line.\n");
  1284. return(USAGE_ONLY);
  1285. }
  1286. /****************************** GET_MODE *********************************/
  1287. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1288. {
  1289. char temp[200], *p;
  1290. if(sscanf(str,"%s",temp)!=1) {
  1291. sprintf(errstr,"Cannot read mode of program.\n");
  1292. return(USAGE_ONLY);
  1293. }
  1294. p = temp + strlen(temp) - 1;
  1295. while(p >= temp) {
  1296. if(!isdigit(*p)) {
  1297. fprintf(stderr,"Invalid mode of program entered.\n");
  1298. return(USAGE_ONLY);
  1299. }
  1300. p--;
  1301. }
  1302. if(sscanf(str,"%d",&dz->mode)!=1) {
  1303. fprintf(stderr,"Cannot read mode of program.\n");
  1304. return(USAGE_ONLY);
  1305. }
  1306. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1307. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1308. return(USAGE_ONLY);
  1309. }
  1310. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1311. return(FINISHED);
  1312. }
  1313. /****************************** ENVSPEAK *********************************/
  1314. int envspeak(dataptr dz)
  1315. {
  1316. int exit_status, chans = dz->infile->channels, srate = dz->infile->srate, isrand;
  1317. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *ovflwbuf = dz->sampbuf[2], *rbuf = dz->sampbuf[3];
  1318. float temp;
  1319. int gpsplicelen;
  1320. int splicelen = 0, upsplice, mindur = (int)round((double)srate/MINEVENTFRQ) * chans;
  1321. int obufpos = 0, lasttrofat = 0, thistrofat, peaklen, nupeaklen, splicend, rbufpos, upspliclen, thissplicelen;
  1322. int *trof = dz->lparray[0];
  1323. int mintrof, skipback, skipforward, trofdiv, offset, truepeaklen, /* truelasttrofat,*/ origpeaklen, sttseg;
  1324. int gated = 0, n, m, i, j, k, z, nwise;
  1325. double *splicebuf = dz->parray[0], time = 0, roffset, ratio;
  1326. double samps_per_sec = (double)srate * chans;
  1327. char *outfilename;
  1328. int namelen, numlen, *permm = NULL;
  1329. int startcut, endcut, newendcut, /*startbuf,*/ localtrof, samps_to_write;
  1330. int done = 0;
  1331. if(dz->mode < 24) {
  1332. gpsplicelen = dz->iparam[ESPK_SPLEN];
  1333. if(dz->param[ESPK_RAND] > 0.0)
  1334. initrand48();
  1335. splicelen = gpsplicelen * chans;
  1336. }
  1337. switch(dz->mode) {
  1338. case(0): // Repeat
  1339. mintrof = dz->iparam[ESPK_OFFST];
  1340. for(n = 0; n <= dz->trofcnt; n++) {
  1341. thistrofat = trof[n];
  1342. peaklen = thistrofat - lasttrofat;
  1343. splicend = splicelen - 1;
  1344. if(n < mintrof) { // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1345. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1346. if (j < splicelen)
  1347. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1348. else
  1349. obuf[obufpos] = ibuf[m]; // else copy input
  1350. if(++obufpos >= dz->buflen * 2) {
  1351. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1352. return(exit_status);
  1353. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1354. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1355. obufpos -= dz->buflen;
  1356. }
  1357. }
  1358. } else {
  1359. time = (double)thistrofat/(double)samps_per_sec;
  1360. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1361. return PROGRAM_ERROR;
  1362. skipback = 0;
  1363. if(lasttrofat > 0) { // If we're NOT at file start
  1364. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1365. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1366. upsplice = splicelen;
  1367. skipback = splicelen;
  1368. } else
  1369. upsplice = 0; // Prevents initial splice on start of file-segment
  1370. splicend = splicelen - 1;
  1371. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; m < thistrofat; m++,k++,j--) {
  1372. if(k < upsplice)
  1373. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1374. else if (j < splicelen)
  1375. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1376. else
  1377. obuf[obufpos] = ibuf[m]; // just copy
  1378. if(++obufpos >= dz->buflen * 2) {
  1379. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1380. return(exit_status);
  1381. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1382. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1383. obufpos -= dz->buflen;
  1384. }
  1385. }
  1386. obufpos -= splicelen;
  1387. origpeaklen = peaklen;
  1388. if(upsplice == 0) // If peaklen has not already been lengthened
  1389. origpeaklen += splicelen; // do it now
  1390. for(z = 0; z < dz->iparam[ESPK_REPET] - 1; z++) {
  1391. peaklen = origpeaklen;
  1392. thissplicelen = splicelen;
  1393. if(dz->param[ESPK_RAND] > 0.0) { // On each repet, reduce length of repet, at random (lopping bits off end)
  1394. do {
  1395. nupeaklen = randvary_pklen(origpeaklen - splicelen,dz);
  1396. }while (nupeaklen < 2*chans);
  1397. peaklen = nupeaklen + splicelen;
  1398. if(peaklen < splicelen * 2)
  1399. thissplicelen = peaklen/2;
  1400. else
  1401. thissplicelen = splicelen;
  1402. splicend = thissplicelen - 1;
  1403. }
  1404. splicend = splicelen - 1;
  1405. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; k < peaklen; m++,k++,j--) {
  1406. if(k < thissplicelen)
  1407. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1408. else if (j < thissplicelen)
  1409. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[splicend--])); // do downslice
  1410. else
  1411. obuf[obufpos] = ibuf[m]; // just copy
  1412. if(++obufpos >= dz->buflen * 2) {
  1413. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1414. return(exit_status);
  1415. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1416. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1417. obufpos -= dz->buflen;
  1418. }
  1419. }
  1420. }
  1421. }
  1422. lasttrofat = thistrofat;
  1423. }
  1424. break;
  1425. case(1): // Repeat-reversed
  1426. mintrof = dz->iparam[ESPK_OFFST];
  1427. for(n = 0; n <= dz->trofcnt; n++) {
  1428. thistrofat = trof[n];
  1429. peaklen = thistrofat - lasttrofat;
  1430. splicend = splicelen - 1;
  1431. if(n < mintrof) { // Copy infile if process has not yet started
  1432. peaklen = thistrofat;
  1433. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1434. if (j < splicelen)
  1435. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1436. else
  1437. obuf[obufpos] = ibuf[m]; // or just copy
  1438. if(++obufpos >= dz->buflen * 2) {
  1439. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1440. return(exit_status);
  1441. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1442. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1443. obufpos -= dz->buflen;
  1444. }
  1445. }
  1446. } else {
  1447. rbufpos = 0;
  1448. skipback = 0;
  1449. if(lasttrofat > 0) {
  1450. obufpos -= splicelen;
  1451. peaklen += splicelen;
  1452. upspliclen = splicelen;
  1453. skipback = splicelen;
  1454. } else
  1455. upspliclen = 0; // No initial splice
  1456. splicend = splicelen - 1;
  1457. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; m < thistrofat; m++,k++,j--) { // Write to both outbuf and reversing-buf
  1458. rbuf[rbufpos++] = ibuf[m];
  1459. if(k < upspliclen)
  1460. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1461. else if (j < splicelen)
  1462. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[splicend--])); // do downslice
  1463. else
  1464. obuf[obufpos] = ibuf[m]; // just copy
  1465. if(++obufpos >= dz->buflen * 2) {
  1466. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1467. return(exit_status);
  1468. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1469. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1470. obufpos -= dz->buflen;
  1471. }
  1472. }
  1473. if(chans > 1) { // Reverse channel groups in reversed buffer
  1474. for(m = 0; m < rbufpos; m += chans) { // IF NESS
  1475. for(i = 0,k = m, j = m+chans-1; i < chans/2; i++, k++,j--) {
  1476. temp = rbuf[j];
  1477. rbuf[j] = rbuf[k];
  1478. rbuf[k] = temp;
  1479. }
  1480. }
  1481. }
  1482. for(i = 0,m = 0, k = rbufpos - 1; i < rbufpos/2; i++, m++,k--) { // Reverse Entire reverse-buf
  1483. temp = rbuf[m];
  1484. rbuf[m] = rbuf[k];
  1485. rbuf[k] = temp;
  1486. }
  1487. obufpos -= splicelen;
  1488. if(upspliclen == 0) // If peaklen has not already been lengthened
  1489. peaklen += splicelen; // do it now
  1490. splicend = splicelen - 1;
  1491. for(m = 0, j = peaklen - 1; m < peaklen; m++,j--) { // Write reverse-buf to outbuf
  1492. if(m < splicelen)
  1493. obuf[obufpos] = (float)(obuf[obufpos] + (rbuf[m] * splicebuf[m])); // do upslice
  1494. else if (j < splicelen)
  1495. obuf[obufpos] = (float)(obuf[obufpos] + (rbuf[m] * splicebuf[splicend--])); // do downslice
  1496. else
  1497. obuf[obufpos] = rbuf[m]; // just copy
  1498. if(++obufpos >= dz->buflen * 2) {
  1499. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1500. return(exit_status);
  1501. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1502. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1503. obufpos -= dz->buflen;
  1504. }
  1505. }
  1506. }
  1507. lasttrofat = thistrofat;
  1508. }
  1509. break;
  1510. case(2): // fall thro Drop out peaks, in a patterned way
  1511. case(3):
  1512. // PREGROUPED THE GATED AND UNGATED MATERIAL
  1513. gated = 0;
  1514. lasttrofat = 0;
  1515. mintrof = dz->iparam[ESPK_OFFST];
  1516. for(n = 0; n <= dz->trofcnt; n++) {
  1517. thistrofat = trof[n];
  1518. peaklen = thistrofat - lasttrofat;
  1519. splicend = splicelen - 1;
  1520. if(n < mintrof) {
  1521. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1522. if (j < splicelen)
  1523. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice to attenuation level
  1524. else
  1525. obuf[obufpos] = ibuf[m]; // or just copy
  1526. if(++obufpos >= dz->buflen * 2) {
  1527. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1528. return(exit_status);
  1529. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1530. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1531. obufpos -= dz->buflen;
  1532. }
  1533. }
  1534. } else if((dz->mode == 2 && !gated) || (dz->mode == 3 && gated)) {
  1535. skipback = 0;
  1536. if(lasttrofat > 0) { // If we're NOT at file start
  1537. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1538. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1539. upsplice = splicelen;
  1540. skipback = splicelen;
  1541. } else
  1542. upsplice = 0; // Prevents initial splice on start of file-segment
  1543. splicend = splicelen - 1;
  1544. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; m < thistrofat; m++,k++,j--) {
  1545. if(k < upsplice)
  1546. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1547. else if (j < splicelen)
  1548. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[splicend--])); // do downslice
  1549. else
  1550. obuf[obufpos] = ibuf[m]; // just copy
  1551. if(++obufpos >= dz->buflen * 2) {
  1552. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1553. return(exit_status);
  1554. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1555. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1556. obufpos -= dz->buflen;
  1557. }
  1558. }
  1559. gated = !gated;
  1560. } else {
  1561. skipback = 0;
  1562. if(lasttrofat > 0) { // If we're NOT at file start
  1563. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1564. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1565. upsplice = splicelen;
  1566. skipback = splicelen;
  1567. } else
  1568. upsplice = 0; // Prevents initial splice on start of file-segment
  1569. splicend = splicelen - 1;
  1570. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; m < thistrofat; m++,k++,j--) {
  1571. if(k < upsplice)
  1572. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * dz->param[ESPK_GAIN] * splicebuf[k])); // do upslice with attenuate
  1573. else if (j < splicelen)
  1574. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * dz->param[ESPK_GAIN] * splicebuf[splicend--])); // do downslice with attenuate
  1575. else
  1576. obuf[obufpos] = (float)(ibuf[m] * dz->param[ESPK_GAIN]); // just attenuate
  1577. if(++obufpos >= dz->buflen * 2) {
  1578. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1579. return(exit_status);
  1580. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1581. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1582. obufpos -= dz->buflen;
  1583. }
  1584. }
  1585. gated = !gated;
  1586. }
  1587. lasttrofat = thistrofat;
  1588. }
  1589. break;
  1590. case(4): // fall thro // Repeat : Shrink
  1591. case(5):
  1592. mintrof = dz->iparam[ESPK_OFFST];
  1593. for(n = 0; n <= dz->trofcnt; n++) {
  1594. thistrofat = trof[n];
  1595. peaklen = thistrofat - lasttrofat;
  1596. trofdiv = (int)round((double)(peaklen/chans)/(double)dz->iparam[ESPK_REPET]) * chans;
  1597. splicend = splicelen - 1;
  1598. if(n < mintrof) { // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1599. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1600. if (j < splicelen)
  1601. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1602. else
  1603. obuf[obufpos] = ibuf[m]; // else copy input
  1604. if(++obufpos >= dz->buflen * 2) {
  1605. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1606. return(exit_status);
  1607. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1608. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1609. obufpos -= dz->buflen;
  1610. }
  1611. }
  1612. } else {
  1613. time = (double)thistrofat/(double)samps_per_sec;
  1614. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1615. return PROGRAM_ERROR;
  1616. skipback = 0;
  1617. if(lasttrofat > 0) { // If we're NOT at file start
  1618. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1619. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1620. upsplice = splicelen;
  1621. skipback = splicelen;
  1622. } else
  1623. upsplice = 0; // Prevents initial splice on start of file-segment
  1624. splicend = splicelen - 1;
  1625. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; m < thistrofat; m++,k++,j--) {
  1626. if(k < upsplice)
  1627. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1628. else if (j < splicelen)
  1629. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1630. else
  1631. obuf[obufpos] = ibuf[m]; // just copy
  1632. if(++obufpos >= dz->buflen * 2) {
  1633. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1634. return(exit_status);
  1635. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1636. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1637. obufpos -= dz->buflen;
  1638. }
  1639. }
  1640. obufpos -= splicelen;
  1641. truepeaklen = peaklen;
  1642. // truelasttrofat = lasttrofat;
  1643. switch(dz->mode) {
  1644. case(4):
  1645. for(z = 0; z < dz->iparam[ESPK_REPET] - 1; z++) {
  1646. peaklen = truepeaklen;
  1647. peaklen -= trofdiv; // On each repet, reduce length of repeat by loppibf bits of END of seg
  1648. truepeaklen -= trofdiv; // Advance and Remember UNrandomised peaklen
  1649. if(dz->param[ESPK_RAND] > 0.0) {
  1650. roffset = drand48() - 0.5; // Rand range max +- 1/2 peaklen;
  1651. roffset *= dz->param[ESPK_RAND];
  1652. offset = (int)round(roffset * ((peaklen - splicelen)/chans)) * chans; // offset is divisible by chans;
  1653. if(offset != 0)
  1654. peaklen += offset;
  1655. }
  1656. if(peaklen < splicelen * 2)
  1657. thissplicelen = peaklen/2;
  1658. else
  1659. thissplicelen = splicelen;
  1660. splicend = thissplicelen - 1;
  1661. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; k < peaklen; m++,k++,j--) {
  1662. if(k < thissplicelen)
  1663. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1664. else if (j < thissplicelen)
  1665. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[splicend--])); // do downslice
  1666. else
  1667. obuf[obufpos] = ibuf[m]; // just copy
  1668. if(++obufpos >= dz->buflen * 2) {
  1669. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1670. return(exit_status);
  1671. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1672. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1673. obufpos -= dz->buflen;
  1674. }
  1675. }
  1676. }
  1677. break;
  1678. case(5):
  1679. for(z = 0; z < dz->iparam[ESPK_REPET] - 1; z++) {
  1680. peaklen = truepeaklen;
  1681. peaklen -= trofdiv;
  1682. truepeaklen -= trofdiv;
  1683. lasttrofat = thistrofat - peaklen;
  1684. lasttrofat += trofdiv; // On each repet, reduce length of repeat by lopping bits off start of seg
  1685. offset = 0;
  1686. if(dz->param[ESPK_RAND] > 0.0) {
  1687. while(peaklen < chans * 2) { // Avoid negative-length segments
  1688. roffset = drand48() - 0.5; // Rand range max +- 1/2 peaklen TIMES the entered rand param (0-1)
  1689. roffset *= dz->param[ESPK_RAND]; // Offset is divisible by chans;
  1690. offset = (int)round(roffset * ((peaklen - splicelen)/2/chans)) * chans;
  1691. peaklen += offset;
  1692. } // If peaklen shorter than upsplive+ downsplice
  1693. } // Shorten "thisspilcelen"
  1694. if(peaklen < splicelen * 2) // This causes splice table to be read up to, and then down from
  1695. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  1696. else
  1697. thissplicelen = splicelen;
  1698. lasttrofat = thistrofat - (peaklen - thissplicelen);
  1699. splicend = thissplicelen - 1;
  1700. for(k = 0, j = peaklen - 1, m = lasttrofat; k < peaklen; m++,k++,j--) {
  1701. if(k < thissplicelen)
  1702. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1703. else if (j < thissplicelen)
  1704. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[splicend--])); // do downslice
  1705. else
  1706. obuf[obufpos] = ibuf[m]; // just copy
  1707. if(++obufpos >= dz->buflen * 2) {
  1708. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1709. return(exit_status);
  1710. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1711. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1712. obufpos -= dz->buflen;
  1713. }
  1714. }
  1715. }
  1716. break;
  1717. }
  1718. }
  1719. lasttrofat = thistrofat;
  1720. }
  1721. break;
  1722. case(6): // Repeat divided element of syllables
  1723. mintrof = dz->iparam[ESPK_OFFST];
  1724. isrand = 0;
  1725. for(n = 0; n <= dz->trofcnt; n++) {
  1726. thistrofat = trof[n];
  1727. peaklen = thistrofat - lasttrofat;
  1728. trofdiv = (int)round((double)(peaklen/chans)/(double)dz->iparam[ESPK_REPET]) * chans;
  1729. trofdiv = max(trofdiv,mindur);
  1730. splicend = splicelen - 1;
  1731. if(n < mintrof) { // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1732. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1733. if (j < splicelen)
  1734. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1735. else
  1736. obuf[obufpos] = ibuf[m]; // else copy input
  1737. if(++obufpos >= dz->buflen * 2) {
  1738. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1739. return(exit_status);
  1740. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1741. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1742. obufpos -= dz->buflen;
  1743. }
  1744. }
  1745. } else {
  1746. time = (double)thistrofat/(double)samps_per_sec;
  1747. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1748. return PROGRAM_ERROR;
  1749. skipback = 0;
  1750. peaklen = trofdiv; // 1/Nth part of syllable only, to be repeated N times
  1751. origpeaklen = peaklen;
  1752. skipforward = (dz->iparam[ESPK_WHICH] - 1) * trofdiv; // Finds seg to repeat
  1753. for(z = 0; z < dz->iparam[ESPK_REPET]; z++) {
  1754. if(isrand)
  1755. peaklen = origpeaklen;
  1756. skipback = splicelen;
  1757. if((sttseg = lasttrofat + skipforward - skipback) >= 0) {
  1758. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1759. if(dz->vflag[0]) {
  1760. /* HEREH */
  1761. if(z == 0)
  1762. peaklen += splicelen;
  1763. } else {
  1764. peaklen += splicelen; // length of peaks increase
  1765. peaklen = min(peaklen,dz->insams[0]);
  1766. }
  1767. upsplice = splicelen;
  1768. lasttrofat = thistrofat - peaklen;
  1769. } else {
  1770. sttseg = 0;
  1771. upsplice = 0; // Prevents initial splice on start of 1st file-segment
  1772. }
  1773. origpeaklen = peaklen;
  1774. isrand = 0;
  1775. if(dz->param[ESPK_RAND] > 0.0) {
  1776. roffset = drand48() - 0.5; // Rand range max +- 1/2 peaklen;
  1777. roffset *= dz->param[ESPK_RAND];
  1778. offset = (int)round(roffset * ((peaklen - splicelen)/chans)) * chans; // offset is divisible by chans;
  1779. peaklen += offset;
  1780. isrand = 1;
  1781. }
  1782. if(peaklen < splicelen * 2) { // This causes splice table to be read up to, and then down from
  1783. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  1784. if(upsplice > 0)
  1785. upsplice = thissplicelen;
  1786. } else {
  1787. thissplicelen = splicelen;
  1788. if(upsplice > 0)
  1789. upsplice = thissplicelen;
  1790. }
  1791. splicend = splicelen - 1;
  1792. for(k = 0, j = peaklen - 1, m = sttseg; k < peaklen; m++,k++,j--) {
  1793. if(k < upsplice)
  1794. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1795. else if (j < thissplicelen)
  1796. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1797. else
  1798. obuf[obufpos] = ibuf[m]; // just copy
  1799. if(++obufpos >= dz->buflen * 2) {
  1800. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1801. return(exit_status);
  1802. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1803. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1804. obufpos -= dz->buflen;
  1805. }
  1806. }
  1807. }
  1808. }
  1809. lasttrofat = thistrofat;
  1810. }
  1811. break;
  1812. case(7): // Repeat syllables, diminishing in length, lopping off end
  1813. mintrof = dz->iparam[ESPK_OFFST];
  1814. isrand = 0;
  1815. for(n = 0; n <= dz->trofcnt; n++) {
  1816. thistrofat = trof[n];
  1817. peaklen = thistrofat - lasttrofat;
  1818. origpeaklen = peaklen;
  1819. ratio = dz->param[ESPK_RATIO];
  1820. splicend = splicelen - 1;
  1821. if(n < mintrof) { // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1822. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1823. if (j < splicelen)
  1824. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1825. else
  1826. obuf[obufpos] = ibuf[m]; // else copy input
  1827. if(++obufpos >= dz->buflen * 2) {
  1828. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1829. return(exit_status);
  1830. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1831. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1832. obufpos -= dz->buflen;
  1833. }
  1834. }
  1835. } else {
  1836. time = (double)thistrofat/(double)samps_per_sec;
  1837. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1838. return PROGRAM_ERROR;
  1839. for(z = 0; z < dz->iparam[ESPK_REPET]; z++) {
  1840. peaklen = origpeaklen;
  1841. if(lasttrofat > 0) {
  1842. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1843. peaklen += splicelen; // include pre-splice
  1844. skipback = splicelen;
  1845. upsplice = splicelen;
  1846. } else {
  1847. upsplice = 0; // Prevents initial splice on start of 1st file-segment
  1848. skipback = 0;
  1849. }
  1850. isrand = 0;
  1851. if(dz->param[ESPK_RAND] > 0.0) {
  1852. roffset = drand48() - 0.5; // Rand range max +- 1/2 peaklen;
  1853. roffset *= dz->param[ESPK_RAND];
  1854. offset = (int)round(roffset * ((peaklen - splicelen)/chans)) * chans; // offset is divisible by chans;
  1855. peaklen += offset;
  1856. isrand = 1;
  1857. }
  1858. if(peaklen < splicelen * 2) { // This causes splice table to be read up to, and then down from
  1859. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  1860. if(upsplice > 0)
  1861. upsplice = thissplicelen;
  1862. } else {
  1863. thissplicelen = splicelen;
  1864. if(upsplice > 0)
  1865. upsplice = thissplicelen;
  1866. }
  1867. splicend = splicelen - 1;
  1868. for(k = 0, j = peaklen - 1, m = lasttrofat - skipback; k < peaklen; m++,k++,j--) {
  1869. if(k < upsplice)
  1870. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1871. else if (j < thissplicelen)
  1872. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1873. else
  1874. obuf[obufpos] = ibuf[m]; // just copy
  1875. if(++obufpos >= dz->buflen * 2) {
  1876. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1877. return(exit_status);
  1878. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1879. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1880. obufpos -= dz->buflen;
  1881. }
  1882. }
  1883. origpeaklen = (int)round((double)(origpeaklen/chans) * ratio) * chans;
  1884. origpeaklen = max(origpeaklen,mindur);
  1885. }
  1886. }
  1887. lasttrofat = thistrofat;
  1888. }
  1889. break;
  1890. case(8): // Repeat syllables, diminishing in length, lopping off start
  1891. mintrof = dz->iparam[ESPK_OFFST];
  1892. isrand = 0;
  1893. for(n = 0; n <= dz->trofcnt; n++) {
  1894. thistrofat = trof[n];
  1895. peaklen = thistrofat - lasttrofat;
  1896. origpeaklen = peaklen;
  1897. ratio = dz->param[ESPK_RATIO];
  1898. splicend = splicelen - 1;
  1899. if(n < mintrof) { // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1900. for(j = peaklen - 1, m = 0; m < thistrofat; m++,j--) {
  1901. if (j < splicelen)
  1902. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1903. else
  1904. obuf[obufpos] = ibuf[m]; // else copy input
  1905. if(++obufpos >= dz->buflen * 2) {
  1906. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1907. return(exit_status);
  1908. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1909. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1910. obufpos -= dz->buflen;
  1911. }
  1912. }
  1913. } else {
  1914. time = (double)thistrofat/(double)samps_per_sec;
  1915. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1916. return PROGRAM_ERROR;
  1917. for(z = 0; z < dz->iparam[ESPK_REPET]; z++) {
  1918. peaklen = origpeaklen;
  1919. if(lasttrofat > 0) {
  1920. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1921. peaklen += splicelen; // include pre-splice
  1922. skipback = splicelen;
  1923. upsplice = splicelen;
  1924. } else {
  1925. upsplice = 0; // Prevents initial splice on start of 1st file-segment
  1926. skipback = 0;
  1927. }
  1928. isrand = 0;
  1929. if(dz->param[ESPK_RAND] > 0.0) {
  1930. roffset = drand48() - 0.5; // Rand range max +- 1/2 peaklen;
  1931. roffset *= dz->param[ESPK_RAND];
  1932. offset = (int)round(roffset * ((peaklen - splicelen)/chans)) * chans; // offset is divisible by chans;
  1933. peaklen += offset;
  1934. isrand = 1;
  1935. }
  1936. if(peaklen < splicelen * 2) { // This causes splice table to be read up to, and then down from
  1937. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  1938. if(upsplice > 0)
  1939. upsplice = thissplicelen;
  1940. } else {
  1941. thissplicelen = splicelen;
  1942. if(upsplice > 0)
  1943. upsplice = thissplicelen;
  1944. }
  1945. splicend = splicelen - 1;
  1946. for(k = 0, j = peaklen - 1, m = max(0,thistrofat - peaklen); k < peaklen; m++,k++,j--) {
  1947. if(k < upsplice)
  1948. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  1949. else if (j < thissplicelen)
  1950. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  1951. else
  1952. obuf[obufpos] = ibuf[m]; // just copy
  1953. if(++obufpos >= dz->buflen * 2) {
  1954. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1955. return(exit_status);
  1956. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1957. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1958. obufpos -= dz->buflen;
  1959. }
  1960. }
  1961. origpeaklen = (int)round((double)(origpeaklen/chans) * ratio) * chans;
  1962. origpeaklen = max(origpeaklen,mindur);
  1963. }
  1964. }
  1965. lasttrofat = thistrofat;
  1966. }
  1967. break;
  1968. case(9): // Extract syllables
  1969. namelen = strlen(dz->wordstor[0]);
  1970. numlen = 4;
  1971. if((outfilename = (char *)malloc((namelen + numlen + 1) * sizeof(char)))==NULL) {
  1972. sprintf(errstr,"INSUFFICIENT MEMORY to store outfilenames.\n");
  1973. return(MEMORY_ERROR);
  1974. }
  1975. for(n = 0; n <= dz->trofcnt; n++) {
  1976. obufpos = 0;
  1977. if(n > 0) {
  1978. if((exit_status = open_next_file(outfilename,n,dz)) < 0)
  1979. return exit_status;
  1980. }
  1981. thistrofat = trof[n];
  1982. peaklen = thistrofat - lasttrofat;
  1983. splicend = splicelen - 1;
  1984. if(lasttrofat > 0) {
  1985. peaklen += splicelen; // include pre-splice
  1986. upsplice = splicelen;
  1987. } else {
  1988. upsplice = 0; // Prevents initial splice on start of 1st file-segment
  1989. }
  1990. if(peaklen < splicelen * 2) { // This causes splice table to be read up to, and then down from
  1991. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  1992. if(upsplice > 0)
  1993. upsplice = thissplicelen;
  1994. } else {
  1995. thissplicelen = splicelen;
  1996. if(upsplice > 0)
  1997. upsplice = thissplicelen;
  1998. }
  1999. dz->total_samps_written = 0;
  2000. dz->tempsize = peaklen;
  2001. splicend = splicelen - 1;
  2002. for(k = 0, j = peaklen - 1, m = thistrofat - peaklen; k < peaklen; m++,k++,j--) {
  2003. if(k < upsplice)
  2004. obuf[obufpos] = (float)(ibuf[m] * splicebuf[k]); // do upslice
  2005. else if (j < thissplicelen)
  2006. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  2007. else
  2008. obuf[obufpos] = ibuf[m]; // just copy
  2009. if(++obufpos >= dz->buflen * 2) {
  2010. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2011. return(exit_status);
  2012. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2013. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2014. obufpos -= dz->buflen;
  2015. }
  2016. }
  2017. if(obufpos) {
  2018. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  2019. return(exit_status);
  2020. }
  2021. lasttrofat = thistrofat;
  2022. }
  2023. obufpos = 0;
  2024. break;
  2025. case(10): // fall thro // Randomise order
  2026. case(11): // N-wise permute order
  2027. switch(dz->mode) {
  2028. case(10):
  2029. if(dz->iparam[ESPK_SEED] > 0)
  2030. srand((int)dz->iparam[ESPK_SEED]);
  2031. else
  2032. initrand48();
  2033. randperm(0,dz->trofcnt+1,dz);
  2034. permm = dz->iparray[0];
  2035. break;
  2036. case(11):
  2037. permm = dz->iparray[0];
  2038. if(dz->brksize[ESPK_NWISE]) {
  2039. time = 0.0;
  2040. if((exit_status = read_value_from_brktable(time,ESPK_NWISE,dz))<0)
  2041. return exit_status;
  2042. }
  2043. i = 0;
  2044. for(k = 0; k <= dz->trofcnt; k += nwise) {
  2045. nwise = dz->iparam[ESPK_NWISE];
  2046. z = min(k + nwise,dz->trofcnt+1);
  2047. do {
  2048. z--;
  2049. permm[i++] = z; // Store reverse-ordered groups
  2050. } while(z > k);
  2051. if(dz->brksize[ESPK_NWISE]) {
  2052. time = (double)trof[k]/(double)samps_per_sec;
  2053. if((exit_status = read_value_from_brktable(time,ESPK_NWISE,dz))<0)
  2054. return exit_status;
  2055. }
  2056. }
  2057. break;
  2058. }
  2059. for(n = 0; n <= dz->trofcnt; n++) {
  2060. k = permm[n];
  2061. thistrofat = trof[k--];
  2062. if(k < 0)
  2063. lasttrofat = 0;
  2064. else
  2065. lasttrofat = trof[k];
  2066. peaklen = thistrofat - lasttrofat;
  2067. splicend = splicelen - 1;
  2068. if(lasttrofat > 0) {
  2069. obufpos -= splicelen; // baktrak to splice to end of last segment written
  2070. peaklen += splicelen; // include pre-splice
  2071. upsplice = splicelen;
  2072. } else
  2073. upsplice = 0; // Prevents initial splice on start of 1st file-segment
  2074. if(peaklen < splicelen * 2) { // This causes splice table to be read up to, and then down from
  2075. thissplicelen = peaklen/2; // ony a part of it, but still gives equivalent up and down splices
  2076. if(upsplice > 0)
  2077. upsplice = thissplicelen;
  2078. } else {
  2079. thissplicelen = splicelen;
  2080. if(upsplice > 0)
  2081. upsplice = thissplicelen;
  2082. }
  2083. splicend = splicelen - 1;
  2084. for(k = 0, j = peaklen - 1, m = max(0,thistrofat - peaklen); k < peaklen; m++,k++,j--) {
  2085. if(k < upsplice)
  2086. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[m] * splicebuf[k])); // do upslice
  2087. else if (j < thissplicelen)
  2088. obuf[obufpos] = (float)(ibuf[m] * splicebuf[splicend--]); // do downslice
  2089. else
  2090. obuf[obufpos] = ibuf[m]; // just copy
  2091. if(++obufpos >= dz->buflen * 2) {
  2092. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2093. return(exit_status);
  2094. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2095. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2096. obufpos -= dz->buflen;
  2097. }
  2098. }
  2099. lasttrofat = thistrofat;
  2100. }
  2101. break;
  2102. case(24):
  2103. obufpos = 0; // No extra write at end
  2104. k = 0;
  2105. endcut = 0;
  2106. // startbuf = 0;
  2107. if((dz->ssampsread = fgetfbufEx(ibuf, dz->buflen,dz->ifd[0],0)) < 0) {
  2108. sprintf(errstr,"Can't read samples from soundfile.\n");
  2109. return(SYSTEM_ERROR);
  2110. }
  2111. while(k < dz->trofcnt) {
  2112. localtrof = trof[k];
  2113. if(ibuf[localtrof] != 0.0) {
  2114. sprintf(errstr,"Time %lf is not in a zero-level part of the sound.\n",(double)trof[k]/srate);
  2115. return(DATA_ERROR);
  2116. }
  2117. while(flteq(ibuf[localtrof],0.0)) {
  2118. localtrof--;
  2119. if(localtrof < 0) {
  2120. localtrof = 0;
  2121. break;
  2122. }
  2123. }
  2124. startcut = localtrof;
  2125. startcut = startcut/chans; // Allow for multichan files
  2126. startcut *= chans;
  2127. localtrof = trof[k];
  2128. while(flteq(ibuf[localtrof],0.0)) {
  2129. localtrof++;
  2130. if(localtrof >= dz->insams[0]) {
  2131. localtrof = dz->insams[0];
  2132. break;
  2133. }
  2134. }
  2135. newendcut = localtrof;
  2136. newendcut /= chans;
  2137. newendcut *= chans;
  2138. samps_to_write = startcut - endcut;
  2139. ibuf += endcut;
  2140. if((exit_status = write_samps(ibuf,samps_to_write,dz))<0)
  2141. return(exit_status);
  2142. ibuf -= endcut;
  2143. endcut = newendcut;
  2144. if(done)
  2145. break;
  2146. k++;
  2147. }
  2148. if(endcut < dz->insams[0]) {
  2149. samps_to_write = dz->insams[0] - endcut;
  2150. ibuf += endcut;
  2151. if((exit_status = write_samps(ibuf,samps_to_write,dz))<0)
  2152. return(exit_status);
  2153. ibuf -= endcut;
  2154. }
  2155. break;
  2156. }
  2157. if(obufpos) {
  2158. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  2159. return(exit_status);
  2160. }
  2161. return FINISHED;
  2162. }
  2163. /*************************************** EXTRACT_ENV_FROM_SNDFILE **************************/
  2164. int extract_env_from_sndfile(dataptr dz)
  2165. {
  2166. int exit_status;
  2167. float *envptr;
  2168. dz->envcnt = windows_in_sndfile(dz);
  2169. if((dz->fptr[0]=(float *)malloc((dz->envcnt+20) * sizeof(float)))==NULL) {
  2170. sprintf(errstr,"INSUFFICIENT MEMORY to store envelope (2).\n");
  2171. return(MEMORY_ERROR);
  2172. }
  2173. envptr = dz->fptr[0];
  2174. dz->ssampsread = 1;
  2175. while(dz->ssampsread > 0) {
  2176. if((dz->ssampsread = fgetfbufEx(dz->sampbuf[0], dz->buflen,dz->ifd[0],0)) < 0) {
  2177. sprintf(errstr,"Can't read samples from soundfile: extract_env_from_sndfile()\n");
  2178. return(SYSTEM_ERROR);
  2179. }
  2180. if(sloom)
  2181. display_virtual_time(dz->total_samps_read,dz);
  2182. if((exit_status = getenv_of_buffer(dz->ssampsread,&envptr,dz))<0)
  2183. return exit_status;
  2184. }
  2185. dz->fptr[1] = envptr; // envend
  2186. if((exit_status = sndseekEx(dz->ifd[0],0,0))<0) {
  2187. sprintf(errstr,"Failed to return to start of file.\n");
  2188. return SYSTEM_ERROR;
  2189. }
  2190. dz->total_samps_read = 0;
  2191. return(FINISHED);
  2192. }
  2193. /************************* GETENV_OF_BUFFER [READENV] *******************************/
  2194. int getenv_of_buffer(int samps_to_process,float **envptr,dataptr dz)
  2195. {
  2196. int start_samp = 0;
  2197. int envwindow_sampsize = dz->iparam[ESPK_WINSZ];
  2198. float *ibuf = dz->sampbuf[0];
  2199. float *env = *envptr;
  2200. double convertor = 1.0/F_ABSMAXSAMP;
  2201. while(samps_to_process >= envwindow_sampsize) {
  2202. *env++ = (float) (getmaxsamp(start_samp,envwindow_sampsize,ibuf) * convertor);
  2203. start_samp += envwindow_sampsize;
  2204. samps_to_process -= envwindow_sampsize;
  2205. }
  2206. if(samps_to_process) /* Handle any final short buffer */
  2207. *env++ = (float)(getmaxsamp(start_samp,samps_to_process,ibuf) * convertor);
  2208. *envptr = env;
  2209. return FINISHED;
  2210. }
  2211. /****************************** WINDOWS_IN_SNDFILE [GET_ENVSIZE] ******************************/
  2212. int windows_in_sndfile(dataptr dz)
  2213. {
  2214. int envcnt, winsize = dz->iparam[ESPK_WINSZ];
  2215. if(((envcnt = dz->insams[0]/winsize) * winsize)!=dz->insams[0])
  2216. envcnt++;
  2217. return envcnt;
  2218. }
  2219. /*************************** GETMAXSAMP *****************************/
  2220. double getmaxsamp(int startsamp, int sampcnt,float *buffer)
  2221. {
  2222. int i, endsamp = startsamp + sampcnt;
  2223. double thisval, thismaxsamp = 0.0;
  2224. for(i = startsamp; i<endsamp; i++) {
  2225. if((thisval = fabs(buffer[i]))>thismaxsamp)
  2226. thismaxsamp = thisval;
  2227. }
  2228. return thismaxsamp;
  2229. }
  2230. /*************************** ENVTROFSGET *************************/
  2231. int envtrofsget(dataptr dz)
  2232. {
  2233. int /*done,*/ n, k, m;
  2234. int upwards, troffcnt = 0, thistrofat, lasttrofat, envcnt, peaklen, ovflw;
  2235. int *trof;
  2236. float *p, *q;
  2237. int envwindow_sampsize = dz->iparam[ESPK_WINSZ];
  2238. int minseglen = (dz->iparam[ESPK_SPLEN] * 2) * dz->infile->channels; // Minimum segment to cut is larger than 2 splices.
  2239. float *env, *envend;
  2240. env = dz->fptr[0];
  2241. envend = dz->fptr[1];
  2242. // 2 gpsplices * chans;
  2243. p = env+1;
  2244. q = env;
  2245. if (*p > *q)
  2246. upwards = TRUE;
  2247. else
  2248. upwards = FALSE;
  2249. troffcnt = 0;
  2250. lasttrofat = 0;
  2251. envcnt = 0;
  2252. while(p < envend) {
  2253. if(upwards) {
  2254. if(*p < *q) {
  2255. upwards = FALSE;
  2256. }
  2257. } else {
  2258. if(*p > *q) { // Peak-segments (separated by trofs)
  2259. if(istrof(env,envend,q,ENVSPEAK_PKSRCHWIDTH)) {
  2260. thistrofat = envcnt * envwindow_sampsize;
  2261. peaklen = thistrofat - lasttrofat;
  2262. if(peaklen > minseglen) { // Peak-segments must be longer than 2 splices
  2263. troffcnt++; // This also skips getting a trof AT 0 time
  2264. lasttrofat = thistrofat;
  2265. }
  2266. }
  2267. upwards = TRUE;
  2268. }
  2269. }
  2270. p++;
  2271. q++;
  2272. envcnt++;
  2273. }
  2274. if(dz->mode == 10 || dz->mode == 11) {
  2275. if((dz->iparray = (int **)malloc(sizeof(int *))) == NULL) {
  2276. sprintf(errstr,"INSUFFICIENT MEMORY to store peak-locations.\n");
  2277. return(MEMORY_ERROR);
  2278. }
  2279. if((dz->iparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) {// Storage for permed or swapped syllable order
  2280. sprintf(errstr,"INSUFFICIENT MEMORY to store peak-locations.\n");
  2281. return(MEMORY_ERROR);
  2282. }
  2283. }
  2284. trof = dz->lparray[0];
  2285. dz->trofcnt = troffcnt;
  2286. envcnt = 0;
  2287. p = env+1;
  2288. q = env;
  2289. if (*p > *q)
  2290. upwards = TRUE;
  2291. else
  2292. upwards = FALSE;
  2293. troffcnt = 0;
  2294. lasttrofat = 0;
  2295. envcnt = 0;
  2296. while(envcnt < dz->envcnt) {
  2297. if(upwards) {
  2298. if(*p < *q) {
  2299. upwards = FALSE;
  2300. }
  2301. } else {
  2302. if(*p > *q) { // Peak-segments (separated by trofs)
  2303. if(istrof(env,envend,q,ENVSPEAK_PKSRCHWIDTH)) {
  2304. thistrofat = envcnt * envwindow_sampsize;
  2305. peaklen = thistrofat - lasttrofat;
  2306. if(peaklen > minseglen) {
  2307. trof[troffcnt++] = envcnt * dz->iparam[ESPK_WINSZ]; // Peak-segments must be longer than 2 splices
  2308. lasttrofat = thistrofat; // This also skips getting a trof AT 0 time
  2309. }
  2310. }
  2311. upwards = TRUE;
  2312. }
  2313. }
  2314. p++;
  2315. q++;
  2316. envcnt++;
  2317. }
  2318. trof[troffcnt] = dz->insams[0]; // Add trof at EOF
  2319. if(dz->mode == 2 || dz->mode == 3) { // PREGROUP (i.e. shuffle-down overwrite) THE SETS OF ATTENUATED SEGMENTS
  2320. // done = 0; // Say we hape attenSTEP = 3
  2321. for(n = 0; n < dz->trofcnt; n+=2) { // At every trof value To merge (for attenuating) N segments, Shuffle down N-1 times
  2322. if(n < dz->iparam[ESPK_OFFST]) // (last time tx is EOF and is AT trofcnt)
  2323. continue; // To delete N trofs, shuffle down N-1 timings t0 t1 t2 t3 t4 t5 t6 t7 (tx)
  2324. k = n + 1; // t0 MERGED t3 t4 t5 t6 t7 (tx)
  2325. m = n + dz->iparam[ESPK_GATED]; // t0 t3 t4 t5 t6 t7 (tx) REDUCE trofcnt by N-1
  2326. if((ovflw = m - dz->trofcnt) >= 0) { //
  2327. trof[k] = trof[dz->trofcnt]; // If at array end
  2328. dz->trofcnt -= (dz->iparam[ESPK_GATED] - ovflw); // t1 t2 t3 t4 (tx) OR t1 t2 t3 (tx) OR t1 t2 (tx)
  2329. // done = 1; // n k m n k m n k - m
  2330. break; // Copy(tx) into k :
  2331. } else { // OVFLW = m - End = 0 OVFLW = m - End = 1 OVFLW = m - End = 2
  2332. for(/* k, m */; m <= dz->trofcnt; k++,m++) { // Reduce trofcnt by 0 Reduce trofcnt by 1 Reduce trofcnt by 2
  2333. trof[k] = trof[m]; //RWD can hide unused vars above
  2334. }
  2335. dz->trofcnt -= dz->iparam[ESPK_GATED] - 1; // DEFAULT
  2336. }
  2337. }
  2338. }
  2339. if(dz->trofcnt <= 0) {
  2340. sprintf(errstr,"FAILED TO FIND ANY ENVELOPE TROUGHS IN THE FILE.\n");
  2341. return DATA_ERROR;
  2342. }
  2343. return(FINISHED);
  2344. }
  2345. /*************************** CREATE_SNDBUFS_FOR_ENVEL **************************
  2346. *
  2347. * Only AFTER params have been read.
  2348. */
  2349. int create_sndbufs_for_envel(dataptr dz)
  2350. {
  2351. int bigbufsize;
  2352. int n;
  2353. /* All other cases */
  2354. if(dz->bufcnt < 4) {
  2355. sprintf(errstr,"bufcnt too low : must be at least 4.\n");
  2356. return(PROGRAM_ERROR);
  2357. }
  2358. if(dz->sbufptr == 0 || dz->sampbuf == 0) {
  2359. sprintf(errstr,"buffer pointers not allocated: create_sndbufs_for_envel()\n");
  2360. return(PROGRAM_ERROR);
  2361. }
  2362. dz->buflen = dz->insams[0];
  2363. bigbufsize = dz->buflen * (dz->bufcnt + 1) * sizeof(float); //RWD ?? surely we need this further buf
  2364. if((dz->bigbuf = (float *)malloc((bigbufsize))) == NULL) {
  2365. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  2366. return(MEMORY_ERROR);
  2367. }
  2368. { // RWD 13/23: debugging, looking for use of uninitialized memory
  2369. unsigned int fbufsize = bigbufsize / sizeof(float);
  2370. unsigned int i;
  2371. for(i=0; i < fbufsize;i++)
  2372. dz->bigbuf[i] = 0.0f; // set to 1.0 to show anomalies
  2373. }
  2374. /* RWD 13/23 */
  2375. for(n=0;n<=dz->bufcnt;n++) // Leave making reversing buf till max size assessed
  2376. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  2377. //dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  2378. return(FINISHED);
  2379. }
  2380. /*************************** ISTROF **********************************/
  2381. int istrof(float *env,float *envend,float *q,int width)
  2382. {
  2383. int up, down;
  2384. float *upq, *downq, *r;
  2385. if(width<2)
  2386. return(TRUE);
  2387. down = up = width/2;
  2388. if(EVEN(width))
  2389. down = up - 1; /* set search params above and below q */
  2390. downq = q - down;
  2391. upq = q + up;
  2392. upq = min(envend-1,upq); /* allow for ends of envelope table */
  2393. downq = max(env,downq);
  2394. for(r = downq; r<=upq; r++) {
  2395. if(*q > *r)
  2396. return(FALSE);
  2397. }
  2398. return(TRUE); /* if r is minimum of all in peak, return 1 */
  2399. }
  2400. /*************************** PRECALCULATE_PEAKS_ARRAY_AND_SPLICE **********************************/
  2401. int precalculate_peaks_array_and_splice(dataptr dz)
  2402. {
  2403. int exit_status, chans = dz->infile->channels;
  2404. int gpsplicelen, splicelen, n, m, k;
  2405. double splicincr, *splicebuf;
  2406. int srate = dz->infile->srate;
  2407. dz->iparam[ESPK_SPLEN] = (int)round(dz->param[ESPK_SPLEN] * MS_TO_SECS * (double)srate);
  2408. gpsplicelen = dz->iparam[ESPK_SPLEN];
  2409. splicelen = gpsplicelen * chans;
  2410. splicincr = 1.0/(double)gpsplicelen;
  2411. if((dz->parray[0] = (double *)malloc((splicelen * sizeof(double)))) == NULL) {
  2412. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (2).\n");
  2413. return(MEMORY_ERROR);
  2414. }
  2415. splicebuf = dz->parray[0];
  2416. for(n= 0, m = 0;n < gpsplicelen; n++, m += chans) {
  2417. for(k = 0; k < chans; k++)
  2418. splicebuf[m+k] = (double)n * splicincr;
  2419. }
  2420. if(dz->mode < 12) {
  2421. dz->iparam[ESPK_WINSZ] = (int)round(dz->param[ESPK_WINSZ] * MS_TO_SECS * (double)srate) * chans;
  2422. if((exit_status = extract_env_from_sndfile(dz))< 0)
  2423. return exit_status;
  2424. if((dz->lparray=(int **)malloc(sizeof(int *)))==NULL) {
  2425. sprintf(errstr,"INSUFFICIENT MEMORY to store peaks.\n");
  2426. return(MEMORY_ERROR);
  2427. }
  2428. if((dz->lparray[0]=(int *)malloc(dz->envcnt * sizeof(int)))==NULL) {
  2429. sprintf(errstr,"INSUFFICIENT MEMORY to store peaks (2).\n");
  2430. return(MEMORY_ERROR);
  2431. }
  2432. if((exit_status = envtrofsget(dz))< 0)
  2433. return exit_status;
  2434. } else {
  2435. dz->ssampsread = 1;
  2436. while(dz->ssampsread > 0) {
  2437. if((dz->ssampsread = fgetfbufEx(dz->sampbuf[0], dz->buflen,dz->ifd[0],0)) < 0) {
  2438. sprintf(errstr,"Can't read samples from soundfile: getcutdata()\n");
  2439. return(SYSTEM_ERROR);
  2440. }
  2441. }
  2442. }
  2443. return FINISHED;
  2444. }
  2445. /*************************** GETMAXATTENCNT **********************************/
  2446. int getmaxattencnt(dataptr dz)
  2447. {
  2448. int n;
  2449. int maxatten = -1;
  2450. if(dz->brksize[ESPK_GATED] == 0)
  2451. return dz->iparam[ESPK_GATED];
  2452. else {
  2453. for(n = 0; n < dz->brksize[ESPK_GATED]; n++)
  2454. maxatten = max(maxatten,(int)round(dz->brk[ESPK_GATED][n]));
  2455. }
  2456. return maxatten;
  2457. }
  2458. /****************************** RANDVARY_PKLEN ******************************/
  2459. int randvary_pklen(int peaklen,dataptr dz)
  2460. {
  2461. int varyrange, variance;
  2462. int chans = dz->infile->channels;
  2463. varyrange = (int)round((double)(peaklen/chans) * dz->param[ESPK_RAND]); //
  2464. variance = (int)floor(drand48() * varyrange); //
  2465. if(variance == 0) // |----------peaklen-------------|
  2466. return 0; // |--vrange--|
  2467. peaklen -= variance * chans; // |-vnce-|
  2468. return peaklen; // |-------nupeaklen-------|
  2469. }
  2470. /******************************** DBTOLEVEL ***********************/
  2471. double dbtolevel(double val)
  2472. {
  2473. int isneg = 0;
  2474. if(flteq(val,0.0))
  2475. return(1.0);
  2476. if(val < 0.0) {
  2477. val = -val;
  2478. isneg = 1;
  2479. }
  2480. val /= 20.0;
  2481. val = pow(10.0,val);
  2482. if(isneg)
  2483. val = 1.0/val;
  2484. return(val);
  2485. }
  2486. /*************************** GETMAXWHICH **********************************/
  2487. int getmaxwhich(dataptr dz)
  2488. {
  2489. int n;
  2490. int maxwhich = -1;
  2491. if(dz->brksize[ESPK_WHICH] == 0)
  2492. return dz->iparam[ESPK_WHICH];
  2493. else {
  2494. for(n = 0; n < dz->brksize[ESPK_WHICH]; n++)
  2495. maxwhich = max(maxwhich,(int)round(dz->brk[ESPK_WHICH][n]));
  2496. }
  2497. return maxwhich;
  2498. }
  2499. /*************************** OPEN_NEXT_FILE **********************************/
  2500. int open_next_file(char *outfilename,int n,dataptr dz)
  2501. {
  2502. int exit_status;
  2503. char prefix_units[] = "_00";
  2504. char prefix_tens[] = "_0";
  2505. char prefix_hundreds[] = "_";
  2506. if(n > 0) {
  2507. if((exit_status = headwrite(dz->ofd,dz))<0) {
  2508. free(outfilename);
  2509. return(exit_status);
  2510. }
  2511. }
  2512. if(sndcloseEx(dz->ofd) < 0) {
  2513. fprintf(stdout,"WARNING: Can't close output soundfile %s\n",outfilename);
  2514. fflush(stdout);
  2515. }
  2516. dz->ofd = -1;
  2517. strcpy(outfilename,dz->wordstor[0]);
  2518. if(!sloom) {
  2519. if(n<10)
  2520. insert_new_chars_at_filename_end(outfilename,prefix_units);
  2521. else if(n<100)
  2522. insert_new_chars_at_filename_end(outfilename,prefix_tens);
  2523. else if(n<1000)
  2524. insert_new_chars_at_filename_end(outfilename,prefix_hundreds);
  2525. else {
  2526. sprintf(errstr,"Too many duplicates.\n");
  2527. return(PROGRAM_ERROR);
  2528. }
  2529. insert_new_number_at_filename_end(outfilename,n,0);
  2530. } else {
  2531. insert_new_number_at_filename_end(outfilename,n,1);
  2532. }
  2533. if((exit_status = create_sized_outfile(outfilename,dz))<0) {
  2534. sprintf(errstr, "Cannot open outfile Soundfile %s\n",outfilename);
  2535. return(SYSTEM_ERROR);
  2536. }
  2537. return FINISHED;
  2538. }
  2539. /********************************* RANDPERM *************************************/
  2540. void randperm(int z,int setlen,dataptr dz)
  2541. {
  2542. int n, t;
  2543. for(n=0;n<setlen;n++) {
  2544. t = (int)floor(drand48() * (n+1));
  2545. if(t>=n)
  2546. hprefix(z,n,setlen,dz);
  2547. else
  2548. hinsert(z,n,t,setlen,dz);
  2549. }
  2550. }
  2551. /***************************** HINSERT **********************************
  2552. *
  2553. * Insert the value m AFTER the T-th element in iparray[].
  2554. */
  2555. void hinsert(int z,int m,int t,int setlen,dataptr dz)
  2556. {
  2557. hshuflup(z,t+1,setlen,dz);
  2558. dz->iparray[z][t+1] = m;
  2559. }
  2560. /***************************** HPREFIX ************************************
  2561. *
  2562. * Insert the value m at start of the permutation iparray[].
  2563. */
  2564. void hprefix(int z,int m,int setlen,dataptr dz)
  2565. {
  2566. hshuflup(z,0,setlen,dz);
  2567. dz->iparray[z][0] = m;
  2568. }
  2569. /****************************** HSHUFLUP ***********************************
  2570. *
  2571. * move set members in iparray[] upwards, starting from element k.
  2572. */
  2573. void hshuflup(int z,int k,int setlen,dataptr dz)
  2574. {
  2575. int n, *i;
  2576. int y = setlen - 1;
  2577. i = (dz->iparray[z]+y);
  2578. for(n = y;n > k;n--) {
  2579. *i = *(i-1);
  2580. i--;
  2581. }
  2582. }
  2583. /******************************** GETCUTDATA ***********************/
  2584. int getcutdata(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2585. {
  2586. aplptr ap = dz->application;
  2587. int troffcnt, linecnt, chans = dz->infile->channels, srate = dz->infile->srate;
  2588. char temp[2000], *q, *filename = (*cmdline)[0];
  2589. int *trof;
  2590. double *p, dummy;
  2591. ap->data_in_file_only = TRUE;
  2592. ap->special_range = TRUE;
  2593. ap->min_special = 0;
  2594. ap->max_special = dz->duration;
  2595. if((dz->fp = fopen(filename,"r"))==NULL) {
  2596. sprintf(errstr,"Cannot open pattern datafile %s\n",filename);
  2597. return(DATA_ERROR);
  2598. }
  2599. p = &dummy;
  2600. linecnt = 0;
  2601. troffcnt = 0;
  2602. while(fgets(temp,200,dz->fp)!=NULL) {
  2603. q = temp;
  2604. if(is_an_empty_line_or_a_comment(temp)) {
  2605. linecnt++;
  2606. continue;
  2607. }
  2608. while(get_float_from_within_string(&q,p)) {
  2609. if(*p < ap->min_special || *p > ap->max_special) {
  2610. sprintf(errstr,"Cut position (%lf) out of range (%lf to %lf): file %s : line %d\n",
  2611. *p,ap->min_special,ap->max_special,filename,linecnt+1);
  2612. return(DATA_ERROR);
  2613. }
  2614. troffcnt++;
  2615. }
  2616. linecnt++;
  2617. }
  2618. if(troffcnt == 0) {
  2619. if(fclose(dz->fp)<0) {
  2620. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2621. fflush(stdout);
  2622. }
  2623. sprintf(errstr,"No data found in file %s\n",filename);
  2624. return(DATA_ERROR);
  2625. }
  2626. if((dz->lparray=(int **)malloc(sizeof(int *)))==NULL) {
  2627. sprintf(errstr,"INSUFFICIENT MEMORY to store trofs (1).\n");
  2628. return(MEMORY_ERROR);
  2629. }
  2630. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Storage for syllable edit-point data
  2631. sprintf(errstr,"INSUFFICIENT MEMORY to store trofs (2).\n");
  2632. return(MEMORY_ERROR);
  2633. }
  2634. if(fseek(dz->fp,0,0)< 0) {
  2635. sprintf(errstr,"Failed to return to start of file %s.\n",filename);
  2636. return SYSTEM_ERROR;
  2637. }
  2638. troffcnt = 0;
  2639. trof = dz->lparray[0];
  2640. while(fgets(temp,200,dz->fp)!=NULL) {
  2641. q = temp;
  2642. if(is_an_empty_line_or_a_comment(temp))
  2643. continue;
  2644. while(get_float_from_within_string(&q,p))
  2645. trof[troffcnt++] = (int)(*p * (double)srate) * chans;
  2646. }
  2647. if(fclose(dz->fp)<0) {
  2648. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2649. fflush(stdout);
  2650. }
  2651. if(trof[troffcnt - 1] >= dz->insams[0]-chans) // Ignore any splice at End-of-file
  2652. troffcnt--; // by moving it to the troffcnt spot
  2653. else
  2654. trof[troffcnt] = dz->insams[0];
  2655. dz->trofcnt = troffcnt;
  2656. (*cmdline)++;
  2657. (*cmdlinecnt)--;
  2658. return FINISHED;
  2659. }