ap_pinfo.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  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 <specpinfo.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. /********************************************************************************************/
  44. /********************************** FORMERLY IN pconsistency.c ******************************/
  45. /********************************************************************************************/
  46. static int check_data_for_pwrite(dataptr dz);
  47. static int are_pitch_zeros(dataptr dz);
  48. /********************************************************************************************/
  49. /********************************** FORMERLY IN preprocess.c ********************************/
  50. /********************************************************************************************/
  51. static int phear_preprocess(dataptr dz);
  52. static int establish_pinfo_internal_param_default_vals(dataptr dz);
  53. static int setup_internal_params_for_pwrite(dataptr dz);
  54. /***************************************************************************************/
  55. /****************************** FORMERLY IN aplinit.c **********************************/
  56. /***************************************************************************************/
  57. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  58. int establish_bufptrs_and_extra_buffers(dataptr dz)
  59. {
  60. int exit_status;
  61. int is_spec = FALSE;
  62. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  63. dz->bptrcnt = 0;
  64. dz->bufcnt = 0;
  65. switch(dz->process) {
  66. case(P_INFO): dz->extra_bufcnt = 0; dz->bptrcnt = 0; is_spec = TRUE; break;
  67. case(P_ZEROS): dz->extra_bufcnt = 0; dz->bptrcnt = 0; is_spec = TRUE; break;
  68. case(P_SEE): dz->extra_bufcnt = 0; dz->bufcnt = 1; is_spec = FALSE; break;
  69. case(P_HEAR): dz->extra_bufcnt = 3; dz->bptrcnt = 2; is_spec = TRUE; break;
  70. case(P_WRITE): dz->extra_bufcnt = 0; dz->bptrcnt = 0; is_spec = TRUE; break;
  71. default:
  72. sprintf(errstr,"Unknown program type [%d] in establish_bufptrs_and_extra_buffers()\n",dz->process);
  73. return(PROGRAM_ERROR);
  74. }
  75. if(dz->extra_bufcnt < 0) {
  76. sprintf(errstr,"bufcnts have not been set: establish_bufptrs_and_extra_buffers()\n");
  77. return(PROGRAM_ERROR);
  78. }
  79. if(is_spec)
  80. return establish_spec_bufptrs_and_extra_buffers(dz);
  81. else if((dz->process==HOUSE_SPEC && dz->mode==HOUSE_CONVERT) || dz->process==INFO_DIFF) {
  82. if((exit_status = establish_spec_bufptrs_and_extra_buffers(dz))<0)
  83. return(exit_status);
  84. }
  85. return establish_groucho_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(P_INFO): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  97. case(P_ZEROS): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  98. case(P_SEE): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  99. case(P_HEAR): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  100. case(P_WRITE): dz->array_cnt =1; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  101. }
  102. /*** WARNING ***
  103. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  104. **** WARNING ***/
  105. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  106. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  107. return(PROGRAM_ERROR);
  108. }
  109. if(dz->array_cnt > 0) {
  110. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  111. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  112. return(MEMORY_ERROR);
  113. }
  114. for(n=0;n<dz->array_cnt;n++)
  115. dz->parray[n] = NULL;
  116. }
  117. if(dz->iarray_cnt > 0) {
  118. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  119. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  120. return(MEMORY_ERROR);
  121. }
  122. for(n=0;n<dz->iarray_cnt;n++)
  123. dz->iparray[n] = NULL;
  124. }
  125. if(dz->larray_cnt > 0) {
  126. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  127. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  128. return(MEMORY_ERROR);
  129. }
  130. for(n=0;n<dz->larray_cnt;n++)
  131. dz->lparray[n] = NULL;
  132. }
  133. if(dz->ptr_cnt > 0) {
  134. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  135. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  136. return(MEMORY_ERROR);
  137. }
  138. for(n=0;n<dz->ptr_cnt;n++)
  139. dz->ptr[n] = NULL;
  140. }
  141. if(dz->fptr_cnt > 0) {
  142. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  143. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  144. return(MEMORY_ERROR);
  145. }
  146. for(n=0;n<dz->fptr_cnt;n++)
  147. dz->fptr[n] = NULL;
  148. }
  149. return(FINISHED);
  150. }
  151. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  152. int assign_process_logic(dataptr dz)
  153. {
  154. switch(dz->process) {
  155. case(P_INFO): setup_process_logic(PITCHFILE_ONLY, SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  156. case(P_ZEROS): setup_process_logic(PITCHFILE_ONLY, SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  157. case(P_SEE): setup_process_logic(PITCH_OR_TRANSPOS, PITCH_TO_PSEUDOSND, SNDFILE_OUT, dz); break;
  158. case(P_HEAR): setup_process_logic(PITCHFILE_ONLY, PITCH_TO_ANAL, ANALFILE_OUT, dz); break;
  159. case(P_WRITE): setup_process_logic(PITCH_OR_TRANSPOS, TO_TEXTFILE, TEXTFILE_OUT, dz); break;
  160. default:
  161. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  162. return(PROGRAM_ERROR);
  163. break;
  164. }
  165. if(dz->has_otherfile) {
  166. switch(dz->input_data_type) {
  167. case(ALL_FILES):
  168. case(TWO_SNDFILES):
  169. case(SNDFILE_AND_ENVFILE):
  170. case(SNDFILE_AND_BRKFILE):
  171. case(SNDFILE_AND_UNRANGED_BRKFILE):
  172. case(SNDFILE_AND_DB_BRKFILE):
  173. break;
  174. case(MANY_SNDFILES):
  175. if(dz->process==INFO_TIMELIST)
  176. break;
  177. /* fall thro */
  178. default:
  179. sprintf(errstr,"Most processes accepting files with different properties\n"
  180. "can only take 2 sound infiles.\n");
  181. return(PROGRAM_ERROR);
  182. }
  183. }
  184. return(FINISHED);
  185. }
  186. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  187. *
  188. * Allows 2nd infile to have different props to first infile.
  189. */
  190. void set_legal_infile_structure(dataptr dz)
  191. {
  192. switch(dz->process) {
  193. default:
  194. dz->has_otherfile = FALSE;
  195. break;
  196. }
  197. }
  198. /***************************************************************************************/
  199. /****************************** FORMERLY IN internal.c *********************************/
  200. /***************************************************************************************/
  201. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  202. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  203. {
  204. int exit_status = FINISHED;
  205. switch(process) {
  206. case(P_INFO): exit_status = set_internalparam_data("ddddd",ap); break;
  207. case(P_ZEROS): return(FINISHED);
  208. case(P_SEE): return(FINISHED);
  209. case(P_HEAR): return(FINISHED);
  210. case(P_WRITE): return(FINISHED);
  211. default:
  212. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  213. return(PROGRAM_ERROR);
  214. }
  215. return(exit_status);
  216. }
  217. /********************************************************************************************/
  218. /********************************** FORMERLY IN specialin.c *********************************/
  219. /********************************************************************************************/
  220. /********************** READ_SPECIAL_DATA ************************/
  221. int read_special_data(char *str,dataptr dz)
  222. {
  223. aplptr ap = dz->application;
  224. switch(ap->special_data) {
  225. default:
  226. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  227. return(PROGRAM_ERROR);
  228. }
  229. return(FINISHED); /* NOTREACHED */
  230. }
  231. /********************************************************************************************/
  232. /********************************** FORMERLY IN preprocess.c ********************************/
  233. /********************************************************************************************/
  234. /****************************** PARAM_PREPROCESS *********************************/
  235. int param_preprocess(dataptr dz)
  236. {
  237. switch(dz->process) {
  238. case(P_HEAR): return phear_preprocess(dz);
  239. case(P_INFO): return establish_pinfo_internal_param_default_vals(dz);
  240. case(P_WRITE): return setup_internal_params_for_pwrite(dz);
  241. case(P_ZEROS): case(P_SEE):
  242. return(FINISHED);
  243. default:
  244. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  245. return(PROGRAM_ERROR);
  246. }
  247. return(FINISHED); /* NOTREACHED */
  248. }
  249. /************************** PHEAR_PREPROCESS ******************************/
  250. int phear_preprocess(dataptr dz)
  251. {
  252. int exit_status;
  253. if((exit_status = establish_testtone_amps(dz))<0)
  254. return(exit_status);
  255. return establish_bottom_frqs_of_channels(dz);
  256. }
  257. /********************** ESTABLISH_PINFO_INTERNAL_PARAM_DEFAULT_VALS **********************/
  258. int establish_pinfo_internal_param_default_vals(dataptr dz)
  259. {
  260. dz->param[PINF_MEAN] = 0.0;
  261. dz->param[PINF_MAX] = 0.0;
  262. dz->param[PINF_MIN] = dz->nyquist;
  263. return(FINISHED);
  264. }
  265. /************ SETUP_INTERNAL_PARAMS_FOR_PWRITE *************/
  266. int setup_internal_params_for_pwrite(dataptr dz)
  267. {
  268. dz->param[PW_DRED] /= 12.0;
  269. dz->param[PW_DRED] = pow(2.0,dz->param[PW_DRED]);
  270. dz->is_sharp = dz->param[PW_DRED];
  271. if(dz->is_sharp==0.0) {
  272. sprintf(errstr,"param not set in setup_internal_params_for_pwrite()\n");
  273. return(PROGRAM_ERROR);
  274. }
  275. dz->is_flat = 1.0/dz->is_sharp;
  276. return(FINISHED);
  277. }
  278. /********************************************************************************************/
  279. /********************************** FORMERLY IN procspec.c **********************************/
  280. /********************************************************************************************/
  281. /**************************** SPEC_PROCESS_FILE ****************************/
  282. int spec_process_file(dataptr dz)
  283. {
  284. dz->total_windows = 0;
  285. switch(dz->process) {
  286. case(P_INFO): return specpinfo(dz);
  287. case(P_ZEROS): return specpinfo(dz);
  288. case(P_SEE): return specpsee(dz);
  289. case(P_HEAR): return specphear(dz);
  290. case(P_WRITE): return specpwrite(dz);
  291. default:
  292. sprintf(errstr,"Unknown process in spec_process_file()\n");
  293. return(PROGRAM_ERROR);
  294. }
  295. return(FINISHED); /* NOTREACHED */
  296. }
  297. /***************************** INNER_LOOP (redundant) **************************/
  298. int inner_loop
  299. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  300. {
  301. return(FINISHED);
  302. }
  303. /********************************************************************************************/
  304. /********************************** FORMERLY IN pconsistency.c ******************************/
  305. /********************************************************************************************/
  306. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  307. int check_param_validity_and_consistency(dataptr dz)
  308. {
  309. int exit_status, chans, stype;
  310. int srate;
  311. handle_pitch_zeros(dz);
  312. switch(dz->process) {
  313. case(P_WRITE): return check_data_for_pwrite(dz);
  314. case(P_SEE):
  315. chans = dz->infile->channels;
  316. srate = dz->infile->srate;
  317. stype = dz->infile->stype;
  318. dz->infile->channels = 1;
  319. dz->infile->srate = dz->infile->origrate;
  320. dz->infile->stype = SAMP_SHORT;
  321. if((exit_status = create_sized_outfile(dz->wordstor[0],dz))<0)
  322. return(exit_status);
  323. dz->infile->channels = chans;
  324. dz->infile->srate = srate;
  325. dz->infile->stype = stype;
  326. break;
  327. case(P_HEAR):
  328. chans = dz->infile->channels;
  329. dz->infile->channels = dz->infile->origchans;
  330. if((exit_status = create_sized_outfile(dz->wordstor[0],dz))<0)
  331. return(exit_status);
  332. dz->infile->channels = chans;
  333. break;
  334. }
  335. return(FINISHED);
  336. }
  337. /************ CHECK_DATA_FOR_PWRITE *************/
  338. int check_data_for_pwrite(dataptr dz)
  339. {
  340. if(dz->is_transpos==FALSE && are_pitch_zeros(dz))
  341. return(DATA_ERROR);
  342. return(FINISHED);
  343. }
  344. /************************** ARE_PITCH_ZEROS ************************/
  345. int are_pitch_zeros(dataptr dz)
  346. {
  347. int n;
  348. for(n=0;n<dz->wlength;n++) {
  349. if(dz->pitches[n] < 0.0) {
  350. sprintf(errstr,"Input file contains unpitched windows: cannot proceed.\n");
  351. return(TRUE);
  352. }
  353. }
  354. return(FALSE);
  355. }
  356. /********************************************************************************************/
  357. /********************************** FORMERLY IN buffers.c ***********************************/
  358. /********************************************************************************************/
  359. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  360. int allocate_large_buffers(dataptr dz)
  361. {
  362. switch(dz->process) {
  363. case(P_SEE):
  364. return create_sndbufs(dz);
  365. case(P_HEAR):
  366. return allocate_single_buffer_plus_extra_pointer(dz);
  367. case(P_INFO): case(P_ZEROS): case(P_WRITE):
  368. return(FINISHED);
  369. default:
  370. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  371. return(PROGRAM_ERROR);
  372. }
  373. return(FINISHED); /* NOTREACHED */
  374. }
  375. /********************************************************************************************/
  376. /********************************** FORMERLY IN cmdline.c ***********************************/
  377. /********************************************************************************************/
  378. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  379. {
  380. if (!strcmp(prog_identifier_from_cmdline,"info")) dz->process = P_INFO;
  381. else if(!strcmp(prog_identifier_from_cmdline,"zeros")) dz->process = P_ZEROS;
  382. else if(!strcmp(prog_identifier_from_cmdline,"see")) dz->process = P_SEE;
  383. else if(!strcmp(prog_identifier_from_cmdline,"hear")) dz->process = P_HEAR;
  384. else if(!strcmp(prog_identifier_from_cmdline,"convert")) dz->process = P_WRITE;
  385. else {
  386. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  387. return(USAGE_ONLY);
  388. }
  389. //TW UPDATE
  390. return(FINISHED);
  391. }
  392. /********************************************************************************************/
  393. /********************************** FORMERLY IN usage.c *************************************/
  394. /********************************************************************************************/
  395. /******************************** USAGE1 ********************************/
  396. int usage1(void)
  397. {
  398. sprintf(errstr,
  399. "\nINFORMATION ON A BINARY PITCH FILE\n\n"
  400. "USAGE: pitchinfo NAME infile (outfile) parameters: \n"
  401. "\n"
  402. "where NAME can be any one of\n"
  403. "\n"
  404. "info zeros see hear convert\n\n"
  405. "Type 'pitchinfo info' for more info on pitchinfo info..ETC.\n");
  406. return(USAGE_ONLY);
  407. }
  408. /******************************** USAGE2 ********************************/
  409. int usage2(char *str)
  410. {
  411. if(!strcmp(str,"info")) {
  412. sprintf(errstr,
  413. "pitchinfo info pitchfile\n\n"
  414. "DISPLAY INFORMATION ABOUT PITCHDATA IN PITCHFILE.\n\n"
  415. "Finds mean pitch, max and min pitch (with timings), as Hz and MIDI.\n"
  416. "Also displays total range, in octaves and semitones.\n");
  417. } else if(!strcmp(str,"zeros")) {
  418. sprintf(errstr,
  419. "pitchinfo zeros pitchfile\n\n"
  420. "SHOWS WHETHER PITCHFILE CONTAINS UNINTERPOLATED ZEROS (UNPITCHED WINDOWS).\n");
  421. } else if(!strcmp(str,"see")) {
  422. fprintf(stdout,
  423. "pitchinfo see 1 pitchfile outsndfile scalefact\n"
  424. "pitchinfo see 2 transposfile outsndfile\n\n"
  425. "CONVERT BINARY PITCHFILE OR TRANSPOSITION-FILE TO PSEUDO-SNDFILE, FOR VIEWING.\n\n"
  426. "MODES....\n"
  427. "(1) PITCHFILE is a binary pitchdata file.\n"
  428. " SCALEFACT (> 0.0) multiplies pitch vals, for ease of viewing.\n"
  429. " Pitch data scaled by (e.g.) 100 can be read directly from 'sndfile'\n"
  430. " (Remembering to divide numeric values by 100).\n\n"
  431. "(2) TRANSPOSFILE is a binary transposition-data file.\n"
  432. " Transposition data is automatically scaled to half max range,\n"
  433. " And displayed in log format (0 = no transposition, + = up, - = down),\n"
  434. " giving a schematic idea ONLY, of transposition data.\n");
  435. } else if(!strcmp(str,"hear")) {
  436. sprintf(errstr,
  437. "pitchinfo hear pitchfile outfile [-ggain]\n\n"
  438. "CONVERT BINARY PITCHFILE TO ANALYSIS TESTTONE FILE.\n"
  439. " (RESYNTHESISE TO HEAR PITCH).\n\n"
  440. "-g gain > 0.0 (default: 1.0)\n");
  441. } else if(!strcmp(str,"convert")) {
  442. sprintf(errstr,
  443. "pitchinfo convert pitchfile outtextfile [-dI]\n\n"
  444. "CONVERT A BINARY PITCH-DATAFILE TO A TIME/FRQ BRKPNT TEXTFILE.\n\n"
  445. "-d I = acceptable pitch error in brkpntfile data-reduction. (semitones)\n"
  446. " (Range > 0.0 : Default = eighth_tone = %lf)\n",LOG2(EIGHTH_TONE)*SEMITONES_PER_OCTAVE);
  447. } else
  448. sprintf(errstr,"Unknown option '%s'\n",str);
  449. return(USAGE_ONLY);
  450. }
  451. /******************************** USAGE3 ********************************/
  452. int usage3(char *str1,char *str2)
  453. {
  454. if(!strcmp(str1,"info"))
  455. return(CONTINUE);
  456. else if(!strcmp(str1,"zeros"))
  457. return(CONTINUE);
  458. else
  459. sprintf(errstr,"Insufficient parameters on command line.\n");
  460. return(USAGE_ONLY);
  461. }