ap_distort.c 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  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. /* floatsam version*/
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <math.h>
  25. #include <ctype.h>
  26. #include <structures.h>
  27. #include <cdpmain.h>
  28. #include <tkglobals.h>
  29. #include <pnames.h>
  30. #include <distort.h>
  31. #include <processno.h>
  32. #include <modeno.h>
  33. #include <globcon.h>
  34. #include <logic.h>
  35. #include <filetype.h>
  36. //TW REMOVED (duplicated)
  37. //#include <stdlib.h>
  38. #include <mixxcon.h>
  39. //TW UPDATE
  40. #include <distort1.h>
  41. #include <flags.h>
  42. #include <speccon.h>
  43. #include <arrays.h>
  44. #include <special.h>
  45. #include <formants.h>
  46. #include <sfsys.h>
  47. #include <osbind.h>
  48. #include <string.h>
  49. #include <arrays.h>
  50. /********************************************************************************************/
  51. /********************************** FORMERLY IN buffers.c ***********************************/
  52. /********************************************************************************************/
  53. static int create_sndbufs_plus_cyclebuf(int cycbuflen_param,dataptr dz);
  54. static int create_avgbufs(dataptr dz);
  55. //TW UPDATE
  56. static int create_pulse_buffers(dataptr dz);
  57. /********************************************************************************************/
  58. /********************************** FORMERLY IN pconsistency.c ******************************/
  59. /********************************************************************************************/
  60. static int check_omit_consistency(dataptr dz);
  61. /********************************************************************************************/
  62. /********************************** FORMERLY IN specialin.c *********************************/
  63. /********************************************************************************************/
  64. static int get_envfile_data(char *filename,dataptr dz);
  65. //TW UPDATE
  66. static int get_pulsefile_data(char *filename,dataptr dz);
  67. static int get_harmonic_data(char *filename,dataptr dz);
  68. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  69. int establish_bufptrs_and_extra_buffers(dataptr dz)
  70. {
  71. int exit_status;
  72. //TW AGREED DELETION is_spec VARIABLE
  73. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  74. dz->bptrcnt = 0;
  75. dz->bufcnt = 0;
  76. switch(dz->process) {
  77. case(DISTORT):
  78. switch(dz->mode) {
  79. case(DISTORT_EXAGG): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  80. default: dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  81. }
  82. break;
  83. case(DISTORT_ENV): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  84. case(DISTORT_AVG): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  85. case(DISTORT_OMT): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  86. case(DISTORT_MLT): dz->extra_bufcnt = 0; dz->bufcnt = 6; break;
  87. case(DISTORT_DIV): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  88. case(DISTORT_HRM): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  89. case(DISTORT_FRC): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  90. case(DISTORT_REV): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  91. case(DISTORT_SHUF): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  92. case(DISTORT_RPTFL):
  93. case(DISTORT_RPT2):
  94. case(DISTORT_RPT): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  95. case(DISTORT_INTP): dz->extra_bufcnt = 0; dz->bufcnt = 5; break;
  96. case(DISTORT_DEL): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  97. case(DISTORT_RPL): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  98. case(DISTORT_TEL): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  99. case(DISTORT_FLT): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  100. case(DISTORT_INT):
  101. switch(dz->mode) {
  102. case(DISTINT_INTRLV): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  103. case(DISTINT_RESIZE): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  104. default:
  105. sprintf(errstr,"Unknown mode for DISTORT_INT in establish_bufptrs_and_extra_buffers()\n");
  106. return(PROGRAM_ERROR);
  107. }
  108. break;
  109. case(DISTORT_CYCLECNT): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  110. case(DISTORT_PCH): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  111. //TW UPDATE NEW CASES
  112. case(DISTORT_OVERLOAD):
  113. switch(dz->mode) {
  114. case(OVER_NOISE): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  115. case(OVER_SINE): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  116. }
  117. break;
  118. case(DISTORT_PULSED): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  119. default:
  120. sprintf(errstr,"Unknown program type [%d] in establish_bufptrs_and_extra_buffers()\n",dz->process);
  121. return(PROGRAM_ERROR);
  122. }
  123. if(dz->extra_bufcnt < 0) {
  124. sprintf(errstr,"bufcnts have not been set: establish_bufptrs_and_extra_buffers()\n");
  125. return(PROGRAM_ERROR);
  126. }
  127. if((dz->process==HOUSE_SPEC && dz->mode==HOUSE_CONVERT) || dz->process==INFO_DIFF) {
  128. if((exit_status = establish_spec_bufptrs_and_extra_buffers(dz))<0)
  129. return(exit_status);
  130. }
  131. return establish_groucho_bufptrs_and_extra_buffers(dz);
  132. }
  133. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  134. int setup_internal_arrays_and_array_pointers(dataptr dz)
  135. {
  136. int n;
  137. dz->ptr_cnt = -1; /* base constructor...process */
  138. dz->array_cnt = -1;
  139. dz->iarray_cnt = -1;
  140. dz->larray_cnt = -1;
  141. switch(dz->process) {
  142. case(DISTORT): dz->array_cnt=1; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  143. case(DISTORT_ENV): dz->array_cnt=1; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 2; dz->fptr_cnt = 0; break;
  144. case(DISTORT_AVG): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  145. case(DISTORT_OMT): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  146. case(DISTORT_MLT): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  147. case(DISTORT_DIV): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  148. case(DISTORT_HRM): dz->array_cnt=1; dz->iarray_cnt=1; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  149. case(DISTORT_FRC): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  150. case(DISTORT_REV): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  151. case(DISTORT_SHUF): dz->array_cnt=0; dz->iarray_cnt=1; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  152. case(DISTORT_RPTFL):
  153. case(DISTORT_RPT2):
  154. case(DISTORT_RPT): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  155. case(DISTORT_INTP): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  156. case(DISTORT_DEL): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  157. case(DISTORT_RPL): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  158. case(DISTORT_TEL): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  159. case(DISTORT_FLT): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  160. case(DISTORT_INT): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  161. case(DISTORT_CYCLECNT):
  162. dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  163. case(DISTORT_PCH): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  164. //TW UPDATE NEW CASES
  165. case(DISTORT_OVERLOAD):
  166. switch(dz->mode) {
  167. case(OVER_NOISE): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  168. case(OVER_SINE): dz->array_cnt=1; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  169. }
  170. break;
  171. case(DISTORT_PULSED): dz->array_cnt=3; dz->iarray_cnt=1; dz->larray_cnt = 0; dz->ptr_cnt = 2; dz->fptr_cnt = 0; break;
  172. }
  173. /*** WARNING ***
  174. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  175. **** WARNING ***/
  176. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  177. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  178. return(PROGRAM_ERROR);
  179. }
  180. if(dz->array_cnt > 0) {
  181. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  182. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  183. return(MEMORY_ERROR);
  184. }
  185. for(n=0;n<dz->array_cnt;n++)
  186. dz->parray[n] = NULL;
  187. }
  188. if(dz->iarray_cnt > 0) {
  189. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  190. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  191. return(MEMORY_ERROR);
  192. }
  193. for(n=0;n<dz->iarray_cnt;n++)
  194. dz->iparray[n] = NULL;
  195. }
  196. if(dz->larray_cnt > 0) {
  197. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  198. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  199. return(MEMORY_ERROR);
  200. }
  201. /*RWD dz->lfarray shadows lparray for distort del, etc */
  202. if((dz->lfarray = (float **)malloc(dz->larray_cnt * sizeof(float *)))==NULL) {
  203. sprintf(errstr,"INSUFFICIENT MEMORY for internal float arrays.\n");
  204. return(MEMORY_ERROR);
  205. }
  206. for(n=0;n<dz->larray_cnt;n++){
  207. dz->lparray[n] = NULL;
  208. dz->lfarray[n] = NULL; /*RWD*/
  209. }
  210. }
  211. if(dz->ptr_cnt > 0) {
  212. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  213. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  214. return(MEMORY_ERROR);
  215. }
  216. for(n=0;n<dz->ptr_cnt;n++)
  217. dz->ptr[n] = NULL;
  218. }
  219. if(dz->fptr_cnt > 0) {
  220. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  221. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  222. return(MEMORY_ERROR);
  223. }
  224. for(n=0;n<dz->fptr_cnt;n++)
  225. dz->fptr[n] = NULL;
  226. }
  227. return(FINISHED);
  228. }
  229. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  230. int assign_process_logic(dataptr dz)
  231. {
  232. switch(dz->process) {
  233. case(DISTORT): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  234. case(DISTORT_ENV): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  235. case(DISTORT_AVG): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  236. case(DISTORT_OMT): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  237. case(DISTORT_MLT): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  238. case(DISTORT_DIV): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  239. case(DISTORT_HRM): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  240. case(DISTORT_FRC): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  241. case(DISTORT_REV): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  242. case(DISTORT_SHUF): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  243. case(DISTORT_RPTFL):
  244. case(DISTORT_RPT2):
  245. case(DISTORT_RPT): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  246. case(DISTORT_INTP): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  247. case(DISTORT_DEL): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  248. case(DISTORT_RPL): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  249. case(DISTORT_TEL): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  250. case(DISTORT_FLT): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  251. case(DISTORT_INT): setup_process_logic(TWO_SNDFILES, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  252. case(DISTORT_CYCLECNT):
  253. setup_process_logic(SNDFILES_ONLY, SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  254. case(DISTORT_PCH): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  255. //TW UPDATE NEW CASES
  256. case(DISTORT_OVERLOAD): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  257. case(DISTORT_PULSED): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  258. default:
  259. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  260. return(PROGRAM_ERROR);
  261. break;
  262. }
  263. if(dz->has_otherfile) {
  264. switch(dz->input_data_type) {
  265. case(ALL_FILES):
  266. case(TWO_SNDFILES):
  267. case(SNDFILE_AND_ENVFILE):
  268. case(SNDFILE_AND_BRKFILE):
  269. case(SNDFILE_AND_UNRANGED_BRKFILE):
  270. case(SNDFILE_AND_DB_BRKFILE):
  271. break;
  272. case(MANY_SNDFILES):
  273. if(dz->process==INFO_TIMELIST)
  274. break;
  275. /* fall thro */
  276. default:
  277. sprintf(errstr,"Most processes accepting files with different properties\n"
  278. "can only take 2 sound infiles.\n");
  279. return(PROGRAM_ERROR);
  280. }
  281. }
  282. return(FINISHED);
  283. }
  284. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  285. *
  286. * Allows 2nd infile to have different props to first infile.
  287. */
  288. void set_legal_infile_structure(dataptr dz)
  289. {
  290. switch(dz->process) {
  291. default:
  292. dz->has_otherfile = FALSE;
  293. break;
  294. }
  295. }
  296. /***************************************************************************************/
  297. /****************************** FORMERLY IN internal.c *********************************/
  298. /***************************************************************************************/
  299. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  300. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  301. {
  302. int exit_status = FINISHED;
  303. switch(process) {
  304. case(DISTORT): exit_status = set_internalparam_data("i" ,ap); break;
  305. case(DISTORT_ENV): exit_status = set_internalparam_data("d" ,ap); break;
  306. case(DISTORT_AVG): exit_status = set_internalparam_data("i" ,ap); break;
  307. case(DISTORT_OMT): return(FINISHED); break;
  308. case(DISTORT_MLT): return(FINISHED); break;
  309. case(DISTORT_DIV): return(FINISHED); break;
  310. case(DISTORT_HRM): exit_status = set_internalparam_data("iii" ,ap); break;
  311. case(DISTORT_FRC): exit_status = set_internalparam_data("i" ,ap); break;
  312. case(DISTORT_REV): return(FINISHED); break;
  313. case(DISTORT_SHUF): exit_status = set_internalparam_data("ii" ,ap); break;
  314. case(DISTORT_RPTFL):
  315. case(DISTORT_RPT2):
  316. case(DISTORT_RPT): return(FINISHED); break;
  317. case(DISTORT_INTP): return(FINISHED); break;
  318. case(DISTORT_DEL): return(FINISHED); break;
  319. case(DISTORT_RPL): return(FINISHED); break;
  320. case(DISTORT_TEL): return(FINISHED); break;
  321. case(DISTORT_FLT): exit_status = set_internalparam_data("dd" ,ap); break;
  322. case(DISTORT_INT): return(FINISHED); break;
  323. case(DISTORT_CYCLECNT):
  324. return(FINISHED); break;
  325. case(DISTORT_PCH): return(FINISHED); break;
  326. //TW NEW CASES
  327. case(DISTORT_OVERLOAD): return(FINISHED); break;
  328. case(DISTORT_PULSED): exit_status = set_internalparam_data("ii",ap); break;
  329. default:
  330. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  331. return(PROGRAM_ERROR);
  332. }
  333. return(exit_status);
  334. }
  335. /********************************************************************************************/
  336. /********************************** FORMERLY IN specialin.c *********************************/
  337. /********************************************************************************************/
  338. /********************** READ_SPECIAL_DATA ************************/
  339. int read_special_data(char *str,dataptr dz)
  340. {
  341. //TW CONFIRMED DELETE exit_status = FINISHED;
  342. aplptr ap = dz->application;
  343. switch(ap->special_data) {
  344. case(DISTORT_ENVELOPE): return get_envfile_data(str,dz);
  345. //TW UPDATE NEW CASE
  346. case(PULSE_ENVELOPE): return get_pulsefile_data(str,dz);
  347. case(HARMONIC_DISTORT): return get_harmonic_data(str,dz);
  348. case(SHUFFLE_DATA): return read_shuffle_data(DISTORTS_DMNCNT,DISTORTS_IMGCNT,DISTORTS_MAP,str,dz);
  349. default:
  350. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  351. return(PROGRAM_ERROR);
  352. }
  353. return(FINISHED); /* NOTREACHED */
  354. }
  355. /************************ GET_ENVFILE_DATA ***************************/
  356. int get_envfile_data(char *filename,dataptr dz)
  357. {
  358. int cnt = 0, n;
  359. double maxtime;
  360. char temp[200], *p;
  361. int arraysize = BIGARRAY;
  362. //TW CONFIRMED DELETE aplptr ap = dz->application;
  363. FILE *fp;
  364. if((dz->parray[DISTORTE_ENV] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  365. sprintf(errstr,"INSUFFICIENT MEMORY for distortion envelope.\n");
  366. return(MEMORY_ERROR);
  367. }
  368. if((fp = fopen(filename,"r"))==NULL) { /* 2 */
  369. sprintf(errstr,"Failed to open envelope file %s\n",filename);
  370. return(DATA_ERROR);
  371. }
  372. while(fgets(temp,200,fp)!=NULL) { /* 3 */
  373. p = temp;
  374. while(get_float_from_within_string(&p,&(dz->parray[DISTORTE_ENV][cnt]))) {
  375. if(cnt==0) { /* FORCE ZERO-TIME POINT AT TAB START */
  376. if(dz->parray[DISTORTE_ENV][cnt]<0.0) {
  377. sprintf(errstr,"-ve time (%lf) line %d in file %s\n",dz->parray[DISTORTE_ENV][cnt],(cnt/2)+1,filename);
  378. return(DATA_ERROR);
  379. }
  380. if(flteq(dz->parray[DISTORTE_ENV][cnt],0.0)) {
  381. dz->parray[DISTORTE_ENV][cnt] = 0.0; /* FORCE 0.0 TIME TO exactly 0.0 */
  382. } else { /* Add zero-time values */
  383. dz->parray[DISTORTE_ENV][2] = dz->parray[DISTORTE_ENV][0];
  384. dz->parray[DISTORTE_ENV][3] = dz->parray[DISTORTE_ENV][1];
  385. dz->parray[DISTORTE_ENV][0] = 0.0;
  386. cnt += 2;
  387. }
  388. } else {
  389. if(EVEN(cnt)) { /* Time vals */
  390. /* CHECK TIME SEQUENCING */
  391. if(dz->parray[DISTORTE_ENV][cnt] <= dz->parray[DISTORTE_ENV][cnt-2]) {
  392. sprintf(errstr,"Time values out of sequence (%lf : %lf)in envelope file at line %d\n",
  393. dz->parray[DISTORTE_ENV][cnt-2],dz->parray[DISTORTE_ENV][cnt],(cnt/2)+1);
  394. return(DATA_ERROR);
  395. }
  396. } else { /* Env values */
  397. if(dz->parray[DISTORTE_ENV][cnt]<dz->application->min_special
  398. || dz->parray[DISTORTE_ENV][cnt]>dz->application->max_special) { /* CHECK RANGE */
  399. sprintf(errstr,"Invalid envelope value (%lf): line %d file %s\n",
  400. dz->parray[DISTORTE_ENV][cnt],(cnt/2)+1,filename);
  401. return(DATA_ERROR);
  402. }
  403. }
  404. }
  405. if(++cnt >= arraysize) {
  406. arraysize += BIGARRAY;
  407. if((dz->parray[DISTORTE_ENV]=
  408. (double *)realloc((char *)dz->parray[DISTORTE_ENV],arraysize*sizeof(double)))==NULL){
  409. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate distortion envelope.\n");
  410. return(MEMORY_ERROR);
  411. }
  412. }
  413. }
  414. }
  415. if(ODD(cnt)) {
  416. sprintf(errstr,"Envelope vals incorrectly paired in file %s\n",filename);
  417. return(DATA_ERROR);
  418. }
  419. if(cnt==0) {
  420. sprintf(errstr,"No envelope values found in file %s\n",filename);
  421. return(DATA_ERROR);
  422. }
  423. if((dz->parray[DISTORTE_ENV]=(double *)realloc(dz->parray[DISTORTE_ENV],cnt * sizeof(double)))==NULL) {
  424. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate distortion envelope.\n");
  425. return(MEMORY_ERROR);
  426. }
  427. dz->ptr[DISTORTE_ENVEND] = &(dz->parray[DISTORTE_ENV][cnt]); /* MARK END OF ENVELOPE DATA */
  428. maxtime = dz->parray[DISTORTE_ENV][cnt-2]; /* FIND MAXIMUM TIME IN DATA */
  429. for(n=2;n<cnt;n +=2) /* NORMALISE DATA TIMES TO LIE BETWEEN 0 AND 1 */
  430. dz->parray[DISTORTE_ENV][n] = (float)(dz->parray[DISTORTE_ENV][n]/maxtime);
  431. dz->parray[DISTORTE_ENV][cnt-2] = 1.0; /* FORCE FINAL TIME TO exactly 1.0 */
  432. if(fclose(fp)<0) {
  433. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  434. fflush(stdout);
  435. }
  436. return(FINISHED);
  437. }
  438. //TW UPDATE : NEW FUNCTION
  439. /************************ GET_PULSEFILE_DATA ***************************
  440. *
  441. * NB DISTORTE_ENV = 0, and so this function works for DISTORT_PULSED,
  442. * putting the data in parray[0]
  443. */
  444. int get_pulsefile_data(char *filename,dataptr dz)
  445. {
  446. int cnt = 0, n;
  447. double maxtime, dummy;
  448. char temp[200], *p;
  449. int arraysize = BIGARRAY;
  450. // aplptr ap = dz->application;
  451. FILE *fp;
  452. p = filename;
  453. if(sloom) {
  454. if(*p == NUMERICVAL_MARKER) {
  455. p++;
  456. if(sscanf(p,"%lf",&dummy)!=1) {
  457. sprintf(errstr,"Invalid numeric value for pulse envelope.\n");
  458. return(PROGRAM_ERROR);
  459. }
  460. if(dummy!=0.0) {
  461. sprintf(errstr,"Pulse envelope must be either '0' (for no envelope) or a brkpoint envelope file.\n");
  462. return(DATA_ERROR);
  463. }
  464. if(dz->mode == PULSE_IMP) {
  465. sprintf(errstr,"Numeric input for pulse envelope should be impossible in this mode.\n");
  466. return(PROGRAM_ERROR);
  467. }
  468. dz->iparam[PULSE_ENVSIZE] = 0;
  469. return(FINISHED);
  470. }
  471. } else {
  472. if(*p == '0') {
  473. p++;
  474. while(*p=='0')
  475. p++;
  476. if(*p=='.')
  477. p++;
  478. while(*p=='0')
  479. p++;
  480. if(*p==ENDOFSTR) {
  481. if(dz->mode == PULSE_IMP) {
  482. sprintf(errstr,"You must provide an envelope file for the impulse, for this process\n");
  483. return(DATA_ERROR);
  484. }
  485. dz->iparam[PULSE_ENVSIZE] = 0;
  486. return(FINISHED);
  487. }
  488. }
  489. }
  490. if((dz->parray[ORIG_PULSENV] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  491. sprintf(errstr,"INSUFFICIENT MEMORY for pulse envelope.\n");
  492. return(MEMORY_ERROR);
  493. }
  494. if((fp = fopen(filename,"r"))==NULL) { /* 2 */
  495. sprintf(errstr,"Failed to open envelope file %s\n",filename);
  496. return(DATA_ERROR);
  497. }
  498. while(fgets(temp,200,fp)!=NULL) { /* 3 */
  499. p = temp;
  500. while(get_float_from_within_string(&p,&(dz->parray[ORIG_PULSENV][cnt]))) {
  501. if(cnt==0) { /* FORCE ZERO-TIME POINT AT TAB START */
  502. if(dz->parray[ORIG_PULSENV][cnt]<0.0) {
  503. sprintf(errstr,"-ve time (%lf) line %d in file %s\n",dz->parray[ORIG_PULSENV][cnt],(cnt/2)+1,filename);
  504. return(DATA_ERROR);
  505. }
  506. if(flteq(dz->parray[ORIG_PULSENV][cnt],0.0)) {
  507. dz->parray[ORIG_PULSENV][cnt] = 0.0; /* FORCE 0.0 TIME TO exactly 0.0 */
  508. } else { /* Add zero-time values */
  509. dz->parray[ORIG_PULSENV][2] = dz->parray[ORIG_PULSENV][0];
  510. dz->parray[ORIG_PULSENV][3] = dz->parray[ORIG_PULSENV][1];
  511. dz->parray[ORIG_PULSENV][0] = 0.0;
  512. cnt += 2;
  513. }
  514. } else {
  515. if(EVEN(cnt)) { /* Time vals */
  516. /* CHECK TIME SEQUENCING */
  517. if(dz->parray[ORIG_PULSENV][cnt] <= dz->parray[ORIG_PULSENV][cnt-2]) {
  518. sprintf(errstr,"Time values out of sequence (%lf : %lf)in pulse envelope file at line %d\n",
  519. dz->parray[ORIG_PULSENV][cnt-2],dz->parray[ORIG_PULSENV][cnt],(cnt/2)+1);
  520. return(DATA_ERROR);
  521. }
  522. } else { /* Env values */
  523. if(dz->parray[ORIG_PULSENV][cnt]<dz->application->min_special
  524. || dz->parray[ORIG_PULSENV][cnt]>dz->application->max_special) { /* CHECK RANGE */
  525. sprintf(errstr,"Invalid envelope value (%lf): line %d file %s\n",
  526. dz->parray[ORIG_PULSENV][cnt],(cnt/2)+1,filename);
  527. return(DATA_ERROR);
  528. }
  529. }
  530. }
  531. if(++cnt >= arraysize) {
  532. arraysize += BIGARRAY;
  533. if((dz->parray[ORIG_PULSENV]=
  534. (double *)realloc((char *)dz->parray[ORIG_PULSENV],arraysize*sizeof(double)))==NULL){
  535. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate pulse envelope.\n");
  536. return(MEMORY_ERROR);
  537. }
  538. }
  539. }
  540. }
  541. if(ODD(cnt)) {
  542. sprintf(errstr,"Pulse envelope vals incorrectly paired in file %s\n",filename);
  543. return(DATA_ERROR);
  544. }
  545. if(cnt==0) {
  546. sprintf(errstr,"No pulse envelope values found in file %s\n",filename);
  547. return(DATA_ERROR);
  548. }
  549. if((dz->parray[ORIG_PULSENV]=(double *)realloc(dz->parray[ORIG_PULSENV],cnt * sizeof(double)))==NULL) {
  550. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate pulse envelope.\n");
  551. return(MEMORY_ERROR);
  552. }
  553. dz->iparam[PULSE_ENVSIZE] = cnt/2;
  554. maxtime = dz->parray[ORIG_PULSENV][cnt-2]; /* FIND MAXIMUM TIME IN DATA */
  555. for(n=2;n<cnt;n +=2) /* NORMALISE DATA TIMES TO LIE BETWEEN 0 AND 1 */
  556. dz->parray[ORIG_PULSENV][n] = (float)(dz->parray[ORIG_PULSENV][n]/maxtime);
  557. dz->parray[ORIG_PULSENV][cnt-2] = 1.0; /* FORCE FINAL TIME TO exactly 1.0 */
  558. if(fclose(fp)<0) {
  559. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  560. fflush(stdout);
  561. }
  562. return(FINISHED);
  563. }
  564. /************************ GET_HARMONIC_DATA ***************************/
  565. int get_harmonic_data(char *filename,dataptr dz)
  566. {
  567. int n = 0;
  568. aplptr ap = dz->application;
  569. char temp[200], *p;
  570. int arraysize = BIGARRAY;
  571. FILE *fp;
  572. if((fp = fopen(filename,"r"))==NULL) { /* 2 */
  573. sprintf(errstr,"Cannot open harmonics file %s\n",filename);
  574. return(DATA_ERROR);
  575. }
  576. if((dz->iparray[DISTORTH_HNO] = (int *)malloc(arraysize * sizeof(int)))==NULL) {
  577. sprintf(errstr,"INSUFFICIENT MEMORY to store harmonic numbers.\n");
  578. return(MEMORY_ERROR);
  579. }
  580. if((dz->parray[DISTORTH_AMP] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  581. sprintf(errstr,"INSUFFICIENT MEMORY to store harmonic amps.\n");
  582. return(MEMORY_ERROR);
  583. }
  584. while(fgets(temp,200,fp)!=NULL) { /* 3 */
  585. p = temp;
  586. while(isspace(*p)) {
  587. if(*(++p) == ENDOFSTR)
  588. break;
  589. }
  590. if(*p == ENDOFSTR) /* ignore blank lines */
  591. continue;
  592. if(sscanf(temp,"%d%lf",&(dz->iparray[DISTORTH_HNO][n]),&(dz->parray[DISTORTH_AMP][n]))!=2) {
  593. sprintf(errstr,"Cannot read harmonic no/val pair in file %s\n",filename);
  594. return(DATA_ERROR);
  595. }
  596. if(dz->iparray[DISTORTH_HNO][n] < (int)ap->min_special
  597. || dz->iparray[DISTORTH_HNO][n] > (int)ap->max_special) { /* TW */
  598. sprintf(errstr,"Error in harmonics file - harmonic number [%d] out of range %.0lf - %.0lf\n",
  599. dz->iparray[DISTORTH_HNO][n],ap->min_special,ap->max_special);
  600. return(DATA_ERROR);
  601. }
  602. if(dz->parray[DISTORTH_AMP][n] < (int)ap->min_special2
  603. || dz->parray[DISTORTH_AMP][n] > (int)ap->max_special2) { /* TW */
  604. sprintf(errstr,"Error in harmonics file - harmonic amp out of range %lf - %lf\n",ap->min_special2,ap->max_special2);
  605. return(DATA_ERROR);
  606. }
  607. if(++n >= arraysize) { /* 5 */
  608. arraysize += BIGARRAY;
  609. if((dz->iparray[DISTORTH_HNO]=(int *)realloc(dz->iparray[DISTORTH_HNO],arraysize*sizeof(int)))==NULL){
  610. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate harmonic numbers.\n");
  611. return(MEMORY_ERROR);
  612. }
  613. if((dz->parray[DISTORTH_AMP]=(double *)realloc(dz->parray[DISTORTH_AMP],arraysize*sizeof(double)))==NULL){
  614. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate harmonic amps.\n");
  615. return(MEMORY_ERROR);
  616. }
  617. }
  618. }
  619. if(fclose(fp)<0) {
  620. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",filename);
  621. fflush(stdout);
  622. }
  623. if(n==0) {
  624. sprintf(errstr,"No harmonics found in file\n");
  625. return(DATA_ERROR);
  626. }
  627. if((dz->iparray[DISTORTH_HNO]=(int *)realloc(dz->iparray[DISTORTH_HNO],n * sizeof(int)))==NULL) {
  628. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate harmonic numbers.\n");
  629. return(MEMORY_ERROR);
  630. }
  631. if((dz->parray[DISTORTH_AMP]=(double *)realloc(dz->parray[DISTORTH_AMP],n * sizeof(double)))==NULL) {
  632. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate harmonic amps.\n");
  633. return(MEMORY_ERROR);
  634. }
  635. dz->iparam[DISTORTH_HCNT] = n;
  636. return(FINISHED);
  637. }
  638. /********************************************************************************************/
  639. /********************************** FORMERLY IN preprocess.c ********************************/
  640. /********************************************************************************************/
  641. /****************************** PARAM_PREPROCESS *********************************/
  642. int param_preprocess(dataptr dz)
  643. {
  644. //TW CONFIRMED DELETE int exit_status = FINISHED;
  645. switch(dz->process) {
  646. case(DISTORT): return distort_preprocess(dz);
  647. case(DISTORT_ENV): return distortenv_preprocess(dz);
  648. case(DISTORT_MLT): return distortmlt_preprocess(dz);
  649. case(DISTORT_DIV): return distortdiv_preprocess(dz);
  650. case(DISTORT_SHUF): return distortshuf_preprocess(dz);
  651. case(DISTORT_DEL): return distortdel_preprocess(dz);
  652. case(DISTORT_FLT): return distortflt_preprocess(dz);
  653. case(DISTORT_AVG): return distorter_preprocess(DISTORTA_CYCLECNT,DISTORTA_STARTCYC,DISTORTA_CYCLEN,dz);
  654. case(DISTORT_FRC): return distorter_preprocess(DISTORTF_SCALE,DISTORTF_STARTCYC,DISTORTF_CYCLEN,dz);
  655. case(DISTORT_RPL): return distorter_preprocess(DISTRPL_CYCLECNT,DISTRPL_STARTCYC,DISTRPL_CYCLEVAL,dz);
  656. case(DISTORT_TEL): return distorter_preprocess(DISTTEL_CYCLECNT,DISTTEL_STARTCYC,DISTTEL_CYCLEVAL,dz);
  657. case(DISTORT_HRM):
  658. dz->iparam[FOLDOVER_WARNING] = FALSE;
  659. return FINISHED;
  660. case(DISTORT_PCH):
  661. initrand48();
  662. return FINISHED;
  663. case(DISTORT_OMT): case(DISTORT_REV): case(DISTORT_RPT): case(DISTORT_RPTFL):
  664. case(DISTORT_INTP): case(DISTORT_INT): case(DISTORT_CYCLECNT): case(DISTORT_RPT2):
  665. return FINISHED;
  666. //TW UPDATE NEW CASES
  667. case(DISTORT_OVERLOAD):
  668. return overload_preprocess(dz);
  669. case(DISTORT_PULSED):
  670. return preprocess_pulse(dz);
  671. default:
  672. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  673. return(PROGRAM_ERROR);
  674. }
  675. return(FINISHED); /* NOTREACHED */
  676. }
  677. /********************************************************************************************/
  678. /********************************** FORMERLY IN procgrou.c **********************************/
  679. /********************************************************************************************/
  680. /**************************** GROUCHO_PROCESS_FILE ****************************/
  681. int groucho_process_file(dataptr dz) /* FUNCTIONS FOUND IN PROCESS.C */
  682. {
  683. int exit_status = FINISHED;
  684. if(dz->process!=DISTORT_CYCLECNT && dz->process!=DISTORT_PULSED)
  685. display_virtual_time(0L,dz);
  686. switch(dz->process) {
  687. case(DISTORT):
  688. if((exit_status = process_with_swapped_bufs_on_single_half_cycles(dz))<0)
  689. return(exit_status);
  690. break;
  691. case(DISTORT_ENV):
  692. case(DISTORT_REV):
  693. if((exit_status = process_with_swapped_bufs_on_full_cycles(dz))<0)
  694. return(exit_status);
  695. break;
  696. case(DISTORT_AVG):
  697. if((exit_status =
  698. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTORTA_SKIPCNT,dz))<0)
  699. return(exit_status);
  700. break;
  701. case(DISTORT_SHUF):
  702. if((exit_status =
  703. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTORTS_SKIPCNT,dz))<0)
  704. return(exit_status);
  705. break;
  706. case(DISTORT_RPTFL):
  707. case(DISTORT_RPT):
  708. case(DISTORT_RPT2):
  709. if((exit_status =
  710. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTRPT_SKIPCNT,dz))<0)
  711. return(exit_status);
  712. break;
  713. case(DISTORT_INTP):
  714. if((exit_status =
  715. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTINTP_SKIPCNT,dz))<0)
  716. return(exit_status);
  717. break;
  718. case(DISTORT_DEL):
  719. if((exit_status =
  720. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTDEL_SKIPCNT,dz))<0)
  721. return(exit_status);
  722. break;
  723. case(DISTORT_RPL):
  724. if((exit_status =
  725. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTRPL_SKIPCNT,dz))<0)
  726. return(exit_status);
  727. break;
  728. case(DISTORT_TEL):
  729. if((exit_status =
  730. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTTEL_SKIPCNT,dz))<0)
  731. return(exit_status);
  732. break;
  733. case(DISTORT_FLT):
  734. if((exit_status =
  735. process_with_swapped_bufs_on_full_cycles_with_newsize_output_and_skipcycles(dz->sampbuf[2],DISTFLT_SKIPCNT,dz))<0)
  736. return(exit_status);
  737. break;
  738. case(DISTORT_OMT):
  739. if((exit_status = process_on_single_buf_with_phase_dependence(dz))<0)
  740. return(exit_status);
  741. break;
  742. case(DISTORT_MLT):
  743. case(DISTORT_DIV):
  744. if((exit_status = process_with_swapped_buf_to_swapped_outbufs(dz))<0)
  745. return(exit_status);
  746. break;
  747. case(DISTORT_HRM):
  748. case(DISTORT_FRC):
  749. if((exit_status = process_with_swapped_bufs_on_full_cycles_with_optional_prescale(dz))<0)
  750. return(exit_status);
  751. break;
  752. case(DISTORT_INT):
  753. switch(dz->mode) {
  754. case(DISTINT_INTRLV):
  755. if((exit_status = two_infiles_interleave_process(dz))<0)
  756. return(exit_status);
  757. break;
  758. case(DISTINT_RESIZE):
  759. if((exit_status = two_infiles_resize_process(dz))<0)
  760. return(exit_status);
  761. break;
  762. default:
  763. sprintf(errstr,"Unknown case in DISTORT_INT mode switch in process_file()\n");
  764. return(PROGRAM_ERROR);
  765. }
  766. break;
  767. case(DISTORT_CYCLECNT):
  768. if((exit_status = process_cyclecnt(dz))<0)
  769. return(exit_status);
  770. break;
  771. case(DISTORT_PCH):
  772. if((exit_status = distort_pitch(dz))<0)
  773. return(exit_status);
  774. break;
  775. //TW UPDATE NEW CASES
  776. case(DISTORT_OVERLOAD):
  777. if((exit_status = distort_overload(dz))<0)
  778. return(exit_status);
  779. break;
  780. case(DISTORT_PULSED):
  781. if((exit_status = do_pulsetrain(dz))<0)
  782. return(exit_status);
  783. break;
  784. default:
  785. sprintf(errstr,"Unknown case in process_file()\n");
  786. return(PROGRAM_ERROR);
  787. }
  788. return(FINISHED);
  789. }
  790. /********************************************************************************************/
  791. /********************************** FORMERLY IN pconsistency.c ******************************/
  792. /********************************************************************************************/
  793. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  794. int check_param_validity_and_consistency(dataptr dz)
  795. {
  796. //TW CONFIRED DELETE int exit_status = FINISHED;
  797. handle_pitch_zeros(dz);
  798. switch(dz->process) {
  799. case(DISTORT_OMT): return check_omit_consistency(dz);
  800. }
  801. return(FINISHED);
  802. }
  803. /********************************** CHECK_OMIT_CONSISTENCY **********************************/
  804. int check_omit_consistency(dataptr dz)
  805. {
  806. int exit_status;
  807. double brkmax;
  808. if(dz->brksize[DISTORTO_OMIT]) {
  809. if((exit_status = get_maxvalue_in_brktable(&brkmax,DISTORTO_OMIT,dz))<0)
  810. return(exit_status);
  811. if(round(brkmax) >= dz->iparam[DISTORTO_KEEP]) {
  812. sprintf(errstr,"A in brkfile > or = B at some point: can't proceed.\n");
  813. return(USER_ERROR);
  814. }
  815. } else {
  816. if(dz->iparam[DISTORTO_OMIT] >= dz->iparam[DISTORTO_KEEP]) {
  817. sprintf(errstr,"A > or = B: can't proceed.\n");
  818. return(USER_ERROR);
  819. }
  820. }
  821. return(FINISHED);
  822. }
  823. /********************************************************************************************/
  824. /********************************** FORMERLY IN buffers.c ***********************************/
  825. /********************************************************************************************/
  826. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  827. int allocate_large_buffers(dataptr dz)
  828. {
  829. switch(dz->process) {
  830. case(DISTORT): case(DISTORT_ENV): case(DISTORT_OMT):
  831. case(DISTORT_MLT): case(DISTORT_DIV): case(DISTORT_REV):
  832. case(DISTORT_SHUF): case(DISTORT_RPT): case(DISTORT_INTP): case(DISTORT_RPT2):
  833. case(DISTORT_DEL): case(DISTORT_RPL): case(DISTORT_TEL):
  834. case(DISTORT_FLT): case(DISTORT_INT): case(DISTORT_CYCLECNT):
  835. case(DISTORT_PCH): case(DISTORT_OVERLOAD): case(DISTORT_RPTFL):
  836. return create_sndbufs(dz);
  837. case(DISTORT_AVG):
  838. return create_avgbufs(dz);
  839. case(DISTORT_HRM):
  840. return create_sndbufs_plus_cyclebuf(DISTORTH_CYCBUFLEN,dz);
  841. case(DISTORT_FRC):
  842. return create_sndbufs_plus_cyclebuf(DISTORTF_CYCBUFLEN,dz);
  843. //TW UPDATE : NEW CASE
  844. case(DISTORT_PULSED):
  845. return create_pulse_buffers(dz);
  846. default:
  847. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  848. return(PROGRAM_ERROR);
  849. }
  850. return(FINISHED); /* NOTREACHED */
  851. }
  852. /************************************* CREATE_PULSE_BUFFERS *************************************/
  853. int create_pulse_buffers(dataptr dz)
  854. {
  855. /* dz->sampbuf[0] = INBUF has to be extra SECSIZE in length, to allow for rounding samples at end
  856. dz->sampbuf[1] = OUTBUF
  857. dz->sampbuf[2] = STOREBUF stores set of wavsets for synth option
  858. dz->sampbuf[3] = PULSEBUF stores pulse while it's being made
  859. */
  860. int exit_status;
  861. double minfrq, mintrans, k;
  862. size_t minbufsize, bigbufsize;
  863. if(dz->brksize[PULSE_FRQ] > 0) {
  864. if((exit_status = get_minvalue_in_brktable(&minfrq,PULSE_FRQ,dz))<0)
  865. return(exit_status);
  866. } else
  867. minfrq = dz->param[PULSE_FRQ];
  868. if(dz->param[PULSE_FRQRAND] > 0.0) { /* if frq could be random-transposed */
  869. k = dz->param[PULSE_FRQRAND]/SEMITONES_PER_OCTAVE;
  870. k = pow(2.0,k);
  871. minfrq /= k; /* transpose it down by max amount possible */
  872. }
  873. if(dz->brksize[PULSE_TRANSPOS] > 0) {
  874. if((exit_status = get_minvalue_in_brktable(&mintrans,PULSE_TRANSPOS,dz))<0)
  875. return(exit_status);
  876. } else
  877. mintrans = dz->param[PULSE_TRANSPOS];
  878. mintrans /= SEMITONES_PER_OCTAVE;
  879. mintrans = pow(2.0,mintrans);
  880. minfrq *= mintrans;
  881. k = (double)(dz->infile->srate/minfrq);
  882. minbufsize = (int)floor(k + 1);
  883. bigbufsize = (size_t) Malloc(-1); /* i.e. grab a big buffer */
  884. bigbufsize /= sizeof(float);
  885. bigbufsize = (bigbufsize/(4 * F_SECSIZE)) * 4 * F_SECSIZE;
  886. bigbufsize /= 4;
  887. while(bigbufsize <= minbufsize) {
  888. if((bigbufsize += F_SECSIZE) <= 0) { /* Numeric overflow */
  889. sprintf(errstr,"Failed to allocate memory for sound buffers: A.\n");
  890. return(MEMORY_ERROR);
  891. }
  892. }
  893. dz->buflen = (int) bigbufsize;
  894. if((dz->bigbuf = (float *)malloc((dz->buflen * 4 * sizeof(float)) + F_SECSIZE))==NULL) {
  895. sprintf(errstr,"Failed to allocate memory for sound buffers: B.\n");
  896. return(MEMORY_ERROR);
  897. }
  898. dz->sampbuf[0] = dz->bigbuf;
  899. dz->sampbuf[1] = dz->sampbuf[0] + dz->buflen + F_SECSIZE;
  900. dz->sampbuf[2] = dz->sampbuf[1] + dz->buflen;
  901. dz->sampbuf[3] = dz->sampbuf[2] + dz->buflen;
  902. return(FINISHED);
  903. }
  904. /*************************** CREATE_SNDBUFS_PLUS_CYCLEBUF **************************/
  905. int create_sndbufs_plus_cyclebuf(int cycbuflen_param,dataptr dz)
  906. {
  907. /*
  908. * RWD this would be 12 samples then...
  909. * #define SAFETY (24)
  910. */
  911. #define SAFETY (48)
  912. size_t bigbufsize;
  913. int n;
  914. int cyclebuf_size;
  915. cyclebuf_size = (int)round((double)dz->infile->srate*(double)sizeof(float)*(double)dz->infile->channels*MAXWAVELEN);
  916. cyclebuf_size += SAFETY;
  917. dz->iparam[cycbuflen_param] = (int)(cyclebuf_size/sizeof(float));
  918. dz->bufcnt--;
  919. bigbufsize = (size_t) Malloc(-1);
  920. dz->buflen = (int)(bigbufsize / sizeof(float));
  921. dz->buflen = (dz->buflen / dz->infile->channels) * dz->infile->channels;
  922. if((dz->bigbuf = (float *)malloc(sizeof(float) * ((dz->buflen * dz->bufcnt) + dz->iparam[cycbuflen_param]))) == NULL) {
  923. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  924. return(MEMORY_ERROR);
  925. }
  926. for(n=0;n<dz->bufcnt;n++)
  927. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  928. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n); /* CYCLEBUF */
  929. return(FINISHED);
  930. }
  931. /*************************** CREATE_AVGBUFS **************************/
  932. #define FSECSIZE (256)
  933. int create_avgbufs(dataptr dz)
  934. {
  935. size_t bigbufsize;
  936. long cyclbuf_size;
  937. cyclbuf_size = round(dz->infile->srate * sizeof(float) * dz->infile->channels * dz->param[DISTORTA_MAXLEN]);
  938. if((dz->sampbuf[3] = (float *)malloc(cyclbuf_size))==NULL) { /* calculation buffer */
  939. sprintf(errstr,"INSUFFICIENT MEMORY to create cycles buffer.\n");
  940. return(MEMORY_ERROR);
  941. }
  942. dz->iparam[DISTORTA_CYCBUFLEN] = (int)(cyclbuf_size/sizeof(float));
  943. bigbufsize = (size_t) Malloc(-1);
  944. dz->buflen = (int)(bigbufsize / sizeof(float));
  945. dz->buflen /= 3;
  946. if(dz->buflen==0)
  947. dz->buflen = FSECSIZE;
  948. dz->buflen = (dz->buflen / dz->infile->channels) * dz->infile->channels;
  949. //TW CHANGED
  950. // if((dz->bigbuf = (float *)malloc((dz->buflen * 3))) == NULL) {
  951. if((dz->bigbuf = (float *)malloc((dz->buflen * 3 * sizeof(float)))) == NULL) {
  952. sprintf(errstr, "INSUFFICIENT MEMORY to create sound buffers.\n");
  953. return(MEMORY_ERROR);
  954. }
  955. dz->sampbuf[0] = dz->bigbuf; /* pair of input bufs */
  956. dz->sampbuf[1] = dz->sampbuf[0] + dz->buflen;
  957. dz->sampbuf[2] = dz->sampbuf[1] + dz->buflen; /* output buffer */
  958. return(FINISHED);
  959. }
  960. /********************************************************************************************/
  961. /********************************** FORMERLY IN cmdline.c ***********************************/
  962. /********************************************************************************************/
  963. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  964. {
  965. if (!strcmp(prog_identifier_from_cmdline,"reform")) dz->process = DISTORT;
  966. else if(!strcmp(prog_identifier_from_cmdline,"envel")) dz->process = DISTORT_ENV;
  967. else if(!strcmp(prog_identifier_from_cmdline,"average")) dz->process = DISTORT_AVG;
  968. else if(!strcmp(prog_identifier_from_cmdline,"omit")) dz->process = DISTORT_OMT;
  969. else if(!strcmp(prog_identifier_from_cmdline,"multiply")) dz->process = DISTORT_MLT;
  970. else if(!strcmp(prog_identifier_from_cmdline,"divide")) dz->process = DISTORT_DIV;
  971. else if(!strcmp(prog_identifier_from_cmdline,"harmonic")) dz->process = DISTORT_HRM;
  972. else if(!strcmp(prog_identifier_from_cmdline,"fractal")) dz->process = DISTORT_FRC;
  973. else if(!strcmp(prog_identifier_from_cmdline,"reverse")) dz->process = DISTORT_REV;
  974. else if(!strcmp(prog_identifier_from_cmdline,"shuffle")) dz->process = DISTORT_SHUF;
  975. else if(!strcmp(prog_identifier_from_cmdline,"repeat")) dz->process = DISTORT_RPT;
  976. else if(!strcmp(prog_identifier_from_cmdline,"repeat2")) dz->process = DISTORT_RPT2;
  977. else if(!strcmp(prog_identifier_from_cmdline,"replim")) dz->process = DISTORT_RPTFL;
  978. else if(!strcmp(prog_identifier_from_cmdline,"interpolate")) dz->process = DISTORT_INTP;
  979. else if(!strcmp(prog_identifier_from_cmdline,"delete")) dz->process = DISTORT_DEL;
  980. else if(!strcmp(prog_identifier_from_cmdline,"replace")) dz->process = DISTORT_RPL;
  981. else if(!strcmp(prog_identifier_from_cmdline,"telescope")) dz->process = DISTORT_TEL;
  982. else if(!strcmp(prog_identifier_from_cmdline,"filter")) dz->process = DISTORT_FLT;
  983. else if(!strcmp(prog_identifier_from_cmdline,"interact")) dz->process = DISTORT_INT;
  984. else if(!strcmp(prog_identifier_from_cmdline,"cyclecnt")) dz->process = DISTORT_CYCLECNT;
  985. else if(!strcmp(prog_identifier_from_cmdline,"pitch")) dz->process = DISTORT_PCH;
  986. //TW UPDATE NEW CASES
  987. else if(!strcmp(prog_identifier_from_cmdline,"overload")) dz->process = DISTORT_OVERLOAD;
  988. else if(!strcmp(prog_identifier_from_cmdline,"pulsed")) dz->process = DISTORT_PULSED;
  989. else {
  990. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  991. return(USAGE_ONLY);
  992. }
  993. return FINISHED;
  994. }
  995. /********************************************************************************************/
  996. /********************************** FORMERLY IN usage.c *************************************/
  997. /********************************************************************************************/
  998. /******************************** USAGE1 ********************************/
  999. int usage1(void)
  1000. {
  1001. sprintf(errstr,
  1002. "\nUSAGE: distort NAME (mode) infile (infile2) outfile parameters: \n"
  1003. "\n"
  1004. "where NAME can be any one of\n"
  1005. "\n"
  1006. " DISTORT OPERATIONS ON A SINGLE SOUND FILE\n\n"
  1007. "average divide fractal multiply repeat replim reverse\n"
  1008. "cyclecnt envel harmonic omit replace shuffle\n"
  1009. "delete filter interpolate pitch reform telescope\n"
  1010. "overload pulsed repeat2"
  1011. "\n"
  1012. " DISTORT OPERATIONS ON TWO SOUND FILES\n\n"
  1013. "interact\n"
  1014. "\n"
  1015. "Type 'distort reform' for more info on reform option.. ETC.\n\n"
  1016. "DISTORT PROCESSES WORK ONLY ON mono FILES.\n");
  1017. return(USAGE_ONLY);
  1018. }
  1019. /******************************** USAGE2 ********************************/
  1020. int usage2(char *str)
  1021. {
  1022. if(!strcmp(str,"reform")) {
  1023. sprintf(errstr,
  1024. "USAGE:\n"
  1025. "distort reform 1-7 infile outfile \n"
  1026. "distort reform 8 infile outfile exaggeration\n\n"
  1027. " MODIFY SHAPE OF 'WAVECYCLES'\n\n"
  1028. "MODES ARE\n"
  1029. "1 Convert to fixed level square_wave\n"
  1030. "2 Convert to square wave\n"
  1031. "3 Convert to fixed level triangular wave\n"
  1032. "4 Convert to triangular wave\n"
  1033. "5 Convert to inverted half_cycles\n"
  1034. "6 Convert to click stream\n"
  1035. "7 Convert to sinusoid\n"
  1036. "8 Exaggerate waveform contour\n\n"
  1037. "EXAGGERATION may vary over time.\n\n"
  1038. "Works on MONO files only\n");
  1039. } else if (!strcmp(str,"envel")) {
  1040. sprintf(errstr,
  1041. "USAGE:\n"
  1042. "distort envel 1-2 infile outfile cyclecnt [-ttroughing] [-eexponent]\n"
  1043. "distort envel 3 infile outfile cyclecnt troughing [-eexponent]\n"
  1044. "distort envel 4 infile outfile envfile cyclecnt \n\n"
  1045. "IMPOSE ENVELOPE OVER EACH GROUP OF cyclecnt 'WAVECYCLES'\n\n"
  1046. "MODES (Works on MONO files only)-\n"
  1047. "1 rising envelope.\n"
  1048. "2 falling envelope.\n"
  1049. "3 troughed envelope.\n"
  1050. "4 user defined envelope.\n"
  1051. "CYCLECNT is no of wavecycles under a single envelope.\n"
  1052. "EXPONENT is exponent for envelope rise or decay:\n"
  1053. " If OMMITED envelope rise/decay is linear.\n"
  1054. "TROUGHING is trough of envelope (0-1: default 0).\n"
  1055. "ENVFILE Defines user envelope as time/val(0-1) pairs.\n"
  1056. " (Time units arbitrary, as envelope stretched to each cycle(set) duration.\n\n"
  1057. "CYCLECNT, TROUGHING and EXPONENT, may vary over time\n\n"
  1058. "Works on MONO files only\n");
  1059. } else if (!strcmp(str,"average")) {
  1060. sprintf(errstr,
  1061. "USAGE:\n"
  1062. "distort average infile outfile cyclecnt [-mmaxwavelen] [-sskipcycles]\n\n"
  1063. "AVERAGE THE WAVESHAPE OVER N 'WAVECYCLES'\n\n"
  1064. "CYCLECNT is number of cycles to average over ( > 1)\n"
  1065. "MAXWAVELEN is max permissible wavelength in seconds. (default %.2lf)\n"
  1066. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n",MAXWAVELEN);
  1067. } else if (!strcmp(str,"omit")) {
  1068. sprintf(errstr,
  1069. "USAGE:\n"
  1070. "distort omit infile outfile A B\n\n"
  1071. "OMIT A OUT OF EVERY B 'WAVECYCLES' REPLACING THEM BY SILENCE\n\n"
  1072. "A may vary over time: but must always be less than B.\n\n"
  1073. "Works on MONO files only\n");
  1074. } else if (!strcmp(str,"multiply")) {
  1075. sprintf(errstr,
  1076. "USAGE:\n"
  1077. "distort multiply infile outfile N [-s]\n\n"
  1078. "DISTORTION BY MULTIPLYING 'WAVECYCLE' FREQUENCY.\n\n"
  1079. "N = multiplier (integer only: range 2-16)\n"
  1080. "-s smoothing: try if glitches appear.\n\n"
  1081. "Works on MONO files only\n");
  1082. } else if (!strcmp(str,"divide")) {
  1083. sprintf(errstr,
  1084. "USAGE:\n"
  1085. "distort divide infile outfile N [-i]\n\n"
  1086. "DISTORTION BY DIVIDING 'WAVECYCLE' FREQUENCY.\n\n"
  1087. "N = divider (integer only: range 2-16)\n"
  1088. "-i uses waveform interpolation: slower, but cleaner.\n\n"
  1089. "Works on MONO files only\n");
  1090. } else if (!strcmp(str,"harmonic")) {
  1091. sprintf(errstr,
  1092. "USAGE:\n"
  1093. "distort harmonic infile outfile harmonics-file [-ppre_attenuation]\n\n"
  1094. "HARMONIC DISTORTION BY SUPERIMPOSING 'HARMONICS' ONTO 'WAVECYCLES'.\n\n"
  1095. "HARMONICS-FILE contains harmonic_no/amplitude pairs.\n"
  1096. " where amplitude of src sound is taken to be 1.0\n"
  1097. " and harmonics range between %.0lf and %.0lf\n\n"
  1098. "PRE_ATTENUATION is applied to input sound before processing.\n\n"
  1099. "Works on MONO files only\n",MIN_HARMONIC,MAX_HARMONIC);
  1100. } else if (!strcmp(str,"fractal")) {
  1101. sprintf(errstr,
  1102. "USAGE:\n"
  1103. "distort fractal infile outfile scaling loudness [-ppre_attenuation]\n\n"
  1104. "SUPERIMPOSE MINIATURE COPIES OF SRC 'WAVECYCLES' ONTO THEMSELVES.\n\n"
  1105. "SCALING = (integer) division of scale of src wave (range: %.0lf to %.2lf*srate)\n"
  1106. "LOUDNESS = loudness of scaled component, relative to src (loudness 1.0).\n\n"
  1107. "PRE_ATTENUATION is applied to input sound before processing.\n\n"
  1108. "scaling and loudness may vary over time\n\n"
  1109. "Works on MONO files only\n",MIN_SCALE,MAXWAVELEN);
  1110. } else if (!strcmp(str,"reverse")) {
  1111. sprintf(errstr,
  1112. "USAGE:\n"
  1113. "distort reverse infile outfile cyclecnt\n\n"
  1114. "CYCLE_REVERSAL DISTORTION.'WAVECYCLES' REVERSED IN GROUPS.\n\n"
  1115. "CYCLECNT: no. of cycles (>0) in reversed groups.\n\n"
  1116. "cyclecnt may vary in time\n\n"
  1117. "Works on MONO files only\n");
  1118. } else if (!strcmp(str,"shuffle")) {
  1119. sprintf(errstr,
  1120. "USAGE:\n"
  1121. "distort shuffle infile outfile domain-image [-ccylecnt] [-sskipcycles]\n\n"
  1122. "DISTORTION BY SHUFFLING 'WAVECYCLES'\n\n"
  1123. "DOMAIN group of letters representing consecutive (groups of) wavecyles.\n"
  1124. "IMAGE group of letters which is some permutation of the domain.\n"
  1125. "Items from domain may be reordered, ommitted or duplicated.\n"
  1126. " N.B. DOMAIN and IMAGE must be connected by a DASH (-).\n"
  1127. "CYCLECNT is size of wavecycle-groups to operate on. (default 1)\n"
  1128. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1129. "Cyclecnt may vary over time.\n\n"
  1130. "Works on MONO files only\n");
  1131. } else if (!strcmp(str,"repeat")) {
  1132. sprintf(errstr,
  1133. "USAGE:\n"
  1134. "distort repeat infile outfile multiplier [-ccyleccnt] [-sskipcycles]\n\n"
  1135. "TIMESTRETCH FILE BY REPEATING 'WAVECYCLES'\n\n"
  1136. "MULTIPLIER: (integer) is no. of times each wavecycle(grp) repeats.\n"
  1137. "CYCLECNT: (integer) is no. wavecycles in repeated groups.\n"
  1138. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1139. "multiplier and cyclecnt may vary over time.\n\n"
  1140. "Works on MONO files only\n");
  1141. } else if (!strcmp(str,"repeat2")) {
  1142. sprintf(errstr,
  1143. "USAGE:\n"
  1144. "distort repeat2 infile outfile multiplier [-ccyleccnt] [-sskipcycles]\n\n"
  1145. "REPEATING 'WAVECYCLES' WITHOUT TIME STRETCHING\n\n"
  1146. "MULTIPLIER: (integer) is no. of times each wavecycle(grp) repeats.\n"
  1147. "CYCLECNT: (integer) is no. wavecycles in repeated groups.\n"
  1148. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1149. "multiplier and cyclecnt may vary over time.\n\n"
  1150. "Works on MONO files only\n");
  1151. } else if (!strcmp(str,"replim")) {
  1152. sprintf(errstr,
  1153. "USAGE:\n"
  1154. "distort replim inf outf multiplier [-ccyleccnt] [-sskipcycles] -f[hilim]\n\n"
  1155. "TIMESTRETCH FILE BY REPEATING 'WAVECYCLES' (BELOW SPECIFIED FRQ)\n\n"
  1156. "MULTIPLIER: (integer) is no. of times each wavecycle(grp) repeats.\n"
  1157. "CYCLECNT: (integer) is no. wavecycles in repeated groups.\n"
  1158. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n"
  1159. "HILIM: (float) is frq below which cycles are counted.\n\n"
  1160. "multiplier and cyclecnt may vary over time.\n\n"
  1161. "Works on MONO files only\n");
  1162. } else if (!strcmp(str,"interpolate")) {
  1163. sprintf(errstr,
  1164. "USAGE:\n"
  1165. "distort interpolate infile outfile multiplier [-sskipcycles]\n\n"
  1166. "TIMESTRETCH FILE BY REPEATING 'WAVECYCLES' & INTERPOLATING BETWEEN THEM.\n\n"
  1167. "MULTIPLIER: (integer) is no. of times each wavecycle repeats.\n"
  1168. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1169. "multiplier and cyclecnt may vary over time.\n\n"
  1170. "Works on MONO files only\n");
  1171. } else if (!strcmp(str,"delete")) {
  1172. sprintf(errstr,
  1173. "USAGE:\n"
  1174. "distort delete mode infile outfile cyclecnt [-sskipcycles]\n\n"
  1175. "TIMECONTRACT FILE BY DELETING 'WAVECYCLES'\n\n"
  1176. "MODES:\n"
  1177. "1: 1 in CYCLECNT wavecycles retained\n"
  1178. "2: Strongest 1 in CYCLECNT wavecycles retained\n\n"
  1179. "3: Weakest 1 in CYCLECNT wavecycles deleted\n"
  1180. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1181. "cyclecnt may vary over time.\n\n"
  1182. "Works on MONO files only\n");
  1183. } else if (!strcmp(str,"replace")) {
  1184. sprintf(errstr,
  1185. "USAGE:\n"
  1186. "distort replace infile outfile cyclecnt [-sskipcycles]\n\n"
  1187. "STRONGEST 'WAVECYCLE', IN EACH cyclecnt, REPLACES OTHERS\n"
  1188. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n\n"
  1189. "cyclecnt may vary over time.\n\n"
  1190. "Works on MONO files only\n");
  1191. } else if (!strcmp(str,"telescope")) {
  1192. sprintf(errstr,
  1193. "USAGE:\n"
  1194. "distort telescope infile outfile cyclecnt [-sskipcycles] [-a]\n\n"
  1195. "TIMECONTRACT SOUND BY TELESCOPING cyclecnt 'WAVECYCLES' TO 1\n\n"
  1196. "SKIPCYCLES: (integer) is no. of wavecycles to skip at start of file\n"
  1197. "-a telescope to average cyclelen.(Default: telescope to longest.)\n\n"
  1198. "cyclecnt may vary over time.\n\n"
  1199. "Works on MONO files only\n");
  1200. } else if (!strcmp(str,"filter")) {
  1201. sprintf(errstr,
  1202. "USAGE:\n"
  1203. "distort filter 1-2 infile outfile freq [-sskipcycles]\n"
  1204. "distort filter 3 infile outfile freq1 freq2 [-sskipcycles]\n\n"
  1205. "TIMECONTRACT SOUND BY FILTERING OUT 'WAVECYCLES'\n\n"
  1206. "MODES:\n"
  1207. "1: omit cycles below FREQ\n"
  1208. "2: omit cycles above FREQ\n"
  1209. "3: omit cycles below FREQ1 and above FREQ2\n\n"
  1210. "skipcycles: (integer) is no. of wavecycles to skip at start of file\n\n"
  1211. "freq, freq1 and freq2 may vary over time.\n\n"
  1212. "N.B. timevarying freq1, freq2 may not cross each other, nor be equal.\n\n"
  1213. "Works on MONO files only\n");
  1214. } else if (!strcmp(str,"interact")) {
  1215. sprintf(errstr,
  1216. "USAGE:\n"
  1217. "distort interact mode infile1 infile2 outfile\n\n"
  1218. "TIME-DOMAIN INTERACTION OF SOUNDS.\n\n"
  1219. "MODES:\n"
  1220. "1: interleave wavecycles from the two infiles.\n"
  1221. "2: impose wavecycle-lengths of 1st file on wavecycles of 2nd\n\n"
  1222. "Works on MONO files only\n");
  1223. } else if (!strcmp(str,"cyclecnt")) {
  1224. sprintf(errstr,
  1225. "USAGE:\n"
  1226. "distort cyclecnt infile\n\n"
  1227. "COUNT 'WAVECYCLES' IN SNDFILE.\n\n"
  1228. "Works on MONO files only\n");
  1229. } else if (!strcmp(str,"pitch")) {
  1230. sprintf(errstr,
  1231. "USAGE:\n"
  1232. "distort pitch infile outfile octvary [-ccyclelen] [-sskipcycles]\n\n"
  1233. "PITCHWARP 'WAVECYCLES' OF SOUND.\n\n"
  1234. "octvary: max possible transposition (up or down) in octaves.\n"
  1235. " Range(>0 - %.1lf)\n"
  1236. " pitch of each wavecycle is varied by a random amount\n"
  1237. " within the range octvary 8vas up to octvary 8vas down.\n"
  1238. "cylelen: Max no. cycles possible between generation of transpos vals(>1)\n"
  1239. " (Default : %d)\n"
  1240. " Actual cyclecnt is a random number, less than this maximum.\n"
  1241. "skipcycles: No of cycles to skip at start of file.\n\n"
  1242. "cyclelen and octvary may vary over time.\n\n"
  1243. "Works on MONO files only\n",MAXOCTVAR,DEFAULT_RSTEP);
  1244. //TW NEW CASES
  1245. } else if (!strcmp(str,"overload")) {
  1246. sprintf(errstr,
  1247. "USAGE:\n"
  1248. "distort overload 1 infile outfile clip_level depth\n"
  1249. "OR\n"
  1250. "distort overload 2 infile outfile gate depth freq\n\n"
  1251. "Clip the signal with noise or a (possibly timevarying) waveform.\n\n"
  1252. "clip_level: Level at which the signal is clipped.\n"
  1253. " Range(0 - 1)\n"
  1254. "depth: Depth of distortion pattern on clipped stretches of signal.\n"
  1255. " (Range 0 - 1)\n"
  1256. "freq: Frequency of waveform imposed on clipped stretches of signal.\n\n"
  1257. "clip_level, depth and freq may vary over time.\n\n"
  1258. "Works on MONO files only\n");
  1259. } else if (!strcmp(str,"pulsed")) {
  1260. sprintf(errstr,
  1261. "USAGE:\n"
  1262. "distort pulsed\n"
  1263. "1 infil outfil env stime dur frq frand trand arand transp tranrand [-s -e]\n"
  1264. "OR\n"
  1265. "2-3 inf outf env stime dur frq frand trand arand cyctime transp tranrand [-s -e]\n"
  1266. " Impose impulse-train on source (mode 1), OR\n"
  1267. " Use segment of src as looped content of synthetic impulse-train(modes 2,3).\n"
  1268. "ENV brkpnt envelope of impulse. Will be scaled to duration needed.\n"
  1269. "STIME time in src sound where impulses begin.(In mode 3,time as samplecnt)\n"
  1270. "DUR time for which impulses persist.\n"
  1271. "FRQ frequency of the impulses, in Hz: range 0.1 to 50\n"
  1272. "FRAND randomisation of frequency of impulse (in semitones) (range 0-12).\n"
  1273. "TRAND randomisation of relative time-positions of amp peaks & troughs\n"
  1274. " from impulse to impulse. (range 0 - 1)\n"
  1275. "ARAND randomisation of amplitude shape created by peaks & troughs\n"
  1276. " from impulse to impulse. (range 0 - 1)\n"
  1277. "CYCTIME duration of wavecycles to grab for sound inside impulses (mode 2)\n"
  1278. " OR number of wavecycles to grab as sound inside impulses (mode 3)\n"
  1279. "TRANSP transposition contour of sound inside each impulse. Brkpnt file of\n"
  1280. " time:semitone-shift pairs,(time will be scaled to impulse dur),\n"
  1281. "TRANRAND randomisation transp contour from impulse to impulse.(Range 0-1)\n"
  1282. "-s keep start of src sound, before impulses begin (if any).\n"
  1283. "-e keep end of src sound, after impulses end (if any)\n"
  1284. "Works on MONO files only\n");
  1285. } else
  1286. sprintf(errstr,"Unknown option '%s'\n",str);
  1287. return(USAGE_ONLY);
  1288. }
  1289. /******************************** USAGE3 ********************************/
  1290. int usage3(char *str1,char *str2)
  1291. {
  1292. if(!strcmp(str1,"cyclecnt"))
  1293. return(CONTINUE);
  1294. else
  1295. sprintf(errstr,"Insufficient parameters on command line.\n");
  1296. return(USAGE_ONLY);
  1297. }
  1298. /******************************** INNER_LOOP (redundant) ********************************/
  1299. int inner_loop
  1300. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1301. {
  1302. return(FINISHED);
  1303. }