flutter.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443
  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 <float.h>
  24. #include <structures.h>
  25. #include <tkglobals.h>
  26. #include <pnames.h>
  27. #include <filetype.h>
  28. #include <processno.h>
  29. #include <modeno.h>
  30. #include <logic.h>
  31. #include <globcon.h>
  32. #include <cdpmain.h>
  33. #include <math.h>
  34. #include <mixxcon.h>
  35. #include <osbind.h>
  36. #include <standalone.h>
  37. #include <ctype.h>
  38. #include <sfsys.h>
  39. #include <string.h>
  40. #include <srates.h>
  41. #include <modicon.h>
  42. #include <txtucon.h>
  43. #if defined unix || defined __GNUC__
  44. #define round(x) lround((x))
  45. #endif
  46. #ifndef HUGE
  47. #define HUGE 3.40282347e+38F
  48. #endif
  49. char errstr[2400];
  50. int anal_infiles = 1;
  51. int sloom = 0;
  52. int sloombatch = 0;
  53. const char* cdp_version = "7.1.0";
  54. //CDP LIB REPLACEMENTS
  55. static int setup_flutter_application(dataptr dz);
  56. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  57. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  58. static int setup_flutter_param_ranges_and_defaults(dataptr dz);
  59. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  60. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  61. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  62. static int establish_application(dataptr dz);
  63. static int initialise_vflags(dataptr dz);
  64. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  65. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  66. static int mark_parameter_types(dataptr dz,aplptr ap);
  67. static int assign_file_data_storage(int infilecnt,dataptr dz);
  68. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  69. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  70. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  71. static int allocate_flutter_buffer(dataptr dz);
  72. //static void mchan_pancalc(double position,double *leftgain,double *rightgain,double *farleftgain,double *farrightgain,int *leftchan,int pantype,dataptr dz);
  73. //static int newposition(int *brkindex,double *position,double *posincr,int *total_sams,int *true_goalchan,int *pantype,dataptr dz);
  74. static int read_flutter_data(char *filename,dataptr dz);
  75. static int check_flutter_param_validity_and_consistency(dataptr dz);
  76. static void cyclicperm(int chansetcnt,int lastchanset,int **perm);
  77. static void hinsert(int m,int t,int *perm,int permlen);
  78. static void hprefix(int m,int *perm,int permlen);
  79. static void hshuflup(int k,int *perm,int permlen);
  80. static int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  81. static int flutter(dataptr dz);
  82. #define FLUTTER_TABSIZE 1024
  83. #define FLFRQ 0
  84. #define FLDEPTH 1
  85. /* GENERAL SCHEMA FOR FLUTTER
  86. *
  87. * The flutter frq and depth are set by the frq and depth params, as with tremolo
  88. * At each moment the overall level is set to (1.0 - depth)
  89. * The loudness-varying table contains a cosine-wave starting at 180 (i.e. at min v and ranges 0 to 1
  90. * For a complete cycle, the amplitude of the selected channels increase by (depth * cosval)
  91. * After one cycle we change to the next set of channels, and proceed as before.
  92. * Sequence of channels may be cyclic, or (no-repets) random-cycles of the channel-sets specified.
  93. * (Could also be changing sets, but that's too complex for the moment).
  94. *
  95. * Channel sets are specified by e.g. 1234-5678 or 12-34-56-78 or 13-246-57-8 or 123-123-4-135-168
  96. * i.e. anything you like !!
  97. * (These could vary opver time, but not for the moment!!)
  98. *
  99. * What happens at frq 0, while frq = 0, everything gets level (1.0 - depth)
  100. *
  101. */
  102. /**************************************** MAIN *********************************************/
  103. int main(int argc,char *argv[]) // THIS ALL NEEDS TO BE FIXED !!! */
  104. {
  105. int exit_status;
  106. dataptr dz = NULL;
  107. char **cmdline;
  108. int cmdlinecnt;
  109. int n;
  110. //aplptr ap;
  111. int is_launched = FALSE;
  112. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  113. fprintf(stdout,"%s\n",cdp_version);
  114. fflush(stdout);
  115. return 0;
  116. }
  117. /* CHECK FOR SOUNDLOOM */
  118. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  119. sloom = 0;
  120. sloombatch = 1;
  121. }
  122. if(sflinit("cdp")){
  123. sfperror("cdp: initialisation\n");
  124. return(FAILED);
  125. }
  126. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  127. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  128. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  129. return(FAILED);
  130. }
  131. if(!sloom) {
  132. if(argc == 1) {
  133. usage1();
  134. return(FAILED);
  135. } else if(argc == 2) {
  136. usage2(argv[1]);
  137. return(FAILED);
  138. }
  139. }
  140. dz->maxmode = 2;
  141. if(!sloom) {
  142. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  143. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  144. return(FAILED);
  145. }
  146. cmdline = argv;
  147. cmdlinecnt = argc;
  148. if((get_the_process_no(argv[0],dz))<0)
  149. return(FAILED);
  150. cmdline++;
  151. cmdlinecnt--;
  152. // setup_particular_application =
  153. if((exit_status = setup_flutter_application(dz))<0) {
  154. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  155. return(FAILED);
  156. }
  157. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  158. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  159. return(FAILED);
  160. }
  161. } else {
  162. //parse_TK_data() =
  163. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  164. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  165. return(exit_status);
  166. }
  167. }
  168. //ap = dz->application;
  169. // parse_infile_and_hone_type() =
  170. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  171. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  172. return(FAILED);
  173. }
  174. // setup_param_ranges_and_defaults() =
  175. if((exit_status = setup_flutter_param_ranges_and_defaults(dz))<0) {
  176. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(FAILED);
  178. }
  179. // open_first_infile CDP LIB
  180. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  181. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  182. return(FAILED);
  183. }
  184. cmdlinecnt--;
  185. cmdline++;
  186. // handle_extra_infiles() : redundant
  187. // handle_outfile() =
  188. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  189. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  190. return(FAILED);
  191. }
  192. // handle_formants() redundant
  193. // handle_formant_quiksearch() redundant
  194. // handle_special_data() .....,
  195. if((exit_status = handle_the_special_data(&cmdlinecnt,&cmdline,dz))<0) {
  196. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  197. return(FAILED);
  198. }
  199. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  200. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  201. return(FAILED);
  202. }
  203. // check_param_validity_and_consistency .....
  204. if((exit_status = check_flutter_param_validity_and_consistency(dz))<0) {
  205. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  206. return(FAILED);
  207. }
  208. is_launched = TRUE;
  209. dz->bufcnt = 1;
  210. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  211. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  212. return(MEMORY_ERROR);
  213. }
  214. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  215. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  216. return(MEMORY_ERROR);
  217. }
  218. for(n = 0;n <dz->bufcnt; n++)
  219. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  220. dz->sampbuf[n] = (float *)0;
  221. if((exit_status = allocate_flutter_buffer(dz))<0) {
  222. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  223. return(FAILED);
  224. }
  225. //param_preprocess() redundant
  226. //groucho_process_file =
  227. if((exit_status = flutter(dz))<0) {
  228. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  229. return(FAILED);
  230. }
  231. if((exit_status = complete_output(dz))<0) { // CDP LIB
  232. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  233. return(FAILED);
  234. }
  235. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  236. free(dz);
  237. return(SUCCEEDED);
  238. }
  239. /**********************************************
  240. REPLACED CDP LIB FUNCTIONS
  241. **********************************************/
  242. /****************************** SET_PARAM_DATA *********************************/
  243. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  244. {
  245. ap->special_data = (char)special_data;
  246. ap->param_cnt = (char)paramcnt;
  247. ap->max_param_cnt = (char)maxparamcnt;
  248. if(ap->max_param_cnt>0) {
  249. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  250. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  251. return(MEMORY_ERROR);
  252. }
  253. strcpy(ap->param_list,paramlist);
  254. }
  255. return(FINISHED);
  256. }
  257. /****************************** SET_VFLGS *********************************/
  258. int set_vflgs
  259. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  260. {
  261. ap->option_cnt = (char) optcnt; /*RWD added cast */
  262. if(optcnt) {
  263. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  264. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  265. return(MEMORY_ERROR);
  266. }
  267. strcpy(ap->option_list,optlist);
  268. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  269. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  270. return(MEMORY_ERROR);
  271. }
  272. strcpy(ap->option_flags,optflags);
  273. }
  274. ap->vflag_cnt = (char) vflagcnt;
  275. ap->variant_param_cnt = (char) vparamcnt;
  276. if(vflagcnt) {
  277. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  278. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  279. return(MEMORY_ERROR);
  280. }
  281. strcpy(ap->variant_list,varlist);
  282. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  283. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  284. return(MEMORY_ERROR);
  285. }
  286. strcpy(ap->variant_flags,varflags);
  287. }
  288. return(FINISHED);
  289. }
  290. /***************************** APPLICATION_INIT **************************/
  291. int application_init(dataptr dz)
  292. {
  293. int exit_status;
  294. int storage_cnt;
  295. int tipc, brkcnt;
  296. aplptr ap = dz->application;
  297. if(ap->vflag_cnt>0)
  298. initialise_vflags(dz);
  299. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  300. ap->total_input_param_cnt = (char)tipc;
  301. if(tipc>0) {
  302. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  303. return(exit_status);
  304. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  305. return(exit_status);
  306. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  307. return(exit_status);
  308. }
  309. brkcnt = tipc;
  310. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  311. if(brkcnt>0) {
  312. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  313. return(exit_status);
  314. }
  315. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  316. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  317. return(exit_status);
  318. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  319. return(exit_status);
  320. }
  321. if((exit_status = mark_parameter_types(dz,ap))<0)
  322. return(exit_status);
  323. // establish_infile_constants() replaced by
  324. // dz->infilecnt = 1;
  325. if(dz->mode != 7) {
  326. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
  327. return(exit_status);
  328. }
  329. //establish_bufptrs_and_extra_buffers():
  330. return(FINISHED);
  331. }
  332. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  333. /* RWD mallo changed to calloc; helps debug verison run as release! */
  334. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  335. {
  336. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  337. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  338. return(MEMORY_ERROR);
  339. }
  340. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  341. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  342. return(MEMORY_ERROR);
  343. }
  344. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  345. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  346. return(MEMORY_ERROR);
  347. }
  348. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  349. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  350. return(MEMORY_ERROR);
  351. }
  352. return(FINISHED);
  353. }
  354. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  355. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  356. {
  357. int n;
  358. for(n=0;n<storage_cnt;n++) {
  359. dz->is_int[n] = (char)0;
  360. dz->no_brk[n] = (char)0;
  361. }
  362. return(FINISHED);
  363. }
  364. /***************************** MARK_PARAMETER_TYPES **************************/
  365. int mark_parameter_types(dataptr dz,aplptr ap)
  366. {
  367. int n, m; /* PARAMS */
  368. for(n=0;n<ap->max_param_cnt;n++) {
  369. switch(ap->param_list[n]) {
  370. case('0'): break; /* dz->is_active[n] = 0 is default */
  371. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  372. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  373. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  374. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  375. default:
  376. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  377. return(PROGRAM_ERROR);
  378. }
  379. } /* OPTIONS */
  380. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  381. switch(ap->option_list[n]) {
  382. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  383. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  384. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  385. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  386. default:
  387. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  388. return(PROGRAM_ERROR);
  389. }
  390. } /* VARIANTS */
  391. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  392. switch(ap->variant_list[n]) {
  393. case('0'): break;
  394. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  395. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  396. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  397. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  398. default:
  399. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  400. return(PROGRAM_ERROR);
  401. }
  402. } /* INTERNAL */
  403. for(n=0,
  404. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  405. switch(ap->internal_param_list[n]) {
  406. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  407. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  408. case('d'): dz->no_brk[m] = (char)1; break;
  409. default:
  410. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  411. return(PROGRAM_ERROR);
  412. }
  413. }
  414. return(FINISHED);
  415. }
  416. /************************ HANDLE_THE_OUTFILE *********************/
  417. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  418. {
  419. int exit_status;
  420. char *filename = (*cmdline)[0];
  421. if(filename[0]=='-' && filename[1]=='f') {
  422. dz->floatsam_output = 1;
  423. dz->true_outfile_stype = SAMP_FLOAT;
  424. filename+= 2;
  425. }
  426. if(!sloom) {
  427. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  428. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  429. return(DATA_ERROR);
  430. }
  431. }
  432. if((dz->outfilename = (char *)malloc(strlen(filename) + 1))==NULL) {
  433. sprintf(errstr,"No memory to store output filename.\n");
  434. return(DATA_ERROR);
  435. }
  436. strcpy(dz->outfilename,filename);
  437. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  438. return(exit_status);
  439. (*cmdline)++;
  440. (*cmdlinecnt)--;
  441. return(FINISHED);
  442. }
  443. /************************ HANDLE_THE_SPECIAL_DATA *********************/
  444. int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  445. {
  446. int exit_status;
  447. if(!sloom) {
  448. if(*cmdlinecnt <= 0) {
  449. sprintf(errstr,"Insufficient parameters on command line.\n");
  450. return(USAGE_ONLY);
  451. }
  452. }
  453. if((exit_status = read_flutter_data((*cmdline)[0],dz))<0)
  454. return(exit_status);
  455. (*cmdline)++;
  456. (*cmdlinecnt)--;
  457. return(FINISHED);
  458. }
  459. /***************************** ESTABLISH_APPLICATION **************************/
  460. int establish_application(dataptr dz)
  461. {
  462. aplptr ap;
  463. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  464. sprintf(errstr,"establish_application()\n");
  465. return(MEMORY_ERROR);
  466. }
  467. ap = dz->application;
  468. memset((char *)ap,0,sizeof(struct applic));
  469. return(FINISHED);
  470. }
  471. /************************* INITIALISE_VFLAGS *************************/
  472. int initialise_vflags(dataptr dz)
  473. {
  474. int n;
  475. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  476. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  477. return(MEMORY_ERROR);
  478. }
  479. for(n=0;n<dz->application->vflag_cnt;n++)
  480. dz->vflag[n] = FALSE;
  481. return FINISHED;
  482. }
  483. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  484. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  485. {
  486. int n;
  487. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  488. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  489. return(MEMORY_ERROR);
  490. }
  491. for(n=0;n<tipc;n++)
  492. ap->default_val[n] = 0.0;
  493. return(FINISHED);
  494. }
  495. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  496. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  497. {
  498. int n;
  499. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  500. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  501. return(MEMORY_ERROR);
  502. }
  503. for(n=0;n<tipc;n++)
  504. dz->is_active[n] = (char)0;
  505. return(FINISHED);
  506. }
  507. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  508. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  509. {
  510. int exit_status;
  511. infileptr infile_info;
  512. if(!sloom) {
  513. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  514. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  515. return(MEMORY_ERROR);
  516. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  517. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  518. return(PROGRAM_ERROR);
  519. } else if(infile_info->filetype != SNDFILE) {
  520. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  521. return(DATA_ERROR);
  522. }
  523. switch(dz->mode) {
  524. case(0):
  525. case(1):
  526. case(2):
  527. if(infile_info->channels != 1) {
  528. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  529. return(DATA_ERROR);
  530. }
  531. break;
  532. case(3):
  533. if(infile_info->channels > 2) {
  534. sprintf(errstr,"File %s is not of correct type (must be mono or stereo)\n",cmdline[0]);
  535. return(DATA_ERROR);
  536. }
  537. break;
  538. case(6):
  539. case(7):
  540. if(infile_info->channels < 2) {
  541. sprintf(errstr,"File %s is not of correct type (cannot be mono)\n",cmdline[0]);
  542. return(DATA_ERROR);
  543. }
  544. break;
  545. }
  546. if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  547. sprintf(errstr,"Failed to copy file parsing information\n");
  548. return(PROGRAM_ERROR);
  549. }
  550. free(infile_info);
  551. }
  552. return(FINISHED);
  553. }
  554. /********************************* PARSE_SLOOM_DATA *********************************/
  555. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  556. {
  557. int exit_status;
  558. int cnt = 1, infilecnt;
  559. int filesize, insams, inbrksize;
  560. double dummy;
  561. int true_cnt = 0;
  562. //aplptr ap;
  563. while(cnt<=PRE_CMDLINE_DATACNT) {
  564. if(cnt > argc) {
  565. sprintf(errstr,"Insufficient data sent from TK\n");
  566. return(DATA_ERROR);
  567. }
  568. switch(cnt) {
  569. case(1):
  570. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  571. sprintf(errstr,"Cannot read process no. sent from TK\n");
  572. return(DATA_ERROR);
  573. }
  574. break;
  575. case(2):
  576. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  577. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  578. return(DATA_ERROR);
  579. }
  580. if(dz->mode > 0)
  581. dz->mode--;
  582. //setup_particular_application() =
  583. if((exit_status = setup_flutter_application(dz))<0)
  584. return(exit_status);
  585. //ap = dz->application;
  586. break;
  587. case(3):
  588. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  589. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  590. return(DATA_ERROR);
  591. }
  592. if(infilecnt < 1) {
  593. true_cnt = cnt + 1;
  594. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  595. }
  596. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  597. return(exit_status);
  598. break;
  599. case(INPUT_FILETYPE+4):
  600. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  601. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  602. return(DATA_ERROR);
  603. }
  604. break;
  605. case(INPUT_FILESIZE+4):
  606. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  607. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  608. return(DATA_ERROR);
  609. }
  610. dz->insams[0] = filesize;
  611. break;
  612. case(INPUT_INSAMS+4):
  613. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  614. sprintf(errstr,"Cannot read insams sent from TK\n");
  615. return(DATA_ERROR);
  616. }
  617. dz->insams[0] = insams;
  618. break;
  619. case(INPUT_SRATE+4):
  620. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  621. sprintf(errstr,"Cannot read srate sent from TK\n");
  622. return(DATA_ERROR);
  623. }
  624. break;
  625. case(INPUT_CHANNELS+4):
  626. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  627. sprintf(errstr,"Cannot read channels sent from TK\n");
  628. return(DATA_ERROR);
  629. }
  630. break;
  631. case(INPUT_STYPE+4):
  632. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  633. sprintf(errstr,"Cannot read stype sent from TK\n");
  634. return(DATA_ERROR);
  635. }
  636. break;
  637. case(INPUT_ORIGSTYPE+4):
  638. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  639. sprintf(errstr,"Cannot read origstype sent from TK\n");
  640. return(DATA_ERROR);
  641. }
  642. break;
  643. case(INPUT_ORIGRATE+4):
  644. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  645. sprintf(errstr,"Cannot read origrate sent from TK\n");
  646. return(DATA_ERROR);
  647. }
  648. break;
  649. case(INPUT_MLEN+4):
  650. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  651. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  652. return(DATA_ERROR);
  653. }
  654. break;
  655. case(INPUT_DFAC+4):
  656. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  657. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  658. return(DATA_ERROR);
  659. }
  660. break;
  661. case(INPUT_ORIGCHANS+4):
  662. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  663. sprintf(errstr,"Cannot read origchans sent from TK\n");
  664. return(DATA_ERROR);
  665. }
  666. break;
  667. case(INPUT_SPECENVCNT+4):
  668. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  669. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  670. return(DATA_ERROR);
  671. }
  672. dz->specenvcnt = dz->infile->specenvcnt;
  673. break;
  674. case(INPUT_WANTED+4):
  675. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  676. sprintf(errstr,"Cannot read wanted sent from TK\n");
  677. return(DATA_ERROR);
  678. }
  679. break;
  680. case(INPUT_WLENGTH+4):
  681. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  682. sprintf(errstr,"Cannot read wlength sent from TK\n");
  683. return(DATA_ERROR);
  684. }
  685. break;
  686. case(INPUT_OUT_CHANS+4):
  687. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  688. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  689. return(DATA_ERROR);
  690. }
  691. break;
  692. /* RWD these chanegs to samps - tk will have to deal with that! */
  693. case(INPUT_DESCRIPTOR_BYTES+4):
  694. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  695. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  696. return(DATA_ERROR);
  697. }
  698. break;
  699. case(INPUT_IS_TRANSPOS+4):
  700. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  701. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  702. return(DATA_ERROR);
  703. }
  704. break;
  705. case(INPUT_COULD_BE_TRANSPOS+4):
  706. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  707. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  708. return(DATA_ERROR);
  709. }
  710. break;
  711. case(INPUT_COULD_BE_PITCH+4):
  712. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  713. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  714. return(DATA_ERROR);
  715. }
  716. break;
  717. case(INPUT_DIFFERENT_SRATES+4):
  718. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  719. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  720. return(DATA_ERROR);
  721. }
  722. break;
  723. case(INPUT_DUPLICATE_SNDS+4):
  724. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  725. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  726. return(DATA_ERROR);
  727. }
  728. break;
  729. case(INPUT_BRKSIZE+4):
  730. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  731. sprintf(errstr,"Cannot read brksize sent from TK\n");
  732. return(DATA_ERROR);
  733. }
  734. if(inbrksize > 0) {
  735. switch(dz->input_data_type) {
  736. case(WORDLIST_ONLY):
  737. break;
  738. case(PITCH_AND_PITCH):
  739. case(PITCH_AND_TRANSPOS):
  740. case(TRANSPOS_AND_TRANSPOS):
  741. dz->tempsize = inbrksize;
  742. break;
  743. case(BRKFILES_ONLY):
  744. case(UNRANGED_BRKFILE_ONLY):
  745. case(DB_BRKFILES_ONLY):
  746. case(ALL_FILES):
  747. case(ANY_NUMBER_OF_ANY_FILES):
  748. if(dz->extrabrkno < 0) {
  749. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  750. return(DATA_ERROR);
  751. }
  752. if(dz->brksize == NULL) {
  753. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  754. return(PROGRAM_ERROR);
  755. }
  756. dz->brksize[dz->extrabrkno] = inbrksize;
  757. break;
  758. default:
  759. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  760. dz->input_data_type);
  761. return(PROGRAM_ERROR);
  762. }
  763. break;
  764. }
  765. break;
  766. case(INPUT_NUMSIZE+4):
  767. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  768. sprintf(errstr,"Cannot read numsize sent from TK\n");
  769. return(DATA_ERROR);
  770. }
  771. break;
  772. case(INPUT_LINECNT+4):
  773. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  774. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  775. return(DATA_ERROR);
  776. }
  777. break;
  778. case(INPUT_ALL_WORDS+4):
  779. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  780. sprintf(errstr,"Cannot read all_words sent from TK\n");
  781. return(DATA_ERROR);
  782. }
  783. break;
  784. case(INPUT_ARATE+4):
  785. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  786. sprintf(errstr,"Cannot read arate sent from TK\n");
  787. return(DATA_ERROR);
  788. }
  789. break;
  790. case(INPUT_FRAMETIME+4):
  791. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  792. sprintf(errstr,"Cannot read frametime sent from TK\n");
  793. return(DATA_ERROR);
  794. }
  795. dz->frametime = (float)dummy;
  796. break;
  797. case(INPUT_WINDOW_SIZE+4):
  798. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  799. sprintf(errstr,"Cannot read window_size sent from TK\n");
  800. return(DATA_ERROR);
  801. }
  802. break;
  803. case(INPUT_NYQUIST+4):
  804. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  805. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  806. return(DATA_ERROR);
  807. }
  808. break;
  809. case(INPUT_DURATION+4):
  810. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  811. sprintf(errstr,"Cannot read duration sent from TK\n");
  812. return(DATA_ERROR);
  813. }
  814. break;
  815. case(INPUT_MINBRK+4):
  816. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  817. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  818. return(DATA_ERROR);
  819. }
  820. break;
  821. case(INPUT_MAXBRK+4):
  822. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  823. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  824. return(DATA_ERROR);
  825. }
  826. break;
  827. case(INPUT_MINNUM+4):
  828. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  829. sprintf(errstr,"Cannot read minnum sent from TK\n");
  830. return(DATA_ERROR);
  831. }
  832. break;
  833. case(INPUT_MAXNUM+4):
  834. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  835. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  836. return(DATA_ERROR);
  837. }
  838. break;
  839. default:
  840. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  841. return(PROGRAM_ERROR);
  842. }
  843. cnt++;
  844. }
  845. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  846. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  847. return(DATA_ERROR);
  848. }
  849. if(true_cnt)
  850. cnt = true_cnt;
  851. *cmdlinecnt = 0;
  852. while(cnt < argc) {
  853. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  854. return(exit_status);
  855. cnt++;
  856. }
  857. return(FINISHED);
  858. }
  859. /********************************* GET_TK_CMDLINE_WORD *********************************/
  860. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  861. {
  862. if(*cmdlinecnt==0) {
  863. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  864. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  865. return(MEMORY_ERROR);
  866. }
  867. } else {
  868. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  869. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  870. return(MEMORY_ERROR);
  871. }
  872. }
  873. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  874. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  875. return(MEMORY_ERROR);
  876. }
  877. strcpy((*cmdline)[*cmdlinecnt],q);
  878. (*cmdlinecnt)++;
  879. return(FINISHED);
  880. }
  881. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  882. int assign_file_data_storage(int infilecnt,dataptr dz)
  883. {
  884. int exit_status;
  885. int no_sndfile_system_files = FALSE;
  886. dz->infilecnt = infilecnt;
  887. if((exit_status = allocate_filespace(dz))<0)
  888. return(exit_status);
  889. if(no_sndfile_system_files)
  890. dz->infilecnt = 0;
  891. return(FINISHED);
  892. }
  893. /************************* redundant functions: to ensure libs compile OK *******************/
  894. int assign_process_logic(dataptr dz)
  895. {
  896. return(FINISHED);
  897. }
  898. void set_legal_infile_structure(dataptr dz)
  899. {}
  900. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  901. {
  902. return(FINISHED);
  903. }
  904. int establish_bufptrs_and_extra_buffers(dataptr dz)
  905. {
  906. return(FINISHED);
  907. }
  908. int read_special_data(char *str,dataptr dz)
  909. {
  910. return(FINISHED);
  911. }
  912. int inner_loop
  913. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  914. {
  915. return(FINISHED);
  916. }
  917. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  918. {
  919. return(FINISHED);
  920. }
  921. /************************* SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS *******************/
  922. int setup_internal_arrays_and_array_pointers(dataptr dz)
  923. {
  924. dz->array_cnt = 1;
  925. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  926. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  927. return(MEMORY_ERROR);
  928. }
  929. dz->parray[0] = NULL;
  930. dz->larray_cnt = 3;
  931. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  932. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  933. return(MEMORY_ERROR);
  934. }
  935. dz->lparray[0] = NULL;
  936. dz->lparray[1] = NULL;
  937. dz->lparray[2] = NULL;
  938. return(FINISHED);
  939. }
  940. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  941. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  942. {
  943. int n;
  944. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  945. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  946. return(MEMORY_ERROR);
  947. }
  948. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  949. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  950. return(MEMORY_ERROR);
  951. }
  952. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  953. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  954. return(MEMORY_ERROR);
  955. }
  956. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  957. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  958. return(MEMORY_ERROR);
  959. }
  960. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  961. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  962. return(MEMORY_ERROR);
  963. }
  964. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  965. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  966. return(MEMORY_ERROR);
  967. }
  968. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  969. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  970. return(MEMORY_ERROR);
  971. }
  972. for(n=0;n<brkcnt;n++) {
  973. dz->brk[n] = NULL;
  974. dz->brkptr[n] = NULL;
  975. dz->brkinit[n] = 0;
  976. dz->brksize[n] = 0;
  977. }
  978. return(FINISHED);
  979. }
  980. /******************************** USAGE1 ********************************/
  981. int usage1(void)
  982. {
  983. usage2("flutter");
  984. return(USAGE_ONLY);
  985. }
  986. /******************************** USAGE2 ********************************/
  987. int usage2(char *str)
  988. {
  989. if(!strcmp(str,"flutter")) {
  990. fprintf(stderr,
  991. "USAGE: flutter flutter inf outf chanseq freq depth gain [-r]\n"
  992. "\n"
  993. "Distribute a loudness tremulation around a multichannel output\n"
  994. "CHANSEQ is a textfile containing a list of \"chansets\".\n"
  995. " A \"chanset\" is a list of any of the channels in the input file.\n"
  996. " Level of every chan in 1st chanset varies for 1 cycle of flutter frq,\n"
  997. " then level of every chan in 2nd chanset varies for next cycle, etc.\n"
  998. " around the sequence of chansets.\n"
  999. " When end of chansets list is reached, begins again at start.\n"
  1000. " (but see '-r' flag).\n"
  1001. "FREQ Frequency (in Hz) of the loudness variation (tremulation).\n"
  1002. "DEPTH Depth (0-16) of the loudness variation.\n"
  1003. " As values approach 1, loudness troughs approach zero.\n"
  1004. " Values > 1 produce narrower peaks in the tremulation.\n"
  1005. "GAIN Overall gain (0-1) of the loudness variation.\n"
  1006. "\n"
  1007. "Both Freq and Depth may vary over time.\n"
  1008. "\n"
  1009. "-r Randomisation of chanset order.\n"
  1010. " Once all the chansets have been used,\n"
  1011. " their order is randomly permuted before they are used again,\n"
  1012. " and once all have been used a 2nd time,\n"
  1013. " their order is permuted again, and so on.\n"
  1014. "\n");
  1015. } else
  1016. fprintf(stderr,"Unknown option '%s'\n",str);
  1017. return(USAGE_ONLY);
  1018. }
  1019. int usage3(char *str1,char *str2)
  1020. {
  1021. fprintf(stderr,"Insufficient parameters on command line.\n");
  1022. return(USAGE_ONLY);
  1023. }
  1024. /********************************************************************************************/
  1025. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1026. {
  1027. if(!strcmp(prog_identifier_from_cmdline,"flutter")) {
  1028. dz->process = FLUTTER;
  1029. } else {
  1030. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1031. return(USAGE_ONLY);
  1032. }
  1033. return(FINISHED);
  1034. }
  1035. /************************************ READ_FLUTTER_DATA ************************************/
  1036. int read_flutter_data(char *filename,dataptr dz)
  1037. {
  1038. double dummy;
  1039. int n;
  1040. int ival, cnt, linecnt, localcnt, isum;
  1041. char temp[200], *q;
  1042. FILE *fp;
  1043. if((fp = fopen(filename,"r"))==NULL) {
  1044. sprintf(errstr, "Can't open file %s to read data.\n",filename);
  1045. return(DATA_ERROR);
  1046. }
  1047. cnt = 0;
  1048. linecnt = 0;
  1049. while(fgets(temp,200,fp)==temp) {
  1050. q = temp;
  1051. while(get_float_from_within_string(&q,&dummy)) {
  1052. cnt++;
  1053. }
  1054. linecnt++;
  1055. }
  1056. if(cnt == 0) {
  1057. sprintf(errstr,"No data in file %s\n",filename);
  1058. return(DATA_ERROR);
  1059. }
  1060. if((dz->lparray[0] = (int *)malloc(cnt * sizeof(int)))==NULL) {
  1061. sprintf(errstr,"INSUFFICIENT MEMORY for data in file %s.\n",filename);
  1062. return(MEMORY_ERROR);
  1063. }
  1064. if((dz->lparray[1] = (int *)malloc(linecnt * sizeof(int)))==NULL) {
  1065. sprintf(errstr,"INSUFFICIENT MEMORY for counts of datasets in file %s.\n",filename);
  1066. return(MEMORY_ERROR);
  1067. }
  1068. if((dz->lparray[2] = (int *)malloc(linecnt * sizeof(int)))==NULL) {
  1069. sprintf(errstr,"INSUFFICIENT MEMORY for counts of datasets in file %s.\n",filename);
  1070. return(MEMORY_ERROR);
  1071. }
  1072. dz->itemcnt = linecnt; // Count of the chansets
  1073. rewind(fp);
  1074. cnt = 0;
  1075. linecnt = 0;
  1076. while(fgets(temp,200,fp)==temp) {
  1077. q = temp;
  1078. localcnt = 0;
  1079. while(get_float_from_within_string(&q,&dummy)) {
  1080. ival = (int)round(dummy);
  1081. if(ival < 1 || ival > dz->infile->channels) {
  1082. sprintf(errstr,"Invalid channel number (%d) (range 1 - %d) in line %d\n",ival,dz->infile->channels,linecnt+1);
  1083. return(DATA_ERROR);
  1084. }
  1085. dz->lparray[0][cnt] = ival - 1; // Channels numbered internally from 0 to N-1
  1086. cnt++;
  1087. localcnt++;
  1088. }
  1089. dz->lparray[1][linecnt] = localcnt; // Counts of the channels with each chanset, allows us to read
  1090. linecnt++;
  1091. }
  1092. if(fclose(fp)<0) {
  1093. fprintf(stdout,"WARNING: Failed to close file %s.\n",filename);
  1094. fflush(stdout);
  1095. }
  1096. isum = 0;
  1097. for(n = 0; n < dz->itemcnt;n++) { // Calculate index in lparray[0] where ewach cnaset starts
  1098. dz->lparray[2][n] = isum;
  1099. isum += dz->lparray[1][n];
  1100. }
  1101. return(FINISHED);
  1102. }
  1103. /************************* SETUP_FLUTTER_APPLICATION *******************/
  1104. int setup_flutter_application(dataptr dz)
  1105. {
  1106. int exit_status;
  1107. aplptr ap;
  1108. if((exit_status = establish_application(dz))<0) // GLOBAL
  1109. return(FAILED);
  1110. ap = dz->application;
  1111. // SEE parstruct FOR EXPLANATION of next 2 functions
  1112. if((exit_status = set_param_data(ap,FLUTTERDATA,3,3,"DDd"))<0)
  1113. return(FAILED);
  1114. if((exit_status = set_vflgs(ap,"",0,"","r",1,0,"0"))<0)
  1115. return(FAILED);
  1116. // set_legal_infile_structure -->
  1117. dz->has_otherfile = FALSE;
  1118. // assign_process_logic -->
  1119. dz->input_data_type = SNDFILES_ONLY;
  1120. dz->process_type = EQUAL_SNDFILE;
  1121. dz->outfiletype = SNDFILE_OUT;
  1122. return application_init(dz); //GLOBAL
  1123. }
  1124. /************************* SETUP_FLUTTER_PARAM_RANGES_AND_DEFAULTS *******************/
  1125. int setup_flutter_param_ranges_and_defaults(dataptr dz)
  1126. {
  1127. int exit_status;
  1128. aplptr ap = dz->application;
  1129. // set_param_ranges()
  1130. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  1131. // NB total_input_param_cnt is > 0 !!!
  1132. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  1133. return(FAILED);
  1134. // get_param_ranges()
  1135. ap->lo[VIB_FRQ] = 0.0;
  1136. ap->hi[VIB_FRQ] = MAX_VIB_FRQ;
  1137. ap->default_val[VIB_FRQ] = DEFAULT_VIB_FRQ;
  1138. ap->lo[VIB_DEPTH] = 0.0;
  1139. ap->hi[VIB_DEPTH] = 16.0;
  1140. ap->default_val[VIB_DEPTH] = 1.0;
  1141. ap->lo[2] = 0.0;
  1142. ap->hi[2] = 10.0;
  1143. ap->default_val[2] = 1.0;
  1144. if(!sloom)
  1145. put_default_vals_in_all_params(dz);
  1146. return(FINISHED);
  1147. }
  1148. /**************************** ALLOCATE_FLUTTER_BUFFER ******************************/
  1149. int allocate_flutter_buffer(dataptr dz)
  1150. {
  1151. int n, m;
  1152. size_t bigbufsize;
  1153. int framesize = dz->infile->channels * sizeof(float);
  1154. if(dz->sbufptr == 0 || dz->sampbuf==0) {
  1155. sprintf(errstr,"buffer pointers not allocated: create_sndbufs()\n");
  1156. return(PROGRAM_ERROR);
  1157. }
  1158. bigbufsize = (size_t)Malloc(-1);
  1159. bigbufsize = (bigbufsize/framesize) * framesize;
  1160. if(bigbufsize <= 0)
  1161. bigbufsize = F_SECSIZE * framesize;
  1162. dz->buflen = (int)(bigbufsize / sizeof(float));
  1163. if((dz->bigbuf = (float *)malloc(bigbufsize)) == NULL) {
  1164. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1165. return(MEMORY_ERROR);
  1166. }
  1167. // We grab (N * buflen) for each N-channel infile buffer
  1168. for(m=0,n=0;n<dz->bufcnt;m++,n+=dz->infile->channels)
  1169. dz->sbufptr[m] = dz->sampbuf[m] = dz->bigbuf + (dz->buflen * n);
  1170. // And the final buffer space for the outfile buffer
  1171. dz->sampbuf[m] = dz->bigbuf + (dz->buflen * n);
  1172. return(FINISHED);
  1173. }
  1174. /************************** CHECK_FLUTTER_PARAM_VALIDITY_AND_CONSISTENCY ******************/
  1175. int check_flutter_param_validity_and_consistency(dataptr dz)
  1176. {
  1177. int n;
  1178. if(dz->param[2] < FLTERR) {
  1179. sprintf(errstr,"Gain is effectively zero: output file would be silent.\n");
  1180. return(DATA_ERROR);
  1181. }
  1182. if((dz->parray[0] = (double *)malloc((FLUTTER_TABSIZE + 1) * sizeof(double)))==NULL) {
  1183. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1184. return(MEMORY_ERROR);
  1185. }
  1186. for(n=0;n<FLUTTER_TABSIZE;n++) {
  1187. dz->parray[0][n] = cos(PI * 2.0 * ((double)n/(double)FLUTTER_TABSIZE)); // cosin table range 1 to -1
  1188. dz->parray[0][n] += 1.0; // cosin table range 2 to 0
  1189. dz->parray[0][n] /= 2.0; // cosin table range 1 to 0
  1190. dz->parray[0][n] = 1.0 - dz->parray[0][n]; // cosin table range 0 to 1
  1191. }
  1192. dz->parray[0][n] = 0.0; /* wrap around point */
  1193. return(FINISHED);
  1194. }
  1195. /*
  1196. * 2 xx xx
  1197. * x x
  1198. * x x
  1199. * x x
  1200. * 1 xx xx 1------x--------x----- 1--xx--------xx-- 1-------xx--------
  1201. * x x x x x x x x
  1202. * x x --> x x --> x x --> x x
  1203. * x x x x x x x x
  1204. * 0--------------------- 0--------- xx --------- 0------ xx ------- 0--xx--------xx---
  1205. * x x
  1206. * x x
  1207. * x x
  1208. * -1 xx
  1209. *
  1210. */
  1211. /******************************** FLUTTER **********************************/
  1212. int flutter(dataptr dz)
  1213. {
  1214. int exit_status;
  1215. int chansetcnt = 0, lastchanset = 0, setlen, setindx, *perm = NULL;
  1216. int m, n, j, k, st_sampsread, st_samps_processed;
  1217. double thistime, locos, hicos, frac, val, depth;
  1218. double fcospos = 0.0, lastfcospos, baslevel, gain = dz->param[2];
  1219. int cospos;
  1220. int chans = dz->infile->channels;
  1221. double inverse_srate = 1.0/(double)dz->infile->srate;
  1222. double tabsize_over_srate = (double)FLUTTER_TABSIZE/(double)dz->infile->srate;
  1223. float *buf = dz->sampbuf[0];
  1224. int *chanset = dz->lparray[0], *chansetlen = dz->lparray[1], *chansetindx = dz->lparray[2];
  1225. double *costab = dz->parray[0];
  1226. float *store;
  1227. if((store = (float *)malloc(dz->infile->channels * sizeof(float)))==NULL) {
  1228. sprintf(errstr,"INSUFFICIENT MEMORY for temporary signal store.\n");
  1229. return(MEMORY_ERROR);
  1230. }
  1231. if(dz->vflag[0]) {
  1232. if((perm = (int *)malloc(dz->itemcnt * sizeof(int)))==NULL) {
  1233. sprintf(errstr,"INSUFFICIENT MEMORY for channel-set permutation store.\n");
  1234. return(MEMORY_ERROR);
  1235. }
  1236. for(n=0;n<dz->itemcnt;n++)
  1237. perm[n] = n;
  1238. lastchanset = dz->itemcnt - 1;
  1239. }
  1240. setlen = chansetlen[0];
  1241. setindx = chansetindx[0];
  1242. while(dz->samps_left > 0) {
  1243. st_samps_processed = dz->total_samps_read/chans;
  1244. if((exit_status = read_samps(buf,dz))<0)
  1245. return(exit_status);
  1246. st_sampsread = dz->ssampsread/chans;
  1247. for(n=0; n < st_sampsread; n++) {
  1248. lastfcospos = fcospos;
  1249. k = n * chans;
  1250. thistime = (double)st_samps_processed * inverse_srate;
  1251. if((exit_status = read_values_from_all_existing_brktables(thistime,dz))<0)
  1252. return(exit_status);
  1253. if((depth = min(1.0,dz->param[FLDEPTH]))<= 0) /* Depth above 1.0 does not change trough level (stays 0) but increases slope of peaks */
  1254. continue; /* If no tremolo, leave signal as is */
  1255. baslevel = max(0.0, 1.0 - depth);
  1256. cospos = (int)fcospos; /* TRUNCATE */
  1257. frac = fcospos - (double)cospos;
  1258. locos = costab[cospos];
  1259. hicos = costab[cospos+1];
  1260. val = locos + ((hicos - locos) * frac); /* interpd (normalised) costable value */
  1261. if(dz->param[FLDEPTH] > 1.0)
  1262. val = pow(val,dz->param[FLDEPTH]); /* increase slope of cosin, for depth > 1.0 */
  1263. val *= depth; /* adjusted for tremolo depth */
  1264. fcospos += (dz->param[FLFRQ] * tabsize_over_srate); /* advance costable float-pointer */
  1265. fcospos = fmod(fcospos,(double)FLUTTER_TABSIZE); /* wrap at table-size */
  1266. if(fcospos < lastfcospos) { /* if cycle of flutter completed (wrap-around) select next channel-set to flutter */
  1267. if(++chansetcnt >= dz->itemcnt) { /* if all chansets have been used */
  1268. if(dz->vflag[0]) { /* cycle to start of chansets, doing randperm if flag set */
  1269. cyclicperm(dz->itemcnt,lastchanset,&perm);
  1270. lastchanset = perm[dz->itemcnt-1];
  1271. }
  1272. chansetcnt = 0;
  1273. }
  1274. if(dz->vflag[0]) {
  1275. setlen = chansetlen[perm[chansetcnt]];
  1276. setindx = chansetindx[perm[chansetcnt]];
  1277. } else {
  1278. setlen = chansetlen[chansetcnt];
  1279. setindx = chansetindx[chansetcnt];
  1280. }
  1281. }
  1282. for(m=0;m<chans;m++) {
  1283. buf[k+m] = (float)(buf[k+m] * gain); /* level of all channels changed by gain value */
  1284. store[m] = buf[k+m]; /* Temporarily store vals of all channels */
  1285. buf[k+m] = (float)(buf[k+m] * baslevel); /* level of all channels reduced to baslevel */
  1286. }
  1287. for(j=0;j<setlen;j++) {
  1288. m = chanset[setindx + j];
  1289. buf[k+m] = (float)(buf[k+m] + (store[m] * val));/* For current channel-set, vibrato added above baslevel */
  1290. }
  1291. st_samps_processed++;
  1292. }
  1293. if(dz->ssampsread > 0) {
  1294. if((exit_status = write_samps(buf,dz->ssampsread,dz))<0)
  1295. return(exit_status);
  1296. }
  1297. }
  1298. return(FINISHED);
  1299. }
  1300. /***************************** CYCLICPERM **********************************/
  1301. void cyclicperm(int chansetcnt,int lastchanset,int **perm)
  1302. {
  1303. int n, t;
  1304. do {
  1305. for(n=0;n<chansetcnt;n++) {
  1306. t = (int)floor(drand48() * (n+1));
  1307. if(t==n) {
  1308. hprefix(n,*perm,chansetcnt);
  1309. } else {
  1310. hinsert(n,t,*perm,chansetcnt);
  1311. }
  1312. }
  1313. } while((*perm)[0] == lastchanset); // Avoid repetitions at perm boundaries.
  1314. }
  1315. void hinsert(int m,int t,int *perm,int permlen)
  1316. {
  1317. hshuflup(t+1,perm,permlen);
  1318. perm[t+1] = m;
  1319. }
  1320. void hprefix(int m,int *perm,int permlen)
  1321. {
  1322. hshuflup(0,perm,permlen);
  1323. perm[0] = m;
  1324. }
  1325. void hshuflup(int k,int *perm,int permlen)
  1326. {
  1327. int n, *i;
  1328. int z = permlen - 1;
  1329. i = perm+z;
  1330. for(n = z;n > k;n--) {
  1331. *i = *(i-1);
  1332. i--;
  1333. }
  1334. }