impulse.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. // At low peak cnt,and dur 0 bass-drum
  2. // At high peak count, birdlike-tweet (chirp)
  3. // AT high outer rate, birdlike-tweet becomes invasive buzz
  4. // "impulse impulse outfile dur pitch glis slope chirp level [-ggap] [-ssrate] [-cchans]\n"
  5. // _cdprogs\impulse impulse test.wav 5 60 0 1 10 1 -g.5
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <structures.h>
  9. #include <tkglobals.h>
  10. #include <pnames.h>
  11. #include <filetype.h>
  12. #include <processno.h>
  13. #include <modeno.h>
  14. #include <logic.h>
  15. #include <globcon.h>
  16. #include <cdpmain.h>
  17. #include <math.h>
  18. #include <mixxcon.h>
  19. #include <osbind.h>
  20. #include <standalone.h>
  21. #include <science.h>
  22. #include <ctype.h>
  23. #include <sfsys.h>
  24. #include <string.h>
  25. #include <srates.h>
  26. #define IMPULSE_LEVEL (0.95)
  27. #define doublepass zeroset
  28. #define passcnt fzeroset
  29. #define maxgap scalefact
  30. #ifdef unix
  31. #define round(x) lround((x))
  32. #endif
  33. char errstr[2400];
  34. int anal_infiles = 1;
  35. int sloom = 0;
  36. int sloombatch = 0;
  37. const char* cdp_version = "6.1.0";
  38. //CDP LIB REPLACEMENTS
  39. static int setup_impulse_application(dataptr dz);
  40. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  41. static int setup_impulse_param_ranges_and_defaults(dataptr dz);
  42. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  43. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  44. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  45. static int establish_application(dataptr dz);
  46. static int initialise_vflags(dataptr dz);
  47. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  48. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  49. static int mark_parameter_types(dataptr dz,aplptr ap);
  50. static int assign_file_data_storage(int infilecnt,dataptr dz);
  51. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  52. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  53. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  54. static int impulse(dataptr dz);
  55. static int check_impulse_param_validity_and_consistency(dataptr dz);
  56. static int open_the_outfile(dataptr dz);
  57. static int impulse_param_preprocess(dataptr dz);
  58. static double getbufmax(double totalmax,int sampcnt,dataptr dz);
  59. /**************************************** MAIN *********************************************/
  60. int main(int argc,char *argv[])
  61. {
  62. int exit_status;
  63. dataptr dz = NULL;
  64. char **cmdline;
  65. int cmdlinecnt;
  66. aplptr ap;
  67. int is_launched = FALSE;
  68. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  69. fprintf(stdout,"%s\n",cdp_version);
  70. fflush(stdout);
  71. return 0;
  72. }
  73. /* CHECK FOR SOUNDLOOM */
  74. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  75. sloom = 0;
  76. sloombatch = 1;
  77. }
  78. if(sflinit("cdp")){
  79. sfperror("cdp: initialisation\n");
  80. return(FAILED);
  81. }
  82. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  83. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  84. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  85. return(FAILED);
  86. }
  87. if(!sloom) {
  88. if(argc == 1) {
  89. usage1();
  90. return(FAILED);
  91. } else if(argc == 2) {
  92. usage2(argv[1]);
  93. return(FAILED);
  94. }
  95. }
  96. if(!sloom) {
  97. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  98. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  99. return(FAILED);
  100. }
  101. cmdline = argv;
  102. cmdlinecnt = argc;
  103. if((get_the_process_no(argv[0],dz))<0)
  104. return(FAILED);
  105. cmdline++;
  106. cmdlinecnt--;
  107. dz->maxmode = 0;
  108. // setup_particular_application =
  109. if((exit_status = setup_impulse_application(dz))<0) {
  110. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  111. return(FAILED);
  112. }
  113. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  114. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  115. return(FAILED);
  116. }
  117. } else {
  118. //parse_TK_data() =
  119. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  120. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  121. return(exit_status);
  122. }
  123. }
  124. ap = dz->application;
  125. // parse_infile_and_hone_type() redundant
  126. // setup_param_ranges_and_defaults() =
  127. if((exit_status = setup_impulse_param_ranges_and_defaults(dz))<0) {
  128. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  129. return(FAILED);
  130. }
  131. // open_first_infile() redUndant
  132. // handle_extra_infiles() : redundant
  133. // handle_outfile() =
  134. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  135. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  136. return(FAILED);
  137. }
  138. // handle_formants() redundant
  139. // handle_formant_quiksearch() redundant
  140. // handle_special_data() redundant
  141. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(FAILED);
  144. }
  145. // check_param_validity_and_consistency .....
  146. if((exit_status = check_impulse_param_validity_and_consistency(dz))<0) {
  147. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  148. return(FAILED);
  149. }
  150. //param_preprocess ....
  151. if((exit_status = impulse_param_preprocess(dz))<0) {
  152. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  153. return(FAILED);
  154. }
  155. is_launched = TRUE;
  156. if((exit_status = open_the_outfile(dz))<0) {
  157. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  158. return(FAILED);
  159. }
  160. //spec_process_file =
  161. if((exit_status = impulse(dz))<0) {
  162. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  163. return(FAILED);
  164. }
  165. if((exit_status = complete_output(dz))<0) { // CDP LIB
  166. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  167. return(FAILED);
  168. }
  169. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  170. free(dz);
  171. return(SUCCEEDED);
  172. }
  173. /**********************************************
  174. REPLACED CDP LIB FUNCTIONS
  175. **********************************************/
  176. /****************************** SET_PARAM_DATA *********************************/
  177. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  178. {
  179. ap->special_data = (char)special_data;
  180. ap->param_cnt = (char)paramcnt;
  181. ap->max_param_cnt = (char)maxparamcnt;
  182. if(ap->max_param_cnt>0) {
  183. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  184. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  185. return(MEMORY_ERROR);
  186. }
  187. strcpy(ap->param_list,paramlist);
  188. }
  189. return(FINISHED);
  190. }
  191. /****************************** SET_VFLGS *********************************/
  192. int set_vflgs
  193. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  194. {
  195. ap->option_cnt = (char) optcnt; /*RWD added cast */
  196. if(optcnt) {
  197. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  198. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  199. return(MEMORY_ERROR);
  200. }
  201. strcpy(ap->option_list,optlist);
  202. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  203. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  204. return(MEMORY_ERROR);
  205. }
  206. strcpy(ap->option_flags,optflags);
  207. }
  208. ap->vflag_cnt = (char) vflagcnt;
  209. ap->variant_param_cnt = (char) vparamcnt;
  210. if(vflagcnt) {
  211. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  212. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  213. return(MEMORY_ERROR);
  214. }
  215. strcpy(ap->variant_list,varlist);
  216. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  217. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  218. return(MEMORY_ERROR);
  219. }
  220. strcpy(ap->variant_flags,varflags);
  221. }
  222. return(FINISHED);
  223. }
  224. /***************************** APPLICATION_INIT **************************/
  225. int application_init(dataptr dz)
  226. {
  227. int exit_status;
  228. int storage_cnt;
  229. int tipc, brkcnt;
  230. aplptr ap = dz->application;
  231. if(ap->vflag_cnt>0)
  232. initialise_vflags(dz);
  233. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  234. ap->total_input_param_cnt = (char)tipc;
  235. if(tipc>0) {
  236. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  237. return(exit_status);
  238. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  239. return(exit_status);
  240. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  241. return(exit_status);
  242. }
  243. brkcnt = tipc;
  244. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  245. if(brkcnt>0) {
  246. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  247. return(exit_status);
  248. }
  249. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  250. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  251. return(exit_status);
  252. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  253. return(exit_status);
  254. }
  255. if((exit_status = mark_parameter_types(dz,ap))<0)
  256. return(exit_status);
  257. // establish_infile_constants() replaced by
  258. dz->infilecnt = 1;
  259. //establish_bufptrs_and_extra_buffers():
  260. return(FINISHED);
  261. }
  262. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  263. /* RWD mallo changed to calloc; helps debug verison run as release! */
  264. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  265. {
  266. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  267. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  268. return(MEMORY_ERROR);
  269. }
  270. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  271. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  272. return(MEMORY_ERROR);
  273. }
  274. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  275. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  276. return(MEMORY_ERROR);
  277. }
  278. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  279. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  280. return(MEMORY_ERROR);
  281. }
  282. return(FINISHED);
  283. }
  284. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  285. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  286. {
  287. int n;
  288. for(n=0;n<storage_cnt;n++) {
  289. dz->is_int[n] = (char)0;
  290. dz->no_brk[n] = (char)0;
  291. }
  292. return(FINISHED);
  293. }
  294. /***************************** MARK_PARAMETER_TYPES **************************/
  295. int mark_parameter_types(dataptr dz,aplptr ap)
  296. {
  297. int n, m; /* PARAMS */
  298. for(n=0;n<ap->max_param_cnt;n++) {
  299. switch(ap->param_list[n]) {
  300. case('0'): break; /* dz->is_active[n] = 0 is default */
  301. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  302. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  303. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  304. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  305. default:
  306. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  307. return(PROGRAM_ERROR);
  308. }
  309. } /* OPTIONS */
  310. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  311. switch(ap->option_list[n]) {
  312. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  313. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  314. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  315. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  316. default:
  317. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  318. return(PROGRAM_ERROR);
  319. }
  320. } /* VARIANTS */
  321. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  322. switch(ap->variant_list[n]) {
  323. case('0'): break;
  324. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  325. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  326. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  327. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  328. default:
  329. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  330. return(PROGRAM_ERROR);
  331. }
  332. } /* INTERNAL */
  333. for(n=0,
  334. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  335. switch(ap->internal_param_list[n]) {
  336. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  337. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  338. case('d'): dz->no_brk[m] = (char)1; break;
  339. default:
  340. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  341. return(PROGRAM_ERROR);
  342. }
  343. }
  344. return(FINISHED);
  345. }
  346. /************************ HANDLE_THE_OUTFILE *********************/
  347. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  348. {
  349. char *filename = (*cmdline)[0], *p;
  350. if(filename[0]=='-' && filename[1]=='f') {
  351. dz->floatsam_output = 1;
  352. dz->true_outfile_stype = SAMP_FLOAT;
  353. filename+= 2;
  354. }
  355. if(!sloom) {
  356. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  357. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  358. return(DATA_ERROR);
  359. }
  360. }
  361. p = filename; // Drop file extension
  362. while(*p != ENDOFSTR) {
  363. if(*p == '.') {
  364. *p = ENDOFSTR;
  365. break;
  366. }
  367. p++;
  368. }
  369. strcpy(dz->outfilename,filename);
  370. (*cmdline)++;
  371. (*cmdlinecnt)--;
  372. return(FINISHED);
  373. }
  374. /************************ OPEN_THE_OUTFILE *********************/
  375. int open_the_outfile(dataptr dz)
  376. {
  377. int exit_status;
  378. dz->infile->srate = dz->iparam[IMP_SRATE];
  379. dz->infile->channels = dz->iparam[IMP_CHANS];
  380. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  381. return(exit_status);
  382. return(FINISHED);
  383. }
  384. /***************************** ESTABLISH_APPLICATION **************************/
  385. int establish_application(dataptr dz)
  386. {
  387. aplptr ap;
  388. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  389. sprintf(errstr,"establish_application()\n");
  390. return(MEMORY_ERROR);
  391. }
  392. ap = dz->application;
  393. memset((char *)ap,0,sizeof(struct applic));
  394. return(FINISHED);
  395. }
  396. /************************* INITIALISE_VFLAGS *************************/
  397. int initialise_vflags(dataptr dz)
  398. {
  399. int n;
  400. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  401. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  402. return(MEMORY_ERROR);
  403. }
  404. for(n=0;n<dz->application->vflag_cnt;n++)
  405. dz->vflag[n] = FALSE;
  406. return FINISHED;
  407. }
  408. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  409. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  410. {
  411. int n;
  412. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  413. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  414. return(MEMORY_ERROR);
  415. }
  416. for(n=0;n<tipc;n++)
  417. ap->default_val[n] = 0.0;
  418. return(FINISHED);
  419. }
  420. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  421. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  422. {
  423. int n;
  424. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  425. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  426. return(MEMORY_ERROR);
  427. }
  428. for(n=0;n<tipc;n++)
  429. dz->is_active[n] = (char)0;
  430. return(FINISHED);
  431. }
  432. /************************* SETUP_IMPULSE_APPLICATION *******************/
  433. int setup_impulse_application(dataptr dz)
  434. {
  435. int exit_status;
  436. aplptr ap;
  437. if((exit_status = establish_application(dz))<0) // GLOBAL
  438. return(FAILED);
  439. ap = dz->application;
  440. // SEE parstruct FOR EXPLANATION of next 2 functions
  441. if((exit_status = set_param_data(ap,0 ,6,6,"dDDDID"))<0)
  442. return(FAILED);
  443. if((exit_status = set_vflgs(ap,"gsc",3,"Dii","",0,0,""))<0)
  444. return(FAILED);
  445. // set_legal_infile_structure -->
  446. dz->has_otherfile = FALSE;
  447. // assign_process_logic -->
  448. dz->input_data_type = NO_FILE_AT_ALL;
  449. dz->process_type = UNEQUAL_SNDFILE;
  450. dz->outfiletype = SNDFILE_OUT;
  451. return application_init(dz); //GLOBAL
  452. }
  453. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  454. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  455. {
  456. int exit_status;
  457. infileptr infile_info;
  458. if(!sloom) {
  459. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  460. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  461. return(MEMORY_ERROR);
  462. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  463. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  464. return(PROGRAM_ERROR);
  465. } else if(infile_info->filetype != SNDFILE) {
  466. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  467. return(DATA_ERROR);
  468. } else if(infile_info->channels != 1) {
  469. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  470. return(DATA_ERROR);
  471. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  472. sprintf(errstr,"Failed to copy file parsing information\n");
  473. return(PROGRAM_ERROR);
  474. }
  475. free(infile_info);
  476. }
  477. return(FINISHED);
  478. }
  479. /************************* SETUP_IMPULSE_PARAM_RANGES_AND_DEFAULTS *******************/
  480. int setup_impulse_param_ranges_and_defaults(dataptr dz)
  481. {
  482. int exit_status;
  483. aplptr ap = dz->application;
  484. // set_param_ranges()
  485. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  486. // NB total_input_param_cnt is > 0 !!!
  487. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  488. return(FAILED);
  489. // get_param_ranges()
  490. ap->lo[IMP_DUR] = 0;
  491. ap->hi[IMP_DUR] = 7200;
  492. ap->default_val[IMP_DUR] = 0;
  493. ap->lo[IMP_PICH] = 1.0;
  494. ap->hi[IMP_PICH] = 1000.0;
  495. ap->default_val[IMP_PICH] = 2.0;
  496. ap->lo[IMP_CHIRP] = 0.0; // 0
  497. ap->hi[IMP_CHIRP] = 30.0; // 30
  498. ap->default_val[IMP_CHIRP] = 0; // 0
  499. ap->lo[IMP_SLOPE] = 1.0;
  500. ap->hi[IMP_SLOPE] = 20.0;
  501. ap->default_val[IMP_SLOPE] = 1.0;
  502. ap->lo[IMP_CYCS] = 1;
  503. ap->hi[IMP_CYCS] = 200;
  504. ap->default_val[IMP_CYCS] = 1;
  505. ap->lo[IMP_LEV] = 0;
  506. ap->hi[IMP_LEV] = 1;
  507. ap->default_val[IMP_LEV] = 1;
  508. ap->lo[IMP_GAP] = -.99;
  509. ap->hi[IMP_GAP] = 10;
  510. ap->default_val[IMP_GAP] = 0;
  511. ap->lo[IMP_SRATE] = 16000;
  512. ap->hi[IMP_SRATE] = 96000;
  513. ap->default_val[IMP_SRATE] = 44100;
  514. ap->lo[IMP_CHANS] = 1.0;
  515. ap->hi[IMP_CHANS] = 16.0;
  516. ap->default_val[IMP_CHANS] = 1.0;
  517. dz->maxmode = 0;
  518. if(!sloom)
  519. put_default_vals_in_all_params(dz);
  520. return(FINISHED);
  521. }
  522. /********************************* PARSE_SLOOM_DATA *********************************/
  523. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  524. {
  525. int exit_status;
  526. int cnt = 1, infilecnt;
  527. int filesize, insams, inbrksize;
  528. double dummy;
  529. int true_cnt = 0;
  530. aplptr ap;
  531. while(cnt<=PRE_CMDLINE_DATACNT) {
  532. if(cnt > argc) {
  533. sprintf(errstr,"Insufficient data sent from TK\n");
  534. return(DATA_ERROR);
  535. }
  536. switch(cnt) {
  537. case(1):
  538. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  539. sprintf(errstr,"Cannot read process no. sent from TK\n");
  540. return(DATA_ERROR);
  541. }
  542. break;
  543. case(2):
  544. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  545. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  546. return(DATA_ERROR);
  547. }
  548. if(dz->mode > 0)
  549. dz->mode--;
  550. //setup_particular_application() =
  551. if((exit_status = setup_impulse_application(dz))<0)
  552. return(exit_status);
  553. ap = dz->application;
  554. break;
  555. case(3):
  556. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  557. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  558. return(DATA_ERROR);
  559. }
  560. if(infilecnt < 1) {
  561. true_cnt = cnt + 1;
  562. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  563. }
  564. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  565. return(exit_status);
  566. break;
  567. case(INPUT_FILETYPE+4):
  568. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  569. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  570. return(DATA_ERROR);
  571. }
  572. break;
  573. case(INPUT_FILESIZE+4):
  574. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  575. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  576. return(DATA_ERROR);
  577. }
  578. dz->insams[0] = filesize;
  579. break;
  580. case(INPUT_INSAMS+4):
  581. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  582. sprintf(errstr,"Cannot read insams sent from TK\n");
  583. return(DATA_ERROR);
  584. }
  585. dz->insams[0] = insams;
  586. break;
  587. case(INPUT_SRATE+4):
  588. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  589. sprintf(errstr,"Cannot read srate sent from TK\n");
  590. return(DATA_ERROR);
  591. }
  592. break;
  593. case(INPUT_CHANNELS+4):
  594. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  595. sprintf(errstr,"Cannot read channels sent from TK\n");
  596. return(DATA_ERROR);
  597. }
  598. break;
  599. case(INPUT_STYPE+4):
  600. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  601. sprintf(errstr,"Cannot read stype sent from TK\n");
  602. return(DATA_ERROR);
  603. }
  604. break;
  605. case(INPUT_ORIGSTYPE+4):
  606. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  607. sprintf(errstr,"Cannot read origstype sent from TK\n");
  608. return(DATA_ERROR);
  609. }
  610. break;
  611. case(INPUT_ORIGRATE+4):
  612. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  613. sprintf(errstr,"Cannot read origrate sent from TK\n");
  614. return(DATA_ERROR);
  615. }
  616. break;
  617. case(INPUT_MLEN+4):
  618. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  619. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  620. return(DATA_ERROR);
  621. }
  622. break;
  623. case(INPUT_DFAC+4):
  624. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  625. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  626. return(DATA_ERROR);
  627. }
  628. break;
  629. case(INPUT_ORIGCHANS+4):
  630. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  631. sprintf(errstr,"Cannot read origchans sent from TK\n");
  632. return(DATA_ERROR);
  633. }
  634. break;
  635. case(INPUT_SPECENVCNT+4):
  636. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  637. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  638. return(DATA_ERROR);
  639. }
  640. dz->specenvcnt = dz->infile->specenvcnt;
  641. break;
  642. case(INPUT_WANTED+4):
  643. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  644. sprintf(errstr,"Cannot read wanted sent from TK\n");
  645. return(DATA_ERROR);
  646. }
  647. break;
  648. case(INPUT_WLENGTH+4):
  649. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  650. sprintf(errstr,"Cannot read wlength sent from TK\n");
  651. return(DATA_ERROR);
  652. }
  653. break;
  654. case(INPUT_OUT_CHANS+4):
  655. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  656. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  657. return(DATA_ERROR);
  658. }
  659. break;
  660. /* RWD these chanegs to samps - tk will have to deal with that! */
  661. case(INPUT_DESCRIPTOR_BYTES+4):
  662. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  663. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  664. return(DATA_ERROR);
  665. }
  666. break;
  667. case(INPUT_IS_TRANSPOS+4):
  668. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  669. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  670. return(DATA_ERROR);
  671. }
  672. break;
  673. case(INPUT_COULD_BE_TRANSPOS+4):
  674. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  675. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  676. return(DATA_ERROR);
  677. }
  678. break;
  679. case(INPUT_COULD_BE_PITCH+4):
  680. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  681. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  682. return(DATA_ERROR);
  683. }
  684. break;
  685. case(INPUT_DIFFERENT_SRATES+4):
  686. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  687. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  688. return(DATA_ERROR);
  689. }
  690. break;
  691. case(INPUT_DUPLICATE_SNDS+4):
  692. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  693. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  694. return(DATA_ERROR);
  695. }
  696. break;
  697. case(INPUT_BRKSIZE+4):
  698. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  699. sprintf(errstr,"Cannot read brksize sent from TK\n");
  700. return(DATA_ERROR);
  701. }
  702. if(inbrksize > 0) {
  703. switch(dz->input_data_type) {
  704. case(WORDLIST_ONLY):
  705. break;
  706. case(PITCH_AND_PITCH):
  707. case(PITCH_AND_TRANSPOS):
  708. case(TRANSPOS_AND_TRANSPOS):
  709. dz->tempsize = inbrksize;
  710. break;
  711. case(BRKFILES_ONLY):
  712. case(UNRANGED_BRKFILE_ONLY):
  713. case(DB_BRKFILES_ONLY):
  714. case(ALL_FILES):
  715. case(ANY_NUMBER_OF_ANY_FILES):
  716. if(dz->extrabrkno < 0) {
  717. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  718. return(DATA_ERROR);
  719. }
  720. if(dz->brksize == NULL) {
  721. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  722. return(PROGRAM_ERROR);
  723. }
  724. dz->brksize[dz->extrabrkno] = inbrksize;
  725. break;
  726. default:
  727. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  728. dz->input_data_type);
  729. return(PROGRAM_ERROR);
  730. }
  731. break;
  732. }
  733. break;
  734. case(INPUT_NUMSIZE+4):
  735. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  736. sprintf(errstr,"Cannot read numsize sent from TK\n");
  737. return(DATA_ERROR);
  738. }
  739. break;
  740. case(INPUT_LINECNT+4):
  741. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  742. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  743. return(DATA_ERROR);
  744. }
  745. break;
  746. case(INPUT_ALL_WORDS+4):
  747. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  748. sprintf(errstr,"Cannot read all_words sent from TK\n");
  749. return(DATA_ERROR);
  750. }
  751. break;
  752. case(INPUT_ARATE+4):
  753. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  754. sprintf(errstr,"Cannot read arate sent from TK\n");
  755. return(DATA_ERROR);
  756. }
  757. break;
  758. case(INPUT_FRAMETIME+4):
  759. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  760. sprintf(errstr,"Cannot read frametime sent from TK\n");
  761. return(DATA_ERROR);
  762. }
  763. dz->frametime = (float)dummy;
  764. break;
  765. case(INPUT_WINDOW_SIZE+4):
  766. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  767. sprintf(errstr,"Cannot read window_size sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_NYQUIST+4):
  772. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  773. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. break;
  777. case(INPUT_DURATION+4):
  778. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  779. sprintf(errstr,"Cannot read duration sent from TK\n");
  780. return(DATA_ERROR);
  781. }
  782. break;
  783. case(INPUT_MINBRK+4):
  784. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  785. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  786. return(DATA_ERROR);
  787. }
  788. break;
  789. case(INPUT_MAXBRK+4):
  790. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  791. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  792. return(DATA_ERROR);
  793. }
  794. break;
  795. case(INPUT_MINNUM+4):
  796. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  797. sprintf(errstr,"Cannot read minnum sent from TK\n");
  798. return(DATA_ERROR);
  799. }
  800. break;
  801. case(INPUT_MAXNUM+4):
  802. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  803. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  804. return(DATA_ERROR);
  805. }
  806. break;
  807. default:
  808. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  809. return(PROGRAM_ERROR);
  810. }
  811. cnt++;
  812. }
  813. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  814. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  815. return(DATA_ERROR);
  816. }
  817. if(true_cnt)
  818. cnt = true_cnt;
  819. *cmdlinecnt = 0;
  820. while(cnt < argc) {
  821. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  822. return(exit_status);
  823. cnt++;
  824. }
  825. return(FINISHED);
  826. }
  827. /********************************* GET_TK_CMDLINE_WORD *********************************/
  828. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  829. {
  830. if(*cmdlinecnt==0) {
  831. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  832. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  833. return(MEMORY_ERROR);
  834. }
  835. } else {
  836. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  837. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  838. return(MEMORY_ERROR);
  839. }
  840. }
  841. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  842. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  843. return(MEMORY_ERROR);
  844. }
  845. strcpy((*cmdline)[*cmdlinecnt],q);
  846. (*cmdlinecnt)++;
  847. return(FINISHED);
  848. }
  849. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  850. int assign_file_data_storage(int infilecnt,dataptr dz)
  851. {
  852. int exit_status;
  853. int no_sndfile_system_files = FALSE;
  854. dz->infilecnt = infilecnt;
  855. if((exit_status = allocate_filespace(dz))<0)
  856. return(exit_status);
  857. if(no_sndfile_system_files)
  858. dz->infilecnt = 0;
  859. return(FINISHED);
  860. }
  861. /************************* redundant functions: to ensure libs compile OK *******************/
  862. int assign_process_logic(dataptr dz)
  863. {
  864. return(FINISHED);
  865. }
  866. void set_legal_infile_structure(dataptr dz)
  867. {}
  868. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  869. {
  870. return(FINISHED);
  871. }
  872. int setup_internal_arrays_and_array_pointers(dataptr dz)
  873. {
  874. return(FINISHED);
  875. }
  876. int establish_bufptrs_and_extra_buffers(dataptr dz)
  877. {
  878. return(FINISHED);
  879. }
  880. int read_special_data(char *str,dataptr dz)
  881. {
  882. return(FINISHED);
  883. }
  884. int inner_loop
  885. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  886. {
  887. return(FINISHED);
  888. }
  889. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  890. {
  891. return(FINISHED);
  892. }
  893. /******************************** USAGE1 ********************************/
  894. int usage1(void)
  895. {
  896. usage2("impulse");
  897. return(USAGE_ONLY);
  898. }
  899. /********************************************************************************************/
  900. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  901. {
  902. if(!strcmp(prog_identifier_from_cmdline,"impulse")) dz->process = IMPULSE;
  903. else {
  904. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  905. return(USAGE_ONLY);
  906. }
  907. return(FINISHED);
  908. }
  909. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  910. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  911. {
  912. int n;
  913. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  914. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  915. return(MEMORY_ERROR);
  916. }
  917. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  918. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  919. return(MEMORY_ERROR);
  920. }
  921. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  922. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  923. return(MEMORY_ERROR);
  924. }
  925. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  926. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  927. return(MEMORY_ERROR);
  928. }
  929. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  930. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  931. return(MEMORY_ERROR);
  932. }
  933. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  934. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  935. return(MEMORY_ERROR);
  936. }
  937. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  938. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  939. return(MEMORY_ERROR);
  940. }
  941. for(n=0;n<brkcnt;n++) {
  942. dz->brk[n] = NULL;
  943. dz->brkptr[n] = NULL;
  944. dz->brkinit[n] = 0;
  945. dz->brksize[n] = 0;
  946. }
  947. return(FINISHED);
  948. }
  949. /******************************** USAGE2 ********************************/
  950. int usage2(char *str)
  951. {
  952. if(!strcmp(str,"impulse")) {
  953. fprintf(stderr,
  954. "USAGE:\n"
  955. "impulse impulse outfile dur pitch chirp slope pkcnt level [-ggap] [-ssrate] [-cchans]\n"
  956. "\n"
  957. "Create a stream of impulses.\n"
  958. "\n"
  959. "DUR Duration of output sound.\n"
  960. " If set to zero, a single impulse is produced.\n"
  961. "PITCH Pitch of impulse-stream (MIDI). (Determines stream-frq)\n"
  962. "CHIRP Glissing of impulse. (Range 0 to 30) (Care, output may clip).\n"
  963. "SLOPE How quickly impulse rises and falls in level. (Range 1 to 20)\n"
  964. "PKCNT Number of peaks in impulse. (Range 1 - 200)\n"
  965. " 'Pkcnt' divided by stream-frq -> (unglissed) frq of impulses.\n"
  966. "LEVEL Impulse level (Range 0-1).\n"
  967. "GAP Relative size of any silent gap between impulses.\n"
  968. " If > zero, lowers apparent pitch of stream.\n"
  969. " IF < zero, chirps overlap, raises apparent pitch of stream.\n"
  970. "SRATE Sample-rate of output file (Default 44100).\n"
  971. "CHANS Number of channels in output file. (Default 1).\n"
  972. "\n"
  973. "\"PITCH\",\"GLIS\",\"SLOPE\",\"CHIRP\",\"LEVEL\" and \"GAP\" can vary through time.\n"
  974. "\n");
  975. } else
  976. fprintf(stdout,"Unknown option '%s'\n",str);
  977. return(USAGE_ONLY);
  978. }
  979. int usage3(char *str1,char *str2)
  980. {
  981. fprintf(stderr,"Insufficient parameters on command line.\n");
  982. return(USAGE_ONLY);
  983. }
  984. /******************************** IMPULSE ********************************/
  985. int impulse(dataptr dz)
  986. {
  987. int exit_status, z;
  988. int n, m, k, impulse_len, impulse_halflen, obufpos, maxwrite, gap;
  989. float *obuf, *ibuf, *ovflwbuf;
  990. double sharpness, range, val, ubval, maxsamp, normaliser, minfrq, time, level, totalmax, ubernorm, srate = (double)dz->infile->srate;
  991. dz->bufcnt = 3;
  992. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  993. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  994. return(MEMORY_ERROR);
  995. }
  996. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  997. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  998. return(MEMORY_ERROR);
  999. }
  1000. for(n = 0;n <dz->bufcnt; n++)
  1001. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  1002. dz->sampbuf[n] = (float *)0;
  1003. if(dz->brksize[IMP_PICH]) {
  1004. if((exit_status = get_minvalue_in_brktable(&minfrq,IMP_PICH,dz))<0)
  1005. return exit_status;
  1006. } else
  1007. minfrq = dz->param[IMP_PICH];
  1008. impulse_len = (int)round(srate/minfrq);
  1009. if(dz->maxgap > 0.0)
  1010. impulse_len = (int)ceil((double)impulse_len * (1.0 + dz->maxgap));
  1011. dz->buflen = impulse_len + 64;
  1012. if((dz->bigbuf = (float *)malloc(dz->buflen * dz->bufcnt * sizeof(float)))==NULL) {
  1013. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  1014. return(MEMORY_ERROR);
  1015. }
  1016. dz->sampbuf[0] = dz->bigbuf;
  1017. dz->sampbuf[1] = dz->sampbuf[0] + dz->buflen;
  1018. dz->sampbuf[2] = dz->sampbuf[1] + dz->buflen;
  1019. ibuf = dz->sampbuf[0];
  1020. obuf = dz->sampbuf[1];
  1021. ovflwbuf = dz->sampbuf[2];
  1022. totalmax = 0.0;
  1023. ubernorm = 1.0;
  1024. for(z = 0; z < dz->passcnt;z++) {
  1025. memset((char *)obuf,0,dz->buflen * 2 * sizeof(float));
  1026. obufpos = 0;
  1027. maxwrite = 0;
  1028. time = 0.0;
  1029. do {
  1030. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  1031. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1032. return exit_status;
  1033. impulse_halflen = (int)round(srate/dz->param[IMP_PICH])/2;
  1034. range = (double)(dz->iparam[IMP_CYCS]);
  1035. range *= PI;
  1036. sharpness = 1.0/dz->param[IMP_CHIRP];
  1037. maxsamp = 0.0;
  1038. for(n = 0,m=impulse_halflen,k=impulse_halflen-1;n<impulse_halflen;n++,m++,k--) {
  1039. val = (double)n/(double)impulse_halflen;
  1040. ubval = pow(1.0 - val,dz->param[IMP_SLOPE]);
  1041. val = pow(val,sharpness);
  1042. val *= range;
  1043. val = sin(val);
  1044. val *= ubval;
  1045. ibuf[m] = (float)-val;
  1046. ibuf[k] = (float)val;
  1047. maxsamp = max(maxsamp,fabs(ibuf[k]));
  1048. }
  1049. level = dz->param[IMP_LEV] * IMPULSE_LEVEL;
  1050. normaliser = level/maxsamp;
  1051. if(obufpos >= dz->buflen) {
  1052. if(dz->doublepass)
  1053. totalmax = getbufmax(totalmax,dz->buflen,dz);
  1054. else {
  1055. if(!flteq(ubernorm,1.0)) {
  1056. for(n = 0; n < dz->buflen;n++)
  1057. obuf[n] = (float)(obuf[n] * ubernorm);
  1058. }
  1059. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1060. return exit_status;
  1061. }
  1062. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1063. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1064. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1065. obufpos -= dz->buflen;
  1066. maxwrite -= dz->buflen;
  1067. }
  1068. for(n=0;n < m; n++) {
  1069. obuf[obufpos] = (float)(obuf[obufpos] + (ibuf[n] * normaliser));
  1070. obufpos++;
  1071. }
  1072. maxwrite = max(maxwrite,obufpos);
  1073. if(dz->param[IMP_DUR] == 0.0) // Single cycle flagged. Exit
  1074. break;
  1075. gap = 0;
  1076. if(dz->param[IMP_GAP] > 0.0) { // IF gapping, insert silence
  1077. gap = (int)round((double)(impulse_halflen * 2) * dz->param[IMP_GAP]);
  1078. for(m=0;m < gap; m++) {
  1079. if(obufpos >= dz->buflen) {
  1080. if(dz->doublepass)
  1081. totalmax = getbufmax(totalmax,dz->buflen,dz);
  1082. else {
  1083. if(!flteq(ubernorm,1.0)) {
  1084. for(n = 0; n < dz->buflen;n++)
  1085. obuf[n] = (float)(obuf[n] * ubernorm);
  1086. }
  1087. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1088. return exit_status;
  1089. }
  1090. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1091. memcpy((char *)obuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1092. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1093. obufpos -= dz->buflen;
  1094. maxwrite -= dz->buflen;
  1095. }
  1096. obufpos++;
  1097. } // If overlapping of chirps, do baktrak
  1098. maxwrite = max(maxwrite,obufpos);
  1099. } else if(dz->param[IMP_GAP] < 0.0) {
  1100. gap = (int)round((double)(impulse_halflen * 2) * dz->param[IMP_GAP]);
  1101. obufpos += gap; // gap is -ve, so this is a baktrak
  1102. if(obufpos < 0) {
  1103. sprintf(errstr,"Error in output buffer accounting.\n");
  1104. return PROGRAM_ERROR;
  1105. }
  1106. }
  1107. time += (double)gap/srate;
  1108. time += 1.0/dz->param[IMP_PICH];
  1109. } while(time < dz->param[IMP_DUR]);
  1110. if(maxwrite > 0) {
  1111. if(dz->doublepass) {
  1112. totalmax = getbufmax(totalmax,maxwrite,dz);
  1113. ubernorm = IMPULSE_LEVEL/totalmax;
  1114. ubernorm = min(ubernorm,1.0);
  1115. } else {
  1116. if(!flteq(ubernorm,1.0)) {
  1117. for(n = 0; n < maxwrite;n++)
  1118. obuf[n] = (float)(obuf[n] * ubernorm);
  1119. }
  1120. if((exit_status = write_samps(obuf,maxwrite,dz))<0)
  1121. return exit_status;
  1122. }
  1123. }
  1124. dz->doublepass = 0;
  1125. }
  1126. return FINISHED;
  1127. }
  1128. /******************************** CHECK_IMPULSE_PARAM_VALIDITY_AND_CONSISTENCY ********************************/
  1129. int check_impulse_param_validity_and_consistency(dataptr dz)
  1130. {
  1131. if (BAD_SR(dz->iparam[IMP_SRATE])) {
  1132. sprintf(errstr,"Invalid sample rate.\n");
  1133. return(DATA_ERROR);
  1134. }
  1135. return FINISHED;
  1136. }
  1137. /******************************** IMPULSE_PARAM_PREPROCESS ********************************/
  1138. int impulse_param_preprocess(dataptr dz)
  1139. {
  1140. int exit_status;
  1141. double mingap = 0.0;
  1142. int n, m;
  1143. if(dz->brksize[IMP_PICH]) { // Convert MIDI to frq
  1144. for(n=0,m=1;n < dz->brksize[IMP_PICH];n++,m+=2)
  1145. dz->brk[IMP_PICH][m] = miditohz(dz->brk[IMP_PICH][m]);
  1146. } else
  1147. dz->param[IMP_PICH] = miditohz(dz->param[IMP_PICH]);
  1148. if(dz->brksize[IMP_CHIRP]) { // Divide by 10 then Convert to a power of 10
  1149. for(n=0,m=1;n < dz->brksize[IMP_CHIRP];n++,m+=2) // Vals 0 10 20 30
  1150. dz->brk[IMP_CHIRP][m] = pow(10.0,(dz->brk[IMP_CHIRP][m]/10.0)); // -> 0 1 2 3
  1151. } else // -> 1 10 100 1000
  1152. dz->param[IMP_CHIRP] = pow(10.0,(dz->param[IMP_CHIRP]/10.0));
  1153. dz->maxgap = 0.0;
  1154. if(dz->brksize[IMP_GAP]) { // Find if there is any overlap of impulses (-ve gaps)
  1155. if((exit_status = get_minvalue_in_brktable(&mingap,IMP_GAP,dz))<0)
  1156. return exit_status;
  1157. if((exit_status = get_maxvalue_in_brktable(&(dz->maxgap),IMP_GAP,dz))<0)
  1158. return exit_status;
  1159. } else {
  1160. mingap = dz->param[IMP_GAP];
  1161. dz->maxgap = dz->param[IMP_GAP];
  1162. }
  1163. if(mingap < 0.0)
  1164. dz->doublepass = 1;
  1165. else
  1166. dz->doublepass = 0;
  1167. dz->passcnt = dz->doublepass + 1;
  1168. return FINISHED;
  1169. }
  1170. /******************************** GETBUFMAX ********************************/
  1171. double getbufmax(double totalmax,int sampcnt,dataptr dz)
  1172. {
  1173. float *obuf = dz->sampbuf[1];
  1174. int n;
  1175. for(n=0;n<sampcnt;n++)
  1176. totalmax = max(totalmax,fabs(obuf[n]));
  1177. return totalmax;
  1178. }