stutter.c 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666
  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. // HEREH
  22. // _cdprogs\stutter stutter alan_bellydancefc.wav test.wav datafile 20 1 0 0 0 1
  23. // _cdprogs\stutter stutter alan_bellydancefc.wav test.wav datafile dur segjoins silprop silmin silmax seed [-ttrans] [-aatten] [-bbias] [-mmindur] [-p]
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <structures.h>
  27. #include <tkglobals.h>
  28. #include <pnames.h>
  29. #include <filetype.h>
  30. #include <processno.h>
  31. #include <modeno.h>
  32. #include <logic.h>
  33. #include <globcon.h>
  34. #include <cdpmain.h>
  35. #include <math.h>
  36. #include <mixxcon.h>
  37. #include <osbind.h>
  38. #include <standalone.h>
  39. #include <science.h>
  40. #include <ctype.h>
  41. #include <sfsys.h>
  42. #include <string.h>
  43. #include <srates.h>
  44. #ifdef unix
  45. #define round(x) lround((x))
  46. #endif
  47. #ifndef HUGE
  48. #define HUGE 3.40282347e+38F
  49. #endif
  50. #define minseglen is_flat
  51. #define maxseglen is_sharp
  52. #define segcnt ringsize
  53. #define silcnt zeroset
  54. #define silence activebuf
  55. #define smpsdur total_windows
  56. char errstr[2400];
  57. int anal_infiles = 1;
  58. int sloom = 0;
  59. int sloombatch = 0;
  60. const char* cdp_version = "6.1.0";
  61. //CDP LIB REPLACEMENTS
  62. static int check_stutter_param_validity_and_consistency(dataptr dz);
  63. static int setup_stutter_application(dataptr dz);
  64. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  65. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  66. static int setup_stutter_param_ranges_and_defaults(dataptr dz);
  67. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  68. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  69. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  70. static int establish_application(dataptr dz);
  71. static int initialise_vflags(dataptr dz);
  72. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  73. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  74. static int mark_parameter_types(dataptr dz,aplptr ap);
  75. static int assign_file_data_storage(int infilecnt,dataptr dz);
  76. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  77. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  78. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  79. static int stutter(dataptr dz);
  80. static int handle_the_special_data(char *str,dataptr dz);
  81. static int stutter_param_preprocess(dataptr dz);
  82. static int create_stutter_sndbufs(dataptr dz);
  83. static void rndpermm(int permlen,int *permm);
  84. static void insert(int m,int t,int permlen,int *permm);
  85. static void prefix(int m,int permlen,int *permm);
  86. static void shuflup(int k,int permlen, int *permm);
  87. static void select_silence_inserts(int *silpermm,dataptr dz);
  88. static int get_segno(int *segs_outcnt,int *permm,dataptr dz);
  89. static int insert_silence(float *obuf,double *time,int *obufpos,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;
  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. if(!sloom) {
  120. if(argc == 1) {
  121. usage1();
  122. return(FAILED);
  123. } else if(argc == 2) {
  124. usage2(argv[1]);
  125. return(FAILED);
  126. }
  127. }
  128. if(!sloom) {
  129. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  130. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  131. return(FAILED);
  132. }
  133. cmdline = argv;
  134. cmdlinecnt = argc;
  135. if((get_the_process_no(argv[0],dz))<0)
  136. return(FAILED);
  137. cmdline++;
  138. cmdlinecnt--;
  139. dz->maxmode = 0;
  140. // setup_particular_application =
  141. if((exit_status = setup_stutter_application(dz))<0) {
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(FAILED);
  144. }
  145. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  146. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  147. return(FAILED);
  148. }
  149. } else {
  150. //parse_TK_data() =
  151. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  152. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  153. return(exit_status);
  154. }
  155. }
  156. // ap = dz->application;
  157. // parse_infile_and_hone_type() =
  158. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  159. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  160. return(FAILED);
  161. }
  162. // setup_param_ranges_and_defaults() =
  163. if((exit_status = setup_stutter_param_ranges_and_defaults(dz))<0) {
  164. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  165. return(FAILED);
  166. }
  167. // open_first_infile CDP LIB
  168. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  169. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  170. return(FAILED);
  171. }
  172. cmdlinecnt--;
  173. cmdline++;
  174. // handle_extra_infiles() : redundant
  175. // handle_outfile() =
  176. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  177. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  178. return(FAILED);
  179. }
  180. // handle_formants() redundant
  181. // handle_formant_quiksearch() redundant
  182. // handle_special_data ....
  183. if((exit_status = handle_the_special_data(cmdline[0],dz))<0) {
  184. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  185. return(FAILED);
  186. }
  187. cmdlinecnt--;
  188. cmdline++;
  189. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  190. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  191. return(FAILED);
  192. }
  193. // check_param_validity_and_consistency....
  194. if((exit_status = check_stutter_param_validity_and_consistency(dz))<0) {
  195. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  196. return(FAILED);
  197. }
  198. //param_preprocess =
  199. if((exit_status = stutter_param_preprocess(dz))<0) {
  200. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  201. return(FAILED);
  202. }
  203. is_launched = TRUE;
  204. dz->bufcnt = dz->segcnt + 2;
  205. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  206. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  207. return(MEMORY_ERROR);
  208. }
  209. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  210. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  211. return(MEMORY_ERROR);
  212. }
  213. for(n = 0;n <dz->bufcnt; n++)
  214. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  215. dz->sampbuf[n] = (float *)0;
  216. if((exit_status = create_stutter_sndbufs(dz))<0) {
  217. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  218. return(FAILED);
  219. }
  220. //spec_process_file =
  221. if((exit_status = stutter(dz))<0) {
  222. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  223. return(FAILED);
  224. }
  225. if((exit_status = complete_output(dz))<0) { // CDP LIB
  226. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  227. return(FAILED);
  228. }
  229. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  230. free(dz);
  231. return(SUCCEEDED);
  232. }
  233. /**********************************************
  234. REPLACED CDP LIB FUNCTIONS
  235. **********************************************/
  236. /****************************** SET_PARAM_DATA *********************************/
  237. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  238. {
  239. ap->special_data = (char)special_data;
  240. ap->param_cnt = (char)paramcnt;
  241. ap->max_param_cnt = (char)maxparamcnt;
  242. if(ap->max_param_cnt>0) {
  243. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  244. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  245. return(MEMORY_ERROR);
  246. }
  247. strcpy(ap->param_list,paramlist);
  248. }
  249. return(FINISHED);
  250. }
  251. /****************************** SET_VFLGS *********************************/
  252. int set_vflgs
  253. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  254. {
  255. ap->option_cnt = (char) optcnt; /*RWD added cast */
  256. if(optcnt) {
  257. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  258. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  259. return(MEMORY_ERROR);
  260. }
  261. strcpy(ap->option_list,optlist);
  262. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  263. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  264. return(MEMORY_ERROR);
  265. }
  266. strcpy(ap->option_flags,optflags);
  267. }
  268. ap->vflag_cnt = (char) vflagcnt;
  269. ap->variant_param_cnt = (char) vparamcnt;
  270. if(vflagcnt) {
  271. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  272. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  273. return(MEMORY_ERROR);
  274. }
  275. strcpy(ap->variant_list,varlist);
  276. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  277. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  278. return(MEMORY_ERROR);
  279. }
  280. strcpy(ap->variant_flags,varflags);
  281. }
  282. return(FINISHED);
  283. }
  284. /***************************** APPLICATION_INIT **************************/
  285. int application_init(dataptr dz)
  286. {
  287. int exit_status;
  288. int storage_cnt;
  289. int tipc, brkcnt;
  290. aplptr ap = dz->application;
  291. if(ap->vflag_cnt>0)
  292. initialise_vflags(dz);
  293. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  294. ap->total_input_param_cnt = (char)tipc;
  295. if(tipc>0) {
  296. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  297. return(exit_status);
  298. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  299. return(exit_status);
  300. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  301. return(exit_status);
  302. }
  303. brkcnt = tipc;
  304. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  305. if(brkcnt>0) {
  306. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  307. return(exit_status);
  308. }
  309. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  310. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  311. return(exit_status);
  312. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  313. return(exit_status);
  314. }
  315. if((exit_status = mark_parameter_types(dz,ap))<0)
  316. return(exit_status);
  317. // establish_infile_constants() replaced by
  318. dz->infilecnt = 1;
  319. //establish_bufptrs_and_extra_buffers():
  320. return(FINISHED);
  321. }
  322. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  323. /* RWD mallo changed to calloc; helps debug verison run as release! */
  324. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  325. {
  326. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  327. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  328. return(MEMORY_ERROR);
  329. }
  330. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  331. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  332. return(MEMORY_ERROR);
  333. }
  334. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  335. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  336. return(MEMORY_ERROR);
  337. }
  338. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  339. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  340. return(MEMORY_ERROR);
  341. }
  342. return(FINISHED);
  343. }
  344. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  345. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  346. {
  347. int n;
  348. for(n=0;n<storage_cnt;n++) {
  349. dz->is_int[n] = (char)0;
  350. dz->no_brk[n] = (char)0;
  351. }
  352. return(FINISHED);
  353. }
  354. /***************************** MARK_PARAMETER_TYPES **************************/
  355. int mark_parameter_types(dataptr dz,aplptr ap)
  356. {
  357. int n, m; /* PARAMS */
  358. for(n=0;n<ap->max_param_cnt;n++) {
  359. switch(ap->param_list[n]) {
  360. case('0'): break; /* dz->is_active[n] = 0 is default */
  361. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  362. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  363. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  364. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  365. default:
  366. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  367. return(PROGRAM_ERROR);
  368. }
  369. } /* OPTIONS */
  370. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  371. switch(ap->option_list[n]) {
  372. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  373. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  374. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  375. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  376. default:
  377. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  378. return(PROGRAM_ERROR);
  379. }
  380. } /* VARIANTS */
  381. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  382. switch(ap->variant_list[n]) {
  383. case('0'): break;
  384. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  385. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  386. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  387. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  388. default:
  389. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  390. return(PROGRAM_ERROR);
  391. }
  392. } /* INTERNAL */
  393. for(n=0,
  394. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  395. switch(ap->internal_param_list[n]) {
  396. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  397. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  398. case('d'): dz->no_brk[m] = (char)1; break;
  399. default:
  400. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  401. return(PROGRAM_ERROR);
  402. }
  403. }
  404. return(FINISHED);
  405. }
  406. /************************ HANDLE_THE_OUTFILE *********************/
  407. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  408. {
  409. int exit_status;
  410. char *filename = (*cmdline)[0];
  411. if(filename[0]=='-' && filename[1]=='f') {
  412. dz->floatsam_output = 1;
  413. dz->true_outfile_stype = SAMP_FLOAT;
  414. filename+= 2;
  415. }
  416. if(!sloom) {
  417. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  418. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  419. return(DATA_ERROR);
  420. }
  421. }
  422. strcpy(dz->outfilename,filename);
  423. if((exit_status = create_sized_outfile(filename,dz))<0)
  424. return(exit_status);
  425. (*cmdline)++;
  426. (*cmdlinecnt)--;
  427. return(FINISHED);
  428. }
  429. /***************************** ESTABLISH_APPLICATION **************************/
  430. int establish_application(dataptr dz)
  431. {
  432. aplptr ap;
  433. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  434. sprintf(errstr,"establish_application()\n");
  435. return(MEMORY_ERROR);
  436. }
  437. ap = dz->application;
  438. memset((char *)ap,0,sizeof(struct applic));
  439. return(FINISHED);
  440. }
  441. /************************* INITIALISE_VFLAGS *************************/
  442. int initialise_vflags(dataptr dz)
  443. {
  444. int n;
  445. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  446. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  447. return(MEMORY_ERROR);
  448. }
  449. for(n=0;n<dz->application->vflag_cnt;n++)
  450. dz->vflag[n] = FALSE;
  451. return FINISHED;
  452. }
  453. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  454. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  455. {
  456. int n;
  457. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  458. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  459. return(MEMORY_ERROR);
  460. }
  461. for(n=0;n<tipc;n++)
  462. ap->default_val[n] = 0.0;
  463. return(FINISHED);
  464. }
  465. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  466. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  467. {
  468. int n;
  469. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  470. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  471. return(MEMORY_ERROR);
  472. }
  473. for(n=0;n<tipc;n++)
  474. dz->is_active[n] = (char)0;
  475. return(FINISHED);
  476. }
  477. /************************* SETUP_STUTTER_APPLICATION *******************/
  478. int setup_stutter_application(dataptr dz)
  479. {
  480. int exit_status;
  481. aplptr ap;
  482. if((exit_status = establish_application(dz))<0) // GLOBAL
  483. return(FAILED);
  484. ap = dz->application;
  485. // SEE parstruct FOR EXPLANATION of next 2 functions
  486. if((exit_status = set_param_data(ap,MOTORDATA,6,6,"didddi"))<0)
  487. return(FAILED);
  488. if((exit_status = set_vflgs(ap,"tabm",4,"DDDd","p",1,0,"0"))<0)
  489. return(FAILED);
  490. // set_legal_infile_structure -->
  491. dz->has_otherfile = FALSE;
  492. // assign_process_logic -->
  493. dz->input_data_type = SNDFILES_ONLY;
  494. dz->process_type = UNEQUAL_SNDFILE;
  495. dz->outfiletype = SNDFILE_OUT;
  496. return application_init(dz); //GLOBAL
  497. }
  498. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  499. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  500. {
  501. int exit_status;
  502. infileptr infile_info;
  503. if(!sloom) {
  504. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  505. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  506. return(MEMORY_ERROR);
  507. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  508. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  509. return(PROGRAM_ERROR);
  510. } else if(infile_info->filetype != SNDFILE) {
  511. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  512. return(DATA_ERROR);
  513. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  514. sprintf(errstr,"Failed to copy file parsing information\n");
  515. return(PROGRAM_ERROR);
  516. }
  517. free(infile_info);
  518. }
  519. return(FINISHED);
  520. }
  521. /************************* SETUP_STUTTER_PARAM_RANGES_AND_DEFAULTS *******************/
  522. int setup_stutter_param_ranges_and_defaults(dataptr dz)
  523. {
  524. int exit_status;
  525. aplptr ap = dz->application;
  526. // set_param_ranges()
  527. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  528. // NB total_input_param_cnt is > 0 !!!
  529. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  530. return(FAILED);
  531. // get_param_ranges()
  532. ap->lo[STUT_DUR] = 1;
  533. ap->hi[STUT_DUR] = 7200;
  534. ap->default_val[STUT_DUR] = 20;
  535. ap->lo[STUT_JOIN] = 1;
  536. ap->hi[STUT_JOIN] = STUT_MAX_JOIN;
  537. ap->default_val[STUT_JOIN] = 1;
  538. ap->lo[STUT_SIL] = 0;
  539. ap->hi[STUT_SIL] = 1;
  540. ap->default_val[STUT_SIL] = 0;
  541. ap->lo[STUT_SILMIN] = 0;
  542. ap->hi[STUT_SILMIN] = 10;
  543. ap->default_val[STUT_SILMIN] = 0.1;
  544. ap->lo[STUT_SILMAX] = 0;
  545. ap->hi[STUT_SILMAX] = 10;
  546. ap->default_val[STUT_SILMAX] = .5;
  547. ap->lo[STUT_SEED] = 0;
  548. ap->hi[STUT_SEED] = 256;
  549. ap->default_val[STUT_SEED] = 1;
  550. ap->lo[STUT_TRANS] = 0;
  551. ap->hi[STUT_TRANS] = 3;
  552. ap->default_val[STUT_TRANS] = 0;
  553. ap->lo[STUT_ATTEN] = 0;
  554. ap->hi[STUT_ATTEN] = 1;
  555. ap->default_val[STUT_ATTEN] = 0;
  556. ap->lo[STUT_BIAS] = -1.0;
  557. ap->hi[STUT_BIAS] = 1.0;
  558. ap->default_val[STUT_BIAS] = 0.0;
  559. ap->lo[STUT_MINDUR] = STUT_SPLICE + STUT_DOVE;
  560. ap->hi[STUT_MINDUR] = 250;
  561. ap->default_val[STUT_MINDUR] = STUT_MIN;
  562. dz->maxmode = 0;
  563. if(!sloom)
  564. put_default_vals_in_all_params(dz);
  565. return(FINISHED);
  566. }
  567. /********************************* PARSE_SLOOM_DATA *********************************/
  568. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  569. {
  570. int exit_status;
  571. int cnt = 1, infilecnt;
  572. int filesize, insams, inbrksize;
  573. double dummy;
  574. int true_cnt = 0;
  575. // aplptr ap;
  576. while(cnt<=PRE_CMDLINE_DATACNT) {
  577. if(cnt > argc) {
  578. sprintf(errstr,"Insufficient data sent from TK\n");
  579. return(DATA_ERROR);
  580. }
  581. switch(cnt) {
  582. case(1):
  583. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  584. sprintf(errstr,"Cannot read process no. sent from TK\n");
  585. return(DATA_ERROR);
  586. }
  587. break;
  588. case(2):
  589. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  590. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  591. return(DATA_ERROR);
  592. }
  593. if(dz->mode > 0)
  594. dz->mode--;
  595. //setup_particular_application() =
  596. if((exit_status = setup_stutter_application(dz))<0)
  597. return(exit_status);
  598. // ap = dz->application;
  599. break;
  600. case(3):
  601. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  602. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  603. return(DATA_ERROR);
  604. }
  605. if(infilecnt < 1) {
  606. true_cnt = cnt + 1;
  607. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  608. }
  609. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  610. return(exit_status);
  611. break;
  612. case(INPUT_FILETYPE+4):
  613. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  614. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  615. return(DATA_ERROR);
  616. }
  617. break;
  618. case(INPUT_FILESIZE+4):
  619. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  620. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  621. return(DATA_ERROR);
  622. }
  623. dz->insams[0] = filesize;
  624. break;
  625. case(INPUT_INSAMS+4):
  626. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  627. sprintf(errstr,"Cannot read insams sent from TK\n");
  628. return(DATA_ERROR);
  629. }
  630. dz->insams[0] = insams;
  631. break;
  632. case(INPUT_SRATE+4):
  633. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  634. sprintf(errstr,"Cannot read srate sent from TK\n");
  635. return(DATA_ERROR);
  636. }
  637. break;
  638. case(INPUT_CHANNELS+4):
  639. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  640. sprintf(errstr,"Cannot read channels sent from TK\n");
  641. return(DATA_ERROR);
  642. }
  643. break;
  644. case(INPUT_STYPE+4):
  645. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  646. sprintf(errstr,"Cannot read stype sent from TK\n");
  647. return(DATA_ERROR);
  648. }
  649. break;
  650. case(INPUT_ORIGSTYPE+4):
  651. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  652. sprintf(errstr,"Cannot read origstype sent from TK\n");
  653. return(DATA_ERROR);
  654. }
  655. break;
  656. case(INPUT_ORIGRATE+4):
  657. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  658. sprintf(errstr,"Cannot read origrate sent from TK\n");
  659. return(DATA_ERROR);
  660. }
  661. break;
  662. case(INPUT_MLEN+4):
  663. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  664. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  665. return(DATA_ERROR);
  666. }
  667. break;
  668. case(INPUT_DFAC+4):
  669. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  670. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  671. return(DATA_ERROR);
  672. }
  673. break;
  674. case(INPUT_ORIGCHANS+4):
  675. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  676. sprintf(errstr,"Cannot read origchans sent from TK\n");
  677. return(DATA_ERROR);
  678. }
  679. break;
  680. case(INPUT_SPECENVCNT+4):
  681. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  682. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  683. return(DATA_ERROR);
  684. }
  685. dz->specenvcnt = dz->infile->specenvcnt;
  686. break;
  687. case(INPUT_WANTED+4):
  688. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  689. sprintf(errstr,"Cannot read wanted sent from TK\n");
  690. return(DATA_ERROR);
  691. }
  692. break;
  693. case(INPUT_WLENGTH+4):
  694. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  695. sprintf(errstr,"Cannot read wlength sent from TK\n");
  696. return(DATA_ERROR);
  697. }
  698. break;
  699. case(INPUT_OUT_CHANS+4):
  700. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  701. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  702. return(DATA_ERROR);
  703. }
  704. break;
  705. /* RWD these chanegs to samps - tk will have to deal with that! */
  706. case(INPUT_DESCRIPTOR_BYTES+4):
  707. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  708. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  709. return(DATA_ERROR);
  710. }
  711. break;
  712. case(INPUT_IS_TRANSPOS+4):
  713. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  714. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  715. return(DATA_ERROR);
  716. }
  717. break;
  718. case(INPUT_COULD_BE_TRANSPOS+4):
  719. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  720. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  721. return(DATA_ERROR);
  722. }
  723. break;
  724. case(INPUT_COULD_BE_PITCH+4):
  725. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  726. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  727. return(DATA_ERROR);
  728. }
  729. break;
  730. case(INPUT_DIFFERENT_SRATES+4):
  731. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  732. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  733. return(DATA_ERROR);
  734. }
  735. break;
  736. case(INPUT_DUPLICATE_SNDS+4):
  737. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  738. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  739. return(DATA_ERROR);
  740. }
  741. break;
  742. case(INPUT_BRKSIZE+4):
  743. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  744. sprintf(errstr,"Cannot read brksize sent from TK\n");
  745. return(DATA_ERROR);
  746. }
  747. if(inbrksize > 0) {
  748. switch(dz->input_data_type) {
  749. case(WORDLIST_ONLY):
  750. break;
  751. case(PITCH_AND_PITCH):
  752. case(PITCH_AND_TRANSPOS):
  753. case(TRANSPOS_AND_TRANSPOS):
  754. dz->tempsize = inbrksize;
  755. break;
  756. case(BRKFILES_ONLY):
  757. case(UNRANGED_BRKFILE_ONLY):
  758. case(DB_BRKFILES_ONLY):
  759. case(ALL_FILES):
  760. case(ANY_NUMBER_OF_ANY_FILES):
  761. if(dz->extrabrkno < 0) {
  762. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  763. return(DATA_ERROR);
  764. }
  765. if(dz->brksize == NULL) {
  766. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  767. return(PROGRAM_ERROR);
  768. }
  769. dz->brksize[dz->extrabrkno] = inbrksize;
  770. break;
  771. default:
  772. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  773. dz->input_data_type);
  774. return(PROGRAM_ERROR);
  775. }
  776. break;
  777. }
  778. break;
  779. case(INPUT_NUMSIZE+4):
  780. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  781. sprintf(errstr,"Cannot read numsize sent from TK\n");
  782. return(DATA_ERROR);
  783. }
  784. break;
  785. case(INPUT_LINECNT+4):
  786. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  787. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  788. return(DATA_ERROR);
  789. }
  790. break;
  791. case(INPUT_ALL_WORDS+4):
  792. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  793. sprintf(errstr,"Cannot read all_words sent from TK\n");
  794. return(DATA_ERROR);
  795. }
  796. break;
  797. case(INPUT_ARATE+4):
  798. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  799. sprintf(errstr,"Cannot read arate sent from TK\n");
  800. return(DATA_ERROR);
  801. }
  802. break;
  803. case(INPUT_FRAMETIME+4):
  804. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  805. sprintf(errstr,"Cannot read frametime sent from TK\n");
  806. return(DATA_ERROR);
  807. }
  808. dz->frametime = (float)dummy;
  809. break;
  810. case(INPUT_WINDOW_SIZE+4):
  811. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  812. sprintf(errstr,"Cannot read window_size sent from TK\n");
  813. return(DATA_ERROR);
  814. }
  815. break;
  816. case(INPUT_NYQUIST+4):
  817. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  818. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  819. return(DATA_ERROR);
  820. }
  821. break;
  822. case(INPUT_DURATION+4):
  823. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  824. sprintf(errstr,"Cannot read duration sent from TK\n");
  825. return(DATA_ERROR);
  826. }
  827. break;
  828. case(INPUT_MINBRK+4):
  829. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  830. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  831. return(DATA_ERROR);
  832. }
  833. break;
  834. case(INPUT_MAXBRK+4):
  835. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  836. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  837. return(DATA_ERROR);
  838. }
  839. break;
  840. case(INPUT_MINNUM+4):
  841. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  842. sprintf(errstr,"Cannot read minnum sent from TK\n");
  843. return(DATA_ERROR);
  844. }
  845. break;
  846. case(INPUT_MAXNUM+4):
  847. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  848. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  849. return(DATA_ERROR);
  850. }
  851. break;
  852. default:
  853. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  854. return(PROGRAM_ERROR);
  855. }
  856. cnt++;
  857. }
  858. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  859. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  860. return(DATA_ERROR);
  861. }
  862. if(true_cnt)
  863. cnt = true_cnt;
  864. *cmdlinecnt = 0;
  865. while(cnt < argc) {
  866. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  867. return(exit_status);
  868. cnt++;
  869. }
  870. return(FINISHED);
  871. }
  872. /********************************* GET_TK_CMDLINE_WORD *********************************/
  873. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  874. {
  875. if(*cmdlinecnt==0) {
  876. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  877. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  878. return(MEMORY_ERROR);
  879. }
  880. } else {
  881. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  882. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  883. return(MEMORY_ERROR);
  884. }
  885. }
  886. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  887. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  888. return(MEMORY_ERROR);
  889. }
  890. strcpy((*cmdline)[*cmdlinecnt],q);
  891. (*cmdlinecnt)++;
  892. return(FINISHED);
  893. }
  894. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  895. int assign_file_data_storage(int infilecnt,dataptr dz)
  896. {
  897. int exit_status;
  898. int no_sndfile_system_files = FALSE;
  899. dz->infilecnt = infilecnt;
  900. if((exit_status = allocate_filespace(dz))<0)
  901. return(exit_status);
  902. if(no_sndfile_system_files)
  903. dz->infilecnt = 0;
  904. return(FINISHED);
  905. }
  906. /************************* redundant functions: to ensure libs compile OK *******************/
  907. int assign_process_logic(dataptr dz)
  908. {
  909. return(FINISHED);
  910. }
  911. void set_legal_infile_structure(dataptr dz)
  912. {}
  913. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  914. {
  915. return(FINISHED);
  916. }
  917. int setup_internal_arrays_and_array_pointers(dataptr dz)
  918. {
  919. return(FINISHED);
  920. }
  921. int establish_bufptrs_and_extra_buffers(dataptr dz)
  922. {
  923. return(FINISHED);
  924. }
  925. int read_special_data(char *str,dataptr dz)
  926. {
  927. return(FINISHED);
  928. }
  929. int inner_loop
  930. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  931. {
  932. return(FINISHED);
  933. }
  934. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  935. {
  936. return(FINISHED);
  937. }
  938. /******************************** USAGE1 ********************************/
  939. int usage1(void)
  940. {
  941. usage2("stutter");
  942. return(USAGE_ONLY);
  943. }
  944. /**************************** CHECK_STUTTER_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  945. int check_stutter_param_validity_and_consistency(dataptr dz)
  946. {
  947. double temp;
  948. if(dz->param[STUT_SIL] == 0.0) {
  949. if (dz->param[STUT_SILMIN] > 0.0 || dz->param[STUT_SILMAX] > 0.0) {
  950. sprintf(errstr,"ERROR: You have selected NO silence inserts.\n");
  951. return DATA_ERROR;
  952. }
  953. } else if(dz->param[STUT_SILMIN] > dz->param[STUT_SILMAX]) {
  954. fprintf(stdout,"WARNING: Min silence duration (%lf) is greater than max silence duration (%lf).\n",dz->param[STUT_SILMIN],dz->param[STUT_SILMAX]);
  955. fprintf(stdout,"WARNING: Reversing these values.\n");
  956. fflush(stdout);
  957. temp = dz->param[STUT_SILMIN];
  958. dz->param[STUT_SILMIN] = dz->param[STUT_SILMAX];
  959. dz->param[STUT_SILMAX] = temp;
  960. }
  961. return FINISHED;
  962. }
  963. /********************************************************************************************/
  964. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  965. {
  966. if(!strcmp(prog_identifier_from_cmdline,"stutter")) dz->process = STUTTER;
  967. else {
  968. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  969. return(USAGE_ONLY);
  970. }
  971. return(FINISHED);
  972. }
  973. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  974. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  975. {
  976. int n;
  977. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  978. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  979. return(MEMORY_ERROR);
  980. }
  981. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  982. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  983. return(MEMORY_ERROR);
  984. }
  985. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  986. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  987. return(MEMORY_ERROR);
  988. }
  989. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  990. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  991. return(MEMORY_ERROR);
  992. }
  993. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  994. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  995. return(MEMORY_ERROR);
  996. }
  997. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  998. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  999. return(MEMORY_ERROR);
  1000. }
  1001. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1002. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1003. return(MEMORY_ERROR);
  1004. }
  1005. for(n=0;n<brkcnt;n++) {
  1006. dz->brk[n] = NULL;
  1007. dz->brkptr[n] = NULL;
  1008. dz->brkinit[n] = 0;
  1009. dz->brksize[n] = 0;
  1010. }
  1011. return(FINISHED);
  1012. }
  1013. /******************************** USAGE2 ********************************/
  1014. int usage2(char *str)
  1015. {
  1016. if(!strcmp(str,"stutter")) {
  1017. fprintf(stderr,
  1018. "USAGE:\n"
  1019. "stutter stutter infile outfile datafile dur segjoins silprop\n"
  1020. "silmin silmax seed [-ttrans] [-aatten] [-bbias] [-mmindur] [-p]\n"
  1021. "\n"
  1022. "Slice src (e.g. speech) into elements (e.g. words or syllables).\n"
  1023. "Cut segments from elements, always cutting from element start.\n"
  1024. "Play these in a random order (with possible intervening silence).\n"
  1025. "\n"
  1026. "DATAFILE List of times at which to slice src into elements.\n"
  1027. " Minimum timestep between times (MT) = 0.016 secs.\n"
  1028. " Times range: MT secs to (duration - MT).\n"
  1029. "DUR Duration of output.\n"
  1030. "SEGJOINS Value 1: uses the specified elements as srcs to cut.\n"
  1031. " Value 2: also use pairs-of-segments as srcs.\n"
  1032. " Value N: also use 2,3,....N joined-segments as srcs.\n"
  1033. " Where joined segs used, cuts end in the last seg joined.\n"
  1034. " Range 1 to %d.\n"
  1035. "SILPROP Silence may be inserted at joins between cut-segments.\n"
  1036. " \"silprop\" is proportion of joins to have inserted silence.\n"
  1037. " (Range 0 - 1). (Apart from none, minimum is 1 in %d)\n"
  1038. "SILMIN Minimum duration of any silences at joins.\n"
  1039. "SILMAX Maximum duration of any silences at joins.\n"
  1040. "SEED Same seed value (with all other params same)\n"
  1041. " produces identical output from any random-varying processes.\n"
  1042. "TRANS Range (semitones) of any random transposition of segments.\n"
  1043. "ATTEN Range of any random attenuation of segment level (Range 0-1).\n"
  1044. "BIAS Bias size of segments cut (Range -1 to 1). 0 = no bias.\n"
  1045. " -ve vals bias towards smaller segs: +ve vals towards larger segs.\n"
  1046. "MINDUR Minimum duration of cut segments, in mS ( >8 mS ).\n"
  1047. "-p Permute elements (all elements used before any used again).\n"
  1048. " i.e.randomly order elements, cut segs from each and play.\n"
  1049. " Then permute order, cut new segs and play, etc.\n"
  1050. " (Default: segs cut from elements taken entirely at random).\n",STUT_MAX_JOIN,STUT_SILDIV);
  1051. } else
  1052. fprintf(stdout,"Unknown option '%s'\n",str);
  1053. return(USAGE_ONLY);
  1054. }
  1055. int usage3(char *str1,char *str2)
  1056. {
  1057. fprintf(stderr,"Insufficient parameters on command line.\n");
  1058. return(USAGE_ONLY);
  1059. }
  1060. /******************************** STUTTER ********************************/
  1061. int stutter(dataptr dz)
  1062. {
  1063. int exit_status, segs_outcnt, segno, silence_cnt = 0, chans = dz->infile->channels;
  1064. float **ibuf, *sbuf, *obuf;
  1065. int *gp_startcut = dz->lparray[0], *gp_sampsread = dz->lparray[1];
  1066. double time, segdur, dsbufpos, splic, rnd, amp, trns, frac, diff, val, srate = (double)dz->infile->srate;
  1067. double *inseg = dz->parray[0];
  1068. int m, n, j, k, ch, gp_mindur, gp_splicelen, gp_cutlen, gp_cutpos, start_read, samps_to_read, gp_start, ibufpos, sbufpos, gp_sbufpos, obufpos;
  1069. int seg_groupings_cnt, next_groupings_end;
  1070. int *permm, *silpermm = NULL;
  1071. gp_splicelen = (int)round(STUT_SPLICE * MS_TO_SECS * srate);
  1072. gp_mindur = (int)round(dz->param[STUT_MINDUR] * MS_TO_SECS * srate);
  1073. if((ibuf = (float **)malloc(dz->segcnt * sizeof(float *)))==NULL) {
  1074. sprintf(errstr,"Insufficient memory to create input sound buffers.\n");
  1075. return(MEMORY_ERROR);
  1076. }
  1077. for(n=0;n<dz->segcnt;n++) { // Establish all sound buffers
  1078. ibuf[n] = dz->sampbuf[n];
  1079. memset((char *)ibuf[n],0,dz->buflen * sizeof(float));
  1080. }
  1081. sbuf = dz->sampbuf[n++];
  1082. memset((char *)sbuf,0,dz->buflen * sizeof(float));
  1083. obuf = dz->sampbuf[n];
  1084. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1085. seg_groupings_cnt = dz->itemcnt + 1;
  1086. next_groupings_end = seg_groupings_cnt;
  1087. for(n=0,m=0;n < dz->segcnt;n++,m+=2) { // Cut all segments, noting their (grouped) length
  1088. start_read = (int)round(inseg[m] * srate) * chans;
  1089. if(n == dz->segcnt - 1 || (int)round(inseg[m+2] * srate) * chans == 0) {
  1090. samps_to_read = dz->insams[0] - start_read;
  1091. seg_groupings_cnt--;
  1092. next_groupings_end += seg_groupings_cnt;
  1093. }
  1094. else {
  1095. segdur = inseg[m+1] - inseg[m];
  1096. samps_to_read = (int)round(segdur * srate) * chans;
  1097. }
  1098. sndseekEx(dz->ifd[0],start_read,0);
  1099. memset((char *)ibuf[n],0,dz->buflen);
  1100. if((dz->ssampsread = fgetfbufEx(ibuf[n],samps_to_read,dz->ifd[0],0)) < 0) {
  1101. sprintf(errstr,"Can't read sample-set %d from input soundfile.\n",n+1);
  1102. return(SYSTEM_ERROR);
  1103. }
  1104. if(dz->ssampsread != samps_to_read) {
  1105. fprintf(stdout,"WARNING: Samps read (%d) not exactly as asked for (%d) for input seg %d\n",dz->ssampsread,samps_to_read,n+1);
  1106. fflush(stdout);
  1107. }
  1108. gp_sampsread[n] = dz->ssampsread/chans; // Remember gp_length of segment read
  1109. gp_start = (int)round(inseg[m] * srate); // Find gp_sample start of this segment within input file
  1110. gp_startcut[n] -= gp_start; // Find start-cut-place WITHIN cut-segment
  1111. if(n>0) { // Splice start and end of segments (except at start and end of source snd)
  1112. ibufpos = 0;
  1113. for(k=0;k<gp_splicelen;k++) {
  1114. splic = (double)k/(double)gp_splicelen;
  1115. for(ch=0;ch<chans;ch++) {
  1116. ibuf[n][ibufpos] = (float)(ibuf[n][ibufpos] * splic);
  1117. ibufpos++;
  1118. }
  1119. }
  1120. }
  1121. if(n<dz->segcnt-1) {
  1122. for(k=0,j=gp_sampsread[n] - 1;k<gp_splicelen;k++,j--) {
  1123. ibufpos = j * chans;
  1124. splic = (double)k/(double)gp_splicelen;
  1125. for(ch=0;ch<chans;ch++) {
  1126. ibuf[n][ibufpos] = (float)(ibuf[n][ibufpos] * splic);
  1127. ibufpos++;
  1128. }
  1129. }
  1130. memset((char *)(ibuf[n] + dz->ssampsread),0,(dz->buflen - dz->ssampsread) * sizeof(float));
  1131. }
  1132. } // Establish array for permuting order of segments, and possibly, occurence of silences
  1133. if((permm = (int *)malloc(dz->segcnt * sizeof(int)))==NULL) {
  1134. sprintf(errstr,"Insufficient memory to create segment-order permutation store.\n");
  1135. return(MEMORY_ERROR);
  1136. }
  1137. if(dz->param[STUT_SIL] > 0.0) { // If there are silence insertions, set up a permutation array for yes-no
  1138. if((silpermm = (int *)malloc(STUT_SILDIV * sizeof(int)))==NULL) {
  1139. sprintf(errstr,"Insufficient memory to create segment-order permutation store.\n");
  1140. return(MEMORY_ERROR);
  1141. }
  1142. }
  1143. srand(dz->iparam[STUT_SEED]); // Initialise randomisation
  1144. if(dz->vflag[STUT_PERM]) // If order of segments is to be permuted, set up first rand permutation
  1145. rndpermm(dz->segcnt,permm); // Permute order of segments
  1146. time = 0.0;
  1147. segs_outcnt = 0;
  1148. obufpos = 0;
  1149. silence_cnt = 0;
  1150. while(time < dz->param[STUT_DUR]) {
  1151. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1152. return exit_status;
  1153. sbufpos = 0;
  1154. ibufpos = 0;
  1155. segno = get_segno(&segs_outcnt,permm,dz); // Select a segment
  1156. gp_cutlen = gp_sampsread[segno] - gp_startcut[segno]; // Find the cutable length (from zero or, end of prior joined segment, to end of seg)
  1157. rnd = drand48();
  1158. if(dz->param[STUT_BIAS] != 1.0) // Generate (possibly biased) random value
  1159. rnd = pow(rnd,dz->param[STUT_BIAS]);
  1160. // Make a random cut of the CUTABLE LENGTH, which is at least gp_mindur in length
  1161. gp_cutpos = (int)round((double)(gp_cutlen - gp_mindur) * rnd);
  1162. gp_cutpos += gp_mindur;
  1163. gp_cutpos += gp_startcut[segno]; // Include any prior joined-segs
  1164. amp = 1.0;
  1165. if(dz->param[STUT_ATTEN]) {
  1166. rnd = drand48() * dz->param[STUT_ATTEN];
  1167. amp -= rnd;
  1168. }
  1169. memset((char *)sbuf,0,dz->buflen * sizeof(float));
  1170. for(n=0;n < gp_cutpos ;n++) { // Copy segment to the segment buffer
  1171. for(ch=0;ch < chans;ch++) {
  1172. sbuf[sbufpos] = (float)(ibuf[segno][ibufpos] * amp);
  1173. sbufpos++;
  1174. ibufpos++;
  1175. }
  1176. }
  1177. for(n = 0,m = gp_cutpos - 1;n < gp_splicelen;n++,m--) {// Spice end of cut segment
  1178. splic = (double)n/(double)gp_splicelen;
  1179. sbufpos = m * chans;
  1180. for(ch=0;ch < chans;ch++) {
  1181. sbuf[sbufpos] = (float)(sbuf[sbufpos] * splic);
  1182. sbufpos++;
  1183. }
  1184. }
  1185. if(dz->param[STUT_TRANS]) { // If segment is to be transposed
  1186. trns = (drand48() * 2.0) - 1.0; // Range -1 t0 1
  1187. trns *= dz->param[STUT_TRANS]; // Range -TRANS to +TRANS semitones
  1188. trns = pow(2.0,trns/SEMITONES_PER_OCTAVE); // and convert to frq ratio
  1189. } else
  1190. trns = 1.0;
  1191. dsbufpos = 0.0;
  1192. while(dsbufpos<gp_cutpos) { // copy segment to output, with possible transposition
  1193. gp_sbufpos = (int)floor(dsbufpos);
  1194. frac = dsbufpos - (double)gp_sbufpos;
  1195. sbufpos = gp_sbufpos * chans;
  1196. for(ch = 0;ch<chans;ch++) {
  1197. val = sbuf[sbufpos];
  1198. diff = sbuf[sbufpos + chans] - val;
  1199. val += frac * diff;
  1200. obuf[obufpos++] = (float)val;
  1201. sbufpos++;
  1202. }
  1203. if(obufpos >= dz->buflen) { // If outbuffer fills
  1204. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1205. return exit_status; // Write buffer-full of sound
  1206. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1207. obufpos = 0; // and reset obuffer pointer
  1208. }
  1209. dsbufpos += trns;
  1210. }
  1211. time = (double)((dz->total_samps_written + obufpos)/chans)/srate;
  1212. if(time >= dz->param[STUT_DUR]) // Check time after segment written, and if reached required duration, break
  1213. break;
  1214. if(dz->param[STUT_SIL] > 0.0) { // If there are silence insertions
  1215. if(silence_cnt >= dz->silcnt) { // If reached end of silence yes-no array
  1216. select_silence_inserts(silpermm,dz); // re-permute
  1217. silence_cnt = 0;
  1218. }
  1219. if(dz->silence[silence_cnt]) { // If this join is flagged for a silent-insert
  1220. if((exit_status = insert_silence(obuf,&time,&obufpos,dz))<0)
  1221. return exit_status; // do silent insert
  1222. }
  1223. silence_cnt++; // Advance yes-no flags array pointer
  1224. }
  1225. }
  1226. if(obufpos > 0) {
  1227. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1228. return(exit_status);
  1229. }
  1230. return FINISHED;
  1231. }
  1232. /**************************** HANDLE_THE_SPECIAL_DATA ****************************/
  1233. int handle_the_special_data(char *str,dataptr dz)
  1234. {
  1235. int done = 0;
  1236. double dummy = 0.0, lasttime;
  1237. double splicedur = MOT_SPLICE * MS_TO_SECS;
  1238. double dblsplicedur = splicedur * 2;
  1239. FILE *fp;
  1240. int cnt = 0, linecnt;
  1241. char temp[800], *p;
  1242. if((fp = fopen(str,"r"))==NULL) {
  1243. sprintf(errstr,"Cannot open file %s to read times.\n",str);
  1244. return(DATA_ERROR);
  1245. }
  1246. linecnt = 0;
  1247. lasttime = -1.0;
  1248. while(fgets(temp,200,fp)!=NULL) {
  1249. p = temp;
  1250. while(isspace(*p))
  1251. p++;
  1252. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  1253. continue;
  1254. while(get_float_from_within_string(&p,&dummy)) {
  1255. if(cnt == 0) {
  1256. if(dummy <= dblsplicedur) {
  1257. sprintf(errstr,"Invalid time (%lf) (closer to start than 2 splicedurs = %.3lf) at line %d in file %s.\n",dummy,dblsplicedur,linecnt+1,str);
  1258. return(DATA_ERROR);
  1259. }
  1260. } else if(dummy <= lasttime + dblsplicedur) {
  1261. sprintf(errstr,"Times (%lf & %lf) not increasing by 2 splicedurs (%.3lf) line %d in file %s.\n",lasttime, dummy,dblsplicedur,linecnt,str);
  1262. return(DATA_ERROR);
  1263. } else if(dummy >= dz->duration - dblsplicedur) {
  1264. fprintf(stdout,"WARNING: Time (%lf) too near or beyond end of source-file, at line %d in file %s.\n",dummy,linecnt+1,str);
  1265. fprintf(stdout,"WARNING: Ignoring data at and after this time.\n");
  1266. fflush(stdout);
  1267. done = 1;
  1268. break;
  1269. }
  1270. lasttime = dummy;
  1271. cnt++;
  1272. }
  1273. if(done)
  1274. break;
  1275. linecnt++;
  1276. }
  1277. if(cnt == 0) {
  1278. sprintf(errstr,"No valid data found in file %s.\n",str);
  1279. return(DATA_ERROR);
  1280. }
  1281. dz->itemcnt = cnt;
  1282. if((dz->parray = (double **)malloc(2 * sizeof(double *)))==NULL) {
  1283. sprintf(errstr,"INSUFFICIENT MEMORY to create slice-time-data storage. (1)\n");
  1284. return(MEMORY_ERROR);
  1285. }
  1286. if((dz->parray[1] = (double *)malloc(dz->itemcnt * sizeof(double)))==NULL) {
  1287. sprintf(errstr,"INSUFFICIENT MEMORY to create slice-time-data storage. (2)\n");
  1288. return(MEMORY_ERROR);
  1289. }
  1290. fseek(fp,0,0);
  1291. cnt = 0;
  1292. done = 0;
  1293. while(fgets(temp,200,fp)!=NULL) {
  1294. p = temp;
  1295. while(isspace(*p))
  1296. p++;
  1297. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  1298. continue;
  1299. while(get_float_from_within_string(&p,&dummy)) {
  1300. dz->parray[1][cnt] = dummy;
  1301. if(++cnt >= dz->itemcnt) {
  1302. done = 1;
  1303. break;
  1304. }
  1305. }
  1306. if(done)
  1307. break;
  1308. }
  1309. fclose(fp);
  1310. return FINISHED;
  1311. }
  1312. /**************************** STUTTER_PARAM_PREPROCESS *****************************/
  1313. int stutter_param_preprocess(dataptr dz)
  1314. {
  1315. double srate = (double)dz->infile->srate, segdur;
  1316. int chans = dz->infile->channels;
  1317. double *inslice = dz->parray[1], *outcuts;
  1318. int n, m, k, kk, tot, outcnt, *gp_startcut;
  1319. double overlap = (STUT_DOVE + STUT_SPLICE) * MS_TO_SECS;
  1320. int datacnt = 0;
  1321. dz->maxseglen = 0.0;
  1322. dz->minseglen = HUGE;
  1323. outcnt = (dz->itemcnt + 1) * 2; // N slices (dz->itemcnt) converted to N+1 pairs of cut-times
  1324. for(k = 0; k < dz->iparam[STUT_JOIN]; k++) { // Supplemented by others pairs, if segs are to be joined (datacnt)
  1325. datacnt += outcnt;
  1326. outcnt -= 2;
  1327. }
  1328. dz->segcnt = datacnt/2;
  1329. if(dz->iparam[STUT_JOIN] > dz->segcnt) {
  1330. sprintf(errstr,"Maximum joining of segments (%d) greater than actual number of segments (%d).\n",dz->iparam[STUT_JOIN],dz->segcnt);
  1331. return DATA_ERROR;
  1332. }
  1333. if((dz->parray[0] = (double *)malloc(datacnt * sizeof(double)))==NULL) {
  1334. sprintf(errstr,"INSUFFICIENT MEMORY to create segment-times storage.\n");
  1335. return(MEMORY_ERROR);
  1336. }
  1337. if((dz->lparray = (int **)malloc(2 * sizeof(int *)))==NULL) {
  1338. sprintf(errstr,"INSUFFICIENT MEMORY to create cut-data storage. (1)\n");
  1339. return(MEMORY_ERROR);
  1340. }
  1341. if((dz->lparray[0] = (int *)malloc(dz->segcnt * sizeof(int)))==NULL) {
  1342. sprintf(errstr,"INSUFFICIENT MEMORY to create cut-segs start and end storage.\n");
  1343. return(MEMORY_ERROR);
  1344. }
  1345. if((dz->lparray[1] = (int *)malloc(dz->segcnt * sizeof(int)))==NULL) {
  1346. sprintf(errstr,"INSUFFICIENT MEMORY to create cut-segs length storage.\n");
  1347. return(MEMORY_ERROR);
  1348. }
  1349. gp_startcut = dz->lparray[0];
  1350. outcuts = dz->parray[0]; // e.g. itemcnt = 4
  1351. outcnt = (dz->itemcnt + 1) * 2; // e.g. outcnt = (4+1)*2 = 10
  1352. tot = 0;
  1353. for(k = 0; k < dz->iparam[STUT_JOIN]; k++) {
  1354. outcuts[tot+outcnt-1] = dz->duration; // End cut is always at end of file
  1355. m = dz->itemcnt - 1;
  1356. if(m-k >= 0) {
  1357. for(n=tot+outcnt-2; m >= k; n-=2,m--) {
  1358. outcuts[n] = max(inslice[m-k] - overlap,0.0); // Ensure startcut of each segment-group is NOT before file-start
  1359. outcuts[n-1] = inslice[m] + overlap;
  1360. segdur = outcuts[n+1] - outcuts[n];
  1361. dz->maxseglen = max(dz->maxseglen,segdur);
  1362. dz->minseglen = max(dz->minseglen,segdur);
  1363. }
  1364. }
  1365. outcuts[tot] = 0.0; // Start cut is always at start of file
  1366. segdur = outcuts[tot+1] - outcuts[tot];
  1367. dz->maxseglen = max(dz->maxseglen,segdur);
  1368. dz->minseglen = max(dz->minseglen,segdur);
  1369. tot += outcnt; // Advance to end of previous perm-set written
  1370. outcnt -= 2; // Reduce the number of items to write by 1-pair
  1371. } // (pairs go from A B C D (4) -> AB BC CD (3) -> ABC BCD (2) -> ABCD (1))
  1372. // e.g.
  1373. // orig storage m= 0 1 2 3 dz->itemcnt = 4
  1374. // prog vals A B C D k = 0 (single-segs) initially
  1375. // outcnt = (4+1)*2 = 10 m-k = m-0 = 3, so 7&8 both get D
  1376. // final storage 0 1 2 3 4 5 6 7 8 9
  1377. // final vals 0 A+ -A B+ B- C+ C- D+ D- dur
  1378. // k = 1 (double-segs) initially
  1379. // outcnt = (3+1)*2 = 8 m-k = m-1 = 2 so 6getsC and 5getsD
  1380. // final storage 0 1 2 3 4 5 6 7
  1381. // final vals 0 B+ A- C+ B- D+ C- dur
  1382. // k = 2 (triple-segs) initially
  1383. // outcnt = (2+1)*2 = 6 m-k = m-2 = 1 so 4getsB and 3getsD
  1384. // final storage 0 1 2 3 4 5
  1385. // final vals 0 C+ A- D+ B- dur
  1386. // k = 3 (quad-segs) initially
  1387. // outcnt = (1+1)*2 = 4 m-k = m-3 = 0 so 2getsA and 1getsD
  1388. // final storage 0 1 2 3
  1389. // final vals 0 D+ A- dur
  1390. // k = 4 (5seg = allfile) initially
  1391. // outcnt = (0+1)*2 = 2 m-k = m-4 = -1 so loop is not triggered
  1392. // final storage 0 1
  1393. // final vals 0 dur
  1394. if(dz->minseglen < dz->param[STUT_MINDUR] * MS_TO_SECS) {
  1395. sprintf(errstr,"Smalleset cut segment (%lf mS) is shorter than min duration set (%lf mS)\n",dz->minseglen * SECS_TO_MS,dz->param[STUT_MINDUR]);
  1396. return DATA_ERROR;
  1397. }
  1398. kk = 0;
  1399. for(k = 0; k < dz->iparam[STUT_JOIN]; k++) { // when k = 0, n runs frm -1 to 3 all cuts start at seg-starts + initial cut at 0 i.e. 0 A B C D
  1400. for(n = k-1; n < dz->itemcnt; n++) { // when k = 1, n runs from 0 to 3 all cuts start 1 seg after double-seg-start i.e. A B C D
  1401. if(kk >= datacnt) { // when k = 2, n runs from 1 to 3 all cuts start 2 segs after triple-seg-start i.e. B C D
  1402. sprintf(errstr,"Unexpected array overrun, storing segment-startcut data.\n");
  1403. return PROGRAM_ERROR; // when k = 3, n runs from 2 to 3 all cuts start 3 segs after quad-seg-start i.e. C D
  1404. } // when k = 4, n runs from 3 to 3 only cut start 4 segs after quin-seg-start i.e. D
  1405. if(n < 0) // i.e. with 4 slices there are 5 segments, and this is the entire input file!!
  1406. gp_startcut[kk++] = 0;
  1407. else // This is gp_sample at which cutting can begin in this segment, in absolute gp_samples
  1408. gp_startcut[kk++] = (int)round((inslice[n] - overlap) * srate);
  1409. }
  1410. }
  1411. if(dz->param[STUT_SIL] > 0) { // If silences are to be inserted
  1412. dz->param[STUT_SIL] *= (double)STUT_SILDIV; // establish proportion of silences
  1413. dz->silcnt = (int)round(dz->param[STUT_SIL]); // and set up silence yes-no store
  1414. if((dz->silence = (int *)malloc(STUT_SILDIV * sizeof(int)))==NULL) {
  1415. sprintf(errstr,"Insufficient memory to create silence choice store.\n");
  1416. return(MEMORY_ERROR);
  1417. }
  1418. } else
  1419. dz->silcnt = 0;
  1420. if(dz->brksize[STUT_BIAS]) { // Invert the bias vals entered.
  1421. for(n=0,m=1;n<dz->brksize[STUT_BIAS];n++,m+=2) { // bias (range -1 to 1) becomes pow(10,0,bias) (range .1 to 10)
  1422. dz->brk[STUT_BIAS][m] = -dz->brk[STUT_BIAS][m]; // Biasing done by raising a linear function between 0 and 1 to a power.
  1423. dz->brk[STUT_BIAS][m] = pow(10.0,dz->brk[STUT_BIAS][m]);// So vals <0 (= < 1) produce weighting to LONGER cuts, as curve becomes fast-slow rise
  1424. } // But entered values < 0 are intend to make bias towards SHORTER cuts.
  1425. } else { // Hence we invert the values.
  1426. dz->param[STUT_BIAS] = -dz->param[STUT_BIAS];
  1427. dz->param[STUT_BIAS] = pow(10.0,dz->param[STUT_BIAS]);
  1428. }
  1429. dz->smpsdur = (int)round(dz->param[STUT_DUR] * srate) * chans;// Get total required duration in samples
  1430. return FINISHED;
  1431. }
  1432. /******************************** CREATE_STUTTER_SNDBUFS ********************************/
  1433. int create_stutter_sndbufs(dataptr dz)
  1434. {
  1435. int n, chans = dz->infile->channels;
  1436. int bigbufsize, secsize, framesize = F_SECSIZE * chans;
  1437. double srate = (double)dz->infile->srate;
  1438. dz->buflen = (int)ceil(dz->maxseglen * srate) * chans;
  1439. secsize = dz->buflen/framesize;
  1440. if(secsize * framesize != dz->buflen)
  1441. secsize++;
  1442. dz->buflen = secsize * framesize;
  1443. dz->buflen += chans; // wrap-around point
  1444. bigbufsize = (dz->buflen * dz->bufcnt) * sizeof(float);
  1445. if((dz->bigbuf = (float *)malloc(bigbufsize)) == NULL) {
  1446. sprintf(errstr,"INSUFFICIENT MEMORY to create total sound buffers.\n");
  1447. return(PROGRAM_ERROR);
  1448. }
  1449. dz->sbufptr[0] = dz->sampbuf[0] = dz->bigbuf; // 1 Inbuf for each infile
  1450. for(n=1;n < dz->bufcnt;n++) // 1 untransposed segment buf
  1451. dz->sbufptr[n] = dz->sampbuf[n] = dz->sampbuf[n-1] + dz->buflen; // 1 output buf
  1452. dz->sampbuf[n] = dz->sampbuf[n-1] + dz->buflen;
  1453. return(FINISHED);
  1454. }
  1455. /*************************** RNDPERMM ********************************/
  1456. void rndpermm(int permlen,int *permm)
  1457. {
  1458. int n, t;
  1459. for(n=0;n<permlen;n++) { /* 1 */
  1460. t = (int)(drand48() * (double)(n+1)); /* 2 */
  1461. if(t==n)
  1462. prefix(n,permlen,permm);
  1463. else
  1464. insert(n,t,permlen,permm);
  1465. }
  1466. }
  1467. /***************************** INSERT **********************************
  1468. *
  1469. * Insert the value m AFTER the T-th element in permm[pindex].
  1470. */
  1471. void insert(int m,int t,int permlen,int *permm)
  1472. {
  1473. shuflup(t+1,permlen,permm);
  1474. permm[t+1] = m;
  1475. }
  1476. /***************************** PREFIX ************************************
  1477. *
  1478. * Insert the value m at start of the permutation permm[pindex].
  1479. */
  1480. void prefix(int m,int permlen,int *permm)
  1481. {
  1482. shuflup(0,permlen,permm);
  1483. permm[0] = m;
  1484. }
  1485. /****************************** SHUFLUP ***********************************
  1486. *
  1487. * move set members in permm[pindex] upwards, starting from element k.
  1488. */
  1489. void shuflup(int k,int permlen, int *permm)
  1490. {
  1491. int n, *i;
  1492. int z = permlen - 1;
  1493. i = permm + z;
  1494. for(n = z;n > k;n--) {
  1495. *i = *(i-1);
  1496. i--;
  1497. }
  1498. }
  1499. /****************************** SELECT_SILENCE_INSERTS ***********************************/
  1500. void select_silence_inserts(int *silpermm,dataptr dz)
  1501. {
  1502. int n;
  1503. memset((char *)dz->silence,0,STUT_SILDIV); // Preset all joins to have no silence (silence-off = 0)
  1504. rndpermm(STUT_SILDIV,silpermm); // Permute order of joins
  1505. for(n=0;n < dz->silcnt;n++) // Set 1st "silcnt" items of perm to silence-on (=1)
  1506. dz->silence[silpermm[n]] = 1;
  1507. }
  1508. /****************************** GET_SEGNO ***********************************/
  1509. int get_segno(int *segs_outcnt,int *permm,dataptr dz)
  1510. {
  1511. int segno;
  1512. if(dz->vflag[STUT_PERM]) {
  1513. if(*segs_outcnt >= dz->segcnt) {
  1514. rndpermm(dz->segcnt,permm); // Permute order of segments
  1515. *segs_outcnt = 0;
  1516. }
  1517. segno = permm[*segs_outcnt];
  1518. } else // segno entirely random
  1519. segno = (int)floor(drand48() * dz->segcnt);
  1520. (*segs_outcnt)++;
  1521. return segno;
  1522. }
  1523. /****************************** INSERT_SILENCE ***********************************/
  1524. int insert_silence(float *obuf,double *time,int *obufpos,dataptr dz)
  1525. {
  1526. int exit_status, chans = dz->infile->channels;
  1527. int silsmps, endsmp, overrun;
  1528. double srate = (double)dz->infile->srate;
  1529. double silrange = dz->param[STUT_SILMAX] - dz->param[STUT_SILMIN];
  1530. silsmps = (int)round(drand48() * silrange * srate) * chans; // Generate random duration silence within specified ranges
  1531. *obufpos += silsmps;
  1532. endsmp = dz->total_samps_written + *obufpos; // Calc where this will write to, in absolute samples
  1533. if((overrun = endsmp - dz->smpsdur) > 0) // Check if this overruns required duration
  1534. *obufpos -= overrun; // and if it does, reduce the quantity of silence to write
  1535. while(*obufpos >= dz->buflen) {
  1536. if((exit_status = write_samps(obuf,dz->buflen,dz))<0) // If obuf overflows
  1537. return exit_status; // Write buffer-full of sound+silence or silence
  1538. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1539. *obufpos -= dz->buflen; // and reset obuf pointer
  1540. } // Then recalc endtime
  1541. *time = (double)((dz->total_samps_written + *obufpos)/chans)/srate;
  1542. return FINISHED;
  1543. }