ap_sndinfo.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  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 <sndinfo.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 <flags.h>
  35. #include <speccon.h>
  36. #include <arrays.h>
  37. #include <special.h>
  38. #include <formants.h>
  39. #include <sfsys.h>
  40. #include <osbind.h>
  41. #include <string.h>
  42. #include <ctype.h>
  43. #include <math.h>
  44. /********************************************************************************************/
  45. /********************************** FORMERLY IN specialin.c *********************************/
  46. /********************************************************************************************/
  47. static int interval_to_semitones(char *str,dataptr dz);
  48. static int readnote_as_midi(char *str,dataptr dz);
  49. /***************************************************************************************/
  50. /****************************** FORMERLY IN aplinit.c **********************************/
  51. /***************************************************************************************/
  52. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  53. int establish_bufptrs_and_extra_buffers(dataptr dz)
  54. {
  55. int exit_status;
  56. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  57. dz->bptrcnt = 0;
  58. dz->bufcnt = 0;
  59. switch(dz->process) {
  60. case(INFO_PROPS): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  61. case(INFO_SFLEN): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  62. case(INFO_TIMELIST): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  63. case(INFO_TIMESUM): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  64. case(INFO_TIMEDIFF): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  65. case(INFO_SAMPTOTIME): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  66. case(INFO_TIMETOSAMP): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  67. case(INFO_MAXSAMP):
  68. case(INFO_MAXSAMP2): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  69. case(INFO_LOUDCHAN): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  70. case(INFO_FINDHOLE): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  71. case(INFO_DIFF): dz->extra_bufcnt = 0; dz->bufcnt = 2; dz->bptrcnt = 2; break;
  72. case(INFO_CDIFF): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  73. case(INFO_PRNTSND): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  74. case(INFO_MUSUNITS): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  75. case(INFO_LOUDLIST): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  76. case(ZCROSS_RATIO): dz->extra_bufcnt = 0; dz->bufcnt = 1; 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. if((dz->process==HOUSE_SPEC && dz->mode==HOUSE_CONVERT) || dz->process==INFO_DIFF) {
  86. if((exit_status = establish_spec_bufptrs_and_extra_buffers(dz))<0)
  87. return(exit_status);
  88. }
  89. return establish_groucho_bufptrs_and_extra_buffers(dz);
  90. }
  91. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  92. int setup_internal_arrays_and_array_pointers(dataptr dz)
  93. {
  94. int n;
  95. dz->ptr_cnt = -1; /* base constructor...process */
  96. dz->array_cnt = -1;
  97. dz->iarray_cnt = -1;
  98. dz->larray_cnt = -1;
  99. switch(dz->process) {
  100. case(INFO_PROPS):
  101. dz->array_cnt=1; dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt= 0; dz->fptr_cnt = 0;
  102. break;
  103. case(INFO_SFLEN): case(INFO_TIMELIST): case(INFO_TIMESUM): case(INFO_TIMEDIFF):
  104. case(INFO_SAMPTOTIME): case(INFO_TIMETOSAMP): case(INFO_MAXSAMP): case(INFO_LOUDCHAN):
  105. case(INFO_FINDHOLE): case(INFO_DIFF): case(INFO_CDIFF): case(INFO_PRNTSND):
  106. case(INFO_MUSUNITS): case(INFO_LOUDLIST): case(INFO_MAXSAMP2): case(ZCROSS_RATIO):
  107. dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt= 0; dz->fptr_cnt = 0;
  108. break;
  109. }
  110. /*** WARNING ***
  111. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  112. **** WARNING ***/
  113. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  114. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  115. return(PROGRAM_ERROR);
  116. }
  117. if(dz->array_cnt > 0) {
  118. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  119. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  120. return(MEMORY_ERROR);
  121. }
  122. for(n=0;n<dz->array_cnt;n++)
  123. dz->parray[n] = NULL;
  124. }
  125. if(dz->iarray_cnt > 0) {
  126. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  127. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  128. return(MEMORY_ERROR);
  129. }
  130. for(n=0;n<dz->iarray_cnt;n++)
  131. dz->iparray[n] = NULL;
  132. }
  133. if(dz->larray_cnt > 0) {
  134. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  135. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  136. return(MEMORY_ERROR);
  137. }
  138. for(n=0;n<dz->larray_cnt;n++)
  139. dz->lparray[n] = NULL;
  140. }
  141. if(dz->ptr_cnt > 0) {
  142. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  143. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  144. return(MEMORY_ERROR);
  145. }
  146. for(n=0;n<dz->ptr_cnt;n++)
  147. dz->ptr[n] = NULL;
  148. }
  149. if(dz->fptr_cnt > 0) {
  150. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  151. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  152. return(MEMORY_ERROR);
  153. }
  154. for(n=0;n<dz->fptr_cnt;n++)
  155. dz->fptr[n] = NULL;
  156. }
  157. return(FINISHED);
  158. }
  159. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  160. int assign_process_logic(dataptr dz)
  161. {
  162. switch(dz->process) {
  163. case(INFO_PROPS): setup_process_logic(ALL_FILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  164. case(INFO_SFLEN): setup_process_logic(ALL_FILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  165. //TW UPDATE
  166. case(INFO_TIMELIST):
  167. if(sloom)
  168. setup_process_logic(MANY_SNDFILES, TO_TEXTFILE, TEXTFILE_OUT, dz);
  169. else
  170. setup_process_logic(MANY_SNDFILES, OTHER_PROCESS, NO_OUTPUTFILE, dz);
  171. break;
  172. case(INFO_TIMESUM): setup_process_logic(MANY_SNDFILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  173. case(INFO_TIMEDIFF): setup_process_logic(TWO_SNDFILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  174. case(INFO_SAMPTOTIME): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  175. case(INFO_TIMETOSAMP): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  176. case(INFO_MAXSAMP):
  177. case(INFO_MAXSAMP2): setup_process_logic(ALL_FILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  178. case(INFO_LOUDCHAN): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  179. case(INFO_FINDHOLE): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  180. case(INFO_DIFF): setup_process_logic(ALL_FILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  181. case(INFO_CDIFF): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  182. case(INFO_PRNTSND): setup_process_logic(SNDFILES_ONLY, TO_TEXTFILE, TEXTFILE_OUT, dz); break;
  183. case(INFO_MUSUNITS): setup_process_logic(NO_FILE_AT_ALL, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  184. case(INFO_LOUDLIST): setup_process_logic(MANY_SNDFILES, TO_TEXTFILE, TEXTFILE_OUT, dz); break;
  185. case(ZCROSS_RATIO): setup_process_logic(SNDFILES_ONLY, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  186. default:
  187. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  188. return(PROGRAM_ERROR);
  189. break;
  190. }
  191. if(dz->has_otherfile) {
  192. switch(dz->input_data_type) {
  193. case(ALL_FILES):
  194. case(TWO_SNDFILES):
  195. case(SNDFILE_AND_ENVFILE):
  196. case(SNDFILE_AND_BRKFILE):
  197. case(SNDFILE_AND_UNRANGED_BRKFILE):
  198. case(SNDFILE_AND_DB_BRKFILE):
  199. break;
  200. case(MANY_SNDFILES):
  201. if(dz->process==INFO_TIMELIST || dz->process==INFO_LOUDLIST)
  202. break;
  203. /* fall thro */
  204. default:
  205. sprintf(errstr,"Most processes accepting files with different properties\n"
  206. "can only take 2 sound infiles.\n");
  207. return(PROGRAM_ERROR);
  208. }
  209. }
  210. return(FINISHED);
  211. }
  212. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  213. *
  214. * Allows 2nd infile to have different props to first infile.
  215. */
  216. void set_legal_infile_structure(dataptr dz)
  217. {
  218. switch(dz->process) {
  219. case(INFO_DIFF):
  220. case(INFO_TIMEDIFF):
  221. case(INFO_TIMELIST):
  222. case(INFO_LOUDLIST):
  223. dz->has_otherfile = TRUE;
  224. break;
  225. default:
  226. dz->has_otherfile = FALSE;
  227. break;
  228. }
  229. }
  230. /****************************** FORMERLY IN internal.c *********************************/
  231. /***************************************************************************************/
  232. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  233. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  234. {
  235. int exit_status = FINISHED;
  236. switch(process) {
  237. case(INFO_PROPS): case(INFO_SFLEN): case(INFO_TIMELIST): case(INFO_TIMESUM):
  238. case(INFO_TIMEDIFF): case(INFO_SAMPTOTIME): case(INFO_TIMETOSAMP): case(INFO_MAXSAMP):
  239. case(INFO_LOUDCHAN): case(INFO_FINDHOLE): case(INFO_DIFF): case(INFO_CDIFF):
  240. case(INFO_PRNTSND): case(INFO_MUSUNITS): case(INFO_LOUDLIST): case(INFO_MAXSAMP2):
  241. case(ZCROSS_RATIO):
  242. exit_status = set_internalparam_data("",ap); break;
  243. default:
  244. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  245. return(PROGRAM_ERROR);
  246. }
  247. return(exit_status);
  248. }
  249. /********************************************************************************************/
  250. /********************************** FORMERLY IN specialin.c *********************************/
  251. /********************************************************************************************/
  252. /********************** READ_SPECIAL_DATA ************************/
  253. int read_special_data(char *str,dataptr dz)
  254. {
  255. aplptr ap = dz->application;
  256. switch(ap->special_data) {
  257. case(NOTE_REPRESENTATION): return readnote_as_midi(str,dz);
  258. case(INTERVAL_REPRESENTATION): return interval_to_semitones(str,dz);
  259. default:
  260. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  261. return(PROGRAM_ERROR);
  262. }
  263. return(FINISHED); /* NOTREACHED */
  264. }
  265. /********************** INTERVAL_TO_SEMITONES **********************/
  266. int interval_to_semitones(char *str,dataptr dz)
  267. {
  268. char *p, *q;
  269. double d = 0, direction = 1.0;
  270. p = str + strlen(str) - 1;
  271. switch(*p) {
  272. case('u'): case('U'): d = .5; break;
  273. case('d'): case('D'): d = -.5; break;
  274. }
  275. q = str;
  276. if(*q=='-') {
  277. direction = -1.0;
  278. q++;
  279. }
  280. if (!strncmp(q,"m2",2)) dz->scalefact = (1.0+d)*direction;
  281. else if(!strncmp(q,"2",1)) dz->scalefact = (2.0+d)*direction;
  282. else if(!strncmp(q,"m3",2)) dz->scalefact = (3.0+d)*direction;
  283. else if(!strncmp(q,"3",1)) dz->scalefact = (4.0+d)*direction;
  284. else if(!strncmp(q,"4",1)) dz->scalefact = (5.0+d)*direction;
  285. else if(!strncmp(q,"#4",2)) dz->scalefact = (6.0+d)*direction;
  286. else if(!strncmp(q,"5",1)) dz->scalefact = (7.0+d)*direction;
  287. else if(!strncmp(q,"m6",2)) dz->scalefact = (8.0+d)*direction;
  288. else if(!strncmp(q,"6",1)) dz->scalefact = (9.0+d)*direction;
  289. else if(!strncmp(q,"m7",2)) dz->scalefact = (10.0+d)*direction;
  290. else if(!strncmp(q,"7",1)) dz->scalefact = (11.0+d)*direction;
  291. else if(!strncmp(q,"8",1)) dz->scalefact = (12.0+d)*direction;
  292. else if(!strncmp(q,"m9",2)) dz->scalefact = (13.0+d)*direction;
  293. else if(!strncmp(q,"9",1)) dz->scalefact = (14.0+d)*direction;
  294. else if(!strncmp(q,"m10",3)) dz->scalefact = (15.0+d)*direction;
  295. else if(!strncmp(q,"10",2)) dz->scalefact = (16.0+d)*direction;
  296. else if(!strncmp(q,"11",2)) dz->scalefact = (17.0+d)*direction;
  297. else if(!strncmp(q,"#11",3)) dz->scalefact = (18.0+d)*direction;
  298. else if(!strncmp(q,"12",2)) dz->scalefact = (19.0+d)*direction;
  299. else if(!strncmp(q,"m13",3)) dz->scalefact = (20.0+d)*direction;
  300. else if(!strncmp(q,"13",2)) dz->scalefact = (21.0+d)*direction;
  301. else if(!strncmp(q,"m14",3)) dz->scalefact = (22.0+d)*direction;
  302. else if(!strncmp(q,"14",2)) dz->scalefact = (23.0+d)*direction;
  303. else if(!strncmp(q,"15",2)) dz->scalefact = (24.0+d)*direction;
  304. else {
  305. sprintf(errstr,"Unknown interval.\n");
  306. return(GOAL_FAILED);
  307. } return FINISHED;
  308. }
  309. /************************ READNOTE_AS_MIDI *************************/
  310. int readnote_as_midi(char *str,dataptr dz)
  311. {
  312. int oct, isquarter = 0;
  313. int flat = 0, sharp = 0, accidental = 0, quarter = 0;
  314. char *p = str + strlen(str) - 1;
  315. if(!isdigit(*p)) {
  316. if(*p=='u' || *p=='d') {
  317. sprintf(errstr,"'u' or 'd' come BEFORE 8va-number in note-representation.\n");
  318. return(GOAL_FAILED);
  319. } else {
  320. sprintf(errstr,"Invalid note-representation.\n");
  321. return(GOAL_FAILED);
  322. }
  323. }
  324. if(*(str+1)=='b') {
  325. flat = 1;
  326. accidental = 1;
  327. } else {
  328. if(*(str+1)=='#') {
  329. sharp = 1;
  330. accidental = 1;
  331. }
  332. }
  333. if(*(str+1+accidental)=='u') {
  334. quarter = 1;
  335. isquarter = 1;
  336. } else {
  337. if(*(str+1+accidental)=='d') {
  338. quarter = -1;
  339. isquarter = 1;
  340. }
  341. }
  342. if(sscanf(str+1+accidental+isquarter,"%d",&oct)!=1) {
  343. sprintf(errstr,"Note octave not specified.\n");
  344. return(GOAL_FAILED);
  345. }
  346. switch(*str) {
  347. case('c'): case('C'): dz->scalefact = 0.0; break;
  348. case('d'): case('D'): dz->scalefact = 2.0; break;
  349. case('e'): case('E'): dz->scalefact = 4.0; break;
  350. case('f'): case('F'): dz->scalefact = 5.0; break;
  351. case('g'): case('G'): dz->scalefact = 7.0; break;
  352. case('a'): case('A'): dz->scalefact = 9.0; break;
  353. case('b'): case('B'): dz->scalefact = 11.0; break;
  354. default:
  355. sprintf(errstr,"Unknown note '%c'\n",*str);
  356. return(GOAL_FAILED);
  357. }
  358. if(flat) dz->scalefact -= 1.0;
  359. if(sharp) dz->scalefact += 1.0;
  360. oct += 5;
  361. dz->scalefact += ((double)oct * 12.0);
  362. dz->scalefact += ((double)quarter * 0.5);
  363. return(FINISHED);
  364. }
  365. /********************************************************************************************/
  366. /********************************** FORMERLY IN preprocess.c ********************************/
  367. /********************************************************************************************/
  368. /****************************** PARAM_PREPROCESS *********************************/
  369. int param_preprocess(dataptr dz)
  370. {
  371. double temp;
  372. switch(dz->process) {
  373. case(INFO_PROPS): case(INFO_SFLEN): case(INFO_TIMELIST):
  374. case(INFO_TIMESUM): case(INFO_TIMEDIFF): case(INFO_SAMPTOTIME):
  375. case(INFO_TIMETOSAMP): case(INFO_LOUDCHAN):
  376. case(INFO_FINDHOLE): case(INFO_DIFF): case(INFO_CDIFF):
  377. case(INFO_PRNTSND): case(INFO_MUSUNITS): case(INFO_LOUDLIST):
  378. case(INFO_MAXSAMP):
  379. break;
  380. case(ZCROSS_RATIO):
  381. if(flteq(dz->param[ZC_START],dz->param[ZC_END])) {
  382. sprintf(errstr,"Start and Endtime of search are too close.\n");
  383. return(DATA_ERROR);
  384. }
  385. if(dz->param[ZC_START] < 0.0)
  386. dz->param[ZC_START] = 0.0;
  387. if(dz->param[ZC_END] > dz->duration)
  388. dz->param[ZC_END] = dz->duration;
  389. if(dz->param[ZC_START] > dz->param[ZC_END]) {
  390. temp = dz->param[ZC_START];
  391. dz->param[ZC_START] = dz->param[ZC_END];
  392. dz->param[ZC_END] = temp;
  393. }
  394. break;
  395. case(INFO_MAXSAMP2):
  396. if(flteq(dz->param[MAX_ETIME],dz->param[MAX_STIME])) {
  397. sprintf(errstr,"Start and Endtime of search are too close.\n");
  398. return(DATA_ERROR);
  399. }
  400. if(dz->param[MAX_ETIME] < dz->param[MAX_STIME]) {
  401. temp = dz->param[MAX_ETIME];
  402. dz->param[MAX_ETIME] = dz->param[MAX_STIME];
  403. dz->param[MAX_STIME] = temp;
  404. }
  405. break;
  406. default:
  407. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  408. return(PROGRAM_ERROR);
  409. }
  410. return(FINISHED);
  411. }
  412. /********************************************************************************************/
  413. /********************************** FORMERLY IN procgrou.c **********************************/
  414. /********************************************************************************************/
  415. /**************************** GROUCHO_PROCESS_FILE ****************************/
  416. int groucho_process_file(dataptr dz) /* FUNCTIONS FOUND IN PROCESS.C */
  417. {
  418. switch(dz->process) {
  419. case(INFO_PROPS): case(INFO_SFLEN): case(INFO_TIMELIST): case(INFO_TIMESUM):
  420. case(INFO_TIMEDIFF): case(INFO_SAMPTOTIME): case(INFO_TIMETOSAMP): case(INFO_MAXSAMP):
  421. case(INFO_LOUDCHAN): case(INFO_FINDHOLE): case(INFO_DIFF): case(INFO_CDIFF):
  422. case(INFO_PRNTSND): case(INFO_LOUDLIST): case(INFO_MAXSAMP2): case(ZCROSS_RATIO):
  423. return do_sndinfo(dz);
  424. case(INFO_MUSUNITS):
  425. return do_musunits(dz);
  426. default:
  427. sprintf(errstr,"Unknown case in process_file()\n");
  428. return(PROGRAM_ERROR);
  429. }
  430. return(FINISHED); /* NOTREACHED */
  431. }
  432. /********************************************************************************************/
  433. /********************************** FORMERLY IN pconsistency.c ******************************/
  434. /********************************************************************************************/
  435. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  436. int check_param_validity_and_consistency(dataptr dz)
  437. {
  438. handle_pitch_zeros(dz);
  439. return(FINISHED);
  440. }
  441. /********************************************************************************************/
  442. /********************************** FORMERLY IN buffers.c ***********************************/
  443. /********************************************************************************************/
  444. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  445. int allocate_large_buffers(dataptr dz)
  446. {
  447. int exit_status;
  448. int orig_chancnt = 0;
  449. switch(dz->process) {
  450. case(INFO_PROPS): case(INFO_TIMESUM): case(INFO_SAMPTOTIME): case(INFO_TIMETOSAMP):
  451. case(INFO_SFLEN): case(INFO_TIMELIST): case(INFO_TIMEDIFF): case(INFO_MUSUNITS):
  452. break;
  453. case(INFO_MAXSAMP): case(INFO_FINDHOLE): case(INFO_PRNTSND): case(INFO_MAXSAMP2):
  454. case(INFO_LOUDCHAN): case(INFO_LOUDLIST):
  455. case(ZCROSS_RATIO):
  456. return create_sndbufs(dz);
  457. case(INFO_DIFF): case(INFO_CDIFF):
  458. if(dz->infile->filetype == ANALFILE) {
  459. orig_chancnt = dz->infile->channels;
  460. dz->infile->channels = 1;
  461. }
  462. if ((exit_status = create_sndbufs(dz))<0)
  463. return exit_status;
  464. if(dz->infile->filetype == ANALFILE)
  465. dz->infile->channels = orig_chancnt;
  466. return FINISHED;
  467. default:
  468. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  469. return(PROGRAM_ERROR);
  470. }
  471. return(FINISHED);
  472. }
  473. /********************************************************************************************/
  474. /********************************** FORMERLY IN cmdline.c ***********************************/
  475. /********************************************************************************************/
  476. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  477. {
  478. if (!strcmp(prog_identifier_from_cmdline,"props")) dz->process = INFO_PROPS;
  479. else if(!strcmp(prog_identifier_from_cmdline,"len")) dz->process = INFO_SFLEN;
  480. else if(!strcmp(prog_identifier_from_cmdline,"lens")) dz->process = INFO_TIMELIST;
  481. else if(!strcmp(prog_identifier_from_cmdline,"sumlen")) dz->process = INFO_TIMESUM;
  482. else if(!strcmp(prog_identifier_from_cmdline,"timediff")) dz->process = INFO_TIMEDIFF;
  483. else if(!strcmp(prog_identifier_from_cmdline,"smptime")) dz->process = INFO_SAMPTOTIME;
  484. else if(!strcmp(prog_identifier_from_cmdline,"timesmp")) dz->process = INFO_TIMETOSAMP;
  485. else if(!strcmp(prog_identifier_from_cmdline,"maxsamp")) dz->process = INFO_MAXSAMP;
  486. else if(!strcmp(prog_identifier_from_cmdline,"maxsamp2")) dz->process = INFO_MAXSAMP2;
  487. else if(!strcmp(prog_identifier_from_cmdline,"loudchan")) dz->process = INFO_LOUDCHAN;
  488. else if(!strcmp(prog_identifier_from_cmdline,"findhole")) dz->process = INFO_FINDHOLE;
  489. else if(!strcmp(prog_identifier_from_cmdline,"diff")) dz->process = INFO_DIFF;
  490. else if(!strcmp(prog_identifier_from_cmdline,"chandiff")) dz->process = INFO_CDIFF;
  491. else if(!strcmp(prog_identifier_from_cmdline,"prntsnd")) dz->process = INFO_PRNTSND;
  492. else if(!strcmp(prog_identifier_from_cmdline,"units")) dz->process = INFO_MUSUNITS;
  493. else if(!strcmp(prog_identifier_from_cmdline,"maxi")) dz->process = INFO_LOUDLIST;
  494. else if(!strcmp(prog_identifier_from_cmdline,"zcross")) dz->process = ZCROSS_RATIO;
  495. else {
  496. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  497. return(USAGE_ONLY);
  498. }
  499. return FINISHED;
  500. }
  501. /********************************************************************************************/
  502. /********************************** FORMERLY IN usage.c *************************************/
  503. /********************************************************************************************/
  504. /******************************** USAGE1 ********************************/
  505. int usage1(void)
  506. {
  507. sprintf(errstr,
  508. "USAGE: sndreport NAME (mode) infile(s) (outfile) (parameters)\n"
  509. "\n"
  510. "where NAME can be any one of\n"
  511. "\n"
  512. "props len lens sumlen timediff\n"
  513. "smptime timesmp maxsamp maxsamp2 loudchan findhole\n"
  514. "diff chandiff prntsnd units maxi zcross\n"
  515. "\n"
  516. "Type 'sndreport timediff' for more info on info timediff option... ETC.\n");
  517. return(USAGE_ONLY);
  518. }
  519. /******************************** USAGE2 ********************************/
  520. int usage2(char *str)
  521. {
  522. if(!strcmp(str,"props")) {
  523. sprintf(errstr,
  524. "DISPLAY PROPERTIES OF A SNDFILING-SYSTEM FILE\n\n"
  525. "USAGE: sndreport props infile\n");
  526. } else if(!strcmp(str,"len")) {
  527. sprintf(errstr,
  528. "DISPLAY DURATION OF A SNDFILING-SYSTEM FILE\n\n"
  529. "USAGE: sndreport len infile\n");
  530. } else if(!strcmp(str,"lens")) {
  531. sprintf(errstr,
  532. "LIST DURATIONS OF SEVERAL SNDFILING-SYSTEM FILES\n\n"
  533. "USAGE: sndreport lens infile [infile2..]\n");
  534. } else if(!strcmp(str,"maxi")) {
  535. sprintf(errstr,
  536. "LIST LEVELS OF SEVERAL SOUNDFILES\n\n"
  537. //TW UPDATE
  538. "USAGE: sndreport maxi infile infile2 [infile3..] outfile\n");
  539. } else if(!strcmp(str,"sumlen")) {
  540. sprintf(errstr,
  541. "SUM DURATIONS OF SEVERAL SNDFILING-SYSTEM FILES\n\n"
  542. "USAGE: sndreport sumlen infile infile2 [infile3..] [-ssplicelen]\n\n"
  543. " SPLICELEN is in milliseconds. (Default: 15ms)\n");
  544. } else if(!strcmp(str,"timediff")) {
  545. sprintf(errstr,
  546. "FIND DIFFERENCE IN DURATION OF TWO SOUND FILES\n\n"
  547. "USAGE: sndreport timediff infile1 infile2\n");
  548. } else if(!strcmp(str,"smptime")) {
  549. sprintf(errstr,
  550. "CONVERT SAMPLE COUNT TO TIME IN SOUNDFILE\n\n"
  551. "USAGE: sndreport smptime infile samplecnt [-g]\n\n"
  552. "-g sample count is count of GROUPED samples\n"
  553. " e.g. stereo file: sample-PAIRS counted.\n");
  554. } else if(!strcmp(str,"timesmp")) {
  555. sprintf(errstr,
  556. "CONVERT TIME TO SAMPLE COUNT IN SOUNDFILE\n\n"
  557. "USAGE: sndreport timesmp infile time [-g]\n\n"
  558. "-g sample count is count of GROUPED samples\n"
  559. " e.g. stereo file: sample-PAIRS counted.\n");
  560. } else if(!strcmp(str,"maxsamp")) {
  561. sprintf(errstr,
  562. "FIND MAXIMUM SAMPLE IN SOUNDFILE OR BINARY DATA FILE\n\n"
  563. "USAGE: sndreport maxsamp infile [-f]\n"
  564. "-f Force file to be scanned\n"
  565. " (Ignore any header info about max sample)\n");
  566. } else if(!strcmp(str,"maxsamp2")) {
  567. sprintf(errstr,
  568. "FIND MAXIMUM SAMPLE WITHIN TIMERANGE IN SOUNDFILE\n\n"
  569. "USAGE: sndreport maxsamp2 infile start end\n\n"
  570. "start starttime of search in file\n"
  571. "end endtime of search in file\n");
  572. } else if(!strcmp(str,"loudchan")) {
  573. sprintf(errstr,
  574. "FIND LOUDEST CHANNEL IN A STEREO SOUNDFILE\n\n"
  575. "USAGE: sndreport loudchan infile\n");
  576. } else if(!strcmp(str,"findhole")) {
  577. sprintf(errstr,
  578. "FIND LARGEST LOW LEVEL HOLE IN A SOUNDFILE\n\n"
  579. "USAGE: sndreport findhole infile [-tthreshold]\n\n"
  580. "THRESHOLD hole only if level falls and stays below threshold (default: 0).\n");
  581. } else if(!strcmp(str,"diff")) {
  582. sprintf(errstr,
  583. "COMPARE 2 SOUND,ANALYSIS,PITCH,TRANSPOSITION,ENVELOPE OR FORMANT FILES\n\n"
  584. "USAGE: sndreport diff infile1 infile2 [-tthreshold] [-ncnt] [-l] [-c]\n\n"
  585. "THRESHOLD max permissible difference in data values:\n"
  586. "CNT MAX NUMBER of differences to accept (default 1).\n"
  587. "-l continue, even if files are not same LENGTH\n"
  588. "-c continue, even if (snd)files don't have same no of CHANNELS\n\n"
  589. "This process works with binary (non-text) files only.\n");
  590. } else if(!strcmp(str,"chandiff")) {
  591. sprintf(errstr,
  592. "COMPARE CHANNELS IN A STEREO SOUNDFILE\n\n"
  593. "USAGE: sndreport chandiff infile [-tthreshold] [-ncnt]\n\n"
  594. "THRESHOLD max permissible difference in data values.\n"
  595. "CNT MAX NUMBER of differences to accept (default 1).\n"
  596. " NB: The output sample display is counted in sample-pairs.\n");
  597. } else if(!strcmp(str,"prntsnd")) {
  598. sprintf(errstr,
  599. "PRINT SOUND SAMPLE DATA TO A TEXTFILE\n\n"
  600. "USAGE: sndreport prntsnd infile outtextfile starttime endtime\n\n"
  601. "CARE!!! large quantities of data.\n");
  602. } else if(!strcmp(str,"units")) {
  603. fprintf(stdout,
  604. "CONVERT BETWEEN DIFFERENT UNITS\n\n"
  605. "USAGE: sndreport units mode value\n\n"
  606. " MODES ARE\n\n"
  607. " PITCH INTERVAL SPEED\n"
  608. " ----- -------- -----\n"
  609. "(1) MIDI to FRQ (7) FRQ RATIO to SEMITONES (16) FRQ RATIO to TIME RATIO\n"
  610. "(2) FRQ to MIDI (8) FRQ RATIO to INTERVAL (17) SEMITONES to TIME RATIO\n"
  611. "(3) NOTE to FRQ (9) INTERVAL to FRQ RATIO (18) OCTAVES to TIME RATIO\n"
  612. "(4) NOTE to MIDI (10) SEMITONES to FRQ RATIO (19) INTERVAL to TIME RATIO\n"
  613. "(5) FRQ to NOTE (11) OCTAVES to FRQ RATIO (20) TIME RATIO to FRQ RATIO\n"
  614. "(6) MIDI to NOTE (12) OCTAVES to SEMITONES (21) TIME RATIO to SEMITONES\n"
  615. " (13) FRQ RATIO to OCTAVES (22) TIME RATIO to OCTAVES\n"
  616. " (14) SEMITONES to OCTAVES (23) TIME RATIO to INTERVAL\n"
  617. " (15) SEMITONES to INTERVAL\n"
  618. "\n"
  619. " LOUDNESS\n"
  620. " --------\n"
  621. " (24) GAIN FACTOR to DB GAIN\n"
  622. " (25) DB GAIN to GAIN FACTOR\n"
  623. "\n"
  624. "NOTE REPRESENTATION ..... A1 = A in octave 1\n"
  625. " Ebu4 is E flat, + (Up) quartertone in octave 4\n"
  626. " F#d-2 is F sharp, - (Dn) quartertone, in octave -2\n\n"
  627. "INTERVAL REPRESENTATION.. 3 = a 3rd -m3 = minor 3rd DOWN\n"
  628. " m3u = minor 3rd + (Up) quartertone\n"
  629. " #4d = tritone - (Dn) quartertone\n"
  630. " 15 = a fifteenth (max permissible interval)\n");
  631. } else if(!strcmp(str,"zcross")) {
  632. sprintf(errstr,
  633. "DISPLAY FRACTION OF ZERO-CROSSINGS IN FILE\n\n"
  634. "USAGE: sndreport ZCROSS infile [-sstarttime -eendtime]\n");
  635. } else
  636. sprintf(errstr,"Unknown option '%s'\n",str);
  637. return(USAGE_ONLY);
  638. }
  639. /******************************** USAGE3 ********************************/
  640. int usage3(char *str1,char *str2)
  641. {
  642. if(!strcmp(str1,"props")) return(CONTINUE);
  643. else if(!strcmp(str1,"len")) return(CONTINUE);
  644. else if(!strcmp(str1,"timediff")) return(CONTINUE);
  645. else if(!strcmp(str1,"smptime")) return(CONTINUE);
  646. else if(!strcmp(str1,"timesmp")) return(CONTINUE);
  647. else if(!strcmp(str1,"loudchan")) return(CONTINUE);
  648. else if(!strcmp(str1,"maxsamp")) return(CONTINUE);
  649. else if(!strcmp(str1,"maxsamp2")) return(CONTINUE);
  650. else if(!strcmp(str1,"findhole")) return(CONTINUE);
  651. else if(!strcmp(str1,"chandiff")) return(CONTINUE);
  652. else
  653. sprintf(errstr,"Insufficient parameters on command line.\n");
  654. return(USAGE_ONLY);
  655. }
  656. /******************************** INNER_LOOP (redundant) ********************************/
  657. int inner_loop(int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  658. {
  659. return(FINISHED);
  660. }