ap_morph.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <cdpmain.h>
  25. #include <tkglobals.h>
  26. #include <pnames.h>
  27. #include <morph.h>
  28. #include <processno.h>
  29. #include <modeno.h>
  30. #include <globcon.h>
  31. #include <logic.h>
  32. #include <filetype.h>
  33. #include <mixxcon.h>
  34. #include <speccon.h>
  35. #include <flags.h>
  36. #include <arrays.h>
  37. #include <formants.h>
  38. #include <sfsys.h>
  39. #include <osbind.h>
  40. #include <string.h>
  41. #include <math.h>
  42. #include <srates.h>
  43. //#ifdef unix
  44. #define round(x) lround((x))
  45. //#endif
  46. /********************************************************************************************/
  47. /********************************** FORMERLY IN buffers.c ***********************************/
  48. /********************************************************************************************/
  49. int allocate_triple_buffer_for_bridge(dataptr dz);
  50. /********************************************************************************************/
  51. /********************************** FORMERLY IN pconsistency.c ******************************/
  52. /********************************************************************************************/
  53. static int check_compatibility_of_bridge_params(dataptr dz);
  54. static int check_consistency_of_morph_params(dataptr dz);
  55. /********************************************************************************************/
  56. /********************************** FORMERLY IN preprocess.c ********************************/
  57. /********************************************************************************************/
  58. static int setup_internal_params_and_arrays_for_glide(dataptr dz);
  59. static int setup_internal_params_for_bridge(dataptr dz);
  60. static int establish_interplen_and_if_head_or_tail_to_the_interp(int *wlen,dataptr dz);
  61. static int morph_preprocess(dataptr dz);
  62. static int make_morph_costable(dataptr dz);
  63. static int setup_internal_morph_params(dataptr dz);
  64. /***************************************************************************************/
  65. /****************************** FORMERLY IN aplinit.c **********************************/
  66. /***************************************************************************************/
  67. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  68. int establish_bufptrs_and_extra_buffers(dataptr dz)
  69. {
  70. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  71. dz->bptrcnt = 0;
  72. dz->bufcnt = 0;
  73. switch(dz->process) {
  74. case(GLIDE): dz->extra_bufcnt = 2; dz->bptrcnt = 2; break;
  75. case(BRIDGE): dz->extra_bufcnt = 0; dz->bptrcnt = 6; break;
  76. case(MORPH): dz->extra_bufcnt = 0; dz->bptrcnt = 4; break;
  77. default:
  78. sprintf(errstr,"Unknown program type [%d] in establish_bufptrs_and_extra_buffers()\n",dz->process);
  79. return(PROGRAM_ERROR);
  80. }
  81. if(dz->extra_bufcnt < 0) {
  82. sprintf(errstr,"bufcnts have not been set: establish_bufptrs_and_extra_buffers()\n");
  83. return(PROGRAM_ERROR);
  84. }
  85. return establish_spec_bufptrs_and_extra_buffers(dz);
  86. }
  87. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  88. int setup_internal_arrays_and_array_pointers(dataptr dz)
  89. {
  90. int n;
  91. dz->ptr_cnt = -1; /* base constructor...process */
  92. dz->array_cnt = -1;
  93. dz->iarray_cnt = -1;
  94. dz->larray_cnt = -1;
  95. switch(dz->process) {
  96. case(GLIDE): dz->array_cnt =1; dz->iarray_cnt =1; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  97. case(BRIDGE): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  98. case(MORPH): dz->array_cnt =1; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  99. }
  100. /*** WARNING ***
  101. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  102. **** WARNING ***/
  103. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  104. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  105. return(PROGRAM_ERROR);
  106. }
  107. if(dz->array_cnt > 0) {
  108. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  109. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  110. return(MEMORY_ERROR);
  111. }
  112. for(n=0;n<dz->array_cnt;n++)
  113. dz->parray[n] = NULL;
  114. }
  115. if(dz->iarray_cnt > 0) {
  116. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  117. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  118. return(MEMORY_ERROR);
  119. }
  120. for(n=0;n<dz->iarray_cnt;n++)
  121. dz->iparray[n] = NULL;
  122. }
  123. if(dz->larray_cnt > 0) {
  124. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  125. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  126. return(MEMORY_ERROR);
  127. }
  128. for(n=0;n<dz->larray_cnt;n++)
  129. dz->lparray[n] = NULL;
  130. }
  131. if(dz->ptr_cnt > 0) {
  132. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  133. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  134. return(MEMORY_ERROR);
  135. }
  136. for(n=0;n<dz->ptr_cnt;n++)
  137. dz->ptr[n] = NULL;
  138. }
  139. if(dz->fptr_cnt > 0) {
  140. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  141. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  142. return(MEMORY_ERROR);
  143. }
  144. for(n=0;n<dz->fptr_cnt;n++)
  145. dz->fptr[n] = NULL;
  146. }
  147. return(FINISHED);
  148. }
  149. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  150. int assign_process_logic(dataptr dz)
  151. {
  152. switch(dz->process) {
  153. case(GLIDE): setup_process_logic(TWO_ANALFILES, BIG_ANALFILE, ANALFILE_OUT, dz); break;
  154. case(BRIDGE): setup_process_logic(TWO_ANALFILES, BIG_ANALFILE, ANALFILE_OUT, dz); break;
  155. case(MORPH): setup_process_logic(TWO_ANALFILES, BIG_ANALFILE, ANALFILE_OUT, dz); break;
  156. default:
  157. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  158. return(PROGRAM_ERROR);
  159. break;
  160. }
  161. if(dz->has_otherfile) {
  162. switch(dz->input_data_type) {
  163. case(ALL_FILES):
  164. case(TWO_SNDFILES):
  165. case(SNDFILE_AND_ENVFILE):
  166. case(SNDFILE_AND_BRKFILE):
  167. case(SNDFILE_AND_UNRANGED_BRKFILE):
  168. case(SNDFILE_AND_DB_BRKFILE):
  169. break;
  170. case(MANY_SNDFILES):
  171. if(dz->process==INFO_TIMELIST)
  172. break;
  173. /* fall thro */
  174. default:
  175. sprintf(errstr,"Most processes accepting files with different properties\n"
  176. "can only take 2 sound infiles.\n");
  177. return(PROGRAM_ERROR);
  178. }
  179. }
  180. return(FINISHED);
  181. }
  182. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  183. *
  184. * Allows 2nd infile to have different props to first infile.
  185. */
  186. void set_legal_infile_structure(dataptr dz)
  187. {
  188. switch(dz->process) {
  189. default:
  190. dz->has_otherfile = FALSE;
  191. break;
  192. }
  193. }
  194. /****************************** FORMERLY IN internal.c *********************************/
  195. /***************************************************************************************/
  196. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  197. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  198. {
  199. int exit_status = FINISHED;
  200. switch(process) {
  201. case(GLIDE): return(FINISHED);
  202. case(BRIDGE): exit_status = set_internalparam_data("ddddiiii",ap); break;
  203. case(MORPH): exit_status = set_internalparam_data("iiiii",ap); break;
  204. default:
  205. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  206. return(PROGRAM_ERROR);
  207. }
  208. return(exit_status);
  209. }
  210. /********************************************************************************************/
  211. /********************************** FORMERLY IN specialin.c *********************************/
  212. /********************************************************************************************/
  213. /********************** READ_SPECIAL_DATA ************************/
  214. int read_special_data(char *str,dataptr dz)
  215. {
  216. aplptr ap = dz->application;
  217. switch(ap->special_data) {
  218. default:
  219. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  220. return(PROGRAM_ERROR);
  221. }
  222. return(FINISHED); /* NOTREACHED */
  223. }
  224. /********************************************************************************************/
  225. /********************************** FORMERLY IN preprocess.c ********************************/
  226. /********************************************************************************************/
  227. /****************************** PARAM_PREPROCESS *********************************/
  228. int param_preprocess(dataptr dz)
  229. {
  230. switch(dz->process) {
  231. case(GLIDE): return setup_internal_params_and_arrays_for_glide(dz);
  232. case(BRIDGE): return setup_internal_params_for_bridge(dz);
  233. case(MORPH): return morph_preprocess(dz);
  234. default:
  235. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  236. return(PROGRAM_ERROR);
  237. }
  238. return(FINISHED); /* NOTREACHED */
  239. }
  240. /************ SETUP_INTERNAL_PARAMS_AND_ARRAYS_FOR_GLIDE *************/
  241. int setup_internal_params_and_arrays_for_glide(dataptr dz)
  242. {
  243. dz->wlength = round(dz->param[GLIDE_DUR]/dz->frametime);
  244. if((dz->parray[GLIDE_INF] = (double *)malloc(dz->clength * sizeof(double)))==NULL) {
  245. sprintf(errstr,"INSUFFICIENT MEMORY for glide array.\n");
  246. return(MEMORY_ERROR);
  247. }
  248. if((dz->iparray[GLIDE_ZERO] = (int *)malloc(dz->clength * sizeof(int)))==NULL) {
  249. sprintf(errstr,"INSUFFICIENT MEMORY for glide zero array.\n");
  250. return(MEMORY_ERROR);
  251. }
  252. return(FINISHED);
  253. }
  254. /************ SETUP_INTERNAL_PARAMS_FOR_BRIDGE *************/
  255. int setup_internal_params_for_bridge(dataptr dz)
  256. {
  257. dz->param[BRG_TFAC] = 0.0;
  258. dz->iparam[BRG_SWIN] = 0;
  259. dz->iparam[BRG_INTPEND] = round(dz->param[BRG_ETIME]/dz->frametime);
  260. dz->iparam[BRG_STARTIS] = 0;
  261. dz->iparam[BRG_TAILIS] = 0;
  262. return establish_interplen_and_if_head_or_tail_to_the_interp(&(dz->wlength),dz);
  263. }
  264. /************** ESTABLISH_INTERPLEN_AND_IF_HEAD_OR_TAIL_TO_THE_INTERP **********/
  265. int establish_interplen_and_if_head_or_tail_to_the_interp(int *wlen,dataptr dz)
  266. {
  267. int interplen;
  268. int endwindow1 = dz->insams[0]/dz->wanted;
  269. int endwindow2 = dz->insams[1]/dz->wanted + round(dz->param[BRG_OFFSET]/dz->frametime);
  270. int endwindow = min(endwindow1,endwindow2);
  271. if(endwindow > dz->iparam[BRG_INTPEND]) /* If interp ends before snd end */
  272. dz->iparam[BRG_TAILIS] = 3; /* establish a tail */
  273. if(flteq(dz->param[BRG_EA2],1.0) /* if intp ends in pure 2nd snd */
  274. && flteq(dz->param[BRG_EF2],1.0)
  275. && dz->iparam[BRG_INTPEND] <= endwindow1) { /* after 1st sound has ended */
  276. dz->iparam[BRG_TAILIS] = 2; /* keep end of FILE2 */
  277. if(endwindow2 > endwindow)
  278. endwindow = endwindow2;
  279. }
  280. if(flteq(dz->param[BRG_EA2],0.0) /* if intp ends in pure 1st snd */
  281. && flteq(dz->param[BRG_EF2],0.0)
  282. && dz->iparam[BRG_INTPEND] <= endwindow2) { /* after 2nd sound has ended */
  283. dz->iparam[BRG_TAILIS] = 1; /* keep end of FILE1 */
  284. if(endwindow1 > endwindow)
  285. endwindow = endwindow1;
  286. }
  287. if(dz->param[BRG_STIME] > 0.0) {
  288. dz->iparam[BRG_STARTIS] = 3;
  289. dz->iparam[BRG_SWIN] = round(dz->param[BRG_STIME]/dz->frametime);
  290. if(flteq(dz->param[BRG_SA2],0.0) && flteq(dz->param[BRG_SF2],0.0))
  291. /* Start with snd1 before interp */
  292. dz->iparam[BRG_STARTIS] = 1;
  293. if(flteq(dz->param[BRG_SA2],1.0) && flteq(dz->param[BRG_SF2],1.0))
  294. /* Start with snd2 before interp */
  295. dz->iparam[BRG_STARTIS] = 2;
  296. }
  297. if((interplen = dz->iparam[BRG_INTPEND] - dz->iparam[BRG_SWIN])<0) {
  298. sprintf(errstr,"Starttime beyond end of one soundfile, or beyond endtime.\n");
  299. return(USER_ERROR);
  300. }
  301. dz->param[BRG_FSTEP] = (dz->param[BRG_EF2]
  302. - dz->param[BRG_SF2])/(double)interplen; /* FRQ INTERPOLATION STEP */
  303. dz->param[BRG_ASTEP] = (dz->param[BRG_EA2]
  304. - dz->param[BRG_SA2])/(double)interplen; /* AMP INTERPOLATION STEP */
  305. dz->param[BRG_TSTEP] = 2.0 * (1.0/(double)interplen);
  306. *wlen = endwindow;
  307. return(FINISHED);
  308. }
  309. /************************** MORPH_PREPROCESS ******************************/
  310. int morph_preprocess(dataptr dz)
  311. {
  312. int exit_status;
  313. if(dz->mode==MPH_COSIN) {
  314. if((exit_status = make_morph_costable(dz))<0)
  315. return(exit_status);
  316. }
  317. return setup_internal_morph_params(dz);
  318. }
  319. /************************ MAKE_MORPH_COSTABLE ***********************/
  320. int make_morph_costable(dataptr dz)
  321. {
  322. double d, d2;
  323. int n;
  324. d = PI/(double)MPH_COSTABSIZE;
  325. if((dz->parray[MPH_COS] = (double *)malloc((MPH_COSTABSIZE + 1) * sizeof(double)))==NULL) {
  326. sprintf(errstr,"INSUFFICIENT MEMORY for morph cosin table.\n");
  327. return(MEMORY_ERROR);
  328. }
  329. for(n=0;n<MPH_COSTABSIZE;n++) {
  330. d2 = cos((double)n * d);
  331. d2 += 1.0;
  332. d2 /= 2.0;
  333. d2 = 1.0 - d2;
  334. d2 = min(d2,1.0); /* trap calc errors */
  335. d2 = max(d2,0.0);
  336. dz->parray[MPH_COS][n] = d2;
  337. }
  338. dz->parray[MPH_COS][n] = 1.0; /* wrap-around point */
  339. return(FINISHED);
  340. }
  341. /********************** SETUP_INTERNAL_MORPH_PARAMS **********************/
  342. int setup_internal_morph_params(dataptr dz)
  343. {
  344. dz->iparam[MPH_AENDW] = round(dz->param[MPH_AEND]/dz->frametime);
  345. dz->iparam[MPH_ASTTW] = round(dz->param[MPH_ASTT]/dz->frametime);
  346. dz->iparam[MPH_FENDW] = round(dz->param[MPH_FEND]/dz->frametime);
  347. dz->iparam[MPH_FSTTW] = round(dz->param[MPH_FSTT]/dz->frametime);
  348. dz->iparam[MPH_STAGW] = round(dz->param[MPH_STAG]/dz->frametime);
  349. return(FINISHED);
  350. }
  351. /********************************************************************************************/
  352. /********************************** FORMERLY IN procspec.c **********************************/
  353. /********************************************************************************************/
  354. /**************************** SPEC_PROCESS_FILE ****************************/
  355. int spec_process_file(dataptr dz)
  356. {
  357. dz->total_windows = 0;
  358. display_virtual_time(0L,dz);
  359. switch(dz->process) {
  360. case(GLIDE): return specglide(dz);
  361. case(BRIDGE): return specbridge(dz);
  362. case(MORPH): return specmorph(dz);
  363. default:
  364. sprintf(errstr,"Unknown process in procspec()\n");
  365. return(PROGRAM_ERROR);
  366. }
  367. return(FINISHED); /* NOTREACHED */
  368. }
  369. /***************************** INNER_LOOP (redundant) **************************/
  370. int inner_loop
  371. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  372. {
  373. return(FINISHED);
  374. }
  375. /********************************************************************************************/
  376. /********************************** FORMERLY IN pconsistency.c ******************************/
  377. /********************************************************************************************/
  378. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  379. int check_param_validity_and_consistency(dataptr dz)
  380. {
  381. handle_pitch_zeros(dz);
  382. switch(dz->process) {
  383. case(BRIDGE): return check_compatibility_of_bridge_params(dz);
  384. case(MORPH): return check_consistency_of_morph_params(dz);
  385. }
  386. return(FINISHED);
  387. }
  388. /************** CHECK_COMPATIBILITY_OF_BRIDGE_PARAMS **********/
  389. int check_compatibility_of_bridge_params(dataptr dz)
  390. {
  391. double bridge_time;
  392. double infile0_dur = (dz->insams[0]/dz->wanted) * dz->frametime;
  393. double infile1_dur = (dz->insams[1]/dz->wanted) * dz->frametime;
  394. if(dz->param[BRG_OFFSET] >= infile0_dur - dz->frametime) {
  395. sprintf(errstr,"Offset incompatible with 1st file duration.\n");
  396. return(USER_ERROR);
  397. }
  398. if(!dz->vflag[IS_BRG_START])
  399. dz->param[BRG_STIME] = dz->param[BRG_OFFSET];
  400. if(!dz->vflag[IS_BRG_END])
  401. dz->param[BRG_ETIME] = min(infile0_dur,dz->param[BRG_OFFSET] + infile1_dur);
  402. bridge_time = dz->param[BRG_ETIME] - dz->param[BRG_STIME];
  403. if(bridge_time < dz->frametime) {
  404. sprintf(errstr,"Starttime and endtime incompatible.\n");
  405. return(USER_ERROR);
  406. }
  407. if(dz->param[BRG_OFFSET] > dz->param[BRG_STIME]) {
  408. sprintf(errstr,"time_offset beyond bridge starttime.\n");
  409. return(USER_ERROR);
  410. }
  411. if(dz->param[BRG_ETIME] > dz->param[BRG_OFFSET] + infile1_dur) {
  412. sprintf(errstr,"bridge endtime beyond end of 2nd file.\n");
  413. return(USER_ERROR);
  414. }
  415. return(FINISHED);
  416. }
  417. /********************** CHECK_CONSISTENCY_OF_MORPH_PARAMS **********************/
  418. int check_consistency_of_morph_params(dataptr dz)
  419. {
  420. double duration0 = (dz->insams[0]/dz->wanted) * dz->frametime;
  421. double duration1 = ((dz->insams[1]/dz->wanted) * dz->frametime)
  422. + dz->param[MPH_STAG];
  423. if(dz->param[MPH_ASTT] < dz->param[MPH_STAG]
  424. || dz->param[MPH_FSTT] < dz->param[MPH_STAG]) {
  425. sprintf(errstr,
  426. "start of amp or frq interpolation is set before entry of 2nd soundfile.\n");
  427. return(DATA_ERROR);
  428. }
  429. if(dz->param[MPH_AEND] > duration0 || dz->param[MPH_AEND] > duration1
  430. || dz->param[MPH_FEND] > duration0 || dz->param[MPH_FEND] > duration1) {
  431. sprintf(errstr,
  432. "end of amp or frq interpolation is beyond end of one of soundfiles.\n");
  433. return(DATA_ERROR);
  434. }
  435. if(dz->param[MPH_AEND] <= dz->param[MPH_ASTT]) {
  436. sprintf(errstr,"amp interpolation starttime is after (or equal to) its endtime.\n");
  437. return(USER_ERROR);
  438. }
  439. if(dz->param[MPH_FEND] <= dz->param[MPH_FSTT]) {
  440. sprintf(errstr,"frq interpolation starttime is after (or equal to) its endtime.\n");
  441. return(USER_ERROR);
  442. }
  443. return(FINISHED);
  444. }
  445. /********************************************************************************************/
  446. /********************************** FORMERLY IN buffers.c ***********************************/
  447. /********************************************************************************************/
  448. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  449. int allocate_large_buffers(dataptr dz)
  450. {
  451. switch(dz->process) {
  452. case(GLIDE): return allocate_single_buffer_plus_extra_pointer(dz);
  453. case(BRIDGE): return allocate_triple_buffer_for_bridge(dz);
  454. case(MORPH): return allocate_double_buffer(dz);
  455. }
  456. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  457. return(PROGRAM_ERROR);
  458. }
  459. /**************************** ALLOCATE_TRIPLE_BUFFER_FOR_BRIDGE ******************************/
  460. int allocate_triple_buffer_for_bridge(dataptr dz)
  461. {
  462. unsigned int buffersize;
  463. if(dz->bptrcnt < 5) {
  464. sprintf(errstr,"Insufficient bufptrs established in allocate_triple_buffer_for_bridge()\n");
  465. return(PROGRAM_ERROR);
  466. }
  467. //TW REVISED: , as buffers no longer have to be in sector lengths
  468. buffersize = dz->wanted * BUF_MULTIPLIER;
  469. if((dz->bigfbuf = (float*)malloc((size_t)(buffersize * 3 * sizeof(float))))==NULL) {
  470. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  471. return(MEMORY_ERROR);
  472. }
  473. dz->big_fsize = buffersize;
  474. //TW ADDED
  475. dz->buflen = buffersize;
  476. dz->flbufptr[2] = dz->bigfbuf + dz->big_fsize;
  477. dz->flbufptr[3] = dz->flbufptr[2] + dz->big_fsize;
  478. dz->flbufptr[4] = dz->flbufptr[3] + dz->big_fsize; /* flbufptr[3-4] are static ptrs */
  479. /* NB MOVING POINTERS NOT ESTABLISHED HERE !! */
  480. return(FINISHED);
  481. }
  482. /********************************************************************************************/
  483. /********************************** FORMERLY IN cmdline.c ***********************************/
  484. /********************************************************************************************/
  485. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  486. {
  487. if (!strcmp(prog_identifier_from_cmdline,"glide")) dz->process = GLIDE;
  488. else if(!strcmp(prog_identifier_from_cmdline,"bridge")) dz->process = BRIDGE;
  489. else if(!strcmp(prog_identifier_from_cmdline,"morph")) dz->process = MORPH;
  490. else {
  491. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  492. return(USAGE_ONLY);
  493. }
  494. return(FINISHED);
  495. }
  496. /********************************************************************************************/
  497. /********************************** FORMERLY IN usage.c *************************************/
  498. /********************************************************************************************/
  499. /******************************** USAGE1 ********************************/
  500. int usage1(void)
  501. {
  502. sprintf(errstr,
  503. "\nMORPHING BETWEEN SPECTRAL FILES\n\n"
  504. "USAGE: morph NAME (mode) infile infile2 outfile parameters: \n"
  505. "\n"
  506. "where NAME can be any one of\n"
  507. "\n"
  508. "glide bridge morph\n\n"
  509. "Type 'morph glide' for more info on morph glide..ETC.\n");
  510. return(USAGE_ONLY);
  511. }
  512. /******************************** USAGE2 ********************************/
  513. int usage2(char *str)
  514. {
  515. if(!strcmp(str,"glide")) {
  516. fprintf(stdout,
  517. "morph glide infile infile2 outfile duration\n\n"
  518. "INTERPOLATE, LINEARLY, BETWEEN 2 SINGLE ANALYSIS WINDOWS\n"
  519. " EXTRACTED WITH spec grab.\n\n"
  520. "INFILE1, INFILE2 are single-window analysis files.\n"
  521. "DURATION is duration of output sound required.\n");
  522. } else if(!strcmp(str,"bridge")) {
  523. fprintf(stdout,
  524. "morph bridge mode infile1 infile2 outfile\n"
  525. " [-aoffset] [-bsf2] [-csa2] [-def2] [-eea2] [-fstart] [-gend]\n\n"
  526. " MAKE A BRIDGING-INTERPOLATION BETWEEN TWO SOUND SPECTRA\n"
  527. "BY INTERPOLATING BETWEEN 2 TIME-SPECIFIED WINDOWS IN THE 2 INFILES.\n\n"
  528. "OFFSET time infile2 starts, relative to start of file1: (>=0) default: 0.0\n"
  529. "SF2 fraction of 2nd sound's frq interpolated at START.(default 0)\n"
  530. "SA2 fraction of 2nd sound's amp interpolated at START.(default 0)\n"
  531. "...if an OFFSET is used, when SF2 or SA2 are set NON-zero,\n"
  532. "...outsound starts from point where 2nd sound enters.\n"
  533. "EF2 fraction of 2nd sound's frq interpolated at END.(default 1)\n"
  534. "EA2 fraction of 2nd sound's amp interpolated at END.(default 1)\n\n"
  535. "...if EF2 or EA2 are set < 1.0 , outsound ends at end of first sound to end.\n"
  536. "START time in infile1, of startwindow for interp, (secs): default: 0.0\n"
  537. "END time in infile1 of endwindow of interp: default: end_of_file\n"
  538. "...if START and END are not specified\n"
  539. "...interp runs from OFFSET to end of 1st file to end.\n"
  540. "MODES....\n"
  541. "(1) output level is direct result of interpolation.\n"
  542. "(2) output level follows moment to moment minimum of the 2 infile amplitudes.\n"
  543. "(3) output level follows moment to moment amplitude of infile1.\n"
  544. "(4) output level follows moment to moment amplitude of infile2.\n"
  545. "(5) output level moves, through interp, from that of file1 to that of file2.\n"
  546. "(6) output level moves, through interp, from that of file2 to that of file1.\n");
  547. } else if(!strcmp(str,"morph")) {
  548. fprintf(stdout,
  549. "morph morph mode infile infile2 outfile as ae fs fe expa expf [-sstagger]\n\n"
  550. "MORPH ONE SPECTRUM INTO ANOTHER.\n\n"
  551. "as is time(secs) when amplitude-interpolation starts.\n"
  552. "ae is time(secs) when amplitude-interpolation ends.\n"
  553. "fs is time(secs) when frequency-interpolation starts.\n"
  554. "fe is time(secs) when frequency-interpolation ends.\n"
  555. "expa is exponent of amplitude interpolation.\n"
  556. "expf is exponent of frequency interpolation.\n"
  557. "stagger is time-delay of entry of 2nd file (defalut 0.0).\n\n"
  558. "MODES..\n"
  559. "(1) interpolate linearly (exp 1)\n"
  560. " or over a curve of increasing (exp >1) or decreasing (exp <1) slope.\n"
  561. "(2) interpolate over a cosinusoidal spline.\n");
  562. } else
  563. fprintf(stdout,"Unknown option '%s'\n",str);
  564. return(USAGE_ONLY);
  565. }
  566. /******************************** USAGE3 ********************************/
  567. int usage3(char *str1,char *str2)
  568. {
  569. sprintf(errstr,"Insufficient parameters on command line.\n");
  570. return(USAGE_ONLY);
  571. }