envnu.c 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <pnames.h>
  26. #include <filetype.h>
  27. #include <processno.h>
  28. #include <modeno.h>
  29. #include <logic.h>
  30. #include <globcon.h>
  31. #include <cdpmain.h>
  32. #include <math.h>
  33. #include <mixxcon.h>
  34. #include <osbind.h>
  35. #include <standalone.h>
  36. #include <ctype.h>
  37. #include <sfsys.h>
  38. #include <string.h>
  39. #include <srates.h>
  40. //#ifdef unix
  41. #define round(x) lround((x))
  42. //#endif
  43. #ifndef HUGE
  44. #define HUGE 3.40282347e+38F
  45. #endif
  46. char errstr[2400];
  47. int anal_infiles = 1;
  48. int sloom = 0;
  49. int sloombatch = 0;
  50. const char* cdp_version = "7.1.0";
  51. //CDP LIB REPLACEMENTS
  52. static int check_the_param_validity_and_consistency(dataptr dz);
  53. static int setup_envnu_application(dataptr dz);
  54. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  55. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  56. static int setup_envnu_param_ranges_and_defaults(dataptr dz);
  57. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  58. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  59. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  60. static int establish_application(dataptr dz);
  61. static int initialise_vflags(dataptr dz);
  62. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  63. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  64. static int mark_parameter_types(dataptr dz,aplptr ap);
  65. static int assign_file_data_storage(int infilecnt,dataptr dz);
  66. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  67. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  68. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  69. static int expdecay(dataptr dz);
  70. static void getenv_of_buffer(int samps_to_process,int envwindow_sampsize,double convertor,double time_convertor,float **envptr,float *buffer,dataptr dz);
  71. static int windows_in_sndfile(dataptr dz);
  72. static int buffers_in_sndfile(int buffer_size,dataptr dz);
  73. static int peakchop(dataptr dz);
  74. static int extract_env_from_sndfile(int *envcnt,dataptr dz);
  75. static void extract_peaks_from_envelope(int *envcnt,dataptr dz);
  76. static int eliminate_too_low_peaks(int *envcnt,dataptr dz);
  77. static int find_exact_peaktimes(int envcnt,dataptr dz);
  78. static int calculate_event_outtimes(int envcnt,int *outcnt,dataptr dz);
  79. static int generate_enveloped_output(int envcnt,int outcnt,dataptr dz);
  80. static double getmaxsamp(int startsamp, int sampcnt,float *buffer);
  81. static int create_peakchop_sndbufs(dataptr dz);
  82. static int peakchop_param_preprocess(dataptr dz);
  83. static int generate_envelope_as_output(int envcnt,dataptr dz);
  84. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  85. static int beyond_endtime(char **cmdline,int cmdlinecnt,dataptr dz);
  86. static int this_value_is_numeric(char *str);
  87. /**************************************** MAIN *********************************************/
  88. int main(int argc,char *argv[])
  89. {
  90. int exit_status;
  91. dataptr dz = NULL;
  92. char **cmdline;
  93. int cmdlinecnt;
  94. int n;
  95. //aplptr ap;
  96. int is_launched = FALSE;
  97. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  98. fprintf(stdout,"%s\n",cdp_version);
  99. fflush(stdout);
  100. return 0;
  101. }
  102. /* CHECK FOR SOUNDLOOM */
  103. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  104. sloom = 0;
  105. sloombatch = 1;
  106. }
  107. if(sflinit("cdp")){
  108. sfperror("cdp: initialisation\n");
  109. return(FAILED);
  110. }
  111. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  112. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  113. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  114. return(FAILED);
  115. }
  116. if(!sloom) {
  117. if(argc == 1) {
  118. usage1();
  119. return(FAILED);
  120. } else if(argc == 2) {
  121. usage2(argv[1]);
  122. return(FAILED);
  123. }
  124. }
  125. if(!sloom) {
  126. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  127. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  128. return(FAILED);
  129. }
  130. cmdline = argv;
  131. cmdlinecnt = argc;
  132. if((get_the_process_no(argv[0],dz))<0)
  133. return(FAILED);
  134. cmdline++;
  135. cmdlinecnt--;
  136. if(dz->process == PEAKCHOP) {
  137. dz->maxmode = 2;
  138. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  139. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  140. return(FAILED);
  141. }
  142. cmdline++;
  143. cmdlinecnt--;
  144. }
  145. else
  146. dz->maxmode = 0;
  147. // setup_particular_application =
  148. if((exit_status = setup_envnu_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_envnu_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. // handle_extra_infiles() : redundant
  182. // handle_outfile() =
  183. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  184. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  185. return(FAILED);
  186. }
  187. // handle_formants() redundant
  188. // handle_formant_quiksearch() redundant
  189. // handle_special_data() redundant
  190. is_launched = TRUE;
  191. switch(dz->process) {
  192. case(EXPDECAY):
  193. dz->bufcnt = 1;
  194. break;
  195. case(PEAKCHOP):
  196. if(dz->mode == 0)
  197. dz->bufcnt = 3;
  198. else
  199. dz->bufcnt = 1;
  200. break;
  201. }
  202. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  203. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  204. return(MEMORY_ERROR);
  205. }
  206. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  207. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  208. return(MEMORY_ERROR);
  209. }
  210. for(n = 0;n <dz->bufcnt; n++)
  211. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  212. dz->sampbuf[n] = (float *)0;
  213. if(!sloom && (dz->process == EXPDECAY)) {
  214. if(beyond_endtime(cmdline,cmdlinecnt,dz)) // In cmdline version, endtime vals beyond end of file are trapped
  215. sprintf(cmdline[1],"%f",0.0); // and (temporarily) set to 0 here
  216. }
  217. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) {
  218. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  219. return(FAILED);
  220. }
  221. if((exit_status = check_the_param_validity_and_consistency(dz))<0) {
  222. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  223. return(FAILED);
  224. }
  225. switch(dz->process) {
  226. case(EXPDECAY):
  227. if((exit_status = create_sndbufs(dz)) < 0)
  228. return(exit_status);
  229. break;
  230. case(PEAKCHOP):
  231. if(dz->mode == 0) {
  232. if((exit_status = create_peakchop_sndbufs(dz)) < 0)
  233. return(exit_status);
  234. } else {
  235. if((exit_status = create_sndbufs(dz)) < 0)
  236. return(exit_status);
  237. }
  238. if((exit_status = peakchop_param_preprocess(dz)) < 0)
  239. return(exit_status);
  240. break;
  241. }
  242. switch(dz->process) {
  243. case(EXPDECAY):
  244. if((exit_status = expdecay(dz))<0) {
  245. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  246. return(FAILED);
  247. }
  248. break;
  249. case(PEAKCHOP):
  250. if((exit_status = peakchop(dz))<0) {
  251. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  252. return(FAILED);
  253. }
  254. break;
  255. }
  256. if((exit_status = complete_output(dz))<0) { // CDP LIB
  257. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  258. return(FAILED);
  259. }
  260. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  261. free(dz);
  262. return(SUCCEEDED);
  263. }
  264. /**********************************************
  265. REPLACED CDP LIB FUNCTIONS
  266. **********************************************/
  267. /****************************** SET_PARAM_DATA *********************************/
  268. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  269. {
  270. ap->special_data = (char)special_data;
  271. ap->param_cnt = (char)paramcnt;
  272. ap->max_param_cnt = (char)maxparamcnt;
  273. if(ap->max_param_cnt>0) {
  274. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  275. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  276. return(MEMORY_ERROR);
  277. }
  278. strcpy(ap->param_list,paramlist);
  279. }
  280. return(FINISHED);
  281. }
  282. /****************************** SET_VFLGS *********************************/
  283. int set_vflgs
  284. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  285. {
  286. ap->option_cnt = (char) optcnt; /*RWD added cast */
  287. if(optcnt) {
  288. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  289. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  290. return(MEMORY_ERROR);
  291. }
  292. strcpy(ap->option_list,optlist);
  293. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  294. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  295. return(MEMORY_ERROR);
  296. }
  297. strcpy(ap->option_flags,optflags);
  298. }
  299. ap->vflag_cnt = (char) vflagcnt;
  300. ap->variant_param_cnt = (char) vparamcnt;
  301. if(vflagcnt) {
  302. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  303. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  304. return(MEMORY_ERROR);
  305. }
  306. strcpy(ap->variant_list,varlist);
  307. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  308. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  309. return(MEMORY_ERROR);
  310. }
  311. strcpy(ap->variant_flags,varflags);
  312. }
  313. return(FINISHED);
  314. }
  315. /***************************** APPLICATION_INIT **************************/
  316. int application_init(dataptr dz)
  317. {
  318. int exit_status;
  319. int storage_cnt;
  320. int tipc, brkcnt;
  321. aplptr ap = dz->application;
  322. if(ap->vflag_cnt>0)
  323. initialise_vflags(dz);
  324. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  325. ap->total_input_param_cnt = (char)tipc;
  326. if(tipc>0) {
  327. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  328. return(exit_status);
  329. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  330. return(exit_status);
  331. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  332. return(exit_status);
  333. }
  334. brkcnt = tipc;
  335. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  336. if(brkcnt>0) {
  337. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  338. return(exit_status);
  339. }
  340. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  341. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  342. return(exit_status);
  343. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  344. return(exit_status);
  345. }
  346. if((exit_status = mark_parameter_types(dz,ap))<0)
  347. return(exit_status);
  348. // establish_infile_constants() replaced by
  349. dz->infilecnt = 1;
  350. //establish_bufptrs_and_extra_buffers():
  351. if(dz->process == PEAKCHOP) {
  352. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
  353. return(exit_status);
  354. }
  355. return(FINISHED);
  356. }
  357. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  358. /* RWD mallo changed to calloc; helps debug verison run as release! */
  359. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  360. {
  361. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  362. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  363. return(MEMORY_ERROR);
  364. }
  365. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  366. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  367. return(MEMORY_ERROR);
  368. }
  369. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  370. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  371. return(MEMORY_ERROR);
  372. }
  373. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  374. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  375. return(MEMORY_ERROR);
  376. }
  377. return(FINISHED);
  378. }
  379. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  380. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  381. {
  382. int n;
  383. for(n=0;n<storage_cnt;n++) {
  384. dz->is_int[n] = (char)0;
  385. dz->no_brk[n] = (char)0;
  386. }
  387. return(FINISHED);
  388. }
  389. /***************************** MARK_PARAMETER_TYPES **************************/
  390. int mark_parameter_types(dataptr dz,aplptr ap)
  391. {
  392. int n, m; /* PARAMS */
  393. for(n=0;n<ap->max_param_cnt;n++) {
  394. switch(ap->param_list[n]) {
  395. case('0'): break; /* dz->is_active[n] = 0 is default */
  396. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  397. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  398. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  399. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  400. default:
  401. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  402. return(PROGRAM_ERROR);
  403. }
  404. } /* OPTIONS */
  405. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  406. switch(ap->option_list[n]) {
  407. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  408. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  409. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  410. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  411. default:
  412. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  413. return(PROGRAM_ERROR);
  414. }
  415. } /* VARIANTS */
  416. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  417. switch(ap->variant_list[n]) {
  418. case('0'): break;
  419. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  420. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  421. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  422. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  423. default:
  424. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  425. return(PROGRAM_ERROR);
  426. }
  427. } /* INTERNAL */
  428. for(n=0,
  429. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  430. switch(ap->internal_param_list[n]) {
  431. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  432. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  433. case('d'): dz->no_brk[m] = (char)1; break;
  434. default:
  435. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  436. return(PROGRAM_ERROR);
  437. }
  438. }
  439. return(FINISHED);
  440. }
  441. /************************ HANDLE_THE_OUTFILE *********************/
  442. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  443. {
  444. int exit_status;
  445. char *filename = (*cmdline)[0], *p;
  446. if(filename[0]=='-' && filename[1]=='f') {
  447. dz->floatsam_output = 1;
  448. dz->true_outfile_stype = SAMP_FLOAT;
  449. filename+= 2;
  450. }
  451. if(!sloom) {
  452. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  453. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  454. return(DATA_ERROR);
  455. }
  456. }
  457. if(sloom) {
  458. p = filename + strlen(filename);
  459. p--;
  460. while(*p != '.') {
  461. p--;
  462. if(p < filename)
  463. break;
  464. }
  465. if(p >= filename)
  466. *p = ENDOFSTR;
  467. }
  468. if(dz->process != PEAKCHOP || dz->mode != 1)
  469. strcpy(dz->outfilename,filename);
  470. if((exit_status = create_sized_outfile(filename,dz))<0)
  471. return(exit_status);
  472. (*cmdline)++;
  473. (*cmdlinecnt)--;
  474. return(FINISHED);
  475. }
  476. /***************************** ESTABLISH_APPLICATION **************************/
  477. int establish_application(dataptr dz)
  478. {
  479. aplptr ap;
  480. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  481. sprintf(errstr,"establish_application()\n");
  482. return(MEMORY_ERROR);
  483. }
  484. ap = dz->application;
  485. memset((char *)ap,0,sizeof(struct applic));
  486. return(FINISHED);
  487. }
  488. /************************* INITIALISE_VFLAGS *************************/
  489. int initialise_vflags(dataptr dz)
  490. {
  491. int n;
  492. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  493. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  494. return(MEMORY_ERROR);
  495. }
  496. for(n=0;n<dz->application->vflag_cnt;n++)
  497. dz->vflag[n] = FALSE;
  498. return FINISHED;
  499. }
  500. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  501. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  502. {
  503. int n;
  504. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  505. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  506. return(MEMORY_ERROR);
  507. }
  508. for(n=0;n<tipc;n++)
  509. ap->default_val[n] = 0.0;
  510. return(FINISHED);
  511. }
  512. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  513. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  514. {
  515. int n;
  516. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  517. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  518. return(MEMORY_ERROR);
  519. }
  520. for(n=0;n<tipc;n++)
  521. dz->is_active[n] = (char)0;
  522. return(FINISHED);
  523. }
  524. /************************* SETUP_ENVU_APPLICATION *******************/
  525. int setup_envnu_application(dataptr dz)
  526. {
  527. int exit_status;
  528. aplptr ap;
  529. if((exit_status = establish_application(dz))<0) // GLOBAL
  530. return(FAILED);
  531. ap = dz->application;
  532. // SEE parstruct FOR EXPLANATION of next 2 functions
  533. switch(dz->process) {
  534. case(EXPDECAY):
  535. if((exit_status = set_param_data(ap,0 ,2,2,"dd"))<0)
  536. return(FAILED);
  537. if((exit_status = set_vflgs(ap,"",0,"","",0,0,""))<0)
  538. return(FAILED);
  539. // set_legal_infile_structure -->
  540. dz->has_otherfile = FALSE;
  541. // assign_process_logic -->
  542. dz->input_data_type = SNDFILES_ONLY;
  543. dz->process_type = UNEQUAL_SNDFILE;
  544. dz->outfiletype = SNDFILE_OUT;
  545. dz->array_cnt = 0;
  546. break;
  547. case(PEAKCHOP):
  548. if(dz->mode == 0) {
  549. if((exit_status = set_param_data(ap,0 ,5,5,"dDDDD"))<0)
  550. return(FAILED);
  551. if((exit_status = set_vflgs(ap,"",0,"","gqsnrm",6,6,"ddDDII"))<0)
  552. return(FAILED);
  553. // assign_process_logic -->
  554. dz->input_data_type = SNDFILES_ONLY;
  555. dz->process_type = UNEQUAL_SNDFILE;
  556. dz->outfiletype = SNDFILE_OUT;
  557. dz->array_cnt = 1;
  558. } else {
  559. if((exit_status = set_param_data(ap,0 ,5,3,"dDD00"))<0)
  560. return(FAILED);
  561. if((exit_status = set_vflgs(ap,"",0,"","gq",2,2,"dd"))<0)
  562. return(FAILED);
  563. // assign_process_logic -->
  564. dz->input_data_type = SNDFILES_ONLY;
  565. dz->process_type = TO_TEXTFILE;
  566. dz->outfiletype = TEXTFILE_OUT;
  567. dz->array_cnt = 0;
  568. }
  569. break;
  570. }
  571. // set_legal_infile_structure -->
  572. dz->has_otherfile = FALSE;
  573. dz->iarray_cnt = 0;
  574. dz->larray_cnt = 0;
  575. dz->ptr_cnt = 0;
  576. dz->fptr_cnt = 0;
  577. return application_init(dz); //GLOBAL
  578. }
  579. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  580. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  581. {
  582. int exit_status;
  583. infileptr infile_info;
  584. if(!sloom) {
  585. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  586. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  587. return(MEMORY_ERROR);
  588. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  589. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  590. return(PROGRAM_ERROR);
  591. } else if(infile_info->filetype != SNDFILE) {
  592. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  593. return(DATA_ERROR);
  594. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  595. sprintf(errstr,"Failed to copy file parsing information\n");
  596. return(PROGRAM_ERROR);
  597. }
  598. free(infile_info);
  599. }
  600. return(FINISHED);
  601. }
  602. /************************* SETUP_ENVNU_PARAM_RANGES_AND_DEFAULTS *******************/
  603. int setup_envnu_param_ranges_and_defaults(dataptr dz)
  604. {
  605. int exit_status;
  606. aplptr ap = dz->application;
  607. // set_param_ranges()
  608. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  609. // NB total_input_param_cnt is > 0 !!!
  610. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  611. return(FAILED);
  612. // get_param_ranges()
  613. switch(dz->process) {
  614. case(EXPDECAY):
  615. ap->lo[0] = 0.0;
  616. ap->hi[0] = dz->duration;
  617. ap->default_val[0] = 0.0;
  618. ap->lo[1] = 0.0;
  619. ap->hi[1] = dz->duration;
  620. ap->default_val[1] = dz->duration;
  621. break;
  622. case(PEAKCHOP):
  623. ap->lo[PKCH_WSIZE] = 1.0; //wsize for envelope extraction
  624. ap->hi[PKCH_WSIZE] = min(dz->duration,1.0) * SECS_TO_MS;
  625. ap->default_val[PKCH_WSIZE] = 50.0;
  626. ap->lo[PKCH_WIDTH] = 0.0; // peakwidth (mS)
  627. ap->hi[PKCH_WIDTH] = 1000.0;
  628. ap->default_val[PKCH_WIDTH] = 2.0;
  629. ap->lo[PKCH_SPLICE] = 1.0; // risetime (mS)
  630. ap->hi[PKCH_SPLICE] = 200;
  631. ap->default_val[PKCH_SPLICE] = 10.0;
  632. ap->lo[PKCH_GATE] = 0.0; // gate (0-1)
  633. ap->hi[PKCH_GATE] = 1.0;
  634. ap->default_val[PKCH_GATE] = 0.0;
  635. ap->lo[PKCH_SKEW] = 0.0; // skew (0-1)
  636. ap->hi[PKCH_SKEW] = 1.0;
  637. ap->default_val[PKCH_SKEW] = 0.25;
  638. if(dz->mode == 0) {
  639. ap->lo[PKCH_TEMPO] = 20; // tempo (MM)
  640. ap->hi[PKCH_TEMPO] = 3000;
  641. ap->default_val[PKCH_TEMPO] = 120;
  642. ap->lo[PKCH_GAIN] = 0.0; // overall gain
  643. ap->hi[PKCH_GAIN] = 1.0;
  644. ap->default_val[PKCH_GAIN] = 1.0;
  645. ap->lo[PKCH_SCAT] = 0.0; // scatter (0-1)
  646. ap->hi[PKCH_SCAT] = 1.0;
  647. ap->default_val[PKCH_SCAT] = 0.0;
  648. ap->lo[PKCH_NORM] = 0.0; // normalise (0-1)
  649. ap->hi[PKCH_NORM] = 1.0;
  650. ap->default_val[PKCH_NORM] = 0.0;
  651. ap->lo[PKCH_REPET] = 0; // repeat attacks
  652. ap->hi[PKCH_REPET] = 256;
  653. ap->default_val[PKCH_REPET] = 0;
  654. ap->lo[PKCH_MISS] = 0; // skip attacks (i.e. take every n+1th attack only)
  655. ap->hi[PKCH_MISS] = 64;
  656. ap->default_val[PKCH_MISS] = 0;
  657. }
  658. break;
  659. }
  660. if(!sloom)
  661. put_default_vals_in_all_params(dz);
  662. dz->maxmode = 0;
  663. return(FINISHED);
  664. }
  665. /********************************* PARSE_SLOOM_DATA *********************************/
  666. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  667. {
  668. int exit_status;
  669. int cnt = 1, infilecnt;
  670. int filesize, insams, inbrksize;
  671. double dummy;
  672. int true_cnt = 0;
  673. //aplptr ap;
  674. while(cnt<=PRE_CMDLINE_DATACNT) {
  675. if(cnt > argc) {
  676. sprintf(errstr,"Insufficient data sent from TK\n");
  677. return(DATA_ERROR);
  678. }
  679. switch(cnt) {
  680. case(1):
  681. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  682. sprintf(errstr,"Cannot read process no. sent from TK\n");
  683. return(DATA_ERROR);
  684. }
  685. break;
  686. case(2):
  687. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  688. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  689. return(DATA_ERROR);
  690. }
  691. if(dz->mode > 0)
  692. dz->mode--;
  693. //setup_particular_application() =
  694. if((exit_status = setup_envnu_application(dz))<0)
  695. return(exit_status);
  696. //ap = dz->application;
  697. break;
  698. case(3):
  699. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  700. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  701. return(DATA_ERROR);
  702. }
  703. if(infilecnt < 1) {
  704. true_cnt = cnt + 1;
  705. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  706. }
  707. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  708. return(exit_status);
  709. break;
  710. case(INPUT_FILETYPE+4):
  711. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  712. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  713. return(DATA_ERROR);
  714. }
  715. break;
  716. case(INPUT_FILESIZE+4):
  717. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  718. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  719. return(DATA_ERROR);
  720. }
  721. dz->insams[0] = filesize;
  722. break;
  723. case(INPUT_INSAMS+4):
  724. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  725. sprintf(errstr,"Cannot read insams sent from TK\n");
  726. return(DATA_ERROR);
  727. }
  728. dz->insams[0] = insams;
  729. break;
  730. case(INPUT_SRATE+4):
  731. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  732. sprintf(errstr,"Cannot read srate sent from TK\n");
  733. return(DATA_ERROR);
  734. }
  735. break;
  736. case(INPUT_CHANNELS+4):
  737. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  738. sprintf(errstr,"Cannot read channels sent from TK\n");
  739. return(DATA_ERROR);
  740. }
  741. break;
  742. case(INPUT_STYPE+4):
  743. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  744. sprintf(errstr,"Cannot read stype sent from TK\n");
  745. return(DATA_ERROR);
  746. }
  747. break;
  748. case(INPUT_ORIGSTYPE+4):
  749. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  750. sprintf(errstr,"Cannot read origstype sent from TK\n");
  751. return(DATA_ERROR);
  752. }
  753. break;
  754. case(INPUT_ORIGRATE+4):
  755. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  756. sprintf(errstr,"Cannot read origrate sent from TK\n");
  757. return(DATA_ERROR);
  758. }
  759. break;
  760. case(INPUT_MLEN+4):
  761. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  762. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  763. return(DATA_ERROR);
  764. }
  765. break;
  766. case(INPUT_DFAC+4):
  767. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  768. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  769. return(DATA_ERROR);
  770. }
  771. break;
  772. case(INPUT_ORIGCHANS+4):
  773. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  774. sprintf(errstr,"Cannot read origchans sent from TK\n");
  775. return(DATA_ERROR);
  776. }
  777. break;
  778. case(INPUT_SPECENVCNT+4):
  779. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  780. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  781. return(DATA_ERROR);
  782. }
  783. dz->specenvcnt = dz->infile->specenvcnt;
  784. break;
  785. case(INPUT_WANTED+4):
  786. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  787. sprintf(errstr,"Cannot read wanted sent from TK\n");
  788. return(DATA_ERROR);
  789. }
  790. break;
  791. case(INPUT_WLENGTH+4):
  792. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  793. sprintf(errstr,"Cannot read wlength sent from TK\n");
  794. return(DATA_ERROR);
  795. }
  796. break;
  797. case(INPUT_OUT_CHANS+4):
  798. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  799. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  800. return(DATA_ERROR);
  801. }
  802. break;
  803. /* RWD these chanegs to samps - tk will have to deal with that! */
  804. case(INPUT_DESCRIPTOR_BYTES+4):
  805. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  806. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  807. return(DATA_ERROR);
  808. }
  809. break;
  810. case(INPUT_IS_TRANSPOS+4):
  811. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  812. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  813. return(DATA_ERROR);
  814. }
  815. break;
  816. case(INPUT_COULD_BE_TRANSPOS+4):
  817. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  818. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  819. return(DATA_ERROR);
  820. }
  821. break;
  822. case(INPUT_COULD_BE_PITCH+4):
  823. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  824. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  825. return(DATA_ERROR);
  826. }
  827. break;
  828. case(INPUT_DIFFERENT_SRATES+4):
  829. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  830. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  831. return(DATA_ERROR);
  832. }
  833. break;
  834. case(INPUT_DUPLICATE_SNDS+4):
  835. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  836. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  837. return(DATA_ERROR);
  838. }
  839. break;
  840. case(INPUT_BRKSIZE+4):
  841. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  842. sprintf(errstr,"Cannot read brksize sent from TK\n");
  843. return(DATA_ERROR);
  844. }
  845. if(inbrksize > 0) {
  846. switch(dz->input_data_type) {
  847. case(WORDLIST_ONLY):
  848. break;
  849. case(PITCH_AND_PITCH):
  850. case(PITCH_AND_TRANSPOS):
  851. case(TRANSPOS_AND_TRANSPOS):
  852. dz->tempsize = inbrksize;
  853. break;
  854. case(BRKFILES_ONLY):
  855. case(UNRANGED_BRKFILE_ONLY):
  856. case(DB_BRKFILES_ONLY):
  857. case(ALL_FILES):
  858. case(ANY_NUMBER_OF_ANY_FILES):
  859. if(dz->extrabrkno < 0) {
  860. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  861. return(DATA_ERROR);
  862. }
  863. if(dz->brksize == NULL) {
  864. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  865. return(PROGRAM_ERROR);
  866. }
  867. dz->brksize[dz->extrabrkno] = inbrksize;
  868. break;
  869. default:
  870. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  871. dz->input_data_type);
  872. return(PROGRAM_ERROR);
  873. }
  874. break;
  875. }
  876. break;
  877. case(INPUT_NUMSIZE+4):
  878. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  879. sprintf(errstr,"Cannot read numsize sent from TK\n");
  880. return(DATA_ERROR);
  881. }
  882. break;
  883. case(INPUT_LINECNT+4):
  884. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  885. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  886. return(DATA_ERROR);
  887. }
  888. break;
  889. case(INPUT_ALL_WORDS+4):
  890. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  891. sprintf(errstr,"Cannot read all_words sent from TK\n");
  892. return(DATA_ERROR);
  893. }
  894. break;
  895. case(INPUT_ARATE+4):
  896. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  897. sprintf(errstr,"Cannot read arate sent from TK\n");
  898. return(DATA_ERROR);
  899. }
  900. break;
  901. case(INPUT_FRAMETIME+4):
  902. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  903. sprintf(errstr,"Cannot read frametime sent from TK\n");
  904. return(DATA_ERROR);
  905. }
  906. dz->frametime = (float)dummy;
  907. break;
  908. case(INPUT_WINDOW_SIZE+4):
  909. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  910. sprintf(errstr,"Cannot read window_size sent from TK\n");
  911. return(DATA_ERROR);
  912. }
  913. break;
  914. case(INPUT_NYQUIST+4):
  915. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  916. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  917. return(DATA_ERROR);
  918. }
  919. break;
  920. case(INPUT_DURATION+4):
  921. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  922. sprintf(errstr,"Cannot read duration sent from TK\n");
  923. return(DATA_ERROR);
  924. }
  925. break;
  926. case(INPUT_MINBRK+4):
  927. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  928. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  929. return(DATA_ERROR);
  930. }
  931. break;
  932. case(INPUT_MAXBRK+4):
  933. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  934. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  935. return(DATA_ERROR);
  936. }
  937. break;
  938. case(INPUT_MINNUM+4):
  939. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  940. sprintf(errstr,"Cannot read minnum sent from TK\n");
  941. return(DATA_ERROR);
  942. }
  943. break;
  944. case(INPUT_MAXNUM+4):
  945. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  946. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  947. return(DATA_ERROR);
  948. }
  949. break;
  950. default:
  951. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  952. return(PROGRAM_ERROR);
  953. }
  954. cnt++;
  955. }
  956. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  957. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  958. return(DATA_ERROR);
  959. }
  960. if(true_cnt)
  961. cnt = true_cnt;
  962. *cmdlinecnt = 0;
  963. while(cnt < argc) {
  964. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  965. return(exit_status);
  966. cnt++;
  967. }
  968. return(FINISHED);
  969. }
  970. /********************************* GET_TK_CMDLINE_WORD *********************************/
  971. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  972. {
  973. if(*cmdlinecnt==0) {
  974. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  975. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  976. return(MEMORY_ERROR);
  977. }
  978. } else {
  979. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  980. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  981. return(MEMORY_ERROR);
  982. }
  983. }
  984. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  985. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  986. return(MEMORY_ERROR);
  987. }
  988. strcpy((*cmdline)[*cmdlinecnt],q);
  989. (*cmdlinecnt)++;
  990. return(FINISHED);
  991. }
  992. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  993. int assign_file_data_storage(int infilecnt,dataptr dz)
  994. {
  995. int exit_status;
  996. int no_sndfile_system_files = FALSE;
  997. dz->infilecnt = infilecnt;
  998. if((exit_status = allocate_filespace(dz))<0)
  999. return(exit_status);
  1000. if(no_sndfile_system_files)
  1001. dz->infilecnt = 0;
  1002. return(FINISHED);
  1003. }
  1004. /************************* SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS *******************/
  1005. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1006. {
  1007. int n;
  1008. if(dz->array_cnt > 0) {
  1009. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  1010. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  1011. return(MEMORY_ERROR);
  1012. }
  1013. for(n=0;n<dz->array_cnt;n++)
  1014. dz->parray[n] = NULL;
  1015. }
  1016. return(FINISHED);
  1017. }
  1018. /************************* redundant functions: to ensure libs compile OK *******************/
  1019. int assign_process_logic(dataptr dz)
  1020. {
  1021. return(FINISHED);
  1022. }
  1023. void set_legal_infile_structure(dataptr dz)
  1024. {}
  1025. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1026. {
  1027. return(FINISHED);
  1028. }
  1029. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1030. {
  1031. return(FINISHED);
  1032. }
  1033. int read_special_data(char *str,dataptr dz)
  1034. {
  1035. return(FINISHED);
  1036. }
  1037. int inner_loop
  1038. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1039. {
  1040. return(FINISHED);
  1041. }
  1042. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1043. {
  1044. return(FINISHED);
  1045. }
  1046. /********************************************************************************************/
  1047. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1048. {
  1049. if (!strcmp(prog_identifier_from_cmdline,"expdecay")) dz->process = EXPDECAY;
  1050. else if(!strcmp(prog_identifier_from_cmdline,"peakchop")) dz->process = PEAKCHOP;
  1051. else {
  1052. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1053. return(USAGE_ONLY);
  1054. }
  1055. return(FINISHED);
  1056. }
  1057. /****************************** GET_MODE *********************************/
  1058. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1059. {
  1060. char temp[200], *p;
  1061. if(sscanf(str,"%s",temp)!=1) {
  1062. sprintf(errstr,"Cannot read mode of program.\n");
  1063. return(USAGE_ONLY);
  1064. }
  1065. p = temp + strlen(temp) - 1;
  1066. while(p >= temp) {
  1067. if(!isdigit(*p)) {
  1068. sprintf(errstr,"Invalid mode of program entered.\n");
  1069. return(USAGE_ONLY);
  1070. }
  1071. p--;
  1072. }
  1073. if(sscanf(str,"%d",&dz->mode)!=1) {
  1074. sprintf(errstr,"Cannot read mode of program.\n");
  1075. return(USAGE_ONLY);
  1076. }
  1077. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1078. sprintf(errstr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1079. return(USAGE_ONLY);
  1080. }
  1081. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1082. return(FINISHED);
  1083. }
  1084. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1085. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1086. {
  1087. int n;
  1088. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1089. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1090. return(MEMORY_ERROR);
  1091. }
  1092. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1093. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1094. return(MEMORY_ERROR);
  1095. }
  1096. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1097. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1098. return(MEMORY_ERROR);
  1099. }
  1100. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1101. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1102. return(MEMORY_ERROR);
  1103. }
  1104. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1105. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1106. return(MEMORY_ERROR);
  1107. }
  1108. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1109. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1110. return(MEMORY_ERROR);
  1111. }
  1112. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1113. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1114. return(MEMORY_ERROR);
  1115. }
  1116. for(n=0;n<brkcnt;n++) {
  1117. dz->brk[n] = NULL;
  1118. dz->brkptr[n] = NULL;
  1119. dz->brkinit[n] = 0;
  1120. dz->brksize[n] = 0;
  1121. }
  1122. return(FINISHED);
  1123. }
  1124. /******************************** USAGE1 ********************************/
  1125. int usage1(void)
  1126. {
  1127. fprintf(stderr,
  1128. "\nNEW ENVELOPING OPERATIONS\n\n"
  1129. "USAGE: envnu NAME (mode) infile outfile parameters: \n"
  1130. "\n"
  1131. "where NAME can be any one of\n"
  1132. "\n"
  1133. "expdecay peakchop\n"
  1134. "Type 'envnu expdecay' for more info on envnu expdecay..ETC.\n");
  1135. return(USAGE_ONLY);
  1136. }
  1137. /******************************** USAGE2 ********************************/
  1138. int usage2(char *str)
  1139. {
  1140. if(!strcmp(str,"expdecay")) {
  1141. fprintf(stderr,
  1142. "USAGE:\n"
  1143. "envnu expdecay infile outfile starttime endtime\n"
  1144. "\n"
  1145. "Impose exponential decay (to zero) on a sound, from starttime to endtime.\n"
  1146. "\n"
  1147. "To force decay-end to be at end of file,\n"
  1148. "enter an endtime at OR beyond file duration.\n");
  1149. } else if(!strcmp(str,"peakchop")) {
  1150. fprintf(stderr,
  1151. "USAGE:\n"
  1152. "envnu peakchop 1 infil outfil wsize pkwidth risetime tempo gain\n"
  1153. " [-ggate -qskew -sscatter -norm -rrepeat -mmiss]\n"
  1154. "OR:\n"
  1155. "envnu peakchop 2 infil outfil wsize pkwidth risetime [-ggate -qskew]\n"
  1156. "\n"
  1157. "Isolate peaks in source, and (Mode 1) play back at specified tempo,\n"
  1158. "or (Mode 2) output peak-isolating envelope.\n"
  1159. "\n"
  1160. "WSIZE windowsize (in mS) for extracting envelope (1-64 dflt 50)\n"
  1161. "PKWIDTH width of retained peaks (in mS) (dflt 20mS).\n"
  1162. " (Must be less than minimum distance between data peaks).\n"
  1163. "RISETIME risetime from zero to peak (in mS) (dflt 10mS)\n"
  1164. "TEMPO tempo of resulting output, MM = events per minute.\n"
  1165. "GAIN lower this if rapid tempo causes peaks to overlap (0-1, dflt 1)\n"
  1166. "GATE level (relative to max) below which peaks ignored (0-1 dflt 0)\n"
  1167. "SKEW envelope centring on peak (0 to 1: dflt 0.25). 0.5 = centred,\n"
  1168. " 0 = peak at envelope start, 1 = peak at envelope end.\n"
  1169. "SCATTER randomisation of output times (0-1 dflt 0)\n"
  1170. "NORM force peakevent levels towards that of loudest (0-1 dflt 0)\n"
  1171. "REPEAT number of times peakevents are repeated (0-256 dflt 0)\n"
  1172. "MISS use peakevent, skip next 'miss' peakevents (0-64 default 0).\n"
  1173. "\n"
  1174. "\nAll parameters may vary in time, EXCEPT wsize, gate and skew.\n"
  1175. "\nTimes in breakpoint files are times in the output.\n"
  1176. "\n");
  1177. } else
  1178. fprintf(stdout,"Unknown option '%s'\n",str);
  1179. return(USAGE_ONLY);
  1180. }
  1181. int usage3(char *str1,char *str2)
  1182. {
  1183. fprintf(stderr,"Insufficient parameters on command line.\n");
  1184. return(USAGE_ONLY);
  1185. }
  1186. /******************************** EXPDECAY ********************************/
  1187. int expdecay(dataptr dz)
  1188. {
  1189. int exit_status;
  1190. double b, val, nextval, div;
  1191. double incr, mlt, srate;
  1192. int chans,j, k;
  1193. int local_frames, local_frame_cnt = 0;
  1194. float *buf = dz->sampbuf[0];
  1195. int startframe, endframe, decayframes, frame_cnt;
  1196. srate = (double)dz->infile->srate;
  1197. //dur = (double)dz->duration;
  1198. chans = dz->infile->channels;
  1199. startframe = (int)round(dz->param[0] * srate);
  1200. endframe = (int)round(dz->param[1] * srate);
  1201. decayframes = endframe - startframe;
  1202. val = 1.0;
  1203. b = 0.00001;
  1204. div = 1.0/(double)decayframes;
  1205. mlt = pow(b,div);
  1206. dz->ssampsread = 1;
  1207. frame_cnt = 0;
  1208. while(frame_cnt < endframe) {
  1209. if((exit_status = read_samps(buf,dz))<0)
  1210. return(exit_status);
  1211. local_frames = dz->ssampsread / chans;
  1212. local_frame_cnt = 0;
  1213. while (local_frame_cnt < local_frames) {
  1214. if(frame_cnt >= startframe) {
  1215. if(frame_cnt >= endframe) {
  1216. if(local_frame_cnt > 0) {
  1217. if((exit_status = write_samps(buf,local_frame_cnt * chans,dz))<0)
  1218. return(exit_status);
  1219. }
  1220. return FINISHED;
  1221. }
  1222. for(j = 0;j < chans;j++) {
  1223. k = (local_frame_cnt * chans) + j;
  1224. buf[k] = (float)(buf[k] * val);
  1225. }
  1226. nextval = val * mlt;
  1227. incr = nextval - val;
  1228. val += incr;
  1229. }
  1230. local_frame_cnt++;
  1231. frame_cnt++;
  1232. }
  1233. if(local_frame_cnt > 0) {
  1234. if((exit_status = write_samps(buf,local_frame_cnt * chans,dz))<0)
  1235. return(exit_status);
  1236. }
  1237. }
  1238. return FINISHED;
  1239. }
  1240. /*********************** CHECK_THE_PARAM_VALIDITY_AND_CONSISTENCY *********************/
  1241. int check_the_param_validity_and_consistency(dataptr dz)
  1242. {
  1243. int channels = dz->infile->channels;
  1244. int srate = dz->infile->srate;
  1245. switch(dz->process) {
  1246. case(EXPDECAY):
  1247. if(!sloom && (dz->param[1] == 0.0)) // In cmdline case, endtime vals beyond end of file are p[reviously trapped and set to 0
  1248. dz->param[1] = dz->duration; // Then readjusted to file-duration here
  1249. if(dz->param[0] >= dz->param[1]) {
  1250. sprintf(errstr,"Endtime of decay must be greater than starttime. %lf %lf",dz->param[0],dz->param[1]);
  1251. return(USER_ERROR);
  1252. }
  1253. break;
  1254. case(PEAKCHOP): // Convert time parameters to samples
  1255. if(dz->brksize[PKCH_WIDTH] == 0)
  1256. dz->iparam[PKCH_WIDTH] = round(dz->param[PKCH_WIDTH] * MS_TO_SECS * (double)srate) * channels;
  1257. if(dz->brksize[PKCH_SPLICE] == 0)
  1258. dz->iparam[PKCH_SPLICE] = round(dz->param[PKCH_SPLICE] * MS_TO_SECS * (double)srate) * channels;
  1259. // Convert tempo parameter to event-distance
  1260. if(dz->mode == 0) {
  1261. if(dz->brksize[PKCH_TEMPO] == 0)
  1262. dz->param[PKCH_TEMPO] = 60.0 / dz->param[PKCH_TEMPO];
  1263. // Convert miss to step (miss 0 = step 1, miss 1 = step 2 etc.
  1264. if(dz->brksize[PKCH_MISS] == 0)
  1265. dz->iparam[PKCH_MISS]++;
  1266. }
  1267. break;
  1268. }
  1269. return FINISHED;
  1270. }
  1271. /*********************** PEAKCHOP_PARAM_PREPROCESS *********************/
  1272. int peakchop_param_preprocess(dataptr dz)
  1273. {
  1274. int exit_status, chans = dz->infile->channels;
  1275. int n, j, k, unadjusted_envwindow_sampsize;
  1276. float *buf;
  1277. double maxsamp, thisval, srate = (double)dz->infile->srate;
  1278. // Trim envelopesize to fit exactly into buffers (which are a pow of two in length)
  1279. unadjusted_envwindow_sampsize = round(dz->param[PKCH_WSIZE] * MS_TO_SECS * srate) * chans;
  1280. if(unadjusted_envwindow_sampsize < dz->buflen) {
  1281. k = dz->buflen;
  1282. while(unadjusted_envwindow_sampsize<k)
  1283. k /= 2;
  1284. j = k * 2;
  1285. if(j - unadjusted_envwindow_sampsize > unadjusted_envwindow_sampsize - k)
  1286. dz->iparam[PKCH_WSIZE] = (int)k;
  1287. else
  1288. dz->iparam[PKCH_WSIZE] = (int)j;
  1289. } else {
  1290. k = round((double)unadjusted_envwindow_sampsize/(double)dz->buflen);
  1291. dz->iparam[PKCH_WSIZE] = (int)(dz->buflen * k);
  1292. }
  1293. // Get and store maximum source sample, if required
  1294. if(dz->param[PKCH_GATE] > 0.0 || (dz->mode == 0 && (dz->brksize[PKCH_NORM] > 0 || dz->param[PKCH_NORM] > 0.0))) {
  1295. if(dz->param[PKCH_GATE] > 0.0)
  1296. fprintf(stdout,"INFO: Finding maximum sample, for gating.\n");
  1297. else
  1298. fprintf(stdout,"INFO: Finding maximum sample, for normalisation.\n");
  1299. fflush(stdout);
  1300. buf = dz->sampbuf[0];
  1301. if((exit_status = read_samps(buf,dz))<0)
  1302. return(exit_status);
  1303. maxsamp = 0.0;
  1304. while(dz->ssampsread > 0) {
  1305. n = 0;
  1306. while(n < dz->ssampsread) {
  1307. thisval = fabs(buf[n]);
  1308. if(thisval > maxsamp)
  1309. maxsamp = thisval;
  1310. n++;
  1311. }
  1312. if((exit_status = read_samps(buf,dz))<0)
  1313. return(exit_status);
  1314. }
  1315. if(maxsamp <= 0.0) {
  1316. sprintf(errstr,"NO SIGNIFICANT SIGNAL FOUND IN SOURCE\n");
  1317. return(DATA_ERROR);
  1318. }
  1319. if(dz->param[PKCH_GATE] > 0.0)
  1320. dz->param[PKCH_GATE] *= maxsamp;
  1321. dz->scalefact = maxsamp;
  1322. if((sndseekEx(dz->ifd[0],0,0)) < 0) {
  1323. sprintf(errstr,"sndseek() 1 failed.\n");
  1324. return(SYSTEM_ERROR);
  1325. }
  1326. reset_filedata_counters(dz);
  1327. if(sloom)
  1328. display_virtual_time(dz->total_samps_read,dz);
  1329. }
  1330. return FINISHED;
  1331. }
  1332. /********************************************** PEAKCHOP ********************************************/
  1333. int peakchop(dataptr dz)
  1334. {
  1335. int exit_status;
  1336. int envcnt,outcnt;
  1337. if((exit_status = extract_env_from_sndfile(&envcnt,dz))<0)
  1338. return(exit_status);
  1339. extract_peaks_from_envelope(&envcnt,dz); // ENVELOPE to 'env' as time-val pairs
  1340. if(envcnt == 0) {
  1341. sprintf(errstr,"No peaks found. Silent file.\n");
  1342. return(DATA_ERROR);
  1343. }
  1344. if(dz->param[PKCH_GATE] > 0.0) {
  1345. if((exit_status = eliminate_too_low_peaks(&envcnt,dz))<0)
  1346. return(exit_status);
  1347. }
  1348. if((sndseekEx(dz->ifd[0],0,0)) < 0) {
  1349. sprintf(errstr,"sndseek() 2 failed\n");
  1350. return(SYSTEM_ERROR);
  1351. }
  1352. reset_filedata_counters(dz);
  1353. if(sloom)
  1354. display_virtual_time(dz->total_samps_read,dz);
  1355. if((exit_status = find_exact_peaktimes(envcnt,dz))<0)
  1356. return(exit_status);
  1357. switch(dz->mode) {
  1358. case(0):
  1359. if((exit_status = calculate_event_outtimes(envcnt,&outcnt,dz))<0)
  1360. return(exit_status);
  1361. if((sndseekEx(dz->ifd[0],0,0)) < 0) {
  1362. sprintf(errstr,"sndseek() 4 failed\n");
  1363. return(SYSTEM_ERROR);
  1364. }
  1365. reset_filedata_counters(dz);
  1366. if(sloom)
  1367. display_virtual_time(dz->total_samps_read,dz);
  1368. if((exit_status = generate_enveloped_output(envcnt,outcnt,dz))<0)
  1369. return(exit_status);
  1370. break;
  1371. case(1):
  1372. if((exit_status = generate_envelope_as_output(envcnt,dz))<0)
  1373. return(exit_status);
  1374. break;
  1375. }
  1376. return FINISHED;
  1377. }
  1378. /****************************** EXTRACT_ENV_FROM_SNDFILE ******************************/
  1379. int extract_env_from_sndfile(int *envcnt,dataptr dz)
  1380. {
  1381. int exit_status, safety = 100;
  1382. int n, bufcnt, totmem;
  1383. double convertor = 1.0/F_ABSMAXSAMP;
  1384. double time_convertor = 1.0/(dz->infile->channels * dz->infile->srate);
  1385. float *envptr;
  1386. float *buffer = dz->sampbuf[0];
  1387. fprintf(stdout,"INFO: Finding envelope of source.\n");
  1388. fflush(stdout);
  1389. bufcnt = buffers_in_sndfile(dz->buflen,dz);
  1390. *envcnt = windows_in_sndfile(dz);
  1391. totmem = (*envcnt * 2) + safety;
  1392. if((dz->env=(float *)calloc(totmem,sizeof(float)))==NULL) { // *2 -> accomodates time,val PAIRS
  1393. sprintf(errstr,"INSUFFICIENT MEMORY for envelope array.\n");
  1394. return(MEMORY_ERROR);
  1395. }
  1396. envptr = dz->env;
  1397. for(n = 0; n < bufcnt; n++) {
  1398. if((exit_status = read_samps(dz->sampbuf[0],dz))<0)
  1399. return(exit_status);
  1400. if(sloom)
  1401. display_virtual_time(dz->total_samps_read,dz);
  1402. getenv_of_buffer(dz->ssampsread,dz->iparam[PKCH_WSIZE],convertor,time_convertor,&envptr,buffer,dz);
  1403. }
  1404. return(FINISHED);
  1405. }
  1406. /****************************** BUFFERS_IN_SNDFILE ******************************/
  1407. int buffers_in_sndfile(int buffer_size,dataptr dz)
  1408. {
  1409. int bufcnt;
  1410. if(((bufcnt = dz->insams[0]/buffer_size)*buffer_size)!=dz->insams[0])
  1411. bufcnt++;
  1412. return(bufcnt);
  1413. }
  1414. /****************************** WINDOWS_IN_SNDFILE [GET_ENVSIZE] ******************************/
  1415. int windows_in_sndfile(dataptr dz)
  1416. {
  1417. int envsize, winsize = dz->iparam[PKCH_WSIZE];
  1418. if(((envsize = dz->insams[0]/winsize) * winsize)!=dz->insams[0])
  1419. envsize++;
  1420. return(envsize);
  1421. }
  1422. /************************* GETENV_OF_BUFFER *******************************/
  1423. void getenv_of_buffer(int samps_to_process,int envwindow_sampsize,double convertor,double time_convertor,float **envptr,float *buffer,dataptr dz)
  1424. {
  1425. int start_samp = 0;
  1426. int bufstart = dz->total_samps_read - dz->ssampsread;
  1427. float *env = *envptr;
  1428. while(samps_to_process >= envwindow_sampsize) {
  1429. *env++ = (float)((start_samp + bufstart) * time_convertor);
  1430. *env++ = (float)(getmaxsamp(start_samp,envwindow_sampsize,buffer) * convertor);
  1431. start_samp += envwindow_sampsize;
  1432. samps_to_process -= envwindow_sampsize;
  1433. }
  1434. if(samps_to_process) { /* Handle any final short buffer */
  1435. *env++ = (float)((start_samp + bufstart) * time_convertor);
  1436. *env++ = (float)(getmaxsamp(start_samp,samps_to_process,buffer) * convertor);
  1437. }
  1438. *envptr = env;
  1439. }
  1440. /************************* EXTRACT_PEAKS_FROM_ENVELOPE *******************************/
  1441. void extract_peaks_from_envelope(int *envcnt,dataptr dz)
  1442. {
  1443. int orig_env_size = *envcnt, n, j=0, k=0;
  1444. int islocalmax = 0;
  1445. float lastenv = 0.0;
  1446. int envloc = 0;
  1447. float *env = dz->env;
  1448. fprintf(stdout,"INFO: Finding peaks.\n");
  1449. fflush(stdout);
  1450. for(n=1;n < orig_env_size; n++) {
  1451. j = n * 2; // indexes time
  1452. k = j + 1; // indexes value
  1453. if(env[k] <= lastenv) {
  1454. if(islocalmax) {
  1455. env[envloc] = env[j-2]; // overwrites original envelope, with env peaks
  1456. envloc++;
  1457. env[envloc] = env[k-2]; // overwrites original envelope, with env peaks
  1458. envloc++;
  1459. }
  1460. islocalmax = 0;
  1461. } else
  1462. islocalmax = 1;
  1463. lastenv = env[k];
  1464. }
  1465. if(islocalmax) { // Capture last peak, if a max
  1466. env[envloc] = env[j-2];
  1467. envloc++;
  1468. env[envloc] = env[k-2];
  1469. envloc++;
  1470. }
  1471. *envcnt = envloc/2;
  1472. }
  1473. /************************* ELIMINATE_TOO_LOW_PEAKS *******************************/
  1474. int eliminate_too_low_peaks(int *envcnt,dataptr dz)
  1475. {
  1476. int new_envcnt = *envcnt;
  1477. int tabend = new_envcnt * 2;
  1478. int n = 0, j, k, jj, gated;
  1479. fprintf(stdout,"INFO: Gating low-level peaks.\n");
  1480. fflush(stdout);
  1481. while(n < new_envcnt) {
  1482. j = n * 2;
  1483. k = j + 1;
  1484. if(dz->env[k] < dz->param[PKCH_GATE]) {
  1485. new_envcnt--;
  1486. tabend = new_envcnt * 2;
  1487. jj = j;
  1488. while(jj < tabend) {
  1489. dz->env[jj] = dz->env[jj + 2];
  1490. jj++;
  1491. }
  1492. } else {
  1493. n++;
  1494. }
  1495. }
  1496. if(new_envcnt == 0) {
  1497. sprintf(errstr,"No peaks retained at this gate level.\n");
  1498. return(DATA_ERROR);
  1499. }
  1500. if((gated = *envcnt - new_envcnt) > 0) {
  1501. fprintf(stdout,"INFO: %d peaks removed by gate: %d peaks remain\n",gated,new_envcnt);
  1502. fflush(stdout);
  1503. *envcnt = new_envcnt;
  1504. }
  1505. return FINISHED;
  1506. }
  1507. /************************* FIND_EXACT_PEAKTIMES *******************************/
  1508. int find_exact_peaktimes(int envcnt,dataptr dz)
  1509. {
  1510. int exit_status;
  1511. double inv_srate = 1.0 / dz->infile->srate, maxsamp, val;
  1512. int n, j, maxtime, samptime, searchend, ibufstart_in_file;
  1513. float *env = dz->env;
  1514. float *buf = dz->sampbuf[0];
  1515. if((exit_status = read_samps(buf,dz))<0)
  1516. return(exit_status);
  1517. ibufstart_in_file = 0;
  1518. for(n=0;n < envcnt; n++) {
  1519. j = n * 2; // indexes time
  1520. //k = j + 1; // indexes value
  1521. samptime = (int)round(env[j] * (double)dz->infile->srate) * dz->infile->channels;
  1522. if((searchend = samptime + dz->iparam[PKCH_WSIZE]) >= dz->total_samps_read) {
  1523. if(dz->ssampsread < dz->buflen) {
  1524. samptime -= ibufstart_in_file;
  1525. searchend = dz->ssampsread;
  1526. } else {
  1527. ibufstart_in_file = (samptime/F_SECSIZE) * F_SECSIZE;
  1528. if((sndseekEx(dz->ifd[0],ibufstart_in_file,0)) < 0) {
  1529. sprintf(errstr,"sndseek() 3 failed\n");
  1530. return(SYSTEM_ERROR);
  1531. }
  1532. dz->total_samps_read = ibufstart_in_file;
  1533. if((exit_status = read_samps(buf,dz))<0)
  1534. return(exit_status);
  1535. if(dz->ssampsread == 0)
  1536. break;
  1537. if(sloom)
  1538. display_virtual_time(dz->total_samps_read,dz);
  1539. samptime -= ibufstart_in_file;
  1540. searchend = min(samptime + dz->iparam[PKCH_WSIZE],dz->ssampsread);
  1541. }
  1542. } else {
  1543. samptime -= ibufstart_in_file;
  1544. searchend -= ibufstart_in_file;
  1545. }
  1546. maxtime = 0;
  1547. maxsamp = fabs(buf[samptime++]);
  1548. while(samptime < searchend) {
  1549. val = fabs(buf[samptime]);
  1550. if(val > maxsamp) {
  1551. maxtime = samptime;
  1552. maxsamp = val;
  1553. }
  1554. samptime++;
  1555. }
  1556. maxtime += ibufstart_in_file;
  1557. maxtime /= dz->infile->channels;
  1558. env[j] = (float)((double)maxtime * inv_srate);
  1559. }
  1560. return FINISHED;
  1561. }
  1562. /**************************** CALCULATE_EVENT_OUTTIMES *****************************/
  1563. int calculate_event_outtimes(int envcnt,int *outcnt,dataptr dz)
  1564. {
  1565. int exit_status;
  1566. double *outtime;
  1567. int n;
  1568. double lastnewpos, newpos, lastgap, nextgap, scatter;
  1569. double rpet;
  1570. int rpetmax;
  1571. if(dz->brksize[PKCH_REPET] > 0) {
  1572. if((exit_status = get_maxvalue_in_brktable(&rpet,PKCH_REPET,dz)) < 0)
  1573. return(exit_status);
  1574. rpetmax = (int)ceil(rpet);
  1575. rpetmax++;
  1576. } else
  1577. rpetmax = dz->iparam[PKCH_REPET] + 1;
  1578. *outcnt = envcnt * rpetmax;
  1579. if((dz->parray[0] = (double *)malloc(sizeof(double) * *outcnt))==NULL) {
  1580. sprintf(errstr,"INSUFFICIENT MEMORY establishing peak-outtimes array.\n");
  1581. return(MEMORY_ERROR);
  1582. }
  1583. fprintf(stdout,"INFO: Generating output event times.\n");
  1584. fflush(stdout);
  1585. outtime = dz->parray[0];
  1586. outtime[0] = 0.0;
  1587. n = 1;
  1588. if(dz->brksize[PKCH_TEMPO] == 0) {
  1589. while(n < *outcnt) {
  1590. outtime[n] = outtime[n-1] + dz->param[PKCH_TEMPO];
  1591. n++;
  1592. }
  1593. } else {
  1594. while(n < *outcnt) {
  1595. read_value_from_brktable(outtime[n-1],PKCH_TEMPO,dz);
  1596. dz->param[PKCH_TEMPO] = 60.0 / dz->param[PKCH_TEMPO];
  1597. outtime[n] = outtime[n-1] + dz->param[PKCH_TEMPO];
  1598. n++;
  1599. }
  1600. }
  1601. if(dz->brksize[PKCH_SCAT] > 0 || dz->param[PKCH_SCAT] > 0.0) {
  1602. newpos = outtime[0];
  1603. for(n=2;n<*outcnt;n++) { // scatter events about there exact positions
  1604. lastnewpos = newpos;
  1605. lastgap = outtime[n-1] - outtime[n-2];
  1606. nextgap = outtime[n] - outtime[n-1];
  1607. scatter = (drand48() * 2.0) - 1.0;
  1608. if(dz->brksize[PKCH_SCAT] > 0)
  1609. read_value_from_brktable(outtime[n-1],PKCH_SCAT,dz);
  1610. scatter *= dz->param[PKCH_SCAT];
  1611. if(scatter > 0.0) {
  1612. nextgap *= scatter;
  1613. newpos = outtime[n-1] + nextgap;
  1614. } else {
  1615. lastgap *= scatter;
  1616. newpos = outtime[n-1] - lastgap;
  1617. }
  1618. outtime[n-2] = lastnewpos;
  1619. }
  1620. }
  1621. return FINISHED;
  1622. }
  1623. /**************************** GENERATE_ENVELOPED_OUTPUT *****************************/
  1624. int generate_enveloped_output(int envcnt,int outcnt,dataptr dz)
  1625. {
  1626. int exit_status, j, k, kk, finished = 0, mstep;
  1627. float *ibuf = dz->sampbuf[0], *obuf1 = dz->sampbuf[1], *obuf2 = dz->sampbuf[2];
  1628. int obufpos = 0, /*obufstart_in_file,*/ obufend_in_file, n, m, outsamptime, seekback, chwidth, halfchwidth, centring, peakadj = 0;
  1629. int startupsplice, endupsplice, startdownsplice, enddownsplice, splice_steps, envlen;
  1630. int ibufpos, ibufstart_in_file, insamptime, readend_of_file, readlen;
  1631. double srate = (double)dz->infile->srate;
  1632. int chans = dz->infile->channels, repeater = 0;
  1633. double *outtimes = dz->parray[0], outtime, splice_incr, spliceval;
  1634. double this_norm, thisamp, normalisation, normalisation_incr, thisgain_incr, outmax = 0.0;
  1635. fprintf(stdout,"INFO: Generating output sound.\n");
  1636. fflush(stdout);
  1637. memset((char *)obuf1,0,2 * dz->buflen * sizeof(float)); // Set double buffer to zero
  1638. if((exit_status = read_samps(ibuf,dz))<0)
  1639. return(exit_status);
  1640. ibufstart_in_file = 0;
  1641. // obufstart_in_file = 0;
  1642. obufend_in_file = dz->buflen;
  1643. envlen = envcnt * 2;
  1644. if(dz->brksize[PKCH_MISS] > 0) {
  1645. read_value_from_brktable(outtimes[0],PKCH_MISS,dz);
  1646. dz->iparam[PKCH_MISS]++;
  1647. }
  1648. if(dz->brksize[PKCH_WIDTH] == 0) {
  1649. chwidth = dz->iparam[PKCH_WIDTH]/chans;
  1650. halfchwidth = chwidth/2;
  1651. centring = (int)round(dz->param[PKCH_SKEW] * chwidth);
  1652. peakadj = (centring - halfchwidth) * chans;
  1653. }
  1654. mstep = dz->iparam[PKCH_MISS] * 2;
  1655. for(n=0,m = 0;m<envlen;n++, m += mstep) {
  1656. if(n >= outcnt) // SAFETY
  1657. break;
  1658. outtime = outtimes[n];
  1659. if(dz->brksize[PKCH_GAIN] > 0)
  1660. read_value_from_brktable(outtime,PKCH_GAIN,dz);
  1661. if(dz->brksize[PKCH_WIDTH] > 0) {
  1662. read_value_from_brktable(outtime,PKCH_WIDTH,dz);
  1663. dz->iparam[PKCH_WIDTH] = (int)round(dz->param[PKCH_WIDTH] * MS_TO_SECS * srate) * chans;
  1664. chwidth = dz->iparam[PKCH_WIDTH]/chans;
  1665. halfchwidth = chwidth/2;
  1666. centring = (int)round(dz->param[PKCH_SKEW] * chwidth);
  1667. peakadj = (centring - halfchwidth) * chans;
  1668. }
  1669. if(dz->brksize[PKCH_SPLICE] > 0) {
  1670. read_value_from_brktable(outtime,PKCH_SPLICE,dz);
  1671. dz->iparam[PKCH_SPLICE] = (int)round(dz->param[PKCH_SPLICE] * MS_TO_SECS * srate) * chans;
  1672. }
  1673. if(dz->brksize[PKCH_MISS] > 0) {
  1674. read_value_from_brktable(outtime,PKCH_MISS,dz);
  1675. dz->iparam[PKCH_MISS]++;
  1676. mstep = dz->iparam[PKCH_MISS] * 2;
  1677. }
  1678. if(dz->brksize[PKCH_REPET] > 0)
  1679. read_value_from_brktable(outtime,PKCH_REPET,dz);
  1680. if(dz->brksize[PKCH_NORM] > 0)
  1681. read_value_from_brktable(outtime,PKCH_NORM,dz);
  1682. if(dz->param[PKCH_NORM] > 0.0) {
  1683. thisamp = dz->env[m+1];
  1684. normalisation = min(dz->scalefact/thisamp,100.0); // scalefact stores maxamplitude of source
  1685. normalisation_incr = normalisation - 1.0;
  1686. thisgain_incr = normalisation_incr * dz->param[PKCH_NORM];
  1687. this_norm = 1.0 + thisgain_incr;
  1688. } else
  1689. this_norm = 1.0;
  1690. outsamptime = (int)round(outtime * (double)dz->infile->srate) * chans;
  1691. while(outsamptime >= obufend_in_file) {
  1692. for(kk=0;kk<dz->buflen;kk++)
  1693. outmax = max(outmax,fabs((double)obuf1[kk]));
  1694. if((exit_status = write_samps(obuf1,dz->buflen,dz))<0)
  1695. return(exit_status);
  1696. memcpy((char *)obuf1,(char *)obuf2,dz->buflen * sizeof(float));
  1697. memset((char *)obuf2,0,dz->buflen * sizeof(float));
  1698. obufend_in_file += dz->buflen;
  1699. // obufstart_in_file += dz->buflen;
  1700. }
  1701. obufpos = outsamptime % dz->buflen;
  1702. if((insamptime = (int)round(dz->env[m] * srate) * chans) >= dz->insams[0]) {
  1703. break;
  1704. }
  1705. insamptime += peakadj;
  1706. startupsplice = max(insamptime - dz->iparam[PKCH_SPLICE],0);
  1707. endupsplice = insamptime;
  1708. startdownsplice = endupsplice + dz->iparam[PKCH_WIDTH];
  1709. readend_of_file = 0;
  1710. if((enddownsplice = startdownsplice + dz->iparam[PKCH_SPLICE]) >= dz->insams[0])
  1711. readend_of_file = dz->insams[0] - insamptime;
  1712. if(startupsplice < ibufstart_in_file) { // Possible if segments are repeated, and they cross a buffer boundary
  1713. seekback = dz->total_samps_read - dz->ssampsread - dz->buflen;
  1714. if(seekback < 0) {
  1715. sprintf(errstr,"BAD SEEK\n");
  1716. return(PROGRAM_ERROR);
  1717. }
  1718. if((sndseekEx(dz->ifd[0],seekback,0)< 0)){
  1719. sprintf(errstr,"sndseek() 5 failed\n");
  1720. return SYSTEM_ERROR;
  1721. }
  1722. dz->total_samps_read = seekback;
  1723. if((exit_status = read_samps(ibuf,dz))<0)
  1724. return(exit_status);
  1725. ibufstart_in_file -= dz->buflen;
  1726. }
  1727. while(startupsplice > dz->total_samps_read) {
  1728. ibufstart_in_file += dz->ssampsread;
  1729. if((exit_status = read_samps(ibuf,dz))<0)
  1730. return(exit_status);
  1731. if(dz->ssampsread == 0) {
  1732. break;
  1733. }
  1734. }
  1735. ibufpos = startupsplice - ibufstart_in_file;
  1736. splice_steps = dz->iparam[PKCH_SPLICE]/chans;
  1737. splice_incr = this_norm/(double)splice_steps;
  1738. spliceval = 0.0;
  1739. for(k = 0; k < splice_steps; k++) {
  1740. for(j=0;j<chans; j++) {
  1741. obuf1[obufpos] = (float)((obuf1[obufpos] + (ibuf[ibufpos] * spliceval)) * dz->param[PKCH_GAIN]);
  1742. obufpos++;
  1743. ibufpos++;
  1744. }
  1745. spliceval += splice_incr;
  1746. if(ibufpos >= dz->ssampsread) {
  1747. if(dz->ssampsread < dz->buflen) {
  1748. finished = 1;
  1749. break;
  1750. }
  1751. ibufstart_in_file += dz->buflen;
  1752. ibufpos -= dz->buflen;
  1753. if((exit_status = read_samps(ibuf,dz))<0)
  1754. return(exit_status);
  1755. if(dz->ssampsread == 0) {
  1756. finished = 1;
  1757. break;
  1758. }
  1759. }
  1760. if(obufpos >= dz->buflen * 2) {
  1761. sprintf(errstr,"AAA Peak-event length too large for buffer dblbuflen = %d eventlen = %d\n",dz->buflen * 2,(dz->iparam[PKCH_SPLICE] * 2) + dz->iparam[PKCH_WIDTH]);
  1762. return(DATA_ERROR);
  1763. }
  1764. }
  1765. if(finished)
  1766. break;
  1767. if(readend_of_file)
  1768. readlen = readend_of_file;
  1769. else
  1770. readlen = dz->iparam[PKCH_WIDTH];
  1771. for(k = 0; k < readlen; k++) {
  1772. obuf1[obufpos] = (float)((obuf1[obufpos] + (this_norm * ibuf[ibufpos])) * dz->param[PKCH_GAIN]);
  1773. ibufpos++;
  1774. obufpos++;
  1775. if(ibufpos >= dz->ssampsread) {
  1776. if(dz->ssampsread < dz->buflen) {
  1777. finished = 1;
  1778. break;
  1779. }
  1780. ibufstart_in_file += dz->buflen;
  1781. ibufpos -= dz->buflen;
  1782. if((exit_status = read_samps(ibuf,dz))<0)
  1783. return(exit_status);
  1784. if(dz->ssampsread == 0) {
  1785. finished = 1;
  1786. break;
  1787. }
  1788. }
  1789. if(obufpos >= dz->buflen * 2) {
  1790. sprintf(errstr,"BBB Peak-event length too large for buffer dblbuflen = %d eventlen = %d\n",dz->buflen * 2,(dz->iparam[PKCH_SPLICE] * 2) + dz->iparam[PKCH_WIDTH]);
  1791. return(DATA_ERROR);
  1792. }
  1793. }
  1794. if(finished || readend_of_file)
  1795. break;
  1796. spliceval = this_norm;
  1797. for(k = 0; k < splice_steps; k++) {
  1798. for(j=0;j<chans; j++) {
  1799. obuf1[obufpos] = (float)((obuf1[obufpos] + (ibuf[ibufpos] * spliceval)) * dz->param[PKCH_GAIN]);
  1800. obufpos++;
  1801. ibufpos++;
  1802. }
  1803. spliceval -= splice_incr;
  1804. if(ibufpos >= dz->ssampsread) {
  1805. if(dz->ssampsread < dz->buflen) {
  1806. finished = 1;
  1807. break;
  1808. }
  1809. ibufstart_in_file += dz->buflen;
  1810. ibufpos -= dz->buflen;
  1811. if((exit_status = read_samps(ibuf,dz))<0)
  1812. return(exit_status);
  1813. if(dz->ssampsread == 0) {
  1814. finished = 1;
  1815. break;
  1816. }
  1817. }
  1818. if(obufpos >= dz->buflen * 2) {
  1819. sprintf(errstr,"CCC Peak-event length too large for buffer dblbuflen = %d eventlen = %d\n",dz->buflen * 2,(dz->iparam[PKCH_SPLICE] * 2) + dz->iparam[PKCH_WIDTH]);
  1820. return(DATA_ERROR);
  1821. }
  1822. }
  1823. if(finished)
  1824. break;
  1825. if(repeater < dz->iparam[PKCH_REPET]) { // rep;eater checked against current val of PKCH_REPET param, which amy change through time
  1826. m -= mstep; // if not done enough repetitions, prevent advance along input peaks table
  1827. repeater++;
  1828. } else // once PKCH_REPET repetitions done, allows advance along peak table
  1829. repeater = 0;
  1830. }
  1831. if(obufpos > 0) {
  1832. for(kk=0;kk<obufpos;kk++)
  1833. outmax = max(outmax,fabs((double)obuf1[kk]));
  1834. if((exit_status = write_samps(obuf1,obufpos,dz))<0)
  1835. return(exit_status);
  1836. }
  1837. if(outmax >= 1.0) {
  1838. fprintf(stdout,"ERROR: clipping! reduce level\n");
  1839. fflush(stdout);
  1840. }
  1841. return FINISHED;
  1842. }
  1843. /**************************** GENERATE_ENVELOPE_AS_OUTPUT *****************************/
  1844. int generate_envelope_as_output(int envcnt,dataptr dz)
  1845. {
  1846. int exit_status;
  1847. float *ibuf = dz->sampbuf[0];
  1848. double lasttime = 0.0, thistime;
  1849. int m, chwidth, halfchwidth, centring, peakadj = 0;
  1850. int startupsplice, endupsplice, startdownsplice, enddownsplice = 0, envlen;
  1851. int insamptime;
  1852. double srate = (double)dz->infile->srate, invsrate = 1.0/srate;
  1853. int chans = dz->infile->channels;
  1854. fflush(stdout);
  1855. endupsplice = -1;
  1856. if((exit_status = read_samps(ibuf,dz))<0)
  1857. return(exit_status);
  1858. //ibufstart_in_file = 0;
  1859. envlen = envcnt * 2;
  1860. if(dz->brksize[PKCH_WIDTH] == 0) {
  1861. chwidth = dz->iparam[PKCH_WIDTH]/chans;
  1862. halfchwidth = chwidth/2;
  1863. centring = (int)round(dz->param[PKCH_SKEW] * chwidth);
  1864. peakadj = (centring - halfchwidth) * chans;
  1865. }
  1866. for(m = 0;m<envlen;m+= 2) {
  1867. if(dz->brksize[PKCH_WIDTH] > 0) {
  1868. read_value_from_brktable(dz->env[m],PKCH_WIDTH,dz);
  1869. dz->iparam[PKCH_WIDTH] = (int)round(dz->param[PKCH_WIDTH] * MS_TO_SECS * srate) * chans;
  1870. chwidth = dz->iparam[PKCH_WIDTH]/chans;
  1871. halfchwidth = chwidth/2;
  1872. centring = (int)round(dz->param[PKCH_SKEW] * chwidth);
  1873. peakadj = (centring - halfchwidth) * chans;
  1874. }
  1875. if(dz->brksize[PKCH_SPLICE] > 0) {
  1876. read_value_from_brktable(dz->env[m],PKCH_SPLICE,dz);
  1877. dz->iparam[PKCH_SPLICE] = (int)round(dz->param[PKCH_SPLICE] * MS_TO_SECS * srate) * chans;
  1878. }
  1879. if((insamptime = (int)round(dz->env[m] * srate) * chans) >= dz->insams[0])
  1880. break;
  1881. insamptime += peakadj;
  1882. startupsplice = max(insamptime - dz->iparam[PKCH_SPLICE],0);
  1883. if(startupsplice < endupsplice) {
  1884. sprintf(errstr,"Peak envelopes overlap at time %lf\n",dz->env[m]);
  1885. return(DATA_ERROR);
  1886. }
  1887. endupsplice = insamptime;
  1888. startdownsplice = endupsplice + dz->iparam[PKCH_WIDTH];
  1889. enddownsplice = startdownsplice + dz->iparam[PKCH_SPLICE];
  1890. if((thistime = (startupsplice/chans) * invsrate) < lasttime) {
  1891. sprintf(errstr,"New peakwidth too wide for the input data.\n");
  1892. return(DATA_ERROR);
  1893. }
  1894. lasttime = thistime;
  1895. if((thistime = (endupsplice/chans) * invsrate) < lasttime) {
  1896. sprintf(errstr,"New peakwidth too wide for the input data.\n");
  1897. return(DATA_ERROR);
  1898. }
  1899. lasttime = thistime;
  1900. if((thistime = (startdownsplice/chans) * invsrate) < lasttime) {
  1901. sprintf(errstr,"New peakwidth too wide for the input data.\n");
  1902. return(DATA_ERROR);
  1903. }
  1904. lasttime = thistime;
  1905. if((thistime = (enddownsplice/chans) * invsrate) < lasttime || thistime <= 0.0) {
  1906. sprintf(errstr,"New peakwidth too wide for the input data.\n");
  1907. return(DATA_ERROR);
  1908. }
  1909. lasttime = thistime;
  1910. }
  1911. fprintf(stdout,"INFO: Generating output envelope.\n");
  1912. for(m = 0;m<envlen;m+= 2) {
  1913. if(dz->brksize[PKCH_WIDTH] > 0) {
  1914. read_value_from_brktable(dz->env[m],PKCH_WIDTH,dz);
  1915. dz->iparam[PKCH_WIDTH] = (int)round(dz->param[PKCH_WIDTH] * MS_TO_SECS * srate) * chans;
  1916. chwidth = dz->iparam[PKCH_WIDTH]/chans;
  1917. halfchwidth = chwidth/2;
  1918. centring = (int)round(dz->param[PKCH_SKEW] * chwidth);
  1919. peakadj = (centring - halfchwidth) * chans;
  1920. }
  1921. if(dz->brksize[PKCH_SPLICE] > 0) {
  1922. read_value_from_brktable(dz->env[m],PKCH_SPLICE,dz);
  1923. dz->iparam[PKCH_SPLICE] = (int)round(dz->param[PKCH_SPLICE] * MS_TO_SECS * srate) * chans;
  1924. }
  1925. if((insamptime = (int)round(dz->env[m] * srate) * chans) >= dz->insams[0])
  1926. break;
  1927. insamptime += peakadj;
  1928. startupsplice = max(insamptime - dz->iparam[PKCH_SPLICE],0); // e.g. At start of file, if peak is at zero, startupsplice -> 0
  1929. endupsplice = insamptime;
  1930. startdownsplice = endupsplice + dz->iparam[PKCH_WIDTH];
  1931. enddownsplice = startdownsplice + dz->iparam[PKCH_SPLICE];
  1932. if(m == 0 && startupsplice != 0)
  1933. fprintf(dz->fp,"%lf\t%lf\n",0.0,0.0);
  1934. // Splices are always > 0.0, except where peak is at start of file
  1935. // When startsplice can be 0.0. In this case endupsplice = startupsplice
  1936. if(endupsplice > startupsplice) // So we must avoid time-duplication in the env file
  1937. fprintf(dz->fp,"%lf\t%lf\n",(startupsplice/chans) * invsrate,0.0);
  1938. fprintf(dz->fp,"%lf\t%lf\n",(endupsplice/chans) * invsrate,1.0);
  1939. if(dz->iparam[PKCH_WIDTH] > 0) // Avoid duplication of time-point for zero-width peaks
  1940. fprintf(dz->fp,"%lf\t%lf\n",(startdownsplice/chans) * invsrate,1.0);
  1941. fprintf(dz->fp,"%lf\t%lf\n",(enddownsplice/chans) * invsrate,0.0);
  1942. }
  1943. if(enddownsplice < dz->insams[0])
  1944. fprintf(dz->fp,"%lf\t%lf\n",(dz->insams[0]) * invsrate,0.0);
  1945. return FINISHED;
  1946. }
  1947. /*************************** GETMAXSAMP *******************************/
  1948. double getmaxsamp(int startsamp, int sampcnt,float *buffer)
  1949. {
  1950. int i, endsamp = startsamp + sampcnt;
  1951. double thisval, thismaxsamp = 0.0;
  1952. for(i = startsamp; i<endsamp; i++) {
  1953. if((thisval = fabs(buffer[i]))>thismaxsamp)
  1954. thismaxsamp = thisval;
  1955. }
  1956. return thismaxsamp;
  1957. }
  1958. /*************************** CREATE_PEAKCHOP_SNDBUFS **************************
  1959. *
  1960. * Buffer size is a power of two, and more than big enough to take max number of repeats at minimum tempo
  1961. */
  1962. int create_peakchop_sndbufs(dataptr dz)
  1963. {
  1964. int exit_status, n;
  1965. int bigbufsize, twopow;
  1966. double rpet, tempo, mindur, pkwidth, splice;
  1967. int rpetmax;
  1968. if(dz->sbufptr == 0 || dz->sampbuf==0) {
  1969. sprintf(errstr,"buffer pointers not allocated: create_sndbufs()\n");
  1970. return(PROGRAM_ERROR);
  1971. }
  1972. if(dz->brksize[PKCH_REPET] > 0) {
  1973. if((exit_status = get_maxvalue_in_brktable(&rpet,PKCH_REPET,dz)) < 0)
  1974. return(exit_status);
  1975. rpetmax = (int)ceil(rpet);
  1976. rpetmax++;
  1977. } else
  1978. rpetmax = dz->iparam[PKCH_REPET] + 1;
  1979. if(dz->brksize[PKCH_TEMPO] > 0) {
  1980. if((exit_status = get_minvalue_in_brktable(&tempo,PKCH_TEMPO,dz)) < 0)
  1981. return(exit_status);
  1982. tempo = 60.0 / tempo;
  1983. } else
  1984. tempo = dz->param[PKCH_TEMPO];
  1985. mindur = tempo * rpetmax * 4.0;
  1986. if(dz->brksize[PKCH_WIDTH] > 0) {
  1987. if((exit_status = get_maxvalue_in_brktable(&pkwidth,PKCH_WIDTH,dz)) < 0)
  1988. return(exit_status);
  1989. pkwidth *= MS_TO_SECS;
  1990. } else
  1991. pkwidth = dz->param[PKCH_WIDTH] * MS_TO_SECS;
  1992. if(dz->brksize[PKCH_SPLICE] > 0) {
  1993. if((exit_status = get_maxvalue_in_brktable(&splice,PKCH_SPLICE,dz)) < 0)
  1994. return(exit_status);
  1995. splice *= MS_TO_SECS;
  1996. } else
  1997. splice = dz->param[PKCH_SPLICE] * MS_TO_SECS;
  1998. pkwidth += (2 * splice);
  1999. mindur = max(mindur,pkwidth * 4);
  2000. bigbufsize = (int)ceil(mindur * (double)dz->infile->srate) * dz->infile->channels;
  2001. twopow = 2;
  2002. while(twopow < bigbufsize)
  2003. twopow *= 2;
  2004. bigbufsize = twopow;
  2005. dz->buflen = bigbufsize;
  2006. if((dz->bigbuf = (float *)calloc(dz->buflen * dz->bufcnt,sizeof(float))) == NULL) {
  2007. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  2008. return(PROGRAM_ERROR);
  2009. }
  2010. for(n=0;n<dz->bufcnt;n++)
  2011. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  2012. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  2013. return(FINISHED);
  2014. }
  2015. /********************* BEYOND_ENDTIME *********************/
  2016. int beyond_endtime(char **cmdline,int cmdlinecnt,dataptr dz)
  2017. {
  2018. float endtime;
  2019. if(cmdlinecnt < 2)
  2020. return 0;
  2021. if(!this_value_is_numeric(cmdline[1]))
  2022. return 0;
  2023. if(sscanf(cmdline[1],"%f",&endtime)<1)
  2024. return 0;
  2025. if(endtime > dz->duration)
  2026. return 1;
  2027. return 0;
  2028. }
  2029. /********************* THIS_VALUE_IS_NUMERIC *********************/
  2030. int this_value_is_numeric(char *str)
  2031. { char *p, *q, *end;
  2032. int point, valid;
  2033. for(;;) {
  2034. point = 0;
  2035. p = str;
  2036. while(isspace(*p))
  2037. p++;
  2038. q = p;
  2039. if(!isdigit(*p) && *p != '.' && *p!='-')
  2040. return(0);
  2041. if(*p == '.'|| *p == '-') {
  2042. if(*p == '-') {
  2043. p++;
  2044. } else {
  2045. point++;
  2046. p++;
  2047. }
  2048. }
  2049. for(;;) {
  2050. if(*p == '.') {
  2051. if(point)
  2052. return(0);
  2053. else {
  2054. point++;
  2055. p++;
  2056. continue;
  2057. }
  2058. }
  2059. if(isdigit(*p)) {
  2060. p++;
  2061. continue;
  2062. } else {
  2063. if(!isspace(*p) && *p!=ENDOFSTR)
  2064. return(0);
  2065. else {
  2066. end = p;
  2067. p = q;
  2068. valid = 0;
  2069. while(p!=end) {
  2070. if(isdigit(*p))
  2071. valid++;
  2072. p++;
  2073. }
  2074. if(valid)
  2075. return(1);
  2076. return(0);
  2077. }
  2078. }
  2079. }
  2080. }
  2081. return(0); /* NOTREACHED */
  2082. }