extspeak.c 117 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <structures.h>
  4. #include <tkglobals.h>
  5. #include <pnames.h>
  6. #include <filetype.h>
  7. #include <processno.h>
  8. #include <modeno.h>
  9. #include <logic.h>
  10. #include <globcon.h>
  11. #include <cdpmain.h>
  12. #include <math.h>
  13. #include <mixxcon.h>
  14. #include <osbind.h>
  15. #include <standalone.h>
  16. #include <ctype.h>
  17. #include <sfsys.h>
  18. #include <string.h>
  19. #include <envlcon.h>
  20. #include <srates.h>
  21. #ifdef unix
  22. #include <aaio.h>
  23. #endif
  24. #ifdef unix
  25. #define round(x) lround((x))
  26. #endif
  27. #define envcnt wlength
  28. #define trofcnt rampbrksize
  29. #define targetcnt ringsize
  30. #define NEGATION 45
  31. #define EXTSPEAK_PKSRCHWIDTH 3
  32. #define XSPK_MAXLEVEL 0.9
  33. char errstr[2400];
  34. #define PATN_ARRAY 0
  35. #define PERM_ARRAY 1
  36. #define TRGT_ARRAY 2
  37. int anal_infiles = 1;
  38. int sloom = 0;
  39. int sloombatch = 0;
  40. const char* cdp_version = "6.1.0";
  41. //CDP LIB REPLACEMENTS
  42. static int check_extspeak_param_validity_and_consistency(int XSPK_RRND,int XSPK_ORISZ,dataptr dz);
  43. static int setup_extspeak_application(dataptr dz);
  44. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  45. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  46. static int setup_extspeak_param_ranges_and_defaults(dataptr dz);
  47. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  48. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  49. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  50. static int establish_application(dataptr dz);
  51. static int initialise_vflags(dataptr dz);
  52. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  53. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  54. static int mark_parameter_types(dataptr dz,aplptr ap);
  55. static int assign_file_data_storage(int infilecnt,dataptr dz);
  56. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  57. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  58. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  59. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  60. static int precalculate_peaks_array_and_splice(dataptr dz);
  61. static int extspeak(int XSPK_RRND,int XSPK_ORISZ,dataptr dz);
  62. static int windows_in_sndfile(dataptr dz);
  63. static int getenv_of_buffer(int samps_to_process,float **env,dataptr dz);
  64. static double getmaxsamp(int startsamp, int sampcnt,float *buffer);
  65. static int istrof(float *env,float *envend,float *q,int width);
  66. static void randperm(int z,int setlen,dataptr dz);
  67. static void hinsert(int z,int m,int t,int setlen,dataptr dz);
  68. static void hprefix(int z,int m,int setlen,dataptr dz);
  69. static void hshuflup(int z,int k,int setlen,dataptr dz);
  70. static int handle_the_extra_infiles(int *cmdlinecnt,char ***cmdline,dataptr dz);
  71. static int insert_new_syllable(int peaklen,int patno,int splicelen,double gain,double origlevel,double normaliser,
  72. int *obufpos,float *obuf,float *ovflwbuf,dataptr dz);
  73. static int store_patterndatafile_name(int *cmdlinecnt,char ***cmdline,dataptr dz);
  74. static int handle_pattern_data(int patternsize,dataptr dz);
  75. static int generate_xspk_pattern(int XSPK_RRND, int patternsize,dataptr dz);
  76. static int create_sndbufs_for_extspeak(dataptr dz);
  77. static int get_int_from_within_string(char **str,int *val, int minus_one_ok);
  78. static int open_checktype_getsize_and_compare_header(char *filename,int fileno,fileptr *fp2,dataptr dz);
  79. static int find_orig_syllab_maxima(int splicelen,dataptr dz);
  80. static int find_normaliser(double *normaliser,int samps_per_sec,int splicelen,dataptr dz);
  81. static double get_syllable_time(int thistrofat,int lasttrofat,int peaklen,int n,int samps_per_sec,dataptr dz);
  82. static double dbtolevel(double val);
  83. static int getcutdata(int *cmdlinecnt,char ***cmdline,dataptr dz);
  84. static int get_cutpat_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  85. static int expand_pattern_data(int patternsize,dataptr dz);
  86. static int get_cuttapa_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  87. static int get_cuttarg_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  88. static int exttargetspeak(int XSPK_RRND,int XSPK_ORISZ,dataptr dz);
  89. static int find_normaliser_target(double *normaliser,int samps_per_sec,int splicelen,dataptr dz);
  90. /**************************************** MAIN *********************************************/
  91. int main(int argc,char *argv[])
  92. {
  93. int exit_status;
  94. dataptr dz = NULL;
  95. char **cmdline;
  96. int cmdlinecnt, XSPK_RRND, XSPK_ORISZ;
  97. int n;
  98. aplptr ap;
  99. int is_launched = FALSE;
  100. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  101. fprintf(stdout,"%s\n",cdp_version);
  102. fflush(stdout);
  103. return 0;
  104. }
  105. /* CHECK FOR SOUNDLOOM */
  106. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  107. sloom = 0;
  108. sloombatch = 1;
  109. }
  110. if(sflinit("cdp")){
  111. sfperror("cdp: initialisation\n");
  112. return(FAILED);
  113. }
  114. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  115. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  116. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  117. return(FAILED);
  118. }
  119. dz->trofcnt = 0;
  120. if(!sloom) {
  121. if(argc == 1) {
  122. usage1();
  123. return(FAILED);
  124. } else if(argc == 2) {
  125. usage2(argv[1]);
  126. return(FAILED);
  127. }
  128. }
  129. if(!sloom) {
  130. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  131. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. cmdline = argv;
  135. cmdlinecnt = argc;
  136. if((get_the_process_no(argv[0],dz))<0)
  137. return(FAILED);
  138. cmdline++;
  139. cmdlinecnt--;
  140. dz->maxmode = 18;
  141. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(exit_status);
  144. }
  145. cmdline++;
  146. cmdlinecnt--;
  147. // setup_particular_application =
  148. if((exit_status = setup_extspeak_application(dz))<0) {
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  153. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  154. return(FAILED);
  155. }
  156. } else {
  157. //parse_TK_data() =
  158. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  159. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  160. return(exit_status);
  161. }
  162. }
  163. ap = dz->application;
  164. // parse_infile_and_hone_type() =
  165. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  166. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  167. return(FAILED);
  168. }
  169. // setup_param_ranges_and_defaults() =
  170. if((exit_status = setup_extspeak_param_ranges_and_defaults(dz))<0) {
  171. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  172. return(FAILED);
  173. }
  174. // open_first_infile CDP LIB
  175. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  176. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(FAILED);
  178. }
  179. cmdlinecnt--;
  180. cmdline++;
  181. if((dz->iparray = (int **)malloc(3 * sizeof(int *))) == NULL) {
  182. sprintf(errstr,"INSUFFICIENT MEMORY to store trof-locations and other data.\n");
  183. return(MEMORY_ERROR);
  184. }
  185. // handle_extra_infiles
  186. if((exit_status = handle_the_extra_infiles(&cmdlinecnt,&cmdline,dz))<0) {
  187. fprintf(stdout,"\n **** May be TOO MANY PARAMS on commandline ****\n\n");
  188. fflush(stdout);
  189. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  190. return(FAILED);
  191. }
  192. if(dz->infilecnt < 2) {
  193. sprintf(errstr,"ERROR: At least TWO input files required for this process.\n");
  194. exit_status = DATA_ERROR;
  195. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  196. return(FAILED);
  197. }
  198. // handle_outfile() =
  199. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  200. fprintf(stdout,"\n **** If the outfile does NOT already exist ****\n **** May be TOO FEW PARAMS on commandline ****\n\n");
  201. fflush(stdout);
  202. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  203. return(FAILED);
  204. }
  205. // handle_formants() redundant
  206. // handle_formant_quiksearch() redundant
  207. switch(dz->mode) {
  208. case(2): // fall thro
  209. case(5):
  210. if((exit_status = store_patterndatafile_name(&cmdlinecnt,&cmdline,dz))<0) {
  211. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  212. return(FAILED);
  213. }
  214. break;
  215. case(6): // fall thro
  216. case(7): // fall thro
  217. case(9): // fall thro
  218. case(10):
  219. if((exit_status = getcutdata(&cmdlinecnt,&cmdline,dz))<0) {
  220. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  221. return(FAILED);
  222. }
  223. break;
  224. case(8): // fall thro
  225. case(11):
  226. if((exit_status = get_cutpat_data(&cmdlinecnt,&cmdline,dz))<0) {
  227. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  228. return(FAILED);
  229. }
  230. break;
  231. case(12): // fall thro
  232. case(13): // fall thro
  233. case(15): // fall thro
  234. case(16):
  235. if((exit_status = get_cuttarg_data(&cmdlinecnt,&cmdline,dz))<0) {
  236. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  237. return(FAILED);
  238. }
  239. break;
  240. case(14): // fall thro
  241. case(17):
  242. if((exit_status = get_cuttapa_data(&cmdlinecnt,&cmdline,dz))<0) {
  243. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  244. return(FAILED);
  245. }
  246. break;
  247. }
  248. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  249. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  250. return(FAILED);
  251. }
  252. if(dz->mode == 3 || dz->mode == 9)
  253. XSPK_RRND = 3;
  254. else if(dz->mode == 12)
  255. XSPK_RRND = 3;
  256. else if(dz->mode == 15)
  257. XSPK_RRND = 2;
  258. else
  259. XSPK_RRND = XSPK_RAND;
  260. if(dz->mode >=12 && dz->mode < 15)
  261. XSPK_ORISZ = 2;
  262. else
  263. XSPK_ORISZ = XSPK_ORIGSZ;
  264. is_launched = TRUE;
  265. dz->bufcnt = dz->infilecnt + 2;
  266. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  267. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  268. return(MEMORY_ERROR);
  269. }
  270. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  271. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  272. return(MEMORY_ERROR);
  273. }
  274. for(n = 0;n <dz->bufcnt; n++)
  275. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  276. dz->sampbuf[n] = (float *)0;
  277. // 1 double array for splice, 1 for maxlevels of orig syllables & 1 for maxlevels of new syllables
  278. if((dz->parray = (double **)malloc(3 * sizeof(double *))) == NULL) {
  279. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (1).\n");
  280. return(MEMORY_ERROR);
  281. }
  282. // 2 float arrays for trofstore
  283. if((dz->fptr=(float **)malloc(2 * sizeof(float *)))==NULL) {
  284. sprintf(errstr,"INSUFFICIENT MEMORY to store envelope (1).\n");
  285. return(MEMORY_ERROR);
  286. }
  287. // create_sndbufs
  288. if((exit_status = create_sndbufs_for_extspeak(dz))<0) {
  289. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  290. return(FAILED);
  291. }
  292. if((exit_status = precalculate_peaks_array_and_splice(dz))<0) {
  293. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  294. return(FAILED);
  295. }
  296. if(dz->vflag[XSPK_ENV] || (dz->mode >= 3 && dz->mode < 6) || (dz->mode >= 9 && dz->mode < 12) || dz->mode >= 15) {
  297. if((dz->parray[2] = (double *)malloc(dz->infilecnt * sizeof(double))) == NULL) {// Storage max levels of new input syllables
  298. sprintf(errstr,"INSUFFICIENT MEMORY to maximum levels of input syllables.\n");
  299. return(MEMORY_ERROR);
  300. }
  301. }
  302. // check_param_validity_and_consistency....
  303. if((exit_status = check_extspeak_param_validity_and_consistency(XSPK_RRND,XSPK_ORISZ,dz))<0) {
  304. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  305. return(FAILED);
  306. }
  307. //param_preprocess() redundant
  308. //spec_process_file =
  309. if(dz->mode >= 12) {
  310. if((exit_status = exttargetspeak(XSPK_RRND,XSPK_ORISZ,dz))<0) {
  311. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  312. return(FAILED);
  313. }
  314. } else {
  315. if((exit_status = extspeak(XSPK_RRND,XSPK_ORISZ,dz))<0) {
  316. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  317. return(FAILED);
  318. }
  319. }
  320. if((exit_status = complete_output(dz))<0) { // CDP LIB
  321. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  322. return(FAILED);
  323. }
  324. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  325. free(dz);
  326. return(SUCCEEDED);
  327. }
  328. /**********************************************
  329. REPLACED CDP LIB FUNCTIONS
  330. **********************************************/
  331. /****************************** SET_PARAM_DATA *********************************/
  332. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  333. {
  334. ap->special_data = (char)special_data;
  335. ap->param_cnt = (char)paramcnt;
  336. ap->max_param_cnt = (char)maxparamcnt;
  337. if(ap->max_param_cnt>0) {
  338. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  339. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  340. return(MEMORY_ERROR);
  341. }
  342. strcpy(ap->param_list,paramlist);
  343. }
  344. return(FINISHED);
  345. }
  346. /****************************** SET_VFLGS *********************************/
  347. int set_vflgs
  348. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  349. {
  350. ap->option_cnt = (char) optcnt; /*RWD added cast */
  351. if(optcnt) {
  352. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  353. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  354. return(MEMORY_ERROR);
  355. }
  356. strcpy(ap->option_list,optlist);
  357. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  358. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  359. return(MEMORY_ERROR);
  360. }
  361. strcpy(ap->option_flags,optflags);
  362. }
  363. ap->vflag_cnt = (char) vflagcnt;
  364. ap->variant_param_cnt = (char) vparamcnt;
  365. if(vflagcnt) {
  366. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  367. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  368. return(MEMORY_ERROR);
  369. }
  370. strcpy(ap->variant_list,varlist);
  371. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  372. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  373. return(MEMORY_ERROR);
  374. }
  375. strcpy(ap->variant_flags,varflags);
  376. }
  377. return(FINISHED);
  378. }
  379. /***************************** APPLICATION_INIT **************************/
  380. int application_init(dataptr dz)
  381. {
  382. int exit_status;
  383. int storage_cnt;
  384. int tipc, brkcnt;
  385. aplptr ap = dz->application;
  386. if(ap->vflag_cnt>0)
  387. initialise_vflags(dz);
  388. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  389. ap->total_input_param_cnt = (char)tipc;
  390. if(tipc>0) {
  391. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  392. return(exit_status);
  393. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  394. return(exit_status);
  395. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  396. return(exit_status);
  397. }
  398. brkcnt = tipc;
  399. if(brkcnt>0) {
  400. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  401. return(exit_status);
  402. }
  403. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  404. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  405. return(exit_status);
  406. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  407. return(exit_status);
  408. }
  409. if((exit_status = mark_parameter_types(dz,ap))<0)
  410. return(exit_status);
  411. // establish_infile_constants() replaced by
  412. dz->infilecnt = 1;
  413. //establish_bufptrs_and_extra_buffers():
  414. return(FINISHED);
  415. }
  416. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  417. /* RWD mallo changed to calloc; helps debug verison run as release! */
  418. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  419. {
  420. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  421. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  422. return(MEMORY_ERROR);
  423. }
  424. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  425. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  426. return(MEMORY_ERROR);
  427. }
  428. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  429. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  430. return(MEMORY_ERROR);
  431. }
  432. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  433. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  434. return(MEMORY_ERROR);
  435. }
  436. return(FINISHED);
  437. }
  438. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  439. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  440. {
  441. int n;
  442. for(n=0;n<storage_cnt;n++) {
  443. dz->is_int[n] = (char)0;
  444. dz->no_brk[n] = (char)0;
  445. }
  446. return(FINISHED);
  447. }
  448. /***************************** MARK_PARAMETER_TYPES **************************/
  449. int mark_parameter_types(dataptr dz,aplptr ap)
  450. {
  451. int n, m; /* PARAMS */
  452. for(n=0;n<ap->max_param_cnt;n++) {
  453. switch(ap->param_list[n]) {
  454. case('0'): break; /* dz->is_active[n] = 0 is default */
  455. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  456. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  457. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  458. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  459. default:
  460. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  461. return(PROGRAM_ERROR);
  462. }
  463. } /* OPTIONS */
  464. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  465. switch(ap->option_list[n]) {
  466. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  467. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  468. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  469. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  470. default:
  471. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  472. return(PROGRAM_ERROR);
  473. }
  474. } /* VARIANTS */
  475. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  476. switch(ap->variant_list[n]) {
  477. case('0'): break;
  478. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  479. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  480. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  481. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  482. default:
  483. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  484. return(PROGRAM_ERROR);
  485. }
  486. } /* INTERNAL */
  487. for(n=0,
  488. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  489. switch(ap->internal_param_list[n]) {
  490. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  491. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  492. case('d'): dz->no_brk[m] = (char)1; break;
  493. default:
  494. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  495. return(PROGRAM_ERROR);
  496. }
  497. }
  498. return(FINISHED);
  499. }
  500. /************************ HANDLE_THE_OUTFILE *********************/
  501. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  502. {
  503. int exit_status;
  504. char *filename = (*cmdline)[0];
  505. if(filename[0]=='-' && filename[1]=='f') {
  506. dz->floatsam_output = 1;
  507. dz->true_outfile_stype = SAMP_FLOAT;
  508. filename+= 2;
  509. }
  510. if(!sloom) {
  511. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  512. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  513. return(DATA_ERROR);
  514. }
  515. }
  516. strcpy(dz->outfilename,filename);
  517. if((exit_status = create_sized_outfile(filename,dz))<0)
  518. return(exit_status);
  519. (*cmdline)++;
  520. (*cmdlinecnt)--;
  521. return(FINISHED);
  522. }
  523. /***************************** ESTABLISH_APPLICATION **************************/
  524. int establish_application(dataptr dz)
  525. {
  526. aplptr ap;
  527. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  528. sprintf(errstr,"establish_application()\n");
  529. return(MEMORY_ERROR);
  530. }
  531. ap = dz->application;
  532. memset((char *)ap,0,sizeof(struct applic));
  533. return(FINISHED);
  534. }
  535. /************************* INITIALISE_VFLAGS *************************/
  536. int initialise_vflags(dataptr dz)
  537. {
  538. int n;
  539. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  540. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  541. return(MEMORY_ERROR);
  542. }
  543. for(n=0;n<dz->application->vflag_cnt;n++)
  544. dz->vflag[n] = FALSE;
  545. return FINISHED;
  546. }
  547. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  548. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  549. {
  550. int n;
  551. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  552. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  553. return(MEMORY_ERROR);
  554. }
  555. for(n=0;n<tipc;n++)
  556. ap->default_val[n] = 0.0;
  557. return(FINISHED);
  558. }
  559. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  560. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  561. {
  562. int n;
  563. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  564. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  565. return(MEMORY_ERROR);
  566. }
  567. for(n=0;n<tipc;n++)
  568. dz->is_active[n] = (char)0;
  569. return(FINISHED);
  570. }
  571. /************************* SETUP_EXTSPEAK_APPLICATION *******************/
  572. int setup_extspeak_application(dataptr dz)
  573. {
  574. int exit_status;
  575. aplptr ap;
  576. if((exit_status = establish_application(dz))<0) // GLOBAL
  577. return(FAILED);
  578. ap = dz->application;
  579. switch(dz->mode) {
  580. case(9): // fall thro
  581. case(10): // fall thro
  582. case(6): // fall thro
  583. case(7): exit_status = set_param_data(ap,XSPK_CUTS ,6,5,"0iiIDi"); break;
  584. case(11): // fall thro
  585. case(8): exit_status = set_param_data(ap,XSPK_CUTPAT ,6,4,"0iiID0"); break;
  586. case(3): // fall thro
  587. case(4): // fall thro
  588. case(0): // fall thro
  589. case(1): exit_status = set_param_data(ap,0 ,6,6,"iiiIDi"); break;
  590. case(5): // fall thro
  591. case(2): exit_status = set_param_data(ap,XSPK_PATTERN ,6,5,"iiiID0"); break;
  592. case(12): // fall thro
  593. case(13): // fall thro
  594. case(15): // fall thro
  595. case(16): exit_status = set_param_data(ap,XSPK_CUTARG ,6,3,"0i00Di"); break;
  596. case(14): // fall thro
  597. case(17): exit_status = set_param_data(ap,XSPK_CUPATA ,6,2,"0i00D0"); break;
  598. }
  599. if(exit_status < 0)
  600. return(FAILED);
  601. switch(dz->mode) {
  602. case(6): // fall thro
  603. case(0):
  604. exit_status = set_vflgs(ap,"",0,"","tekior",6,0,"000000");
  605. break;
  606. case(7): // fall thro
  607. case(8): // fall thro
  608. case(1): // fall thro
  609. case(2):
  610. exit_status = set_vflgs(ap,"",0,"","tekio" ,5,0,"00000");
  611. break;
  612. case(9): // fall thro
  613. case(3):
  614. exit_status = set_vflgs(ap,"",0,"","tekr" ,4,0,"0000");
  615. break;
  616. case(10): // fall thro
  617. case(11): // fall thro
  618. case(4): // fall thro
  619. case(5):
  620. exit_status = set_vflgs(ap,"",0,"","tek" ,3,0,"000");
  621. break;
  622. case(12):
  623. exit_status = set_vflgs(ap,"",0,"","teor" ,4,0,"0000");
  624. break;
  625. case(15): // fall thro
  626. exit_status = set_vflgs(ap,"",0,"","ter" ,3,0,"000");
  627. break;
  628. case(13): // fall thro
  629. case(14):
  630. exit_status = set_vflgs(ap,"",0,"","teo" ,3,0,"000");
  631. break;
  632. case(16): // fall thro
  633. case(17):
  634. exit_status = set_vflgs(ap,"",0,"","te" ,2,0,"00");
  635. break;
  636. }
  637. if(exit_status < 0)
  638. return(FAILED);
  639. // set_legal_infile_structure -->
  640. dz->has_otherfile = FALSE;
  641. // assign_process_logic -->
  642. dz->input_data_type = MANY_SNDFILES;
  643. dz->process_type = UNEQUAL_SNDFILE;
  644. dz->outfiletype = SNDFILE_OUT;
  645. return application_init(dz); //GLOBAL
  646. }
  647. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  648. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  649. {
  650. int exit_status;
  651. infileptr infile_info;
  652. if(!sloom) {
  653. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  654. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  655. return(MEMORY_ERROR);
  656. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  657. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  658. return(PROGRAM_ERROR);
  659. } else if(infile_info->filetype != SNDFILE) {
  660. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  661. return(DATA_ERROR);
  662. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  663. sprintf(errstr,"Failed to copy file parsing information\n");
  664. return(PROGRAM_ERROR);
  665. }
  666. free(infile_info);
  667. }
  668. return(FINISHED);
  669. }
  670. /************************* SETUP_EXTSPEAK_PARAM_RANGES_AND_DEFAULTS *******************/
  671. int setup_extspeak_param_ranges_and_defaults(dataptr dz)
  672. {
  673. int exit_status;
  674. aplptr ap = dz->application;
  675. // set_param_ranges()
  676. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  677. // NB total_input_param_cnt is > 0 !!!
  678. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  679. return(FAILED);
  680. if(dz->mode < 6) {
  681. ap->lo[XSPK_WINSZ] = 5; // param 0
  682. ap->hi[XSPK_WINSZ] = 1000;
  683. ap->default_val[XSPK_WINSZ] = 50;
  684. }
  685. ap->lo[XSPK_SPLEN] = 2; // param 1
  686. ap->hi[XSPK_SPLEN] = 100;
  687. ap->default_val[XSPK_SPLEN] = 5;
  688. if(dz->mode < 12) {
  689. ap->lo[XSPK_OFFST] = 0; // param 2
  690. ap->hi[XSPK_OFFST] = 100;
  691. ap->default_val[XSPK_OFFST] = 0;
  692. ap->lo[XSPK_N] = 0; // param 3
  693. ap->hi[XSPK_N] = MAX_PATN;
  694. ap->default_val[XSPK_N] = 1;
  695. }
  696. ap->lo[XSPK_GAIN] = -96; // param 4
  697. ap->hi[XSPK_GAIN] = 0;
  698. ap->default_val[XSPK_GAIN] = 0;
  699. if(dz->mode != 2 && dz->mode != 5 && dz->mode != 8 && dz->mode != 11 && dz->mode != 14 && dz->mode != 17) {
  700. ap->lo[XSPK_SEED] = 0; // param 5
  701. ap->hi[XSPK_SEED] = 64;
  702. ap->default_val[XSPK_SEED] = 0;
  703. }
  704. dz->maxmode = 18;
  705. if(!sloom)
  706. put_default_vals_in_all_params(dz);
  707. return(FINISHED);
  708. }
  709. /********************************* PARSE_SLOOM_DATA *********************************/
  710. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  711. {
  712. int exit_status;
  713. int cnt = 1, infilecnt;
  714. int filesize, insams, inbrksize;
  715. double dummy;
  716. int true_cnt = 0;
  717. aplptr ap;
  718. while(cnt<=PRE_CMDLINE_DATACNT) {
  719. if(cnt > argc) {
  720. sprintf(errstr,"Insufficient data sent from TK\n");
  721. return(DATA_ERROR);
  722. }
  723. switch(cnt) {
  724. case(1):
  725. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  726. sprintf(errstr,"Cannot read process no. sent from TK\n");
  727. return(DATA_ERROR);
  728. }
  729. break;
  730. case(2):
  731. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  732. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  733. return(DATA_ERROR);
  734. }
  735. if(dz->mode > 0)
  736. dz->mode--;
  737. //setup_particular_application() =
  738. if((exit_status = setup_extspeak_application(dz))<0)
  739. return(exit_status);
  740. ap = dz->application;
  741. break;
  742. case(3):
  743. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  744. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  745. return(DATA_ERROR);
  746. }
  747. if(infilecnt < 1) {
  748. true_cnt = cnt + 1;
  749. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  750. }
  751. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  752. return(exit_status);
  753. break;
  754. case(INPUT_FILETYPE+4):
  755. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  756. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  757. return(DATA_ERROR);
  758. }
  759. break;
  760. case(INPUT_FILESIZE+4):
  761. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  762. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  763. return(DATA_ERROR);
  764. }
  765. dz->insams[0] = filesize;
  766. break;
  767. case(INPUT_INSAMS+4):
  768. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  769. sprintf(errstr,"Cannot read insams sent from TK\n");
  770. return(DATA_ERROR);
  771. }
  772. dz->insams[0] = insams;
  773. break;
  774. case(INPUT_SRATE+4):
  775. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  776. sprintf(errstr,"Cannot read srate sent from TK\n");
  777. return(DATA_ERROR);
  778. }
  779. break;
  780. case(INPUT_CHANNELS+4):
  781. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  782. sprintf(errstr,"Cannot read channels sent from TK\n");
  783. return(DATA_ERROR);
  784. }
  785. break;
  786. case(INPUT_STYPE+4):
  787. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  788. sprintf(errstr,"Cannot read stype sent from TK\n");
  789. return(DATA_ERROR);
  790. }
  791. break;
  792. case(INPUT_ORIGSTYPE+4):
  793. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  794. sprintf(errstr,"Cannot read origstype sent from TK\n");
  795. return(DATA_ERROR);
  796. }
  797. break;
  798. case(INPUT_ORIGRATE+4):
  799. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  800. sprintf(errstr,"Cannot read origrate sent from TK\n");
  801. return(DATA_ERROR);
  802. }
  803. break;
  804. case(INPUT_MLEN+4):
  805. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  806. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  807. return(DATA_ERROR);
  808. }
  809. break;
  810. case(INPUT_DFAC+4):
  811. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  812. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  813. return(DATA_ERROR);
  814. }
  815. break;
  816. case(INPUT_ORIGCHANS+4):
  817. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  818. sprintf(errstr,"Cannot read origchans sent from TK\n");
  819. return(DATA_ERROR);
  820. }
  821. break;
  822. case(INPUT_SPECENVCNT+4):
  823. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  824. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  825. return(DATA_ERROR);
  826. }
  827. dz->specenvcnt = dz->infile->specenvcnt;
  828. break;
  829. case(INPUT_WANTED+4):
  830. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  831. sprintf(errstr,"Cannot read wanted sent from TK\n");
  832. return(DATA_ERROR);
  833. }
  834. break;
  835. case(INPUT_WLENGTH+4):
  836. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  837. sprintf(errstr,"Cannot read wlength sent from TK\n");
  838. return(DATA_ERROR);
  839. }
  840. break;
  841. case(INPUT_OUT_CHANS+4):
  842. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  843. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  844. return(DATA_ERROR);
  845. }
  846. break;
  847. /* RWD these chanegs to samps - tk will have to deal with that! */
  848. case(INPUT_DESCRIPTOR_BYTES+4):
  849. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  850. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  851. return(DATA_ERROR);
  852. }
  853. break;
  854. case(INPUT_IS_TRANSPOS+4):
  855. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  856. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  857. return(DATA_ERROR);
  858. }
  859. break;
  860. case(INPUT_COULD_BE_TRANSPOS+4):
  861. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  862. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  863. return(DATA_ERROR);
  864. }
  865. break;
  866. case(INPUT_COULD_BE_PITCH+4):
  867. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  868. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  869. return(DATA_ERROR);
  870. }
  871. break;
  872. case(INPUT_DIFFERENT_SRATES+4):
  873. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  874. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  875. return(DATA_ERROR);
  876. }
  877. break;
  878. case(INPUT_DUPLICATE_SNDS+4):
  879. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  880. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  881. return(DATA_ERROR);
  882. }
  883. break;
  884. case(INPUT_BRKSIZE+4):
  885. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  886. sprintf(errstr,"Cannot read brksize sent from TK\n");
  887. return(DATA_ERROR);
  888. }
  889. if(inbrksize > 0) {
  890. switch(dz->input_data_type) {
  891. case(WORDLIST_ONLY):
  892. break;
  893. case(PITCH_AND_PITCH):
  894. case(PITCH_AND_TRANSPOS):
  895. case(TRANSPOS_AND_TRANSPOS):
  896. dz->tempsize = inbrksize;
  897. break;
  898. case(BRKFILES_ONLY):
  899. case(UNRANGED_BRKFILE_ONLY):
  900. case(DB_BRKFILES_ONLY):
  901. case(ALL_FILES):
  902. case(ANY_NUMBER_OF_ANY_FILES):
  903. if(dz->extrabrkno < 0) {
  904. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  905. return(DATA_ERROR);
  906. }
  907. if(dz->brksize == NULL) {
  908. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  909. return(PROGRAM_ERROR);
  910. }
  911. dz->brksize[dz->extrabrkno] = inbrksize;
  912. break;
  913. default:
  914. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  915. dz->input_data_type);
  916. return(PROGRAM_ERROR);
  917. }
  918. break;
  919. }
  920. break;
  921. case(INPUT_NUMSIZE+4):
  922. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  923. sprintf(errstr,"Cannot read numsize sent from TK\n");
  924. return(DATA_ERROR);
  925. }
  926. break;
  927. case(INPUT_LINECNT+4):
  928. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  929. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  930. return(DATA_ERROR);
  931. }
  932. break;
  933. case(INPUT_ALL_WORDS+4):
  934. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  935. sprintf(errstr,"Cannot read all_words sent from TK\n");
  936. return(DATA_ERROR);
  937. }
  938. break;
  939. case(INPUT_ARATE+4):
  940. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  941. sprintf(errstr,"Cannot read arate sent from TK\n");
  942. return(DATA_ERROR);
  943. }
  944. break;
  945. case(INPUT_FRAMETIME+4):
  946. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  947. sprintf(errstr,"Cannot read frametime sent from TK\n");
  948. return(DATA_ERROR);
  949. }
  950. dz->frametime = (float)dummy;
  951. break;
  952. case(INPUT_WINDOW_SIZE+4):
  953. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  954. sprintf(errstr,"Cannot read window_size sent from TK\n");
  955. return(DATA_ERROR);
  956. }
  957. break;
  958. case(INPUT_NYQUIST+4):
  959. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  960. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  961. return(DATA_ERROR);
  962. }
  963. break;
  964. case(INPUT_DURATION+4):
  965. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  966. sprintf(errstr,"Cannot read duration sent from TK\n");
  967. return(DATA_ERROR);
  968. }
  969. break;
  970. case(INPUT_MINBRK+4):
  971. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  972. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  973. return(DATA_ERROR);
  974. }
  975. break;
  976. case(INPUT_MAXBRK+4):
  977. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  978. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  979. return(DATA_ERROR);
  980. }
  981. break;
  982. case(INPUT_MINNUM+4):
  983. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  984. sprintf(errstr,"Cannot read minnum sent from TK\n");
  985. return(DATA_ERROR);
  986. }
  987. break;
  988. case(INPUT_MAXNUM+4):
  989. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  990. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  991. return(DATA_ERROR);
  992. }
  993. break;
  994. default:
  995. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  996. return(PROGRAM_ERROR);
  997. }
  998. cnt++;
  999. }
  1000. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  1001. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  1002. return(DATA_ERROR);
  1003. }
  1004. if(true_cnt)
  1005. cnt = true_cnt;
  1006. *cmdlinecnt = 0;
  1007. while(cnt < argc) {
  1008. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  1009. return(exit_status);
  1010. cnt++;
  1011. }
  1012. return(FINISHED);
  1013. }
  1014. /********************************* GET_TK_CMDLINE_WORD *********************************/
  1015. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  1016. {
  1017. if(*cmdlinecnt==0) {
  1018. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  1019. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1020. return(MEMORY_ERROR);
  1021. }
  1022. } else {
  1023. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  1024. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1025. return(MEMORY_ERROR);
  1026. }
  1027. }
  1028. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  1029. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  1030. return(MEMORY_ERROR);
  1031. }
  1032. strcpy((*cmdline)[*cmdlinecnt],q);
  1033. (*cmdlinecnt)++;
  1034. return(FINISHED);
  1035. }
  1036. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  1037. int assign_file_data_storage(int infilecnt,dataptr dz)
  1038. {
  1039. int exit_status;
  1040. int no_sndfile_system_files = FALSE;
  1041. dz->infilecnt = infilecnt;
  1042. if((exit_status = allocate_filespace(dz))<0)
  1043. return(exit_status);
  1044. if(no_sndfile_system_files)
  1045. dz->infilecnt = 0;
  1046. return(FINISHED);
  1047. }
  1048. /************************* redundant functions: to ensure libs compile OK *******************/
  1049. int assign_process_logic(dataptr dz)
  1050. {
  1051. return(FINISHED);
  1052. }
  1053. void set_legal_infile_structure(dataptr dz)
  1054. {}
  1055. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1056. {
  1057. return(FINISHED);
  1058. }
  1059. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1060. {
  1061. return(FINISHED);
  1062. }
  1063. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1064. {
  1065. return(FINISHED);
  1066. }
  1067. int read_special_data(char *str,dataptr dz)
  1068. {
  1069. return(FINISHED);
  1070. }
  1071. int inner_loop
  1072. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1073. {
  1074. return(FINISHED);
  1075. }
  1076. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1077. {
  1078. return(FINISHED);
  1079. }
  1080. /******************************** USAGE1 ********************************/
  1081. int usage1(void)
  1082. {
  1083. usage2("extspeak");
  1084. return(USAGE_ONLY);
  1085. }
  1086. /**************************** CHECK_EXTSPEAK_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  1087. int check_extspeak_param_validity_and_consistency(int XSPK_RRND,int XSPK_ORISZ,dataptr dz)
  1088. {
  1089. // NEEDS TO BE DONE WHEN TROFCNT IS KNOWN AND SPLICELEN IN GPSAMPS KNOWN !!!!
  1090. int lastsamp = 0, n, k, sampsize;
  1091. int chans = dz->infile->channels, srate = dz->infile->srate;
  1092. int offset = dz->iparam[XSPK_OFFST];
  1093. int *trof = dz->lparray[0];
  1094. int splicelen, minseg, bad;
  1095. splicelen = dz->iparam[XSPK_SPLEN] * chans;
  1096. minseg = (splicelen * 2) + chans;
  1097. if(dz->trofcnt == 0) {
  1098. sprintf(errstr,"Trof array not established before testing parameters.\n");
  1099. return PROGRAM_ERROR;
  1100. }
  1101. if(offset >= dz->trofcnt - 2) {
  1102. sprintf(errstr,"ERROR: Offset (%d) too large for number of peaks found (%d).\n",offset,dz->trofcnt);
  1103. return DATA_ERROR;
  1104. }
  1105. bad = 0;
  1106. for(n = 0; n <= dz->trofcnt; n++) {
  1107. sampsize = trof[n] - lastsamp;
  1108. if(sampsize < minseg) {
  1109. bad = 1;
  1110. if(n == 0)
  1111. fprintf(stdout,"syllab %d too short (%d mS) for two Splices (%d mS)\nbetween times 0 and %lf\n",
  1112. n+1,(int)round(((double)(sampsize/chans)/(double)srate) * SECS_TO_MS),(int)round(dz->param[XSPK_SPLEN] * 2),(double)trof[n]/(double)(srate * chans));
  1113. else {
  1114. sampsize -= splicelen;
  1115. fprintf(stdout,"syllab %d too short (%d mS) for two Splices (%d mS)\nbetween times %lf and %lf\n",
  1116. n+1,(int)round(((double)(sampsize/chans)/(double)srate) * SECS_TO_MS),(int)round(dz->param[XSPK_SPLEN] * 2),(double)(trof[n-1]/chans)/(double)srate,(double)(trof[n]/chans)/(double)srate);
  1117. }
  1118. }
  1119. lastsamp = trof[n] - splicelen;
  1120. }
  1121. if(bad)
  1122. return DATA_ERROR;
  1123. if(dz->trofcnt <= 1) {
  1124. sprintf(errstr,"Too few trofs found (%d) for this process and offset (%d)\n",dz->trofcnt,dz->iparam[2]);
  1125. return DATA_ERROR;
  1126. }
  1127. if(dz->mode < 3 || (dz->mode >= 6 && dz->mode < 9)) {
  1128. if(dz->vflag[XSPK_INJECT]) {
  1129. if(dz->vflag[XSPK_ORISZ] || dz->vflag[XSPK_ENV] || dz->vflag[XSPK_TRANSPOSE] ) {
  1130. if(dz->vflag[XSPK_ORISZ]) {
  1131. if(dz->vflag[XSPK_ENV] && dz->vflag[XSPK_TRANSPOSE])
  1132. fprintf(stdout,"WARNING: \"Original Size\" flag redundant : \"Envelope\" & \"Transpose\" Flags not operational when INSERTING the original syllables.\n");
  1133. else if(dz->vflag[XSPK_ENV])
  1134. fprintf(stdout,"WARNING: \"Original Size\" flag redundant : \"Envelope\" Flag not operational when INSERTING the original syllables.\n");
  1135. else if(dz->vflag[XSPK_TRANSPOSE])
  1136. fprintf(stdout,"WARNING: \"Original Size\" flag redundant : \"Transpose\" Flag not operational when INSERTING the original syllables.\n");
  1137. else
  1138. fprintf(stdout,"WARNING: \"Original Size\" flag redundant when INSERTING the original syllables.\n");
  1139. } else {
  1140. if(dz->vflag[XSPK_ENV] && dz->vflag[XSPK_TRANSPOSE])
  1141. fprintf(stdout,"WARNING: \"Envelope\" & \"Transpose\" Flags not operational when INSERTING the original syllables.\n");
  1142. else if(dz->vflag[XSPK_ENV])
  1143. fprintf(stdout,"WARNING: \"Envelope\" Flag not operational when INSERTING the original syllables.\n");
  1144. else
  1145. fprintf(stdout,"WARNING: \"Transpose\" Flag not operational when INSERTING the original syllables.\n");
  1146. }
  1147. fflush(stdout);
  1148. }
  1149. dz->vflag[XSPK_TRANSPOSE] = 0;
  1150. dz->vflag[XSPK_ENV] = 0;
  1151. dz->vflag[XSPK_ORISZ] = 1;
  1152. }
  1153. }
  1154. if(dz->mode < 3 || (dz->mode >= 6 && dz->mode < 9) || (dz->mode >= 12 && dz->mode < 15)) {
  1155. if(dz->vflag[XSPK_ORISZ] && dz->vflag[XSPK_TRANSPOSE]) {
  1156. fprintf(stdout,"WARNING: \"Keep original size\" Flag makes \"Transposition\" Flag redundant.\n");
  1157. fflush(stdout);
  1158. }
  1159. }
  1160. if((dz->mode==0 || dz->mode==3 || dz->mode==6 || dz->mode==9) && dz->vflag[XSPK_RRND] && dz->infilecnt < 3) {
  1161. switch(dz->mode) {
  1162. case(10): // fall thro
  1163. case(7): // fall thro
  1164. case(4): // fall thro
  1165. case(1):
  1166. sprintf(errstr,"INFO: No randomisation possible with less than 2 (extra) input file.\n");
  1167. return DATA_ERROR;
  1168. case(9): // fall thro
  1169. case(6): // fall thro
  1170. case(3): // fall thro
  1171. case(0):
  1172. if(dz->infilecnt < 3) {
  1173. sprintf(errstr,"WARNING: No randomisation possible with only less than 2 (extra) input file.\n");
  1174. return DATA_ERROR;
  1175. }
  1176. break;
  1177. }
  1178. }
  1179. if(dz->brksize[XSPK_GAIN]) {
  1180. for(n = 0,k = 1; n < dz->brksize[XSPK_GAIN];n++,k+=2)
  1181. dz->brk[XSPK_GAIN][k] = dbtolevel(dz->brk[XSPK_GAIN][k]);
  1182. } else
  1183. dz->param[XSPK_GAIN] = dbtolevel(dz->param[XSPK_GAIN]);
  1184. return FINISHED;
  1185. }
  1186. /********************************************************************************************/
  1187. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1188. {
  1189. if(!strcmp(prog_identifier_from_cmdline,"extspeak")) dz->process = EXTSPEAK;
  1190. else {
  1191. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1192. return(USAGE_ONLY);
  1193. }
  1194. return(FINISHED);
  1195. }
  1196. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1197. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1198. {
  1199. int n;
  1200. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1201. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1202. return(MEMORY_ERROR);
  1203. }
  1204. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1205. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1206. return(MEMORY_ERROR);
  1207. }
  1208. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1209. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1210. return(MEMORY_ERROR);
  1211. }
  1212. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1213. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1214. return(MEMORY_ERROR);
  1215. }
  1216. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1217. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1218. return(MEMORY_ERROR);
  1219. }
  1220. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1221. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1222. return(MEMORY_ERROR);
  1223. }
  1224. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1225. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1226. return(MEMORY_ERROR);
  1227. }
  1228. for(n=0;n<brkcnt;n++) {
  1229. dz->brk[n] = NULL;
  1230. dz->brkptr[n] = NULL;
  1231. dz->brkinit[n] = 0;
  1232. dz->brksize[n] = 0;
  1233. }
  1234. return(FINISHED);
  1235. }
  1236. /******************************** USAGE2 ********************************/
  1237. int usage2(char *str)
  1238. {
  1239. if(!strcmp(str,"extspeak")) {
  1240. fprintf(stderr,
  1241. "\nUSAGE: extspeak extspeak 1-18 infile0 infile1 [infile2..] outfile params\n"
  1242. "PARAMS for each mode\n"
  1243. "1) wsize splice offset N gain seed [-t] [-e] [-k] [-i] [-o] [-r]\n"
  1244. "2) wsize splice offset N gain seed [-t] [-e] [-k] [-i] [-o] \n"
  1245. "3) pattern wsize splice offset N gain [-t] [-e] [-k] [-i] [-o] \n"
  1246. "4) wsize splice offset N gain seed [-t] [-e] [-k] [-r]\n"
  1247. "5) wsize splice offset N gain seed [-t] [-e] [-k]\n"
  1248. "6) pattern wsize splice offset N gain [-t] [-e] [-k]\n"
  1249. "7) cuts splice offset N gain seed [-t] [-e] [-k] [-i] [-o] [-r]\n"
  1250. "8) cuts splice offset N gain seed [-t] [-e] [-k] [-i] [-o] \n"
  1251. "9) cutspat splice offset N gain [-t] [-e] [-k] [-i] [-o] \n"
  1252. "10) cuts splice offset N gain seed [-t] [-e] [-k] [-r]\n"
  1253. "11) cuts splice offset N gain seed [-t] [-e] [-k]\n"
  1254. "12) cutspat splice offset N gain [-t] [-e] [-k]\n"
  1255. "13) cuts+targets splice gain seed [-t] [-e] [-o] [-r]\n"
  1256. "14) cuts+targets splice gain seed [-t] [-e] [-o]\n"
  1257. "15) cuts+tgts+pat splice gain [-t] [-e] [-o]\n"
  1258. "16) cuts+targets splice gain seed [-t] [-e] [-r]\n"
  1259. "17) cuts+targets splice gain seed [-t] [-e]\n"
  1260. "18) cuts+tgts+pat splice gain [-t] [-e]\n"
  1261. "MODES 1-3,6-9 REPLACE - or INJECT BETWEEN - syllabs of infile0 ...\n"
  1262. "MODES 12-15 REPLACE SPECIFIED syllabs of infile0 ...\n"
  1263. "MODES 4-6,10-12 MIX INTO selected syllabs of infile0 ...\n"
  1264. "MODES 16-18 MIX INTO SPECIFIED syllabs of infile0 ...\n"
  1265. " ... NEW SYLLABLES, each taken from one of the other input files.\n"
  1266. "MODES 1/4/7/10/13/16 Select syllabs from each file in turn OR (-r) at random.\n"
  1267. "MODES 2/5/8/11/14/17 Rand-permute order of syllabs. Once ALL used, permute again.\n"
  1268. "MODES 3/6/9/12/15/18 Select infile following specified ordering-pattern.\n"
  1269. "\n"
  1270. "PATTERN Pattern in a Textfile : the specific sequence of syllables to be inserted.\n"
  1271. " e.g. \"1 5 2\" means, use infile1 infile5 infile2 in that order (then repeat).\n"
  1272. "CUTS Modes 7,8,10,11 List of Times, in a Textfile : location of syllable-starts\n"
  1273. " in infile0 (zero time, and time at very end of file, not required).\n"
  1274. "CUTSPAT Modes 9 and 12 List of Times, in a Textfile : location of syllable-starts\n"
  1275. " FOLLOWED BY single line with \"#\", followed by PATTERN Data (see above).\n"
  1276. "CUTS+TARGETS List of Times, in a Textfile : location of syllable-starts\n"
  1277. " FOLLOWED BY single line with \"#\", followed by SYLLABLES TO TARGET Data.\n"
  1278. "CUTS+TGTS+PAT List of Times, in a Textfile : location of syllable-starts\n"
  1279. " FOLLOWED BY single line with \"#\", followed by SYLLABLES TO TARGET Data\n"
  1280. " FOLLOWED BY single line with \"#\", followed by PATTERN Data (see above).\n"
  1281. "If there is NO CUTS/CUTSPAT, infile0 divided into \"syllables\" by automatic process.\n"
  1282. "\n"
  1283. "FOR MORE INFORMATION ----- hit any key on keyboard\n");
  1284. } else {
  1285. fprintf(stdout,"Unknown option '%s'\n",str);
  1286. return USAGE_ONLY;
  1287. }
  1288. _getch();
  1289. while(!kbhit())
  1290. ;
  1291. if(kbhit()) {
  1292. fprintf(stderr,
  1293. "\n"
  1294. "In \"Syllables to Target\" data, the COUNT OF SYLLABLES in infile0\n"
  1295. "is ONE MORE than the number of edit-points you have listed\n"
  1296. "(assuming there are no edits at zero or at the file end).\n"
  1297. "\n"
  1298. " Each edit point marks the END of a syllable\n"
  1299. " and the final syllable is AFTER the last edit.\n"
  1300. "\n"
  1301. "To ensure to target the VERY LAST syllable, the value \"-1\" can be used.\n"
  1302. "\n"
  1303. "\n"
  1304. "\n"
  1305. "\n"
  1306. "PARAMETERS\n"
  1307. "\n"
  1308. "\n"
  1309. "WSIZE Size of envelope-search window to AUTOfind syllabs in file0, in mS (try 50).\n"
  1310. "\n"
  1311. "SPLICE Splice length for extracting and joining syllables (try 15).\n"
  1312. "\n"
  1313. "OFFSET Number of syllables at start of infile0 to output unchanged.\n"
  1314. "\n"
  1315. "N N means write 1 original (file0) syllable for every N new syllabs inserted\n"
  1316. "\n"
  1317. " ...... EXCEPT IF flag \"-k\" is set, when ......\n"
  1318. "\n"
  1319. " N means KEEP N original (file0) syllables for every 1 new syllab inserted.\n"
  1320. "\n"
  1321. "GAIN Gain of inserted syllables (Range -96dB to 0dB).\n"
  1322. "\n"
  1323. "SEED Initialisation for random reorderings, or permutations.\n"
  1324. " If Seed > 0, using SAME seed AGAIN gives IDENTICAL random output.\n"
  1325. "\n"
  1326. "Parameters N and GAIN may vary over time.\n"
  1327. "\n"
  1328. "\n"
  1329. "\n"
  1330. "\n"
  1331. "\n"
  1332. "\n"
  1333. "\n"
  1334. "FOR MORE INFORMATION ----- hit any key on keyboard\n"
  1335. "\n"
  1336. "\n");
  1337. }
  1338. _getch();
  1339. while(!kbhit())
  1340. ;
  1341. if(kbhit()) {
  1342. fprintf(stderr,
  1343. "\n"
  1344. "\n"
  1345. "EXAMPLE USAGE:\n"
  1346. "\n"
  1347. " For N=2 (i.e. REPLACE or KEEP 2 in 3 syllables)\n"
  1348. " AND 9 Original Syllables = ---------\n"
  1349. "\n"
  1350. "No flags: Keep 1, Replace (N=)2 -XX-XX-XX\n"
  1351. "\n"
  1352. "-k flags: Keep (N=)2, Replace 1 --X--X--X\n"
  1353. "\n"
  1354. "-i flag: Keep 1, Inject (N=)2 -XX-XX-XX-XX-XX-XX-XX-XX-XX\n"
  1355. "\n"
  1356. "-i & -k flags: Keep (N=)2, Inject 1 --X--X--X--X-\n"
  1357. "\n"
  1358. "\n"
  1359. "FLAGS.\n"
  1360. "\n"
  1361. "-r RAND: Select next inserted syllable ENTIRELY at random.\n"
  1362. "\n"
  1363. "-k KEEP: N becomes count of syllabs to KEEP rather than to REPLACE or INJECT.\n"
  1364. "\n"
  1365. "-i INJECT new syllable(s) BETWEEN existing infile0 syllables.\n"
  1366. " Default : new syllabs OVERWRITE existing syllables, and are resized to fit.\n"
  1367. "\n"
  1368. "FOLLOWING FLAG ONLY RELEVANT where you REPLACE the original syllables.\n"
  1369. "\n"
  1370. "-o ORIGINAL SIZE: Don't Resize new syllable to size of originals.\n"
  1371. " (Output file will therefore not be same length/rhythm as infile0).\n"
  1372. "\n"
  1373. "FOLLOWING FLAGS ONLY RELEVANT where you REPLACE or MIX INTO the original syllables.\n"
  1374. "\n"
  1375. "-t TRANSPOSE: If Resizing, Transpose/Time-stretch new syllab to adjust length.\n"
  1376. " Default: Cut to Size or Pad with Silence.\n"
  1377. "\n"
  1378. "-e Follow the ENVELOPE of the the original syllables in file0\n"
  1379. " by scaling level of inserted syllab to that of replaced/mixed-into syllable.\n"
  1380. " This scaling is independent of the \"GAIN\" value (which is ALSO applied).\n"
  1381. "\n"
  1382. "\n"
  1383. "\n"
  1384. "\n"
  1385. "FOR MORE INFORMATION ----- hit any key on keyboard\n"
  1386. "\n");
  1387. }
  1388. _getch();
  1389. while(!kbhit())
  1390. ;
  1391. if(kbhit()) {
  1392. fprintf(stderr,
  1393. "CONTOUR TYPES.\n"
  1394. "\n"
  1395. " _\n"
  1396. " / | | _\n"
  1397. " _ ................ Add ..... / |_| | |\n"
  1398. " | | | | | |\n"
  1399. " | | _ | | | |\n"
  1400. " | | _ | | | | |_|\n"
  1401. " | |_ | | _ | | | |_ | |\n"
  1402. " _| | |_| |_ + | | | | = _| | |_| |_\n"
  1403. " | | | | | | | _| |___| |_ | | | | | | |\n"
  1404. "\n"
  1405. "\n"
  1406. "\n"
  1407. "\n"
  1408. " Gain+ _\n"
  1409. " _ ................ Add ..... ../ |_|\n"
  1410. " | | | | _\n"
  1411. " | | ..... | | | |\n"
  1412. " | | _ | | |_|\n"
  1413. " | |_ | | ..... ._. | |_ | |\n"
  1414. " _| | |_| |_ + ._. | | = _| | |_| |_\n"
  1415. " | | | | | | | _| |___| |_ | | | | | | |\n"
  1416. "\n"
  1417. "\n"
  1418. "\n"
  1419. "\n"
  1420. " _\n"
  1421. " / | |\n"
  1422. " / | |\n"
  1423. " / | |\n"
  1424. " / | |\n"
  1425. " / | |\n"
  1426. " _ .... -e ...... _ ..Add../ |_| _\n"
  1427. " | | Envelope |^| | | | |\n"
  1428. " | | |^| ..... | | | |\n"
  1429. " | | _ ........|^|... _ ... | | |_|\n"
  1430. " | |_ | | |^| | | | |_ | |\n"
  1431. " _| | |_| |_ + |_| | | = _| | |_| |_\n"
  1432. " | | | | | | | _| |___| |_ | | | | | | |\n"
  1433. "\n");
  1434. }
  1435. return(USAGE_ONLY);
  1436. }
  1437. int usage3(char *str1,char *str2)
  1438. {
  1439. fprintf(stderr,"Insufficient parameters on command line.\n");
  1440. return(USAGE_ONLY);
  1441. }
  1442. /****************************** GET_MODE *********************************/
  1443. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1444. {
  1445. char temp[200], *p;
  1446. if(sscanf(str,"%s",temp)!=1) {
  1447. sprintf(errstr,"Cannot read mode of program.\n");
  1448. return(USAGE_ONLY);
  1449. }
  1450. p = temp + strlen(temp) - 1;
  1451. while(p >= temp) {
  1452. if(!isdigit(*p)) {
  1453. fprintf(stderr,"Invalid mode of program entered.\n");
  1454. return(USAGE_ONLY);
  1455. }
  1456. p--;
  1457. }
  1458. if(sscanf(str,"%d",&dz->mode)!=1) {
  1459. fprintf(stderr,"Cannot read mode of program.\n");
  1460. return(USAGE_ONLY);
  1461. }
  1462. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1463. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1464. return(USAGE_ONLY);
  1465. }
  1466. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1467. return(FINISHED);
  1468. }
  1469. /****************************** EXTSPEAK *********************************/
  1470. int extspeak(int XSPK_RRND,int XSPK_ORISZ,dataptr dz)
  1471. {
  1472. int exit_status, chans = dz->infile->channels, srate = dz->infile->srate, orig, done;
  1473. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[dz->infilecnt], *ovflwbuf = dz->sampbuf[dz->infilecnt + 1];
  1474. int gpsplicelen = dz->iparam[XSPK_SPLEN];
  1475. int splicelen = gpsplicelen * chans, upsplice;
  1476. int obufpos = 0, lasttrofat = 0, thistrofat, peaklen, splicend;
  1477. int *trof = dz->lparray[0];
  1478. int mintrof;
  1479. int n, m, j, k, z;
  1480. double *splicebuf = dz->parray[0], time = 0, maxgain = 0.0, *origmax = dz->parray[1], *syllmax = dz->parray[2];
  1481. int samps_per_sec = srate * chans;
  1482. double val, gain, normaliser = 1.0;
  1483. int *pattern;
  1484. double Nmaxd, origlevel = 1.0;
  1485. int max_inserts_per_orig, patternsize, patterncnt, patno, syllread, q;
  1486. for(n = 1; n< dz->infilecnt;n++) {
  1487. if((syllread = fgetfbufEx(dz->sampbuf[n], dz->insams[n],dz->ifd[n],0)) < 0) {
  1488. sprintf(errstr,"Can't read samples from soundfile %d\n",n); // RWD was %n
  1489. return(SYSTEM_ERROR);
  1490. }
  1491. if(syllread != dz->insams[n]) {
  1492. sprintf(errstr,"Fail to read all samples from soundfile %d\n",n); // RWD ditto
  1493. return(SYSTEM_ERROR);
  1494. }
  1495. if(dz->vflag[XSPK_ENV] || (dz->mode >= 3 && dz->mode < 6) || (dz->mode >= 9 && dz->mode < 12)|| dz->mode >= 15) {
  1496. maxgain = 0.0;
  1497. for(q = 0; q < dz->insams[n]; q++)
  1498. maxgain = max(maxgain,fabs(dz->sampbuf[n][q]));
  1499. syllmax[n] = maxgain;
  1500. }
  1501. }
  1502. if(dz->mode != 2 && dz->mode != 5 && dz->mode != 8 && dz->mode != 11) {
  1503. if(dz->iparam[XSPK_SEED] > 0)
  1504. srand(dz->iparam[XSPK_SEED]);
  1505. else
  1506. initrand48();
  1507. }
  1508. mintrof = dz->iparam[XSPK_OFFST];
  1509. if(dz->brksize[XSPK_N]) {
  1510. if((exit_status = get_maxvalue_in_brktable(&Nmaxd,XSPK_N,dz))<0)
  1511. return exit_status;
  1512. } else
  1513. Nmaxd = dz->param[XSPK_N];
  1514. if(dz->vflag[XSPK_KEEP]) // One inserted item for every N origs
  1515. max_inserts_per_orig = 1; // Max possible 1 for every 1
  1516. else
  1517. max_inserts_per_orig = (int)ceil(Nmaxd); // Max possible = max_inserts_per_orig
  1518. patternsize = (dz->trofcnt+1) * max_inserts_per_orig; // Max possible pattern size
  1519. if((exit_status = generate_xspk_pattern(XSPK_RRND,patternsize,dz))<0)
  1520. return exit_status;
  1521. if((dz->mode >= 3 && dz->mode < 6) || dz->mode >= 9) {
  1522. fprintf(stdout,"INFO: Calculating Normalisation.\n");
  1523. fflush(stdout);
  1524. if((exit_status = find_orig_syllab_maxima(splicelen,dz)) < 0)
  1525. return exit_status;
  1526. if((exit_status = find_normaliser(&normaliser,samps_per_sec,splicelen,dz)) < 0)
  1527. return exit_status;
  1528. }
  1529. pattern = dz->iparray[PATN_ARRAY];
  1530. orig = 0;
  1531. done = 0;
  1532. lasttrofat = 0;
  1533. splicend = splicelen - 1;
  1534. patterncnt = 0;
  1535. m = mintrof - 1;
  1536. if(m >= 0) {
  1537. thistrofat = trof[m];
  1538. peaklen = thistrofat; // We must be at start of file : therefore no obufpos baktrak & no upsplice
  1539. for(k = 0, j = peaklen - 1; k < thistrofat; k++,j--) {
  1540. if (j < splicelen)
  1541. obuf[obufpos] = (float)(ibuf[k] * splicebuf[splicend--] * normaliser); // do downslice
  1542. else
  1543. obuf[obufpos] = (float)(ibuf[k] * normaliser); // else copy input
  1544. if(++obufpos >= dz->buflen * 2) {
  1545. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1546. return(exit_status);
  1547. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1548. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1549. obufpos -= dz->buflen;
  1550. }
  1551. }
  1552. lasttrofat = thistrofat;
  1553. }
  1554. m++;
  1555. for(n = m; n <= dz->trofcnt; n++) {
  1556. if(n > 0)
  1557. lasttrofat = trof[n-1];
  1558. thistrofat = trof[n];
  1559. peaklen = thistrofat - lasttrofat;
  1560. splicend = splicelen - 1;
  1561. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  1562. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1563. return exit_status;
  1564. gain = dz->param[XSPK_GAIN];
  1565. if(lasttrofat > 0) { // If we're NOT at file start
  1566. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1567. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1568. upsplice = splicelen;
  1569. } else
  1570. upsplice = 0; // Prevents initial splice on start of file-segment
  1571. splicend = splicelen - 1;
  1572. if(dz->vflag[XSPK_ENV])
  1573. origlevel = origmax[n];
  1574. switch(dz->vflag[XSPK_KEEP]) {
  1575. case(0): // N = the number of syllables to insert
  1576. // First Copy ONE original syllable
  1577. for(k = 0, j = peaklen - 1, m = thistrofat - peaklen; k < peaklen; k++,m++,j--) {
  1578. if(k < upsplice)
  1579. val = ibuf[m] * splicebuf[k]; // do upslice
  1580. else if (j < splicelen)
  1581. val = ibuf[m] * splicebuf[splicend--]; // do downslice
  1582. else
  1583. val = ibuf[m]; // else as is
  1584. obuf[obufpos] = (float)(obuf[obufpos] + (val * normaliser));// then normalise and add to buffer
  1585. if(++obufpos >= dz->buflen * 2) {
  1586. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1587. return(exit_status);
  1588. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1589. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1590. obufpos -= dz->buflen;
  1591. }
  1592. }
  1593. for(z = 0; z < dz->iparam[XSPK_N]; z++) { // Then Add N NEW syllables
  1594. if((dz->mode >= 3 && dz->mode < 6) || dz->mode >= 9 || !dz->vflag[XSPK_INJECT]) {
  1595. if(++n > dz->trofcnt) { // Advance count of original syllables
  1596. done = 1; // and If out of original syllables, quit
  1597. break;
  1598. }
  1599. lasttrofat = thistrofat;
  1600. thistrofat = trof[n];
  1601. peaklen = thistrofat - lasttrofat;
  1602. peaklen += splicelen;
  1603. }
  1604. obufpos -= splicelen;
  1605. upsplice = splicelen;
  1606. patno = pattern[patterncnt++];
  1607. if((dz->mode < 3 || (dz->mode >= 6 && dz->mode < 9)) && dz->vflag[XSPK_ORISZ]) // IF not Resizing : write-in ALL of new syllable
  1608. peaklen = dz->insams[patno]; // ELSE it's truncated/extended to size of original syllable
  1609. splicend = peaklen - 1;
  1610. if((exit_status = insert_new_syllable(peaklen,patno,splicelen,gain,origlevel,normaliser,&obufpos,obuf,ovflwbuf,dz))<0)
  1611. return exit_status;
  1612. }
  1613. break;
  1614. case(1): // N = the number of syllables to keep
  1615. if(orig < dz->iparam[XSPK_N]) { // Add an original syllable, Keeping count of how many added
  1616. for(k = 0, j = peaklen - 1, m = thistrofat - peaklen; k < peaklen; k++,m++,j--) {
  1617. if(k < upsplice)
  1618. val = ibuf[m] * splicebuf[k]; // do upslice
  1619. else if (j < splicelen)
  1620. val = ibuf[m] * splicebuf[splicend--]; // do downslice
  1621. else
  1622. val = ibuf[m]; // else as is
  1623. obuf[obufpos] = (float)(obuf[obufpos] + (val * normaliser));// then normalise and add to buffer
  1624. if(++obufpos >= dz->buflen * 2) {
  1625. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1626. return(exit_status);
  1627. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1628. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1629. obufpos -= dz->buflen;
  1630. }
  1631. }
  1632. orig++; // Count how many orig syllabs added
  1633. } else { // If all N orig syllabs have already been added
  1634. patno = pattern[patterncnt++]; // Add JUST 1 NEW syllable
  1635. if((dz->mode < 3 || (dz->mode >= 6 && dz->mode < 9)) && dz->vflag[XSPK_ORISZ])
  1636. peaklen = dz->insams[patno];
  1637. splicend = peaklen - 1;
  1638. if((exit_status = insert_new_syllable(peaklen,patno,splicelen,gain,origlevel,normaliser,&obufpos,obuf,ovflwbuf,dz))<0)
  1639. return exit_status;
  1640. orig = 0; // Reset orig-syllabs counter
  1641. }
  1642. break;
  1643. }
  1644. if(done)
  1645. break;
  1646. }
  1647. if(obufpos) {
  1648. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1649. return(exit_status);
  1650. }
  1651. return FINISHED;
  1652. }
  1653. /****************************** EXTTARGETSPEAK *********************************/
  1654. int exttargetspeak(int XSPK_RRND,int XSPK_ORISZ,dataptr dz)
  1655. {
  1656. int exit_status, chans = dz->infile->channels, srate = dz->infile->srate;
  1657. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[dz->infilecnt], *ovflwbuf = dz->sampbuf[dz->infilecnt + 1];
  1658. int gpsplicelen = dz->iparam[XSPK_SPLEN];
  1659. int splicelen = gpsplicelen * chans, upsplice;
  1660. int obufpos = 0, lasttrofat = 0, thistrofat, peaklen, splicend;
  1661. int *trof = dz->lparray[0];
  1662. int n, m, j, k;
  1663. double *splicebuf = dz->parray[0], time = 0, maxgain = 0.0, *origmax = dz->parray[1], *syllmax = dz->parray[2];
  1664. int samps_per_sec = srate * chans;
  1665. double val, gain, normaliser = 1.0;
  1666. int *pattern, *target;
  1667. double origlevel = 1.0;
  1668. int patterncnt, target_cnt, patno, syllread, q;
  1669. for(n = 1; n< dz->infilecnt;n++) {
  1670. if((syllread = fgetfbufEx(dz->sampbuf[n], dz->insams[n],dz->ifd[n],0)) < 0) {
  1671. sprintf(errstr,"Can't read samples from soundfile %d\n",n); // RWD was %n
  1672. return(SYSTEM_ERROR);
  1673. }
  1674. if(syllread != dz->insams[n]) {
  1675. sprintf(errstr,"Fail to read all samples from soundfile %d\n",n); // RWD ditto
  1676. return(SYSTEM_ERROR);
  1677. }
  1678. if(dz->vflag[XSPK_ENV] || dz->mode >= 15) {
  1679. maxgain = 0.0;
  1680. for(q = 0; q < dz->insams[n]; q++)
  1681. maxgain = max(maxgain,fabs(dz->sampbuf[n][q]));
  1682. syllmax[n] = maxgain;
  1683. }
  1684. }
  1685. if(dz->mode != 14 && dz->mode != 17) {
  1686. if(dz->iparam[XSPK_SEED] > 0)
  1687. srand(dz->iparam[XSPK_SEED]);
  1688. else
  1689. initrand48();
  1690. if((exit_status = generate_xspk_pattern(XSPK_RRND,dz->trofcnt+1,dz))<0)
  1691. return exit_status;
  1692. }
  1693. if(dz->mode >= 15) {
  1694. fprintf(stdout,"INFO: Calculating Normalisation.\n");
  1695. fflush(stdout);
  1696. if((exit_status = find_orig_syllab_maxima(splicelen,dz)) < 0)
  1697. return exit_status;
  1698. if((exit_status = find_normaliser_target(&normaliser,samps_per_sec,splicelen,dz)) < 0)
  1699. return exit_status;
  1700. }
  1701. target = dz->iparray[TRGT_ARRAY];
  1702. pattern = dz->iparray[PATN_ARRAY];
  1703. lasttrofat = 0;
  1704. splicend = splicelen - 1;
  1705. patterncnt = 0;
  1706. target_cnt = 0;
  1707. for(n = 0; n <= dz->trofcnt; n++) {
  1708. if(n > 0)
  1709. lasttrofat = trof[n-1];
  1710. thistrofat = trof[n];
  1711. peaklen = thistrofat - lasttrofat;
  1712. splicend = splicelen - 1;
  1713. if(dz->brksize[XSPK_GAIN]) {
  1714. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  1715. if((exit_status = read_value_from_brktable(time,XSPK_GAIN,dz))<0)
  1716. return exit_status;
  1717. }
  1718. gain = dz->param[XSPK_GAIN];
  1719. if(lasttrofat > 0) { // If we're NOT at file start
  1720. obufpos -= splicelen; // baktrak to splice to end of last segment written
  1721. peaklen += splicelen; // and length of peak is therefore one splicelen longer
  1722. upsplice = splicelen;
  1723. } else
  1724. upsplice = 0; // Prevents initial splice on start of file-segment
  1725. splicend = splicelen - 1;
  1726. if(dz->vflag[XSPK_ENV])
  1727. origlevel = origmax[n];
  1728. if(target_cnt < dz->targetcnt && n == target[target_cnt]) {
  1729. patno = pattern[patterncnt++];
  1730. if((dz->mode < 15) && dz->vflag[XSPK_ORISZ]) // IF not Resizing : write-in ALL of new syllable
  1731. peaklen = dz->insams[patno]; // ELSE it's truncated/extended to size of original syllable
  1732. splicend = peaklen - 1;
  1733. if((exit_status = insert_new_syllable(peaklen,patno,splicelen,gain,origlevel,normaliser,&obufpos,obuf,ovflwbuf,dz))<0)
  1734. return exit_status;
  1735. target_cnt++;
  1736. } else {
  1737. for(k = 0, j = peaklen - 1, m = thistrofat - peaklen; k < peaklen; k++,m++,j--) {
  1738. if(k < upsplice)
  1739. val = ibuf[m] * splicebuf[k]; // do upslice
  1740. else if (j < splicelen)
  1741. val = ibuf[m] * splicebuf[splicend--]; // do downslice
  1742. else
  1743. val = ibuf[m]; // else as is
  1744. obuf[obufpos] = (float)(obuf[obufpos] + (val * normaliser));// then normalise and add to buffer
  1745. if(++obufpos >= dz->buflen * 2) {
  1746. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1747. return(exit_status);
  1748. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1749. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1750. obufpos -= dz->buflen;
  1751. }
  1752. }
  1753. }
  1754. }
  1755. if(obufpos) {
  1756. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1757. return(exit_status);
  1758. }
  1759. return FINISHED;
  1760. }
  1761. /*************************************** EXTRACT_ENV_FROM_SNDFILE **************************/
  1762. int extract_env_from_sndfile(dataptr dz)
  1763. {
  1764. int exit_status;
  1765. float *envptr;
  1766. dz->envcnt = windows_in_sndfile(dz);
  1767. if((dz->fptr[0]=(float *)malloc((dz->envcnt+20) * sizeof(float)))==NULL) {
  1768. sprintf(errstr,"INSUFFICIENT MEMORY to store envelope (2).\n");
  1769. return(MEMORY_ERROR);
  1770. }
  1771. envptr = dz->fptr[0];
  1772. dz->ssampsread = 1;
  1773. while(dz->ssampsread > 0) {
  1774. if((dz->ssampsread = fgetfbufEx(dz->sampbuf[0], dz->insams[0],dz->ifd[0],0)) < 0) {
  1775. sprintf(errstr,"Can't read samples from soundfile 1: extract_env_from_sndfile()\n");
  1776. return(SYSTEM_ERROR);
  1777. }
  1778. if(sloom)
  1779. display_virtual_time(dz->total_samps_read,dz);
  1780. if((exit_status = getenv_of_buffer(dz->ssampsread,&envptr,dz))<0)
  1781. return exit_status;
  1782. }
  1783. dz->fptr[1] = envptr; // envend
  1784. if((exit_status = sndseekEx(dz->ifd[0],0,0))<0) {
  1785. sprintf(errstr,"Failed to return to start of file.\n");
  1786. return SYSTEM_ERROR;
  1787. }
  1788. dz->total_samps_read = 0;
  1789. return(FINISHED);
  1790. }
  1791. /************************* GETENV_OF_BUFFER [READENV] *******************************/
  1792. int getenv_of_buffer(int samps_to_process,float **envptr,dataptr dz)
  1793. {
  1794. int start_samp = 0;
  1795. int envwindow_sampsize = dz->iparam[XSPK_WINSZ];
  1796. float *ibuf = dz->sampbuf[0];
  1797. float *env = *envptr;
  1798. double convertor = 1.0/F_ABSMAXSAMP;
  1799. while(samps_to_process >= envwindow_sampsize) {
  1800. *env++ = (float) (getmaxsamp(start_samp,envwindow_sampsize,ibuf) * convertor);
  1801. start_samp += envwindow_sampsize;
  1802. samps_to_process -= envwindow_sampsize;
  1803. }
  1804. if(samps_to_process) /* Handle any final short buffer */
  1805. *env++ = (float)(getmaxsamp(start_samp,samps_to_process,ibuf) * convertor);
  1806. *envptr = env;
  1807. return FINISHED;
  1808. }
  1809. /****************************** WINDOWS_IN_SNDFILE [GET_ENVSIZE] ******************************/
  1810. int windows_in_sndfile(dataptr dz)
  1811. {
  1812. int envcnt, winsize = dz->iparam[XSPK_WINSZ];
  1813. if(((envcnt = dz->insams[0]/winsize) * winsize)!=dz->insams[0])
  1814. envcnt++;
  1815. return envcnt;
  1816. }
  1817. /*************************** GETMAXSAMP *****************************/
  1818. double getmaxsamp(int startsamp, int sampcnt,float *buffer)
  1819. {
  1820. int i, endsamp = startsamp + sampcnt;
  1821. double thisval, thismaxsamp = 0.0;
  1822. for(i = startsamp; i<endsamp; i++) {
  1823. if((thisval = fabs(buffer[i]))>thismaxsamp)
  1824. thismaxsamp = thisval;
  1825. }
  1826. return thismaxsamp;
  1827. }
  1828. /*************************** EXTTROFSGET *************************/
  1829. int exttrofsget(dataptr dz)
  1830. {
  1831. int upwards, troffcnt = 0, thistrofat, lasttrofat, env_cnt, peaklen;
  1832. int *trof;
  1833. float *p, *q, *ibuf = dz->sampbuf[0];
  1834. double *maxarray, maxlevel;
  1835. int envwindow_sampsize = dz->iparam[XSPK_WINSZ], n, k;
  1836. int minseglen = (dz->iparam[XSPK_SPLEN] * 2) * dz->infile->channels; // Minimum segment to cut is larger than 2 splices.
  1837. float *env, *envend;
  1838. env = dz->fptr[0];
  1839. envend = dz->fptr[1];
  1840. // 2 gpsplices * chans;
  1841. p = env+1;
  1842. q = env;
  1843. if (*p > *q)
  1844. upwards = TRUE;
  1845. else
  1846. upwards = FALSE;
  1847. troffcnt = 0;
  1848. lasttrofat = 0;
  1849. dz->envcnt = 0;
  1850. while(p < envend) {
  1851. if(upwards) {
  1852. if(*p < *q) {
  1853. upwards = FALSE;
  1854. }
  1855. } else {
  1856. if(*p > *q) { // Peak-segments (separated by trofs)
  1857. if(istrof(env,envend,q,EXTSPEAK_PKSRCHWIDTH)) {
  1858. thistrofat = dz->envcnt * envwindow_sampsize;
  1859. peaklen = thistrofat - lasttrofat;
  1860. if(peaklen > minseglen) { // Peak-segments must be longer than 2 splices
  1861. troffcnt++; // This also skips getting a trof AT 0 time
  1862. lasttrofat = thistrofat;
  1863. }
  1864. }
  1865. upwards = TRUE;
  1866. }
  1867. }
  1868. p++;
  1869. q++;
  1870. dz->envcnt++;
  1871. }
  1872. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Allow for trof at EOF
  1873. sprintf(errstr,"INSUFFICIENT MEMORY to store peak-locations.\n");
  1874. return(MEMORY_ERROR);
  1875. }
  1876. if(dz->mode == 1 || dz->mode == 4) {
  1877. if((dz->iparray[PERM_ARRAY] = (int *)malloc((dz->infilecnt - 1) * sizeof(int))) == NULL) { // Storage for permed syllable order
  1878. sprintf(errstr,"INSUFFICIENT MEMORY to store permutation array.\n");
  1879. return(MEMORY_ERROR);
  1880. }
  1881. }
  1882. trof = dz->lparray[0];
  1883. dz->trofcnt = troffcnt;
  1884. p = env+1;
  1885. q = env;
  1886. env_cnt = 0;
  1887. if (*p > *q)
  1888. upwards = TRUE;
  1889. else
  1890. upwards = FALSE;
  1891. troffcnt = 0;
  1892. lasttrofat = 0;
  1893. while(env_cnt < dz->envcnt) {
  1894. if(upwards) {
  1895. if(*p < *q) {
  1896. upwards = FALSE;
  1897. }
  1898. } else {
  1899. if(*p > *q) { // Peak-segments (separated by trofs)
  1900. if(istrof(env,envend,q,EXTSPEAK_PKSRCHWIDTH)) {
  1901. thistrofat = env_cnt * envwindow_sampsize;
  1902. peaklen = thistrofat - lasttrofat;
  1903. if(peaklen > minseglen) {
  1904. trof[troffcnt++] = env_cnt * dz->iparam[XSPK_WINSZ];// Peak-segments must be longer than 2 splices
  1905. lasttrofat = thistrofat; // This also skips getting a trof AT 0 time
  1906. }
  1907. }
  1908. upwards = TRUE;
  1909. }
  1910. }
  1911. p++;
  1912. q++;
  1913. env_cnt++;
  1914. }
  1915. trof[troffcnt] = dz->insams[0]; // Add trof at EOF
  1916. //Only get here if dz->mode < 6
  1917. if(dz->vflag[XSPK_ENV] || dz->mode >= 3) { // Get syllable maxima on infile0
  1918. if((dz->parray[1] = (double *)malloc((dz->trofcnt + 1) * sizeof(double))) == NULL) {
  1919. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (2).\n");
  1920. return(MEMORY_ERROR);
  1921. }
  1922. maxarray = dz->parray[1];
  1923. n = 0;
  1924. lasttrofat = 0;
  1925. while(n <= dz->trofcnt) {
  1926. thistrofat = trof[n];
  1927. k = lasttrofat;
  1928. maxlevel = -HUGE;
  1929. while(k < thistrofat) {
  1930. maxlevel = max(maxlevel,fabs(ibuf[k]));
  1931. k++;
  1932. }
  1933. maxarray[n] = maxlevel;
  1934. lasttrofat = thistrofat;
  1935. n++;
  1936. }
  1937. }
  1938. return(FINISHED);
  1939. }
  1940. /*************************** CREATE_SNDBUFS_FOR_EXTSPEAK **************************
  1941. *
  1942. * Only AFTER params have been read.
  1943. */
  1944. int create_sndbufs_for_extspeak(dataptr dz)
  1945. {
  1946. int bigbufsize, minobufsize, safety = 16;
  1947. int n, k,chans = dz->infile->channels;
  1948. double srate = (double)dz->infile->srate;
  1949. /* All other cases */
  1950. if(dz->bufcnt == dz->infilecnt + 3); // includes end-of-all bufs pointer
  1951. if(dz->sbufptr == 0 || dz->sampbuf == 0) {
  1952. sprintf(errstr,"buffer pointers not allocated: create_sndbufs_for_extspeak()\n");
  1953. return(PROGRAM_ERROR);
  1954. }
  1955. /* minobufsize = 2 * sizeof splice */
  1956. minobufsize = ((int)ceil((dz->param[XSPK_SPLEN] * MS_TO_SECS) * 2.0 * srate) + safety) * chans;
  1957. minobufsize = max(minobufsize,512 * chans);
  1958. bigbufsize = 0;
  1959. for(n = 0; n < dz->infilecnt; n++)
  1960. bigbufsize += dz->insams[n];
  1961. bigbufsize += minobufsize * 2;
  1962. bigbufsize *= sizeof(float);
  1963. if((dz->bigbuf = (float *)malloc((bigbufsize))) == NULL) {
  1964. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1965. return(MEMORY_ERROR);
  1966. }
  1967. dz->sbufptr[0] = dz->sampbuf[0] = dz->bigbuf;
  1968. for(n=0,k=1;n<dz->infilecnt;n++,k++) // Inbufs = size of infles
  1969. dz->sbufptr[k] = dz->sampbuf[k] = dz->sampbuf[n] + dz->insams[n];
  1970. dz->sbufptr[k] = dz->sampbuf[k] = dz->sampbuf[n] + minobufsize; // outbuf and ovflwbuf are minobufsize length
  1971. k++;
  1972. n++;
  1973. dz->sbufptr[k] = dz->sampbuf[k] = dz->sampbuf[n] + minobufsize;
  1974. dz->buflen = minobufsize;
  1975. return(FINISHED);
  1976. }
  1977. /*************************** ISTROF **********************************/
  1978. int istrof(float *env,float *envend,float *q,int width)
  1979. {
  1980. int up, down;
  1981. float *upq, *downq, *r;
  1982. if(width<2)
  1983. return(TRUE);
  1984. down = up = width/2;
  1985. if(EVEN(width))
  1986. down = up - 1; /* set search params above and below q */
  1987. downq = q - down;
  1988. upq = q + up;
  1989. upq = min(envend-1,upq); /* allow for ends of envelope table */
  1990. downq = max(env,downq);
  1991. for(r = downq; r<=upq; r++) {
  1992. if(*q > *r)
  1993. return(FALSE);
  1994. }
  1995. return(TRUE); /* if r is minimum of all in peak, return 1 */
  1996. }
  1997. /*************************** PRECALCULATE_PEAKS_ARRAY_AND_SPLICE **********************************/
  1998. int precalculate_peaks_array_and_splice(dataptr dz)
  1999. {
  2000. int exit_status, chans = dz->infile->channels;
  2001. int gpsplicelen, splicelen, n, m, k;
  2002. double splicincr, *splicebuf;
  2003. int srate = dz->infile->srate;
  2004. int *trof;
  2005. double *maxarray, maxlevel;
  2006. int thistrofat, lasttrofat;
  2007. float *ibuf;
  2008. dz->iparam[XSPK_SPLEN] = (int)round(dz->param[XSPK_SPLEN] * MS_TO_SECS * (double)srate);
  2009. if(dz->mode < 6)
  2010. dz->iparam[XSPK_WINSZ] = (int)round(dz->param[XSPK_WINSZ] * MS_TO_SECS * (double)srate) * chans;
  2011. gpsplicelen = dz->iparam[XSPK_SPLEN];
  2012. splicelen = gpsplicelen * chans;
  2013. splicincr = 1.0/(double)gpsplicelen;
  2014. if((dz->parray[0] = (double *)malloc((splicelen * sizeof(double)))) == NULL) {
  2015. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (2).\n");
  2016. return(MEMORY_ERROR);
  2017. }
  2018. splicebuf = dz->parray[0];
  2019. for(n= 0, m = 0;n < gpsplicelen; n++, m += chans) {
  2020. for(k = 0; k < chans; k++)
  2021. splicebuf[m+k] = (double)n * splicincr;
  2022. }
  2023. if(dz->mode < 6) {
  2024. if((exit_status = extract_env_from_sndfile(dz))< 0)
  2025. return exit_status;
  2026. if((dz->lparray=(int **)malloc(2 * sizeof(int *)))==NULL) {
  2027. sprintf(errstr,"INSUFFICIENT MEMORY to store peaks.\n");
  2028. return(MEMORY_ERROR);
  2029. }
  2030. if((dz->lparray[0]=(int *)malloc(dz->envcnt * sizeof(int)))==NULL) {
  2031. sprintf(errstr,"INSUFFICIENT MEMORY to store peaks (2).\n");
  2032. return(MEMORY_ERROR);
  2033. }
  2034. trof = dz->lparray[0];
  2035. if((exit_status = exttrofsget(dz))< 0)
  2036. return exit_status;
  2037. } else {
  2038. trof = dz->lparray[0]; // Array was created when special-data file "cuts" was read
  2039. ibuf = dz->sampbuf[0];
  2040. if((dz->ssampsread = fgetfbufEx(dz->sampbuf[0],dz->insams[0],dz->ifd[0],0)) < 0) {
  2041. sprintf(errstr,"Can't read samples from soundfile 1: precalculate_peaks_array_and_splice()\n");
  2042. return(SYSTEM_ERROR);
  2043. }
  2044. if(dz->vflag[XSPK_ENV] || (dz->mode >= 9 && dz->mode < 12) || dz->mode >= 15) { // Get syllable maxima on infile0
  2045. if((dz->parray[1] = (double *)malloc((dz->trofcnt + 1) * sizeof(double))) == NULL) {
  2046. sprintf(errstr,"INSUFFICIENT MEMORY to create splice buffer (2).\n");
  2047. return(MEMORY_ERROR);
  2048. }
  2049. maxarray = dz->parray[1];
  2050. n = 0;
  2051. lasttrofat = 0;
  2052. while(n <= dz->trofcnt) {
  2053. thistrofat = trof[n];
  2054. k = lasttrofat;
  2055. maxlevel = -HUGE;
  2056. while(k < thistrofat) {
  2057. maxlevel = max(maxlevel,fabs(ibuf[k]));
  2058. k++;
  2059. }
  2060. maxarray[n] = maxlevel;
  2061. lasttrofat = thistrofat;
  2062. n++;
  2063. }
  2064. }
  2065. }
  2066. return FINISHED;
  2067. }
  2068. /********************************* RANDPERM *************************************/
  2069. void randperm(int z,int setlen,dataptr dz)
  2070. {
  2071. int n, t;
  2072. for(n=0;n<setlen;n++) {
  2073. t = (int)floor(drand48() * (n+1));
  2074. if(t>=n)
  2075. hprefix(z,n,setlen,dz);
  2076. else
  2077. hinsert(z,n,t,setlen,dz);
  2078. }
  2079. }
  2080. /***************************** HINSERT **********************************
  2081. *
  2082. * Insert the value m AFTER the T-th element in iparray[].
  2083. */
  2084. void hinsert(int z,int m,int t,int setlen,dataptr dz)
  2085. {
  2086. hshuflup(z,t+1,setlen,dz);
  2087. dz->iparray[z][t+1] = m;
  2088. }
  2089. /***************************** HPREFIX ************************************
  2090. *
  2091. * Insert the value m at start of the permutation iparray[].
  2092. */
  2093. void hprefix(int z,int m,int setlen,dataptr dz)
  2094. {
  2095. hshuflup(z,0,setlen,dz);
  2096. dz->iparray[z][0] = m;
  2097. }
  2098. /****************************** HSHUFLUP ***********************************
  2099. *
  2100. * move set members in iparray[] upwards, starting from element k.
  2101. */
  2102. void hshuflup(int z,int k,int setlen,dataptr dz)
  2103. {
  2104. int n, *i;
  2105. int y = setlen - 1;
  2106. i = (dz->iparray[z]+y);
  2107. for(n = y;n > k;n--) {
  2108. *i = *(i-1);
  2109. i--;
  2110. }
  2111. }
  2112. /****************************** GENERATE_XSPK_PATTERN ***********************************/
  2113. int generate_xspk_pattern(int XSPK_RRND,int patternsize,dataptr dz)
  2114. {
  2115. int exit_status, lastperm, firstperm, n, patterncnt, syllabcnt, done = 0;
  2116. int *pattern, *permm;
  2117. if(dz->mode != 8 && dz->mode != 11 && dz->mode != 14 && dz->mode != 17) { // In these modes, pattern has already been read
  2118. if((dz->iparray[PATN_ARRAY] = (int *)malloc(patternsize * sizeof(int))) == NULL) {// Storage for permed or swapped syllable order
  2119. sprintf(errstr,"INSUFFICIENT MEMORY to store pattern of new syllables.\n");
  2120. return(MEMORY_ERROR);
  2121. }
  2122. }
  2123. pattern = dz->iparray[PATN_ARRAY];
  2124. syllabcnt = dz->infilecnt - 1; // Count of files with syllables-for-insertion
  2125. patterncnt = 0;
  2126. switch(dz->mode) {
  2127. case(12): // fall thro
  2128. case(15): // fall thro
  2129. case(9): // fall thro
  2130. case(6): // fall thro
  2131. case(3): // fall thro
  2132. case(0): // Syllable pattern is in original order, or entirely random
  2133. if(dz->vflag[XSPK_RRND]) { // Entirely random
  2134. while(patterncnt < patternsize)
  2135. pattern[patterncnt++] = (int)floor(drand48() * syllabcnt) + 1;
  2136. } else { // No flags set : seq of infiles, (repeated) e.g. for 3 files 1 2 3 1 2 3 ....
  2137. while(patterncnt < patternsize) {
  2138. for(n = 0; n < syllabcnt; n++) {
  2139. pattern[patterncnt] = n + 1;
  2140. if(++patterncnt >= patternsize) {
  2141. done = 1;
  2142. break;
  2143. }
  2144. }
  2145. if(done)
  2146. break;
  2147. }
  2148. }
  2149. break;
  2150. case(16): // fall thro
  2151. case(13): // fall thro
  2152. case(10): // fall thro
  2153. case(7): // fall thro
  2154. case(4): // fall thro
  2155. case(1): // Rand-permutation of ALL input syllables, then a different ditto, etc
  2156. permm = dz->iparray[PERM_ARRAY];
  2157. randperm(PERM_ARRAY,syllabcnt,dz); // For syllabcnt 3, perms values 0,1,2 into "permm"
  2158. lastperm = permm[syllabcnt - 1];
  2159. while(patterncnt < patternsize) {
  2160. for(n = 0; n < syllabcnt; n++) {
  2161. pattern[patterncnt] = permm[n] + 1; // Read permd value, but add 1 to index syllab buffers from 1 upwards
  2162. if(++patterncnt >= patternsize) {
  2163. done = 1;
  2164. break;
  2165. }
  2166. }
  2167. if(done)
  2168. break;
  2169. do {
  2170. randperm(1,syllabcnt,dz);
  2171. firstperm = permm[0];
  2172. } while(firstperm == lastperm);
  2173. lastperm = permm[syllabcnt - 1]; // Ensure no syllable repeated betwren end of one perm & start of next
  2174. }
  2175. break;
  2176. case(5): // fall thro
  2177. case(2): // Syllable pattern is input as a file : read it, and expand to fill patternsize
  2178. if((exit_status = handle_pattern_data(patternsize,dz))<0)
  2179. return exit_status;
  2180. break;
  2181. case(8): // fall thro
  2182. case(11): // Syllable pattern HAS ALREADY BEEN input as a file : expand it to fill patternsize
  2183. if((exit_status = expand_pattern_data(patternsize,dz))<0)
  2184. return exit_status;
  2185. break;
  2186. }
  2187. return FINISHED;
  2188. }
  2189. /************************ HANDLE_PATTERN_DATA *********************/
  2190. int handle_pattern_data(int patternsize,dataptr dz)
  2191. {
  2192. aplptr ap = dz->application;
  2193. int patterncnt, linecnt, done, k, j;
  2194. char temp[2000], *q, *filename = dz->wordstor[0];
  2195. int *pattern = dz->iparray[PATN_ARRAY];
  2196. int *p;
  2197. ap->data_in_file_only = TRUE;
  2198. ap->special_range = TRUE;
  2199. ap->min_special = 1;
  2200. ap->max_special = dz->infilecnt - 1;
  2201. if((dz->fp = fopen(filename,"r"))==NULL) {
  2202. sprintf(errstr,"Cannot open pattern datafile %s\n",filename);
  2203. return(DATA_ERROR);
  2204. }
  2205. p = pattern;
  2206. done = 0;
  2207. linecnt = 0;
  2208. patterncnt = 0;
  2209. while(fgets(temp,200,dz->fp)!=NULL) {
  2210. q = temp;
  2211. if(is_an_empty_line_or_a_comment(temp)) {
  2212. linecnt++;
  2213. continue;
  2214. }
  2215. while(get_int_from_within_string(&q,p,0)) {
  2216. if(*p < ap->min_special || *p > ap->max_special) {
  2217. sprintf(errstr,"Pattern number (%d) out of range (from %d to count of NEW syllables in infile list = %d) : file %s : line %d\n",
  2218. (int)round(*p),(int)round(ap->min_special),dz->infilecnt - 1,filename,linecnt+1);
  2219. return(DATA_ERROR);
  2220. }
  2221. if(++patterncnt >= patternsize) {
  2222. done = 1;
  2223. break;
  2224. }
  2225. p++;
  2226. }
  2227. if(done)
  2228. break;
  2229. linecnt++;
  2230. }
  2231. if(fclose(dz->fp)<0) {
  2232. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2233. fflush(stdout);
  2234. }
  2235. if(patterncnt == 0) {
  2236. sprintf(errstr,"No data found in file %s\n",filename);
  2237. return(DATA_ERROR);
  2238. }
  2239. if(patterncnt < patternsize) { // Repeat pattern to fill pattern array
  2240. for(k = patterncnt, j = 0; k < patternsize; k++,j++)
  2241. pattern[k] = pattern[j];
  2242. }
  2243. return(FINISHED);
  2244. }
  2245. /************************************ STORE_PATTERNDATAFILE_NAME ***************************
  2246. *
  2247. * Store the NAME of the special-data file, to open later.
  2248. */
  2249. int store_patterndatafile_name(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2250. {
  2251. int exit_status;
  2252. char *filename = (*cmdline)[0];
  2253. if(!sloom) {
  2254. if(*cmdlinecnt <= 0) {
  2255. sprintf(errstr,"Insufficient parameters on command line.\n");
  2256. return(USAGE_ONLY);
  2257. }
  2258. }
  2259. if((dz->fp = fopen(filename,"r"))==NULL) {
  2260. sprintf(errstr,"Cannot open pattern datafile %s\n",filename);
  2261. return(DATA_ERROR);
  2262. }
  2263. fclose(dz->fp);
  2264. if(dz->wordstor!=NULL)
  2265. free_wordstors(dz);
  2266. dz->all_words = 0;
  2267. if((exit_status = store_filename(filename,dz))<0)
  2268. return(exit_status);
  2269. (*cmdline)++;
  2270. (*cmdlinecnt)--;
  2271. return(FINISHED);
  2272. }
  2273. /************************************ INSERT_NEW_SYLLABLE ***************************/
  2274. int insert_new_syllable(int peaklen,int patno,int splicelen,double gain,double origlevel,double normaliser,int *obufpos, float *obuf, float *ovflwbuf,dataptr dz)
  2275. {
  2276. int exit_status, k, j, m, z, c, gpsmpcnt, chans = dz->infile->channels;
  2277. double frac, diff, flincr, flpos, val;
  2278. double *splicebuf = dz->parray[0];
  2279. float *ibuf = dz->sampbuf[patno], *origibuf, ival;
  2280. double *syllmax = dz->parray[2];
  2281. int ibufpos;
  2282. int splicend = splicelen - 1;
  2283. if(dz->vflag[XSPK_ENV]) // Scale to level of original syllable
  2284. gain *= origlevel/syllmax[patno]; // pattern vals run from 1 (not from zero), and level also stored at 1 upwards
  2285. if((dz->mode >= 3 && dz->mode < 6) || (dz->mode >= 9 && dz->mode < 12) || dz->mode >= 15) {
  2286. origibuf = dz->sampbuf[0];
  2287. ibufpos = dz->total_samps_written + *obufpos;
  2288. switch(dz->vflag[XSPK_TRANSPOSE]) {
  2289. case(0): // CUT OR PAD WITH ZEROS
  2290. for(k = 0, j = peaklen - 1; k < peaklen; k++,j--) {
  2291. if(k >= dz->insams[patno]) // add normalised orig into existing buffer
  2292. ival = 0.0f;
  2293. else
  2294. ival = ibuf[k];
  2295. if(k < splicelen) // do upslice of new syllab BUT ADD ~~NO~~ old syllab (its already there in downsplice)
  2296. val = (origibuf[ibufpos++] + (gain * ival)) * splicebuf[k];
  2297. else if (j < splicelen) // do downslice of new syllab
  2298. val = (origibuf[ibufpos++] + (gain * ival)) * splicebuf[splicend--];
  2299. else // just add, and normalise
  2300. val = origibuf[ibufpos++] + (gain * ival);
  2301. obuf[*obufpos] = (float)(obuf[*obufpos] + (val * normaliser));
  2302. if(++(*obufpos) >= dz->buflen * 2) {
  2303. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2304. return(exit_status);
  2305. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2306. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2307. *obufpos -= dz->buflen;
  2308. }
  2309. }
  2310. break;
  2311. case(1): // TRANSPOSE
  2312. flpos = 0.0; // Flincr increments as GPsampcnt
  2313. flincr = (double)(dz->insams[patno])/(double)peaklen;
  2314. flpos = 0.0; // Flincr increments as GPsampcnt
  2315. for(k = 0,gpsmpcnt = 0,j = peaklen - chans;k < peaklen;gpsmpcnt++,k+=chans,j-=chans) {
  2316. flpos = ((double)k/(double)peaklen) * (double)(dz->insams[patno]/chans);
  2317. m = (int)floor(flpos); // Find the fractional part of the GPchans-xnt
  2318. frac = flpos - (double)m; // Convert to the (channel-base) in the true sampcnt;
  2319. m *= chans;
  2320. for(c = 0; c < chans; c++) { // Do interp between ALL channels
  2321. z = m + chans;
  2322. val = ibuf[m];
  2323. diff = ibuf[z] - ibuf[m];
  2324. val += diff * frac;
  2325. if(k < splicelen) // do upslice of new syllab
  2326. val = (origibuf[ibufpos++] + (gain * val)) * splicebuf[k];
  2327. else if (j < splicelen) // do downslice of new syllab mixing with orig
  2328. val = (origibuf[ibufpos++] + (gain * val)) * splicebuf[splicend--];
  2329. else // just add, and normalise
  2330. val = origibuf[ibufpos++] + (gain * val);
  2331. obuf[*obufpos] = (float)(obuf[*obufpos] + (val * normaliser));
  2332. m++;
  2333. (*obufpos)++;
  2334. }
  2335. if(*obufpos >= dz->buflen * 2) {
  2336. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2337. return(exit_status);
  2338. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2339. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2340. *obufpos -= dz->buflen;
  2341. }
  2342. }
  2343. break;
  2344. }
  2345. return FINISHED;
  2346. }
  2347. switch(dz->vflag[XSPK_TRANSPOSE]) {
  2348. case(0): // CUT OR PAD WITH ZEROS
  2349. for(k = 0, j = peaklen - 1; k < peaklen; k++,j--) {
  2350. if(k >= dz->insams[patno]) // add nothing into existing buffer
  2351. ;
  2352. else if(k < splicelen) // do upslice
  2353. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * (ibuf[k] * splicebuf[k])));
  2354. else if (j < splicelen) // do downslice
  2355. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * (ibuf[k] * splicebuf[splicend--])));
  2356. else
  2357. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * ibuf[k])); // just copy
  2358. if(++(*obufpos) >= dz->buflen * 2) {
  2359. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2360. return(exit_status);
  2361. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2362. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2363. *obufpos -= dz->buflen;
  2364. }
  2365. }
  2366. break;
  2367. case(1): // TRANSPOSE
  2368. for(k = 0,gpsmpcnt = 0,j = peaklen - chans;k < peaklen;gpsmpcnt++,k+=chans,j-=chans) {
  2369. flpos = ((double)k/(double)peaklen) * (double)(dz->insams[patno]/chans);
  2370. m = (int)floor(flpos); // Find the fractional part of the GPchans-xnt
  2371. frac = flpos - (double)m; // Convert to the (channel-base) in the true sampcnt;
  2372. m *= chans;
  2373. for(c = 0; c < chans; c++) { // Do interp between ALL channels
  2374. z = m + chans;
  2375. val = ibuf[m];
  2376. diff = ibuf[z] - ibuf[m];
  2377. val += (diff * frac);
  2378. if(k < splicelen)
  2379. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * val * splicebuf[k]));
  2380. else if (j < splicelen) // do upslice
  2381. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * val * splicebuf[splicend--]));
  2382. else // do downslice
  2383. obuf[*obufpos] = (float)(obuf[*obufpos] + (gain * val));
  2384. m++; // just add in
  2385. (*obufpos)++;
  2386. }
  2387. if(*obufpos >= dz->buflen * 2) {
  2388. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  2389. return(exit_status);
  2390. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  2391. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  2392. *obufpos -= dz->buflen;
  2393. }
  2394. }
  2395. break;
  2396. }
  2397. return FINISHED;
  2398. }
  2399. /************************ HANDLE_EXTRA_INFILES *********************/
  2400. int handle_the_extra_infiles(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2401. {
  2402. /* OPEN ANY FURTHER INFILES, CHECK COMPATIBILITY, STORE DATA AND INFO */
  2403. int exit_status;
  2404. int n;
  2405. char *filename;
  2406. fileptr fp2 = NULL;
  2407. for(n=1;n<dz->infilecnt;n++) {
  2408. filename = (*cmdline)[0];
  2409. if((exit_status = open_checktype_getsize_and_compare_header(filename,n,&fp2,dz))<0)
  2410. return(exit_status);
  2411. (*cmdline)++;
  2412. (*cmdlinecnt)--;
  2413. }
  2414. return(FINISHED);
  2415. }
  2416. /************************** GET_INT_FROM_WITHIN_STRING **************************
  2417. * takes a pointer TO A POINTER to a string. If it succeeds in finding
  2418. * aN INT it returns the int value (*val), and it's new position in the
  2419. * string (*str).
  2420. */
  2421. int get_int_from_within_string(char **str,int *val,int minus_one_ok)
  2422. {
  2423. char *p, *valstart;
  2424. int has_digits = 0;
  2425. p = *str;
  2426. while(isspace(*p))
  2427. p++;
  2428. valstart = p;
  2429. if(minus_one_ok) {
  2430. if(*p == NEGATION) {
  2431. p++;
  2432. if(*p != 1 + INT_TO_ASCII) // Only neg number allowed is -1
  2433. return(FALSE);
  2434. }
  2435. }
  2436. if(!isdigit(*p))
  2437. return(FALSE);
  2438. has_digits = TRUE;
  2439. p++;
  2440. while(!isspace(*p) && *p!=NEWLINE && *p!=ENDOFSTR) {
  2441. if(isdigit(*p))
  2442. has_digits = TRUE;
  2443. p++;
  2444. }
  2445. if(!has_digits || sscanf(valstart,"%d",val)!=1)
  2446. return(FALSE);
  2447. *str = p;
  2448. return(TRUE);
  2449. }
  2450. /************************** OPEN_CHECKTYPE_GETSIZE_AND_COMPARE_HEADER *****************************/
  2451. int open_checktype_getsize_and_compare_header(char *filename,int fileno,fileptr *fp2,dataptr dz)
  2452. {
  2453. int exit_status;
  2454. infileptr ifp;
  2455. double maxamp, maxloc;
  2456. int maxrep;
  2457. int getmax = 0, getmaxinfo = 0;
  2458. fileptr fp1 = dz->infile;
  2459. if((dz->ifd[fileno] = sndopenEx(filename,0,CDP_OPEN_RDONLY)) < 0) {
  2460. sprintf(errstr,"cannot open input file %s to read data.\n",filename);
  2461. return(DATA_ERROR);
  2462. }
  2463. if((ifp = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  2464. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (1)\n");
  2465. return(MEMORY_ERROR);
  2466. }
  2467. if((*fp2 = (fileptr)malloc(sizeof(struct fileprops)))==NULL) {
  2468. sprintf(errstr,"INSUFFICIENT MEMORY to store data on later infile. (2)\n");
  2469. return(MEMORY_ERROR);
  2470. }
  2471. if((exit_status = readhead(ifp,dz->ifd[fileno],filename,&maxamp,&maxloc,&maxrep,getmax,getmaxinfo))<0)
  2472. return(exit_status);
  2473. copy_to_fileptr(ifp,*fp2);
  2474. if((*fp2)->filetype != SNDFILE) {
  2475. sprintf(errstr,"%s is not a sound file.\n",filename);
  2476. return(DATA_ERROR);
  2477. }
  2478. if((*fp2)->filetype != fp1->filetype) {
  2479. sprintf(errstr,"Incompatible file type in input file %s.\n",filename);
  2480. return(DATA_ERROR);
  2481. }
  2482. if((*fp2)->srate != fp1->srate) {
  2483. sprintf(errstr,"Incompatible sample-rate in input file %s.\n",filename);
  2484. return(DATA_ERROR);
  2485. }
  2486. if((*fp2)->channels != fp1->channels) {
  2487. sprintf(errstr,"Incompatible channel-count in input file %s.\n",filename);
  2488. return(DATA_ERROR);
  2489. }
  2490. if((dz->insams[fileno] = sndsizeEx(dz->ifd[fileno]))<0) { /* FIND SIZE OF FILE */
  2491. sprintf(errstr, "Can't read size of input file %s.\n");
  2492. return(PROGRAM_ERROR);
  2493. }
  2494. return(FINISHED);
  2495. }
  2496. /***************************************** FIND_ORIG_SYLLAB_MAXIMA *******************************/
  2497. int find_orig_syllab_maxima(int splicelen,dataptr dz)
  2498. {
  2499. int thistrofat, lasttrofat, n, k;
  2500. int *trof = dz->lparray[0];
  2501. double maxlevel, *origmax = dz->parray[1];
  2502. float *ibuf = dz->sampbuf[0];
  2503. lasttrofat = 0;
  2504. for(n = 0; n <= dz->trofcnt;n++) {
  2505. thistrofat = trof[n];
  2506. lasttrofat = max(0,lasttrofat - splicelen);
  2507. maxlevel = 0.0;
  2508. for(k = lasttrofat; k < thistrofat; k++)
  2509. maxlevel = max(maxlevel,ibuf[k]);
  2510. origmax[n] = maxlevel;
  2511. lasttrofat = thistrofat;
  2512. }
  2513. return FINISHED;
  2514. }
  2515. /***************************************** FIND_NORMALISER *******************************/
  2516. int find_normaliser(double *normaliser,int samps_per_sec,int splicelen,dataptr dz)
  2517. {
  2518. int exit_status, patterncnt, patno, z, n, done, orig;
  2519. double newmaxlevel, time = 0.0;
  2520. int lasttrofat, thistrofat, peaklen;
  2521. int *trof = dz->lparray[0];
  2522. int *pattern = dz->iparray[PATN_ARRAY];
  2523. double thislevel, *origlevel = dz->parray[1], *syllmax = dz->parray[2];
  2524. done = 0;
  2525. orig = 0;
  2526. patterncnt = 0;
  2527. lasttrofat = 0;
  2528. newmaxlevel = 0.0;
  2529. z = 0;
  2530. while(z < dz->iparam[XSPK_OFFST]) {
  2531. newmaxlevel = max(newmaxlevel,origlevel[z]);
  2532. z++;
  2533. }
  2534. for(n = z; n <= dz->trofcnt; n++) {
  2535. if(n > 0)
  2536. lasttrofat = trof[n-1];
  2537. lasttrofat = max(0,lasttrofat - splicelen);
  2538. thistrofat = trof[n];
  2539. peaklen = thistrofat - lasttrofat;
  2540. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  2541. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  2542. return exit_status;
  2543. switch(dz->vflag[XSPK_KEEP]) {
  2544. case(0): // N = the number of syllables to insert
  2545. newmaxlevel = max(newmaxlevel,origlevel[n]); // Just read level of file0 syllable
  2546. for(z = 0; z < dz->iparam[XSPK_N]; z++) { // Then Consider N NEW syllables
  2547. if(++n >= dz->trofcnt) { // Advance count of original syllables
  2548. done = 1; // and If out of original syllables, quit
  2549. break;
  2550. }
  2551. if(dz->brksize[XSPK_GAIN]) {
  2552. lasttrofat = thistrofat; // Reset time to read any gain table
  2553. thistrofat = trof[n];
  2554. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  2555. if((exit_status = read_value_from_brktable(time,XSPK_GAIN,dz))<0)
  2556. return exit_status;
  2557. }
  2558. patno = pattern[patterncnt++];
  2559. if(dz->vflag[XSPK_ENV])
  2560. thislevel = origlevel[n] + (origlevel[n] * dz->param[XSPK_GAIN]); // File0-level + (scaled fileN-level X gain)
  2561. else
  2562. thislevel = origlevel[n] + (syllmax[patno] * dz->param[XSPK_GAIN]); // File0-level + (fileN-level X gain)
  2563. newmaxlevel = max(newmaxlevel,thislevel);
  2564. }
  2565. break;
  2566. case(1): // N = the number of syllables to keep
  2567. if(orig < dz->iparam[XSPK_N]) { // Add an original syllable, Keeping count of how many added
  2568. newmaxlevel = max(newmaxlevel,origlevel[n]);
  2569. orig++; // Count how many orig syllabs added
  2570. } else { // If all N orig syllabs have already been added
  2571. if(++n >= dz->trofcnt) { // Advance count of original syllables
  2572. done = 1; // and If out of original syllables, quit
  2573. break;
  2574. }
  2575. if(dz->brksize[XSPK_GAIN]) {
  2576. lasttrofat = thistrofat;
  2577. thistrofat = trof[n];
  2578. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  2579. if((exit_status = read_value_from_brktable(time,XSPK_GAIN,dz))<0)
  2580. return exit_status;
  2581. }
  2582. patno = pattern[patterncnt++]; // Add JUST 1 NEW syllable
  2583. if(dz->vflag[XSPK_ENV])
  2584. thislevel = origlevel[n] + (origlevel[n] * dz->param[XSPK_GAIN]); // File0-level + (scaled fileN-level X gain)
  2585. else
  2586. thislevel = origlevel[n] + (syllmax[patno] * dz->param[XSPK_GAIN]); // File0-level + (fileN-level X gain)
  2587. newmaxlevel = max(newmaxlevel,thislevel);
  2588. orig = 0; // Reset orig-syllabs counter
  2589. }
  2590. break;
  2591. }
  2592. if(done)
  2593. break;
  2594. }
  2595. if(newmaxlevel > XSPK_MAXLEVEL)
  2596. *normaliser = XSPK_MAXLEVEL/newmaxlevel;
  2597. return FINISHED;
  2598. }
  2599. /***************************************** FIND_NORMALISER_TARGET *******************************/
  2600. int find_normaliser_target(double *normaliser,int samps_per_sec,int splicelen,dataptr dz)
  2601. {
  2602. int exit_status, patterncnt, patno, n;
  2603. double newmaxlevel, time = 0.0;
  2604. int lasttrofat, thistrofat, peaklen;
  2605. int *trof = dz->lparray[0];
  2606. int target_cnt, *pattern = dz->iparray[PATN_ARRAY], *target = dz->iparray[TRGT_ARRAY];
  2607. double thislevel, *origlevel = dz->parray[1], *syllmax = dz->parray[2];
  2608. lasttrofat = 0;
  2609. target_cnt = 0;
  2610. patterncnt = 0;
  2611. newmaxlevel = 0.0;
  2612. for(n = 0; n <= dz->trofcnt; n++) {
  2613. if(n > 0)
  2614. lasttrofat = trof[n-1];
  2615. lasttrofat = max(0,lasttrofat - splicelen);
  2616. thistrofat = trof[n];
  2617. peaklen = thistrofat - lasttrofat;
  2618. if(target_cnt < dz->targetcnt && n == target[target_cnt]) {
  2619. if(dz->brksize[XSPK_GAIN]) {
  2620. time = get_syllable_time(thistrofat,lasttrofat,peaklen,n,samps_per_sec,dz);
  2621. if((exit_status = read_value_from_brktable(time,XSPK_GAIN,dz))<0)
  2622. return exit_status;
  2623. }
  2624. patno = pattern[patterncnt++];
  2625. if(dz->vflag[XSPK_ENV])
  2626. thislevel = origlevel[n] + (origlevel[n] * dz->param[XSPK_GAIN]); // File0-level + (scaled fileN-level X gain)
  2627. else
  2628. thislevel = origlevel[n] + (syllmax[patno] * dz->param[XSPK_GAIN]); // File0-level + (fileN-level X gain)
  2629. newmaxlevel = max(newmaxlevel,thislevel);
  2630. target_cnt++;
  2631. } else
  2632. newmaxlevel = max(newmaxlevel,origlevel[n]);
  2633. }
  2634. if(newmaxlevel > XSPK_MAXLEVEL)
  2635. *normaliser = XSPK_MAXLEVEL/newmaxlevel;
  2636. return FINISHED;
  2637. }
  2638. /*************************************** GET_SYLLABLE_TIME ****************************************/
  2639. double get_syllable_time(int thistrofat,int lasttrofat,int peaklen,int n,int samps_per_sec,dataptr dz)
  2640. {
  2641. double time;
  2642. if(lasttrofat == 0) // time is zero at first syllab of file0
  2643. time = 0,0;
  2644. else if(n == dz->trofcnt) // time is EOF at last syllab of file0
  2645. time = (double)thistrofat/(double)samps_per_sec;
  2646. else // ELSE time is mid-point of syllable
  2647. time = (double)(thistrofat + (peaklen/2))/(double)samps_per_sec;
  2648. return time;
  2649. }
  2650. /******************************** DBTOLEVEL ***********************/
  2651. double dbtolevel(double val)
  2652. {
  2653. int isneg = 0;
  2654. if(flteq(val,0.0))
  2655. return(1.0);
  2656. if(val < 0.0) {
  2657. val = -val;
  2658. isneg = 1;
  2659. }
  2660. val /= 20.0;
  2661. val = pow(10.0,val);
  2662. if(isneg)
  2663. val = 1.0/val;
  2664. return(val);
  2665. }
  2666. /******************************** GETCUTDATA ***********************/
  2667. int getcutdata(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2668. {
  2669. aplptr ap = dz->application;
  2670. int troffcnt, linecnt, chans = dz->infile->channels, srate = dz->infile->srate;
  2671. char temp[2000], *q, *filename = (*cmdline)[0];
  2672. int *trof;
  2673. double *p, dummy;
  2674. ap->data_in_file_only = TRUE;
  2675. ap->special_range = TRUE;
  2676. ap->min_special = 0;
  2677. ap->max_special = dz->duration;
  2678. if((dz->fp = fopen(filename,"r"))==NULL) {
  2679. sprintf(errstr,"Cannot open pattern datafile %s\n",filename);
  2680. return(DATA_ERROR);
  2681. }
  2682. p = &dummy;
  2683. linecnt = 0;
  2684. troffcnt = 0;
  2685. while(fgets(temp,200,dz->fp)!=NULL) {
  2686. q = temp;
  2687. if(is_an_empty_line_or_a_comment(temp)) {
  2688. linecnt++;
  2689. continue;
  2690. }
  2691. while(get_float_from_within_string(&q,p)) {
  2692. if(*p < ap->min_special || *p > ap->max_special) {
  2693. sprintf(errstr,"Cut position (%lf) out of range (%lf to %lf): file %s : line %d\n",
  2694. *p,ap->min_special,ap->max_special,filename,linecnt+1);
  2695. return(DATA_ERROR);
  2696. }
  2697. troffcnt++;
  2698. }
  2699. linecnt++;
  2700. }
  2701. if(troffcnt == 0) {
  2702. if(fclose(dz->fp)<0) {
  2703. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2704. fflush(stdout);
  2705. }
  2706. sprintf(errstr,"No data found in file %s\n",filename);
  2707. return(DATA_ERROR);
  2708. }
  2709. if((dz->lparray=(int **)malloc(2 * sizeof(int *)))==NULL) {
  2710. sprintf(errstr,"INSUFFICIENT MEMORY to store trofs (1).\n");
  2711. return(MEMORY_ERROR);
  2712. }
  2713. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Storage for syllable edit-point data
  2714. sprintf(errstr,"INSUFFICIENT MEMORY to store trofs (2).\n");
  2715. return(MEMORY_ERROR);
  2716. }
  2717. if(dz->mode == 7 || dz->mode == 10) {
  2718. if((dz->iparray[PERM_ARRAY] = (int *)malloc((dz->infilecnt - 1) * sizeof(int))) == NULL) { // Storage for permed syllable order
  2719. sprintf(errstr,"INSUFFICIENT MEMORY to store permutation array.\n");
  2720. return(MEMORY_ERROR);
  2721. }
  2722. }
  2723. if(fseek(dz->fp,0,0)< 0) {
  2724. sprintf(errstr,"Failed to return to start of file %s.\n",filename);
  2725. return SYSTEM_ERROR;
  2726. }
  2727. troffcnt = 0;
  2728. trof = dz->lparray[0];
  2729. while(fgets(temp,200,dz->fp)!=NULL) {
  2730. q = temp;
  2731. if(is_an_empty_line_or_a_comment(temp))
  2732. continue;
  2733. while(get_float_from_within_string(&q,p))
  2734. trof[troffcnt++] = (int)(*p * (double)srate) * chans;
  2735. }
  2736. if(fclose(dz->fp)<0) {
  2737. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2738. fflush(stdout);
  2739. }
  2740. if(trof[troffcnt - 1] >= dz->insams[0]-chans) // Ignore any splice at End-of-file
  2741. troffcnt--; // by moving it to the troffcnt spot
  2742. else
  2743. trof[troffcnt] = dz->insams[0];
  2744. dz->trofcnt = troffcnt;
  2745. (*cmdline)++;
  2746. (*cmdlinecnt)--;
  2747. return FINISHED;
  2748. }
  2749. /************************ GET_CUTPAT_DATA *********************/
  2750. int get_cutpat_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2751. {
  2752. aplptr ap = dz->application;
  2753. int troffcnt, patterncnt, linecnt, gottrof, chans = dz->infile->channels, srate = dz->infile->srate;
  2754. char temp[2000], *q, *filename = (*cmdline)[0];
  2755. int maxpatternsize, *trof;
  2756. double *dp, ddummy;
  2757. int *ip, idummy, *pattern;
  2758. ap->data_in_file_only = TRUE;
  2759. ap->special_range = TRUE;
  2760. ap->min_special = 0;
  2761. ap->max_special = dz->duration;
  2762. ap->min_special2 = 1;
  2763. ap->max_special2 = dz->infilecnt - 1;
  2764. if((dz->fp = fopen(filename,"r"))==NULL) {
  2765. sprintf(errstr,"Cannot open splicing & pattern datafile %s\n",filename);
  2766. return(DATA_ERROR);
  2767. }
  2768. dp = &ddummy;
  2769. ip = &idummy;
  2770. gottrof = 0;
  2771. linecnt = 1;
  2772. troffcnt = 0;
  2773. patterncnt = 0;
  2774. while(fgets(temp,200,dz->fp)!=NULL) {
  2775. q = temp;
  2776. if(temp[0] == '#') {
  2777. if(gottrof) {
  2778. sprintf(errstr,"Too many \"#\" lines in the file\n");
  2779. return(DATA_ERROR);
  2780. }
  2781. if(strlen(temp) != 1) {
  2782. q++;
  2783. while(*q != ENDOFSTR) { // Catch error like #1 1 2 3 4, with pattern item(s) on same line as #
  2784. if(!isspace(*q)) {
  2785. sprintf(errstr,"Spurious characters found on \"#\" line in file %s\n",filename);
  2786. if(fclose(dz->fp)<0) {
  2787. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2788. fflush(stdout);
  2789. }
  2790. return DATA_ERROR;
  2791. }
  2792. q++;
  2793. }
  2794. }
  2795. gottrof = 1;
  2796. linecnt++;
  2797. continue;
  2798. }
  2799. else if(is_an_empty_line_or_a_comment(temp)) {
  2800. linecnt++;
  2801. continue;
  2802. }
  2803. if(gottrof) { // Looking for pattern numbers
  2804. while(get_int_from_within_string(&q,ip,0)) {
  2805. if(*ip < ap->min_special2 || *ip > ap->max_special2) {
  2806. sprintf(errstr,"Pattern number (%d) out of range (from %d to count of NEW syllables in infile list = %d) : file %s : line %d\n",
  2807. *ip,(int)round(ap->min_special2),(int)round(ap->max_special2),filename,linecnt);
  2808. return(DATA_ERROR);
  2809. }
  2810. patterncnt++;
  2811. }
  2812. } else { // Looking for file edit times
  2813. while(get_float_from_within_string(&q,dp)) {
  2814. if(*dp < ap->min_special || *dp > ap->max_special) {
  2815. sprintf(errstr,"Cut position (%lf) out of range (%lf to %lf): file %s : line %d\n",
  2816. *dp,ap->min_special,ap->max_special,filename,linecnt);
  2817. return(DATA_ERROR);
  2818. }
  2819. troffcnt++;
  2820. }
  2821. }
  2822. linecnt++;
  2823. }
  2824. if(troffcnt == 0 || patterncnt == 0) {
  2825. if(fclose(dz->fp)<0) {
  2826. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2827. fflush(stdout);
  2828. }
  2829. if(troffcnt == 0 && patterncnt == 0) {
  2830. sprintf(errstr,"No data found in file %s\n",filename);
  2831. return(DATA_ERROR);
  2832. } else if(troffcnt == 0) {
  2833. sprintf(errstr,"No file edit times found in file %s\n",filename);
  2834. return(DATA_ERROR);
  2835. } else {
  2836. if(!gottrof) {
  2837. sprintf(errstr,"No separator \"#\" found in file %s\n",filename);
  2838. return(DATA_ERROR);
  2839. } else {
  2840. sprintf(errstr,"No pattern data found in file %s\n",filename);
  2841. return(DATA_ERROR);
  2842. }
  2843. }
  2844. }
  2845. if((dz->lparray=(int **)malloc(2 * sizeof(int *)))==NULL) {
  2846. sprintf(errstr,"INSUFFICIENT MEMORY to store cut times (1).\n");
  2847. return(MEMORY_ERROR);
  2848. }
  2849. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Storage for syllable edit-point data
  2850. sprintf(errstr,"INSUFFICIENT MEMORY to store source cut times (2).\n");
  2851. return(MEMORY_ERROR);
  2852. }
  2853. if(dz->mode == 7 || dz->mode == 10) {
  2854. if((dz->iparray[PERM_ARRAY] = (int *)malloc((dz->infilecnt - 1) * sizeof(int))) == NULL) { // Storage for permed syllable order
  2855. sprintf(errstr,"INSUFFICIENT MEMORY to store permutation array.\n");
  2856. return(MEMORY_ERROR);
  2857. }
  2858. }
  2859. maxpatternsize = (troffcnt+1) * (1 + MAX_PATN);
  2860. if((dz->iparray[PATN_ARRAY] = (int *)malloc(maxpatternsize * sizeof(int))) == NULL) { // Storage for pattern of syllables
  2861. sprintf(errstr,"INSUFFICIENT MEMORY to store pattern of new syllables.\n");
  2862. return(MEMORY_ERROR);
  2863. }
  2864. if(fseek(dz->fp,0,0)< 0) {
  2865. sprintf(errstr,"Failed to return to start of file %s.\n",filename);
  2866. return SYSTEM_ERROR;
  2867. }
  2868. dp = &ddummy;
  2869. ip = &idummy;
  2870. gottrof = 0;
  2871. linecnt = 0;
  2872. trof = dz->lparray[0];
  2873. pattern = dz->iparray[PATN_ARRAY];
  2874. troffcnt = 0;
  2875. patterncnt = 0;
  2876. while(fgets(temp,200,dz->fp)!=NULL) {
  2877. q = temp;
  2878. if(temp[0] == '#') {
  2879. gottrof = 1;
  2880. continue;
  2881. }
  2882. if(is_an_empty_line_or_a_comment(temp))
  2883. continue;
  2884. if(gottrof) { // Looking for pattern numbers
  2885. while(get_int_from_within_string(&q,ip,0))
  2886. pattern[patterncnt++] = *ip;
  2887. } else { // Looking for file edit times
  2888. while(get_float_from_within_string(&q,dp))
  2889. trof[troffcnt++] = (int)(*dp * (double)srate) * chans;
  2890. }
  2891. }
  2892. if(fclose(dz->fp)<0) {
  2893. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2894. fflush(stdout);
  2895. }
  2896. if(trof[troffcnt - 1] >= dz->insams[0]-chans) // Ignore any splice at End-of-file
  2897. troffcnt--; // by moving it to the troffcnt spot
  2898. else
  2899. trof[troffcnt] = dz->insams[0];
  2900. dz->trofcnt = troffcnt;
  2901. dz->itemcnt = patterncnt;
  2902. (*cmdline)++;
  2903. (*cmdlinecnt)--;
  2904. return(FINISHED);
  2905. }
  2906. /************************ EXPAND_PATTERN_DATA *********************/
  2907. int expand_pattern_data(int patternsize,dataptr dz)
  2908. {
  2909. int k, j;
  2910. int *pattern = dz->iparray[PATN_ARRAY];
  2911. if(dz->itemcnt < patternsize) { // Repeat pattern to fill pattern array : Array already has max possible size for patterns
  2912. for(k = dz->itemcnt, j = 0; k < patternsize; k++,j++)
  2913. pattern[k] = pattern[j % dz->itemcnt];
  2914. }
  2915. return FINISHED;
  2916. }
  2917. /************************ GET_CUTTARG_DATA *********************/
  2918. int get_cuttarg_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  2919. {
  2920. aplptr ap = dz->application;
  2921. int troffcnt, target_cnt, linecnt, gottrof, chans = dz->infile->channels, srate = dz->infile->srate;
  2922. char temp[2000], *q, *filename = (*cmdline)[0];
  2923. int *trof;
  2924. double *dp, ddummy;
  2925. int *ip, idummy, *target, n, m, k;
  2926. ap->data_in_file_only = TRUE;
  2927. ap->special_range = TRUE;
  2928. ap->min_special = 0;
  2929. ap->max_special = dz->duration;
  2930. ap->min_special2 = 1;
  2931. ap->max_special2 = dz->infilecnt - 1;
  2932. if((dz->fp = fopen(filename,"r"))==NULL) {
  2933. sprintf(errstr,"Cannot open splicing & target datafile %s\n",filename);
  2934. return(DATA_ERROR);
  2935. }
  2936. dp = &ddummy;
  2937. ip = &idummy;
  2938. gottrof = 0;
  2939. linecnt = 1;
  2940. troffcnt = 0;
  2941. target_cnt = 0;
  2942. while(fgets(temp,200,dz->fp)!=NULL) {
  2943. q = temp;
  2944. if(temp[0] == '#') {
  2945. if(gottrof) {
  2946. sprintf(errstr,"Too many \"#\" lines in the file\n");
  2947. return(DATA_ERROR);
  2948. }
  2949. if(strlen(temp) != 1) {
  2950. q++;
  2951. while(*q != ENDOFSTR) { // Catch error like #1 1 2 3 4, with target item(s) on same line as #
  2952. if(!isspace(*q)) {
  2953. sprintf(errstr,"Spurious characters found on \"#\" line in file %s\n",filename);
  2954. if(fclose(dz->fp)<0) {
  2955. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2956. fflush(stdout);
  2957. }
  2958. return DATA_ERROR;
  2959. }
  2960. q++;
  2961. }
  2962. }
  2963. gottrof = 1;
  2964. linecnt++;
  2965. continue;
  2966. }
  2967. else if(is_an_empty_line_or_a_comment(temp)) {
  2968. linecnt++;
  2969. continue;
  2970. }
  2971. if(gottrof) { // Looking for target numbers
  2972. while(get_int_from_within_string(&q,ip,1)) {
  2973. if((*ip != -1) && (*ip == 0 || *ip > troffcnt+1)) {
  2974. sprintf(errstr,"Target number (%d) out of range (from 1 to count of syllabs within file0 (%d) = %d) OR -1 (for last syllab)le: file %s : line %d\n",
  2975. *ip,troffcnt+1,filename,linecnt);
  2976. return(DATA_ERROR);
  2977. }
  2978. target_cnt++;
  2979. }
  2980. } else { // Looking for file edit times
  2981. while(get_float_from_within_string(&q,dp)) {
  2982. if(*dp < ap->min_special || *dp > ap->max_special) {
  2983. sprintf(errstr,"Cut position (%lf) out of range (%lf to %lf): file %s : line %d\n",
  2984. *dp,ap->min_special,ap->max_special,filename,linecnt);
  2985. return(DATA_ERROR);
  2986. }
  2987. troffcnt++;
  2988. }
  2989. }
  2990. linecnt++;
  2991. }
  2992. if(troffcnt == 0 || target_cnt == 0) {
  2993. if(fclose(dz->fp)<0) {
  2994. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  2995. fflush(stdout);
  2996. }
  2997. if(troffcnt == 0 && target_cnt == 0) {
  2998. sprintf(errstr,"No data found in file %s\n",filename);
  2999. return(DATA_ERROR);
  3000. } else if(troffcnt == 0) {
  3001. sprintf(errstr,"No file edit times found in file %s\n",filename);
  3002. return(DATA_ERROR);
  3003. } else {
  3004. if(!gottrof) {
  3005. sprintf(errstr,"No separator \"#\" found in file %s\n",filename);
  3006. return(DATA_ERROR);
  3007. } else {
  3008. sprintf(errstr,"No target data found in file %s\n",filename);
  3009. return(DATA_ERROR);
  3010. }
  3011. }
  3012. }
  3013. if((dz->lparray=(int **)malloc(2 * sizeof(int *)))==NULL) {
  3014. sprintf(errstr,"INSUFFICIENT MEMORY to store source cut times (1).\n");
  3015. return(MEMORY_ERROR);
  3016. }
  3017. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Storage for syllable edit-point data
  3018. sprintf(errstr,"INSUFFICIENT MEMORY to store source cut times (2).\n");
  3019. return(MEMORY_ERROR);
  3020. }
  3021. if((dz->iparray[TRGT_ARRAY] = (int *)malloc((troffcnt+1) * sizeof(int))) == NULL) { // Storage for targeted syllables
  3022. sprintf(errstr,"INSUFFICIENT MEMORY to store target syllables.\n");
  3023. return(MEMORY_ERROR);
  3024. }
  3025. if(dz->mode == 13 || dz->mode == 16) {
  3026. if((dz->iparray[PERM_ARRAY] = (int *)malloc((dz->infilecnt - 1) * sizeof(int))) == NULL) { // Storage for permed syllable order
  3027. sprintf(errstr,"INSUFFICIENT MEMORY to store permutation array.\n");
  3028. return(MEMORY_ERROR);
  3029. }
  3030. }
  3031. if(fseek(dz->fp,0,0)< 0) {
  3032. sprintf(errstr,"Failed to return to start of file %s.\n",filename);
  3033. return SYSTEM_ERROR;
  3034. }
  3035. dp = &ddummy;
  3036. ip = &idummy;
  3037. gottrof = 0;
  3038. linecnt = 0;
  3039. trof = dz->lparray[0];
  3040. target = dz->iparray[TRGT_ARRAY];
  3041. troffcnt = 0;
  3042. target_cnt = 0;
  3043. while(fgets(temp,200,dz->fp)!=NULL) {
  3044. q = temp;
  3045. if(temp[0] == '#') {
  3046. gottrof = 1;
  3047. continue;
  3048. }
  3049. if(is_an_empty_line_or_a_comment(temp))
  3050. continue;
  3051. if(gottrof) { // Looking for target numbers
  3052. while(get_int_from_within_string(&q,ip,1)) {
  3053. if(*ip < 0)
  3054. *ip = troffcnt + 1;
  3055. target[target_cnt++] = *ip;
  3056. }
  3057. } else { // Looking for file edit times
  3058. while(get_float_from_within_string(&q,dp))
  3059. trof[troffcnt++] = (int)(*dp * (double)srate) * chans;
  3060. }
  3061. }
  3062. if(fclose(dz->fp)<0) {
  3063. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  3064. fflush(stdout);
  3065. }
  3066. if(trof[troffcnt - 1] >= dz->insams[0]-chans) // Ignore any splice at End-of-file
  3067. troffcnt--; // by moving it to the troffcnt spot
  3068. else
  3069. trof[troffcnt] = dz->insams[0];
  3070. dz->trofcnt = troffcnt;
  3071. for(n = 0; n < target_cnt-1;n++) { // Sort targets to ascending order, and erase duplicates
  3072. for(m = n+1; m < target_cnt; m++) {
  3073. if(target[n] == target[m]) {
  3074. fprintf(stdout,"syllable %d targeted more than once.\n",target[n]);
  3075. fflush(stdout);
  3076. if(m < target_cnt - 1) {
  3077. for(k = m+1;k < target_cnt;k++)
  3078. target[k-1] = target[k]; // Erase by shufldown
  3079. }
  3080. target_cnt--;
  3081. m--;
  3082. } else if(target[m] < target[n]) {
  3083. k = target[m];
  3084. target[m] = target[n];
  3085. target[n] = k;
  3086. }
  3087. }
  3088. }
  3089. for(n = 0; n < target_cnt;n++) // Make targets count from zero
  3090. target[n]--;
  3091. dz->targetcnt = target_cnt;
  3092. (*cmdline)++;
  3093. (*cmdlinecnt)--;
  3094. return(FINISHED);
  3095. }
  3096. /************************ GET_CUTTAPA_DATA *********************/
  3097. int get_cuttapa_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  3098. {
  3099. aplptr ap = dz->application;
  3100. int troffcnt, target_cnt, patterncnt, linecnt, gothash, chans = dz->infile->channels, srate = dz->infile->srate;
  3101. char temp[2000], *q, *filename = (*cmdline)[0];
  3102. int *trof;
  3103. double *dp, ddummy;
  3104. int *ip, idummy, *pattern, *target, n, m, k;
  3105. ap->data_in_file_only = TRUE;
  3106. ap->special_range = TRUE;
  3107. ap->min_special = 0;
  3108. ap->max_special = dz->duration;
  3109. ap->min_special2 = 1;
  3110. ap->max_special2 = dz->infilecnt - 1;
  3111. if((dz->fp = fopen(filename,"r"))==NULL) {
  3112. sprintf(errstr,"Cannot open splicing,pattern and targeting datafile %s\n",filename);
  3113. return(DATA_ERROR);
  3114. }
  3115. dp = &ddummy;
  3116. ip = &idummy;
  3117. gothash = 0;
  3118. linecnt = 1;
  3119. troffcnt = 0;
  3120. target_cnt = 0;
  3121. patterncnt = 0;
  3122. while(fgets(temp,200,dz->fp)!=NULL) {
  3123. q = temp;
  3124. if(temp[0] == '#') {
  3125. if(gothash == 2) {
  3126. sprintf(errstr,"Too many \"#\" signs in datafile %s\n",filename);
  3127. return(DATA_ERROR);
  3128. }
  3129. if(strlen(temp) != 1) {
  3130. q++;
  3131. while(*q != ENDOFSTR) { // Catch error like #1 1 2 3 4, with pattern item(s) on same line as #
  3132. if(!isspace(*q)) {
  3133. if(gothash)
  3134. sprintf(errstr,"Spurious characters found on second \"#\" line in file %s\n",filename);
  3135. else
  3136. sprintf(errstr,"Spurious characters found on first \"#\" line in file %s\n",filename);
  3137. if(fclose(dz->fp)<0) {
  3138. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  3139. fflush(stdout);
  3140. }
  3141. return DATA_ERROR;
  3142. }
  3143. q++;
  3144. }
  3145. }
  3146. gothash++;
  3147. linecnt++;
  3148. continue;
  3149. }
  3150. else if(is_an_empty_line_or_a_comment(temp)) {
  3151. linecnt++;
  3152. continue;
  3153. }
  3154. if(gothash == 2) { // Looking for target numbers
  3155. while(get_int_from_within_string(&q,ip,1)) {
  3156. if((*ip != -1) && (*ip == 0 || *ip > troffcnt+1)) {
  3157. sprintf(errstr,"Target number (%d) out of range (from 1 to count of syllabs within file0 = %d) OR -1 for last syllable: file %s : line %d\n",
  3158. *ip,troffcnt+1,filename,linecnt);
  3159. return(DATA_ERROR);
  3160. }
  3161. target_cnt++;
  3162. }
  3163. } else if(gothash == 1) { // Looking for pattern
  3164. while(get_int_from_within_string(&q,ip,0)) {
  3165. if(*ip < ap->min_special2 || *ip > ap->max_special2) {
  3166. sprintf(errstr,"Pattern number (%d) out of range (from %d to count of NEW syllables (%d) in infile list = %d) : file %s : line %d\n",
  3167. *ip,dz->infilecnt-1,(int)round(ap->min_special2),(int)round(ap->max_special2),filename,linecnt);
  3168. return(DATA_ERROR);
  3169. }
  3170. patterncnt++;
  3171. }
  3172. } else { // Looking for file edit times
  3173. while(get_float_from_within_string(&q,dp)) {
  3174. if(*dp < ap->min_special || *dp > ap->max_special) {
  3175. sprintf(errstr,"Cut position (%lf) out of range (%lf to %lf): file %s : line %d\n",
  3176. *dp,ap->min_special,ap->max_special,filename,linecnt);
  3177. return(DATA_ERROR);
  3178. }
  3179. troffcnt++;
  3180. }
  3181. }
  3182. linecnt++;
  3183. }
  3184. if(troffcnt == 0 || patterncnt == 0 || target_cnt == 0) {
  3185. if(fclose(dz->fp)<0) {
  3186. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  3187. fflush(stdout);
  3188. }
  3189. if(troffcnt == 0 && patterncnt == 0 && target_cnt == 0) {
  3190. sprintf(errstr,"No data found in file %s\n",filename);
  3191. return(DATA_ERROR);
  3192. } else if(troffcnt == 0) {
  3193. sprintf(errstr,"No file edit times found in file %s\n",filename);
  3194. return(DATA_ERROR);
  3195. } else {
  3196. if(gothash == 0) {
  3197. sprintf(errstr,"No separator \"#\" found in file %s\n",filename);
  3198. return(DATA_ERROR);
  3199. } else if(gothash == 1) {
  3200. sprintf(errstr,"No 2nd separator \"#\" found in file %s\n",filename);
  3201. return(DATA_ERROR);
  3202. } else if(target_cnt == 0) {
  3203. sprintf(errstr,"No target data found in file %s\n",filename);
  3204. return(DATA_ERROR);
  3205. } else {
  3206. sprintf(errstr,"No pattern data found in file %s\n",filename);
  3207. return(DATA_ERROR);
  3208. }
  3209. }
  3210. }
  3211. if((dz->lparray=(int **)malloc(2 * sizeof(int *)))==NULL) {
  3212. sprintf(errstr,"INSUFFICIENT MEMORY to store cut times (1).\n");
  3213. return(MEMORY_ERROR);
  3214. }
  3215. if((dz->lparray[0] = (int *)malloc((troffcnt + 1) * sizeof(int))) == NULL) { // Storage for syllable edit-point data
  3216. sprintf(errstr,"INSUFFICIENT MEMORY to store source cut times (2).\n");
  3217. return(MEMORY_ERROR);
  3218. }
  3219. if((dz->iparray[PATN_ARRAY] = (int *)malloc((troffcnt+1) * sizeof(int))) == NULL) { // Storage for pattern of syllables
  3220. sprintf(errstr,"INSUFFICIENT MEMORY to store target syllables.\n");
  3221. return(MEMORY_ERROR);
  3222. }
  3223. if((dz->iparray[TRGT_ARRAY] = (int *)malloc((troffcnt+1) * sizeof(int))) == NULL) { // Storage for target syllables
  3224. sprintf(errstr,"INSUFFICIENT MEMORY to store target syllables.\n");
  3225. return(MEMORY_ERROR);
  3226. }
  3227. if(fseek(dz->fp,0,0)< 0) {
  3228. sprintf(errstr,"Failed to return to start of file %s.\n",filename);
  3229. return SYSTEM_ERROR;
  3230. }
  3231. dp = &ddummy;
  3232. ip = &idummy;
  3233. gothash = 0;
  3234. linecnt = 0;
  3235. trof = dz->lparray[0];
  3236. pattern = dz->iparray[PATN_ARRAY];
  3237. target = dz->iparray[TRGT_ARRAY];
  3238. troffcnt = 0;
  3239. patterncnt = 0;
  3240. target_cnt = 0;
  3241. while(fgets(temp,200,dz->fp)!=NULL) {
  3242. q = temp;
  3243. if(temp[0] == '#') {
  3244. gothash++;
  3245. continue;
  3246. }
  3247. if(is_an_empty_line_or_a_comment(temp))
  3248. continue;
  3249. if(gothash == 2) { // Looking for target list
  3250. while(get_int_from_within_string(&q,ip,1)) {
  3251. if(*ip < 0)
  3252. *ip = troffcnt+1;
  3253. target[target_cnt++] = *ip;
  3254. }
  3255. } else if(gothash == 1) { // Looking for pattern numbers
  3256. while(get_int_from_within_string(&q,ip,0))
  3257. pattern[patterncnt++] = *ip;
  3258. } else { // Looking for file edit times
  3259. while(get_float_from_within_string(&q,dp))
  3260. trof[troffcnt++] = (int)(*dp * (double)srate) * chans;
  3261. }
  3262. }
  3263. if(fclose(dz->fp)<0) {
  3264. fprintf(stdout,"WARNING: Failed to close datafile %s.\n",filename);
  3265. fflush(stdout);
  3266. }
  3267. if(trof[troffcnt - 1] >= dz->insams[0]-chans) // Ignore any splice at End-of-file
  3268. troffcnt--; // by moving it to the troffcnt spot
  3269. else
  3270. trof[troffcnt] = dz->insams[0];
  3271. dz->trofcnt = troffcnt;
  3272. for(n = 0; n < target_cnt-1;n++) { // Sort targets to ascending order, and erase duplicates
  3273. for(m = n+1; m < target_cnt; m++) {
  3274. if(target[n] == target[m]) {
  3275. fprintf(stdout,"syllable %d targeted more than once.\n",target[n]);
  3276. fflush(stdout);
  3277. if(m < target_cnt - 1) {
  3278. for(k = m+1;k < target_cnt;k++)
  3279. target[k-1] = target[k]; // Erase by shufldown
  3280. }
  3281. target_cnt--;
  3282. m--;
  3283. } else if(target[m] < target[n]) { // Swap out-of-order targets
  3284. k = target[m];
  3285. target[m] = target[n];
  3286. target[n] = k;
  3287. }
  3288. }
  3289. }
  3290. for(n = 0; n < target_cnt;n++) // Make targets count from zero
  3291. target[n]--;
  3292. dz->targetcnt = target_cnt;
  3293. if(patterncnt < dz->trofcnt + 1) { // Expand pattern to max possible size
  3294. for(n = 0, k = patterncnt; k < dz->trofcnt+1;n++,k++)
  3295. pattern[k] = pattern[n % patterncnt];
  3296. }
  3297. (*cmdline)++;
  3298. (*cmdlinecnt)--;
  3299. return(FINISHED);
  3300. }