ap_modify.c 83 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774
  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 <string.h>
  25. #include <math.h>
  26. #include <structures.h>
  27. #include <cdpmain.h>
  28. #include <tkglobals.h>
  29. #include <pnames.h>
  30. #include <modify.h>
  31. #include <processno.h>
  32. #include <modeno.h>
  33. #include <globcon.h>
  34. #include <logic.h>
  35. #include <filetype.h>
  36. #include <mixxcon.h>
  37. #include <speccon.h>
  38. #include <flags.h>
  39. #include <arrays.h>
  40. #include <formants.h>
  41. #include <sfsys.h>
  42. #include <osbind.h>
  43. #include <srates.h>
  44. //TW UPDATES
  45. #include <arrays.h>
  46. #include <special.h>
  47. #include <limits.h>
  48. int sintab_pconsistency(dataptr dz);
  49. //TW UPDATES
  50. static int read_stackdata(char *str,dataptr dz);
  51. static double semitone_to_ratio(double val);
  52. static int convolve_pconsistency(dataptr dz);
  53. static int create_convolve_bufs(dataptr dz);
  54. static int read_loudness(char *str,dataptr dz);
  55. static int setup_and_init_brktable_constants(dataptr dz);
  56. /********************************************************************************************/
  57. /********************************** FORMERLY IN buffers.c ***********************************/
  58. /********************************************************************************************/
  59. static int create_granula_buffers(dataptr dz);
  60. static int grab_an_appropriate_block_of_memory(int bufdivisor,dataptr dz);
  61. /***************************************************************************************/
  62. /****************************** FORMERLY IN aplinit.c **********************************/
  63. /***************************************************************************************/
  64. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  65. int establish_bufptrs_and_extra_buffers(dataptr dz)
  66. {
  67. // int is_spec = FALSE;
  68. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  69. dz->bptrcnt = 0;
  70. dz->bufcnt = 0;
  71. switch(dz->process) {
  72. case(MOD_LOUDNESS): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  73. case(MOD_SPACE):
  74. switch(dz->mode) {
  75. case(MOD_PAN): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  76. case(MOD_MIRROR): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  77. case(MOD_MIRRORPAN): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  78. case(MOD_NARROW): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  79. default:
  80. sprintf(errstr,"Unknown case for MOD_SPACE in establish_bufptrs_and_extra_buffers()\n");
  81. return(PROGRAM_ERROR);
  82. }
  83. break;
  84. //TW NEW CASES
  85. case(SCALED_PAN): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  86. case(FIND_PANPOS): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  87. case(MOD_PITCH):
  88. switch(dz->mode) {
  89. case(MOD_TRANSPOS): dz->extra_bufcnt = 0; dz->bufcnt = 9; break;
  90. case(MOD_TRANSPOS_SEMIT): dz->extra_bufcnt = 0; dz->bufcnt = 9; break;
  91. case(MOD_TRANSPOS_INFO): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  92. case(MOD_TRANSPOS_SEMIT_INFO): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  93. case(MOD_ACCEL): dz->extra_bufcnt = 0; dz->bufcnt = 9; break;
  94. case(MOD_VIBRATO): dz->extra_bufcnt = 0; dz->bufcnt = 9; break;
  95. default:
  96. sprintf(errstr,"Unknown case for MOD_PITCH in establish_bufptrs_and_extra_buffers()\n");
  97. return(PROGRAM_ERROR);
  98. }
  99. break;
  100. case(MOD_REVECHO):
  101. switch(dz->mode) {
  102. case(MOD_STADIUM): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  103. default: dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  104. }
  105. break;
  106. case(MOD_RADICAL):
  107. switch(dz->mode) {
  108. //TW SIMPLIFIED
  109. // case(MOD_REVERSE): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  110. case(MOD_REVERSE): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  111. case(MOD_LOBIT):
  112. case(MOD_LOBIT2): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  113. case(MOD_SCRUB): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  114. case(MOD_SHRED): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  115. case(MOD_RINGMOD): dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  116. case(MOD_CROSSMOD): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  117. }
  118. break;
  119. case(BRASSAGE): dz->extra_bufcnt = 1; dz->bufcnt = 4; break;
  120. case(SAUSAGE): dz->extra_bufcnt = 1; dz->bufcnt = 2; break; /* ADD MORE LATER */
  121. case(SIN_TAB): dz->extra_bufcnt = 0; dz->bufcnt = 0; break; /* ADD MORE LATER */
  122. //TW NEW CASES
  123. case(STACK): dz->extra_bufcnt = 0; dz->bufcnt = 2; break;
  124. case(CONVOLVE): dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  125. case(SHUDDER): dz->extra_bufcnt = 0; dz->bufcnt = 4; break;
  126. /* TEMPORARY TEST ROUTINE */
  127. case(WORDCNT): dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  128. /* TEMPORARY TEST ROUTINE */
  129. default:
  130. sprintf(errstr,"Unknown program type [%d] in establish_bufptrs_and_extra_buffers()\n",dz->process);
  131. return(PROGRAM_ERROR);
  132. }
  133. if(dz->extra_bufcnt < 0) {
  134. sprintf(errstr,"bufcnts have not been set: establish_bufptrs_and_extra_buffers()\n");
  135. return(PROGRAM_ERROR);
  136. }
  137. return establish_groucho_bufptrs_and_extra_buffers(dz);
  138. }
  139. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  140. int setup_internal_arrays_and_array_pointers(dataptr dz)
  141. {
  142. int n;
  143. dz->ptr_cnt = -1; //base constructor...process
  144. dz->array_cnt = -1;
  145. dz->iarray_cnt = -1;
  146. dz->larray_cnt = -1;
  147. switch(dz->process) {
  148. case(MOD_LOUDNESS): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  149. case(MOD_SPACE): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  150. //TW UPDATES
  151. case(SCALED_PAN): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  152. case(FIND_PANPOS): dz->array_cnt=0; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  153. case(SIN_TAB): dz->array_cnt=1; dz->iarray_cnt=0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  154. case(MOD_PITCH):
  155. switch(dz->mode) {
  156. case(MOD_VIBRATO): dz->array_cnt=1;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  157. default: dz->array_cnt=0;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  158. }
  159. break;
  160. case(MOD_REVECHO):
  161. switch(dz->mode) {
  162. case(MOD_STADIUM): dz->array_cnt=5;dz->iarray_cnt=0; dz->larray_cnt=1; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  163. default: dz->array_cnt=1;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  164. }
  165. break;
  166. case(MOD_RADICAL):
  167. switch(dz->mode) {
  168. case(MOD_REVERSE): dz->array_cnt=0;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  169. case(MOD_LOBIT):
  170. case(MOD_LOBIT2): dz->array_cnt=0;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  171. case(MOD_SCRUB): dz->array_cnt=2;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  172. case(MOD_SHRED): dz->array_cnt=0;dz->iarray_cnt=1; dz->larray_cnt=2; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  173. case(MOD_RINGMOD): dz->array_cnt=1;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  174. case(MOD_CROSSMOD): dz->array_cnt=0;dz->iarray_cnt=0; dz->larray_cnt=0; dz->ptr_cnt= 0; dz->fptr_cnt = 0; break;
  175. }
  176. break;
  177. case(BRASSAGE): dz->array_cnt = 3; dz->iarray_cnt = 1; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 4; break;
  178. case(SAUSAGE): dz->array_cnt = 3; dz->iarray_cnt = 2; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 4; break;
  179. /* TEMPORARY TEST ROUTINE */
  180. case(WORDCNT): dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  181. /* TEMPORARY TEST ROUTINE */
  182. //TW UPDATES
  183. case(STACK): dz->array_cnt = 2; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  184. case(CONVOLVE): dz->array_cnt = 1; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  185. case(SHUDDER): dz->array_cnt = 6; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  186. }
  187. /*** WARNING ***
  188. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  189. **** WARNING ***/
  190. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  191. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  192. return(PROGRAM_ERROR);
  193. }
  194. if(dz->array_cnt > 0) {
  195. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  196. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  197. return(MEMORY_ERROR);
  198. }
  199. for(n=0;n<dz->array_cnt;n++)
  200. dz->parray[n] = NULL;
  201. }
  202. if(dz->iarray_cnt > 0) {
  203. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  204. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  205. return(MEMORY_ERROR);
  206. }
  207. for(n=0;n<dz->iarray_cnt;n++)
  208. dz->iparray[n] = NULL;
  209. }
  210. if(dz->larray_cnt > 0) {
  211. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  212. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  213. return(MEMORY_ERROR);
  214. }
  215. for(n=0;n<dz->larray_cnt;n++)
  216. dz->lparray[n] = NULL;
  217. }
  218. if(dz->ptr_cnt > 0) {
  219. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  220. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  221. return(MEMORY_ERROR);
  222. }
  223. for(n=0;n<dz->ptr_cnt;n++)
  224. dz->ptr[n] = NULL;
  225. }
  226. if(dz->fptr_cnt > 0) {
  227. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  228. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  229. return(MEMORY_ERROR);
  230. }
  231. for(n=0;n<dz->fptr_cnt;n++)
  232. dz->fptr[n] = NULL;
  233. }
  234. return(FINISHED);
  235. }
  236. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  237. int assign_process_logic(dataptr dz)
  238. {
  239. switch(dz->process) {
  240. case(MOD_LOUDNESS):
  241. switch(dz->mode) {
  242. case(LOUDNESS_GAIN):
  243. case(LOUDNESS_DBGAIN):
  244. case(LOUDNESS_NORM):
  245. case(LOUDNESS_SET):
  246. case(LOUD_PROPOR):
  247. case(LOUD_DB_PROPOR):
  248. case(LOUDNESS_PHASE):
  249. setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  250. case(LOUDNESS_BALANCE):
  251. setup_process_logic(TWO_SNDFILES, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  252. case(LOUDNESS_LOUDEST):
  253. setup_process_logic(MANY_SNDFILES, OTHER_PROCESS, NO_OUTPUTFILE, dz); break;
  254. case(LOUDNESS_EQUALISE):
  255. setup_process_logic(MANY_SNDFILES, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  256. default:
  257. sprintf(errstr,"Unknown case for MOD_LOUDNESS in assign_process_logic()\n");
  258. return(PROGRAM_ERROR);
  259. }
  260. break;
  261. case(MOD_SPACE):
  262. switch(dz->mode) {
  263. case(MOD_PAN): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  264. case(MOD_MIRROR): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  265. case(MOD_MIRRORPAN): setup_process_logic(UNRANGED_BRKFILE_ONLY,TO_TEXTFILE, TEXTFILE_OUT, dz); break;
  266. case(MOD_NARROW): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  267. default:
  268. sprintf(errstr,"Unknown case for MOD_SPACE in assign_process_logic()\n");
  269. return(PROGRAM_ERROR);
  270. }
  271. break;
  272. //TW UPDATES
  273. case(SCALED_PAN): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  274. case(FIND_PANPOS): setup_process_logic(SNDFILES_ONLY, SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  275. case(MOD_PITCH):
  276. switch(dz->mode) {
  277. case(MOD_TRANSPOS): setup_process_logic(SNDFILES_ONLY,UNEQUAL_SNDFILE,SNDFILE_OUT, dz); break;
  278. case(MOD_TRANSPOS_SEMIT): setup_process_logic(SNDFILES_ONLY,UNEQUAL_SNDFILE,SNDFILE_OUT, dz); break;
  279. case(MOD_TRANSPOS_INFO): setup_process_logic(SNDFILES_ONLY,SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  280. case(MOD_TRANSPOS_SEMIT_INFO): setup_process_logic(SNDFILES_ONLY,SCREEN_MESSAGE, NO_OUTPUTFILE, dz); break;
  281. case(MOD_ACCEL): setup_process_logic(SNDFILES_ONLY,UNEQUAL_SNDFILE,SNDFILE_OUT, dz); break;
  282. case(MOD_VIBRATO): setup_process_logic(SNDFILES_ONLY,UNEQUAL_SNDFILE,SNDFILE_OUT, dz); break;
  283. default:
  284. sprintf(errstr,"Unknown case for MOD_PITCH in assign_process_logic()\n");
  285. return(PROGRAM_ERROR);
  286. }
  287. break;
  288. case(MOD_REVECHO): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  289. case(MOD_RADICAL):
  290. switch(dz->mode) {
  291. case(MOD_REVERSE): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  292. case(MOD_LOBIT):
  293. case(MOD_LOBIT2): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  294. case(MOD_SCRUB): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  295. case(MOD_SHRED): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  296. case(MOD_RINGMOD): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  297. case(MOD_CROSSMOD): setup_process_logic(TWO_SNDFILES, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  298. }
  299. break;
  300. case(BRASSAGE): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  301. case(SAUSAGE): setup_process_logic(MANY_SNDFILES, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  302. case(SIN_TAB): setup_process_logic(NO_FILE_AT_ALL, TO_TEXTFILE, TEXTFILE_OUT, dz); break;
  303. /* TEMPORARY TEST ROUTINE */
  304. case(WORDCNT): setup_process_logic(WORDLIST_ONLY, TO_TEXTFILE, NO_OUTPUTFILE, dz); break;
  305. /* TEMPORARY TEST ROUTINE */
  306. //TW UPDATES
  307. case(STACK): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  308. case(CONVOLVE): setup_process_logic(TWO_SNDFILES, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  309. case(SHUDDER): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  310. default:
  311. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  312. return(PROGRAM_ERROR);
  313. break;
  314. }
  315. if(dz->has_otherfile) {
  316. switch(dz->input_data_type) {
  317. case(ALL_FILES):
  318. case(TWO_SNDFILES):
  319. case(SNDFILE_AND_ENVFILE):
  320. case(SNDFILE_AND_BRKFILE):
  321. case(SNDFILE_AND_UNRANGED_BRKFILE):
  322. case(SNDFILE_AND_DB_BRKFILE):
  323. break;
  324. case(MANY_SNDFILES):
  325. if(dz->process==INFO_TIMELIST)
  326. break;
  327. /* fall thro */
  328. default:
  329. sprintf(errstr,"Most processes accepting files with different properties\n"
  330. "can only take 2 sound infiles.\n");
  331. return(PROGRAM_ERROR);
  332. }
  333. }
  334. return(FINISHED);
  335. }
  336. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  337. *
  338. * Allows 2nd infile to have different props to first infile.
  339. */
  340. void set_legal_infile_structure(dataptr dz)
  341. {
  342. switch(dz->process) {
  343. case(MOD_RADICAL):
  344. if(dz->mode==MOD_CROSSMOD)
  345. dz->has_otherfile = TRUE;
  346. else
  347. dz->has_otherfile = FALSE;
  348. break;
  349. case(MOD_LOUDNESS):
  350. if(dz->mode==LOUDNESS_BALANCE)
  351. dz->has_otherfile = TRUE;
  352. else
  353. dz->has_otherfile = FALSE;
  354. break;
  355. default:
  356. dz->has_otherfile = FALSE;
  357. break;
  358. }
  359. }
  360. /***************************************************************************************/
  361. /****************************** FORMERLY IN internal.c *********************************/
  362. /***************************************************************************************/
  363. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  364. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  365. {
  366. int exit_status = FINISHED;
  367. switch(process) {
  368. case(MOD_LOUDNESS): exit_status = set_internalparam_data("",ap); break;
  369. case(MOD_SPACE): exit_status = set_internalparam_data("",ap); break;
  370. //TW UPDATES
  371. case(SCALED_PAN): exit_status = set_internalparam_data("",ap); break;
  372. case(FIND_PANPOS): exit_status = set_internalparam_data("",ap); break;
  373. case(MOD_PITCH):
  374. switch(mode) {
  375. case(MOD_ACCEL): exit_status = set_internalparam_data( "iiid",ap); break;
  376. case(MOD_VIBRATO): exit_status = set_internalparam_data( "iiiid",ap); break;
  377. default: exit_status = set_internalparam_data("iiiiid",ap); break;
  378. }
  379. break;
  380. case(MOD_REVECHO):
  381. switch(mode) {
  382. case(MOD_DELAY): exit_status = set_internalparam_data("0ddidi",ap); break;
  383. case(MOD_VDELAY): exit_status = set_internalparam_data( "ddidi",ap); break;
  384. case(MOD_STADIUM): exit_status = set_internalparam_data( "ii" ,ap); break;
  385. default:
  386. sprintf(errstr,"Unknown case for MOD_REVECHO in set_legal_internalparam_structure()\n");
  387. return(PROGRAM_ERROR);
  388. }
  389. break;
  390. case(MOD_RADICAL):
  391. switch(mode) {
  392. case(MOD_REVERSE): exit_status = set_internalparam_data("iiii",ap); break;
  393. case(MOD_SHRED): exit_status = set_internalparam_data("iiiiiiiiiiiiiii",ap); break;
  394. case(MOD_SCRUB): exit_status = set_internalparam_data("ididdii",ap); break;
  395. case(MOD_LOBIT):
  396. case(MOD_LOBIT2): exit_status = set_internalparam_data("iiii",ap); break;
  397. case(MOD_RINGMOD): exit_status = set_internalparam_data("",ap); break;
  398. case(MOD_CROSSMOD): exit_status = set_internalparam_data("",ap); break;
  399. default:
  400. sprintf(errstr,"Unknown case for MOD_RADICAL in set_legal_internalparam_structure()\n");
  401. return(PROGRAM_ERROR);
  402. }
  403. break;
  404. case(BRASSAGE):
  405. switch(mode) {
  406. case(GRS_PITCHSHIFT): exit_status = set_internalparam_data("0000ddddiiiiiiiiiiiiiiiiii",ap); break;
  407. case(GRS_TIMESTRETCH): exit_status = set_internalparam_data("0000ddddiiiiiiiiiiiiiiiiii",ap); break;
  408. case(GRS_REVERB): exit_status = set_internalparam_data( "000ddddiiiiiiiiiiiiiiiiii",ap); break;
  409. case(GRS_SCRAMBLE): exit_status = set_internalparam_data( "000ddddiiiiiiiiiiiiiiiiii",ap); break;
  410. case(GRS_GRANULATE): exit_status = set_internalparam_data("0000ddddiiiiiiiiiiiiiiiiii",ap); break;
  411. case(GRS_BRASSAGE): exit_status = set_internalparam_data( "ddddiiiiiiiiiiiiiiiiii",ap); break;
  412. case(GRS_FULL_MONTY): exit_status = set_internalparam_data( "ddddiiiiiiiiiiiiiiiiii",ap); break;
  413. default:
  414. sprintf(errstr,"Unknown case for BRASSAGE in set_legal_internalparam_structure()\n");
  415. return(PROGRAM_ERROR);
  416. }
  417. break;
  418. case(SAUSAGE): exit_status = set_internalparam_data("ddddiiiiiiiiiiiiiiiiii",ap); break;
  419. case(SIN_TAB): exit_status = set_internalparam_data("",ap); break;
  420. //TW UPDATES
  421. case(STACK): exit_status = set_internalparam_data("d",ap); break;
  422. case(CONVOLVE): exit_status = set_internalparam_data("",ap); break;
  423. case(SHUDDER): exit_status = set_internalparam_data("",ap); break;
  424. /* TEMPORARY TEST ROUTINE */
  425. case(WORDCNT): exit_status = set_internalparam_data("",ap); break;
  426. /* TEMPORARY TEST ROUTINE */
  427. default:
  428. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  429. return(PROGRAM_ERROR);
  430. }
  431. return(exit_status);
  432. }
  433. /********************************************************************************************/
  434. /********************************** FORMERLY IN specialin.c *********************************/
  435. /********************************************************************************************/
  436. /********************** READ_SPECIAL_DATA ************************/
  437. int read_special_data(char *str,dataptr dz)
  438. {
  439. aplptr ap = dz->application;
  440. switch(ap->special_data) {
  441. //TW UPDATE
  442. case(STACKDATA): return read_stackdata(str,dz);
  443. case(LOUDNESS): return read_loudness(str,dz);
  444. default:
  445. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  446. return(PROGRAM_ERROR);
  447. }
  448. return(FINISHED); /* NOTREACHED */
  449. }
  450. /********************************************************************************************/
  451. /********************************** FORMERLY IN preprocess.c ********************************/
  452. /********************************************************************************************/
  453. /****************************** PARAM_PREPROCESS *********************************/
  454. int param_preprocess(dataptr dz)
  455. {
  456. int exit_status = FINISHED;
  457. #ifdef MULTICHAN
  458. int n;
  459. #endif
  460. switch(dz->process) {
  461. case(MOD_LOUDNESS):
  462. return(FINISHED);
  463. case(MOD_RADICAL):
  464. switch(dz->mode) {
  465. case(MOD_SHRED): return shred_preprocess(dz);
  466. case(MOD_SCRUB): return scrub_preprocess(dz);
  467. case(MOD_RINGMOD): return create_rm_sintab(dz);
  468. default: return(FINISHED);
  469. }
  470. break;
  471. case(MOD_SPACE): return modspace_preprocess(dz);
  472. //TW UPDATES
  473. case(SCALED_PAN): return scaledpan_preprocess(dz);
  474. case(FIND_PANPOS): return FINISHED;
  475. case(MOD_PITCH): return vtrans_preprocess(dz);
  476. case(MOD_REVECHO): return delay_preprocess(dz);
  477. case(BRASSAGE):
  478. /* RWD: create outfile here - different chan count from infile */
  479. #ifdef MULTICHAN
  480. n = dz->infile->channels;
  481. dz->infile->channels = dz->outfile->channels;
  482. #endif
  483. if(dz->mode==GRS_REVERB || dz->mode==GRS_BRASSAGE || dz->mode == GRS_FULL_MONTY){
  484. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  485. return(exit_status);
  486. }
  487. #ifdef MULTICHAN
  488. dz->infile->channels = n;
  489. #endif
  490. return FINISHED;
  491. case(SAUSAGE): return sausage_preprocess(dz);
  492. case(SIN_TAB): return FINISHED;
  493. //TW UPDATES
  494. case(STACK): return stack_preprocess(dz);
  495. case(CONVOLVE):
  496. if(dz->mode == CONV_TVAR)
  497. return convolve_preprocess(dz);
  498. break;
  499. case(SHUDDER): return FINISHED;
  500. /* TEMPORARY TEST ROUTINE */
  501. case(WORDCNT):
  502. return FINISHED;
  503. /* TEMPORARY TEST ROUTINE */
  504. default:
  505. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  506. return(PROGRAM_ERROR);
  507. }
  508. return(FINISHED); /* NOTREACHED */
  509. }
  510. /********************************************************************************************/
  511. /********************************** FORMERLY IN procgrou.c **********************************/
  512. /********************************************************************************************/
  513. /**************************** GROUCHO_PROCESS_FILE ****************************/
  514. int groucho_process_file(dataptr dz) /* FUNCTIONS FOUND IN PROCESS.C */
  515. {
  516. /*int exit_status = FINISHED;*/
  517. if(dz->process==BRASSAGE || dz->process==SAUSAGE)
  518. display_virtual_time(0L,dz);
  519. switch(dz->process) {
  520. case(MOD_SPACE):
  521. switch(dz->mode) {
  522. case(MOD_PAN): return dopan(dz);
  523. case(MOD_MIRROR): return mirroring(dz);
  524. case(MOD_MIRRORPAN): mirror_panfile(dz); return(FINISHED);
  525. case(MOD_NARROW): return narrow_sound(dz);
  526. default:
  527. sprintf(errstr,"Unknown mode for MOD_SPACE in groucho_process_file()\n");
  528. return(PROGRAM_ERROR);
  529. }
  530. break;
  531. //TW UPDATES
  532. case(SCALED_PAN): return dopan(dz);
  533. case(FIND_PANPOS): return findpan(dz);
  534. case(MOD_PITCH): return process_varispeed(dz);
  535. case(MOD_REVECHO):
  536. switch(dz->mode) {
  537. case(MOD_STADIUM): return do_stadium(dz);
  538. case(MOD_DELAY):
  539. case(MOD_VDELAY): return do_delay(dz);
  540. default:
  541. sprintf(errstr,"Unknown mode for MOD_REVECHO in groucho_process_file()\n");
  542. return(PROGRAM_ERROR);
  543. }
  544. break;
  545. case(MOD_RADICAL):
  546. switch(dz->mode) {
  547. case(MOD_REVERSE): return do_reversing(dz);
  548. case(MOD_SHRED): return shred_process(dz);
  549. case(MOD_SCRUB): return do_scrubbing(dz);
  550. case(MOD_LOBIT):
  551. case(MOD_LOBIT2): return lobit_process(dz);
  552. case(MOD_RINGMOD): return ring_modulate(dz);
  553. case(MOD_CROSSMOD): return cross_modulate(dz);
  554. default:
  555. sprintf(errstr,"Unknown mode for MOD_RADICAL in groucho_process_file()\n");
  556. return(PROGRAM_ERROR);
  557. }
  558. break;
  559. case(MOD_LOUDNESS): return loudness_process(dz);
  560. case(BRASSAGE): return granula_process(dz);
  561. case(SAUSAGE): return granula_process(dz);
  562. case(SIN_TAB): return generate_sintable(dz);
  563. //TW UPDATES
  564. case(STACK): return do_stack(dz);
  565. case(CONVOLVE): return do_convolve(dz);
  566. case(SHUDDER): return do_shudder(dz);
  567. default:
  568. sprintf(errstr,"Unknown case in process_file()\n");
  569. return(PROGRAM_ERROR);
  570. }
  571. return(FINISHED); /* NOTREACHED */
  572. }
  573. /********************************************************************************************/
  574. /********************************** FORMERLY IN pconsistency.c ******************************/
  575. /********************************************************************************************/
  576. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  577. int check_param_validity_and_consistency(dataptr dz)
  578. {
  579. /* int exit_status = FINISHED;*/
  580. handle_pitch_zeros(dz);
  581. switch(dz->process) {
  582. case(MOD_SPACE): return modspace_pconsistency(dz);
  583. //TW UPDATE
  584. case(SCALED_PAN):
  585. if(dz->infile->channels!=MONO) {
  586. sprintf(errstr,"ERROR: SCALED PAN only works with MONO input files.\n");
  587. return(DATA_ERROR);
  588. }
  589. return FINISHED;
  590. case(MOD_REVECHO):
  591. if(dz->mode==MOD_STADIUM)
  592. return stadium_pconsistency(dz);
  593. return FINISHED;
  594. case(MOD_RADICAL):
  595. switch(dz->mode) {
  596. case(MOD_LOBIT): return lobit_pconsistency(dz);
  597. case(MOD_SHRED): return shred_pconsistency(dz);
  598. case(MOD_SCRUB): return scrub_pconsistency(dz);
  599. case(MOD_CROSSMOD): return crossmod_pconsistency(dz);
  600. default: return FINISHED;
  601. }
  602. break;
  603. case(BRASSAGE):
  604. case(SAUSAGE): return granula_pconsistency(dz);
  605. case(SIN_TAB): return sintab_pconsistency(dz);
  606. //TW UPDATES
  607. case(STACK): return FINISHED;
  608. case(CONVOLVE): return convolve_pconsistency(dz);
  609. case(SHUDDER): return FINISHED;
  610. case(FIND_PANPOS): return FINISHED;
  611. /* TEMPORARY TEST ROUTINE */
  612. case(WORDCNT): return FINISHED;
  613. /* TEMPORARY TEST ROUTINE */
  614. }
  615. return(FINISHED);
  616. }
  617. /********************************************************************************************/
  618. /********************************** FORMERLY IN buffers.c ***********************************/
  619. /********************************************************************************************/
  620. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  621. int allocate_large_buffers(dataptr dz)
  622. {
  623. switch(dz->process) {
  624. case(MOD_LOUDNESS):
  625. return create_sndbufs(dz);
  626. case(MOD_SPACE):
  627. if(dz->mode!=MOD_MIRRORPAN)
  628. return create_sndbufs(dz);
  629. return(FINISHED);
  630. //TW UPDATE
  631. case(SCALED_PAN): return create_sndbufs(dz);
  632. case(MOD_PITCH): return create_modspeed_buffers(dz);
  633. case(MOD_REVECHO): return create_delay_buffers(dz);
  634. case(MOD_RADICAL):
  635. switch(dz->mode) {
  636. case(MOD_REVERSE): return create_reversing_buffers(dz);
  637. case(MOD_SHRED): return create_shred_buffers(dz);
  638. case(MOD_SCRUB): return create_scrub_buffers(dz);
  639. case(MOD_LOBIT):
  640. case(MOD_LOBIT2): return create_sndbufs(dz);
  641. case(MOD_RINGMOD): return create_sndbufs(dz);
  642. case(MOD_CROSSMOD): return create_crossmod_buffers(dz);
  643. }
  644. break;
  645. case(BRASSAGE): return create_granula_buffers(dz);
  646. case(SAUSAGE): return create_sausage_buffers(dz);
  647. case(SIN_TAB): return FINISHED;
  648. //TW UPDATES
  649. case(FIND_PANPOS): return create_sndbufs(dz);
  650. case(STACK): return create_sndbufs(dz);
  651. case(CONVOLVE): return create_convolve_bufs(dz);
  652. case(SHUDDER): return create_sndbufs(dz);
  653. /* TEMPORARY TEST ROUTINE */
  654. case(WORDCNT):
  655. return(FINISHED);
  656. /* TEMPORARY TEST ROUTINE */
  657. default:
  658. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  659. return(PROGRAM_ERROR);
  660. }
  661. return(FINISHED);
  662. }
  663. /*************************** CREATE_GRANULA_BUFFERS **************************/
  664. #ifndef MULTICHAN
  665. int create_granula_buffers(dataptr dz)
  666. {
  667. int exit_status,enough_memory;
  668. int convert_to_stereo = FALSE, overall_size = 0, bufdivisor = 0;
  669. float *tailend;
  670. int stereo_buflen = 0, stereo_bufxs = 0, outbuflen, bbb_size;
  671. //TW All buffers are in floats, so this not needed
  672. // int lfactor = sizeof(int)/sizeof(float);
  673. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG])
  674. convert_to_stereo = TRUE;
  675. if((dz->extrabuf[GRS_GBUF] = (float *)malloc(dz->iparam[GRS_GLBUF_SMPXS] * sizeof(float)))==NULL) {
  676. sprintf(errstr,"INSUFFICIENT MEMORY to create grain buffer.\n"); /* GRAIN BUFFER */
  677. return(MEMORY_ERROR);
  678. }
  679. /* CALCULATE NUMBER OF BUFFER CHUNKS REQUIRED : bufdivisor */
  680. if(dz->iparam[GRS_CHANNELS]>0)
  681. bufdivisor += 2;
  682. //TW All buffers are in floats
  683. // bufdivisor += 1 + 1 + lfactor;
  684. bufdivisor += 3;
  685. if(convert_to_stereo)
  686. //TW All buffers are in floats
  687. // bufdivisor += 1 + lfactor;
  688. bufdivisor += 2;
  689. enough_memory = 0;
  690. if((exit_status = grab_an_appropriate_block_of_memory(bufdivisor,dz))<0)
  691. return(exit_status);
  692. bbb_size = /*dz->bigbufsize*/dz->buflen;
  693. while(!enough_memory) {
  694. /* CALCULATE AND ALLOCATE TOTAL MEMORY REQUIRED : overall_size */
  695. if ((overall_size = /*dz->bigbufsize*/dz->buflen * bufdivisor) < 0) { /* overflow */
  696. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  697. return(MEMORY_ERROR);
  698. }
  699. if ((overall_size += (dz->iparam[GRS_BUF_SMPXS] + dz->iparam[GRS_LBUF_SMPXS])) < 0) { /* overflow */
  700. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  701. return(MEMORY_ERROR);
  702. }
  703. if(dz->iparam[GRS_CHANNELS])
  704. overall_size += 2 * dz->iparam[GRS_BUF_SMPXS];
  705. if(overall_size<0) { /* overflow */
  706. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  707. return(MEMORY_ERROR);
  708. }
  709. if((dz->bigbuf=(float *)malloc(overall_size * sizeof(float)))==NULL) {
  710. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  711. return(MEMORY_ERROR);
  712. }
  713. /* SET SIZE OF inbuf, outbuf, AND Lbuf (FOR CALCS IN LONGS) */
  714. outbuflen = dz->buflen;
  715. if(convert_to_stereo)
  716. outbuflen *= 2;
  717. if(dz->iparam[GRS_CHANNELS]) {
  718. stereo_buflen = dz->buflen * 2;
  719. stereo_bufxs = dz->iparam[GRS_BUF_SMPXS] * 2; /**** CHANGED MAY 1998 ****/
  720. }
  721. dz->iparam[GRS_LONGS_BUFLEN] = outbuflen;
  722. if(dz->iparam[GRS_LBUF_SMPXS] <= dz->iparam[GRS_LONGS_BUFLEN])
  723. enough_memory = 1;
  724. else {
  725. if((/*dz->bigbufsize*/dz->buflen += bbb_size) < 0) { /* overflow */
  726. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  727. return(MEMORY_ERROR);
  728. }
  729. }
  730. }
  731. /* DIVIDE UP ALLOCATED MEMORY IN SPECIALISED BUFFERS */
  732. if(dz->iparam[GRS_CHANNELS]) {
  733. dz->sampbuf[GRS_SBUF] = dz->bigbuf;
  734. dz->sampbuf[GRS_BUF] = dz->sampbuf[GRS_SBUF] + stereo_buflen + stereo_bufxs;
  735. } else
  736. dz->sampbuf[GRS_BUF] = dz->bigbuf; /* buf: complete input buffer with wrap-around space */
  737. dz->sbufptr[GRS_BUF] = dz->sampbuf[GRS_BUF] + dz->buflen; /* bufend: start of wrap-around area */
  738. tailend = dz->sbufptr[GRS_BUF] + dz->iparam[GRS_BUF_SMPXS]; /* tailend: end of wrap-around area */
  739. dz->sampbuf[GRS_IBUF] = dz->sampbuf[GRS_BUF] + dz->iparam[GRS_BUF_SMPXS]; /* ibuf: input buffer 'base' after wrap-around begins */
  740. dz->fptr[GRS_LBUF] = /*(int *)*/tailend; /* Lbuf: buffer for calculations */
  741. dz->fptr[GRS_LBUFEND] = dz->fptr[GRS_LBUF] + dz->iparam[GRS_LONGS_BUFLEN];/* Lbufend: start of Lbuf wrap-around area */
  742. dz->fptr[GRS_LTAILEND] = dz->fptr[GRS_LBUFEND] + dz->iparam[GRS_LBUF_SMPXS];/* Ltailend: end of Lbuf wrap-around area */
  743. dz->fptr[GRS_LBUFMID] = dz->fptr[GRS_LBUF] + dz->iparam[GRS_LBUF_SMPXS];/* Lbufmid: Lbuf 'base' after wrap-around begins */
  744. dz->sampbuf[GRS_OBUF] = (dz->fptr[GRS_LTAILEND]); /* obuf: output buffer */
  745. /* INITIALISE BUFFERS */
  746. memset((char *)dz->bigbuf,0,overall_size * sizeof(float));
  747. return(FINISHED);
  748. }
  749. #else
  750. int create_granula_buffers(dataptr dz)
  751. {
  752. int exit_status,enough_memory;
  753. int spatialise_output = FALSE, overall_size = 0, bufdivisor = 0, chans = dz->infile->channels;
  754. float *tailend;
  755. int multichan_buflen = 0, multichan_bufxs = 0, grainbuflen, bbb_size;
  756. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG])
  757. spatialise_output = TRUE;
  758. if((dz->extrabuf[GRS_GBUF] = (float *)malloc(dz->iparam[GRS_GLBUF_SMPXS] * sizeof(float)))==NULL) {
  759. sprintf(errstr,"INSUFFICIENT MEMORY to create grain buffer.\n"); /* GRAIN BUFFER */
  760. return(MEMORY_ERROR);
  761. }
  762. /* CALCULATE NUMBER OF BUFFER CHUNKS REQUIRED : bufdivisor */
  763. if(dz->iparam[GRS_CHANNELS]>0)
  764. bufdivisor += chans;
  765. bufdivisor += 3;
  766. // MARCH 2010
  767. // if(spatialise_output)
  768. bufdivisor += dz->out_chans;
  769. enough_memory = 0;
  770. if((exit_status = grab_an_appropriate_block_of_memory(bufdivisor,dz))<0)
  771. return(exit_status);
  772. bbb_size = dz->buflen;
  773. while(!enough_memory) {
  774. /* CALCULATE AND ALLOCATE TOTAL MEMORY REQUIRED : overall_size */
  775. if ((overall_size = dz->buflen * bufdivisor) < 0) { /* overflow */
  776. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  777. return(MEMORY_ERROR);
  778. }
  779. if ((overall_size += (dz->iparam[GRS_BUF_SMPXS] + dz->iparam[GRS_LBUF_SMPXS])) < 0) { /* overflow */
  780. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  781. return(MEMORY_ERROR);
  782. }
  783. if(dz->iparam[GRS_CHANNELS])
  784. overall_size += chans * dz->iparam[GRS_BUF_SMPXS];
  785. if(overall_size<0) { /* overflow */
  786. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  787. return(MEMORY_ERROR);
  788. }
  789. if((dz->bigbuf=(float *)malloc(overall_size * sizeof(float)))==NULL) {
  790. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  791. return(MEMORY_ERROR);
  792. }
  793. /* SET SIZE OF inbuf, outbuf, AND Lbuf (FOR CALCS IN LONGS) */
  794. grainbuflen = dz->buflen * dz->iparam[GRS_INCHANS];
  795. if(dz->iparam[GRS_CHANNELS]) {
  796. multichan_buflen = dz->buflen * chans;
  797. multichan_bufxs = dz->iparam[GRS_BUF_SMPXS] * chans; /**** CHANGED MAY 1998 ****/
  798. }
  799. dz->iparam[GRS_LONGS_BUFLEN] = grainbuflen;
  800. if(dz->iparam[GRS_LBUF_SMPXS] <= dz->iparam[GRS_LONGS_BUFLEN])
  801. enough_memory = 1;
  802. else {
  803. if((dz->buflen += bbb_size) < 0) { /* overflow */
  804. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  805. return(MEMORY_ERROR);
  806. }
  807. }
  808. }
  809. /* DIVIDE UP ALLOCATED MEMORY IN SPECIALISED BUFFERS */
  810. if(dz->iparam[GRS_CHANNELS]) {
  811. dz->sampbuf[GRS_SBUF] = dz->bigbuf;
  812. dz->sampbuf[GRS_BUF] = dz->sampbuf[GRS_SBUF] + multichan_buflen + multichan_bufxs;
  813. } else
  814. dz->sampbuf[GRS_BUF] = dz->bigbuf; /* buf: complete input buffer with wrap-around space */
  815. dz->sbufptr[GRS_BUF] = dz->sampbuf[GRS_BUF] + dz->buflen; /* bufend: start of wrap-around area */
  816. tailend = dz->sbufptr[GRS_BUF] + dz->iparam[GRS_BUF_SMPXS]; /* tailend: end of wrap-around area */
  817. dz->sampbuf[GRS_IBUF] = dz->sampbuf[GRS_BUF] + dz->iparam[GRS_BUF_SMPXS]; /* ibuf: input buffer 'base' after wrap-around begins */
  818. dz->fptr[GRS_LBUF] = /*(int *)*/tailend; /* Lbuf: buffer for calculations */
  819. dz->fptr[GRS_LBUFEND] = dz->fptr[GRS_LBUF] + dz->iparam[GRS_LONGS_BUFLEN];/* Lbufend: start of Lbuf wrap-around area */
  820. dz->fptr[GRS_LTAILEND] = dz->fptr[GRS_LBUFEND] + dz->iparam[GRS_LBUF_SMPXS];/* Ltailend: end of Lbuf wrap-around area */
  821. dz->fptr[GRS_LBUFMID] = dz->fptr[GRS_LBUF] + dz->iparam[GRS_LBUF_SMPXS];/* Lbufmid: Lbuf 'base' after wrap-around begins */
  822. dz->sampbuf[GRS_OBUF] = (dz->fptr[GRS_LTAILEND]); /* obuf: output buffer */
  823. /* INITIALISE BUFFERS */
  824. memset((char *)dz->bigbuf,0,overall_size * sizeof(float));
  825. return(FINISHED);
  826. }
  827. #endif
  828. /* INPUT BUFFER :-
  829. *
  830. * |-----------BUFLEN-----------|
  831. *
  832. * buf ibuf bufend tailend
  833. * |_________|__________________|buf_smpxs| ..... (obuf->)
  834. * /
  835. * |buf_smpxs| <<-COPY_________/
  836. *
  837. * |-----------BUFLEN-----------|
  838. *
  839. *
  840. *
  841. * OUTPUT LONGS BUFFER:-
  842. *
  843. * Lbuf Lbufmid Lbufend
  844. * |____________|_______________|_Lbuf_smpxs_|
  845. * /
  846. * |_Lbuf_smpxs_| <<-COPY___________/
  847. *
  848. */
  849. /*************************** GRAB_AN_APPROPRIATE_BLOCK_OF_MEMORY **************************/
  850. #ifndef MULTICHAN
  851. int grab_an_appropriate_block_of_memory(int bufdivisor,dataptr dz)
  852. {
  853. int this_bloksize, standard_block = (int) ((long)Malloc(-1));
  854. int sector_blok;
  855. standard_block /= sizeof(float);
  856. this_bloksize = standard_block;
  857. dz->buflen = 0;
  858. while(dz->buflen <= 0){
  859. if((dz->buflen = this_bloksize)< 0) { /* arithmetic overflow */
  860. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  861. return(MEMORY_ERROR);
  862. }
  863. this_bloksize += standard_block;
  864. /* CALCULATE SIZE OF BUFFER REQUIRED : dz->bigbufsize */
  865. dz->buflen -= dz->iparam[GRS_BUF_SMPXS] + dz->iparam[GRS_LBUF_SMPXS]; /* Allow for overflow areas */
  866. if(dz->iparam[GRS_CHANNELS])
  867. dz->buflen -= 2 * dz->iparam[GRS_BUF_SMPXS]; /* Allow for overflow space in additional stereo inbuf */
  868. dz->buflen /= bufdivisor; /* get unit buffersize */
  869. sector_blok = F_SECSIZE; /* Read and write buf sizes must be multiples of SECSIZE ... for now */
  870. if(dz->iparam[GRS_CHANNELS]) /* If reading stereo: 2* SECSIZE reduces to single mono SECSIZE */
  871. sector_blok *= 2; /* So dz->bigbufsize must be a multiple of (2 * SECSIZE) */
  872. dz->buflen = (dz->buflen/sector_blok) * sector_blok;
  873. }
  874. return(FINISHED);
  875. }
  876. #else
  877. int grab_an_appropriate_block_of_memory(int bufdivisor,dataptr dz)
  878. {
  879. int this_bloksize, standard_block = (int)Malloc(-1);
  880. int sector_blok, chans = dz->infile->channels;
  881. standard_block /= sizeof(float);
  882. this_bloksize = standard_block;
  883. dz->buflen = 0;
  884. while(dz->buflen <= 0){
  885. if((dz->buflen = this_bloksize)< 0) { /* arithmetic overflow */
  886. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  887. return(MEMORY_ERROR);
  888. }
  889. this_bloksize += standard_block;
  890. /* CALCULATE SIZE OF BUFFER REQUIRED : dz->bigbufsize */
  891. dz->buflen -= dz->iparam[GRS_BUF_SMPXS] + dz->iparam[GRS_LBUF_SMPXS]; /* Allow for overflow areas */
  892. if(dz->iparam[GRS_CHANNELS])
  893. dz->buflen -= chans * dz->iparam[GRS_BUF_SMPXS]; /* Allow for overflow space in additional multichannel inbuf */
  894. dz->buflen /= bufdivisor; /* get unit buffersize */
  895. sector_blok = F_SECSIZE; /* Read and write buf sizes must be multiples of SECSIZE ... for now */
  896. if(dz->iparam[GRS_CHANNELS]) /* If reading multichan: chans * SECSIZE reduces to single mono SECSIZE */
  897. sector_blok *= chans; /* So dz->bigbufsize must be a multiple of (chans * SECSIZE) */
  898. dz->buflen = (dz->buflen/sector_blok) * sector_blok;
  899. }
  900. return(FINISHED);
  901. }
  902. #endif
  903. /********************************************************************************************/
  904. /********************************** FORMERLY IN cmdline.c ***********************************/
  905. /********************************************************************************************/
  906. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  907. {
  908. if (!strcmp(prog_identifier_from_cmdline,"loudness")) dz->process = MOD_LOUDNESS;
  909. else if(!strcmp(prog_identifier_from_cmdline,"space")) dz->process = MOD_SPACE;
  910. //TW UPDATES
  911. else if(!strcmp(prog_identifier_from_cmdline,"scaledpan")) dz->process = SCALED_PAN;
  912. else if(!strcmp(prog_identifier_from_cmdline,"findpan")) dz->process = FIND_PANPOS;
  913. else if(!strcmp(prog_identifier_from_cmdline,"speed")) dz->process = MOD_PITCH;
  914. else if(!strcmp(prog_identifier_from_cmdline,"revecho")) dz->process = MOD_REVECHO;
  915. else if(!strcmp(prog_identifier_from_cmdline,"radical")) dz->process = MOD_RADICAL;
  916. else if(!strcmp(prog_identifier_from_cmdline,"brassage")) dz->process = BRASSAGE;
  917. else if(!strcmp(prog_identifier_from_cmdline,"sausage")) dz->process = SAUSAGE;
  918. //TW UPDATE (originally missing from cmdlinr list
  919. else if(!strcmp(prog_identifier_from_cmdline,"spaceform")) dz->process = SIN_TAB;
  920. //TW UPDATES
  921. else if(!strcmp(prog_identifier_from_cmdline,"stack")) dz->process = STACK;
  922. else if(!strcmp(prog_identifier_from_cmdline,"convolve")) dz->process = CONVOLVE;
  923. else if(!strcmp(prog_identifier_from_cmdline,"shudder")) dz->process = SHUDDER;
  924. /* TEMPORARY TEST ROUTINE */
  925. else if(!strcmp(prog_identifier_from_cmdline,"wordcnt")) dz->process = WORDCNT;
  926. /* TEMPORARY TEST ROUTINE */
  927. else {
  928. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  929. return(USAGE_ONLY);
  930. }
  931. /*RWD 9:2001 need retval */
  932. return FINISHED;
  933. }
  934. /********************************************************************************************/
  935. /********************************** FORMERLY IN usage.c *************************************/
  936. /********************************************************************************************/
  937. /******************************** USAGE1 ********************************/
  938. int usage1(void)
  939. {
  940. sprintf(errstr,
  941. "USAGE: modify NAME (mode) infile outfile (datafile) parameters\n"
  942. "\n"
  943. "where NAME can be any one of\n"
  944. "\n"
  945. "loudness space speed revecho\n"
  946. //TW UPDATE
  947. // "brassage sausage radical\n"
  948. "brassage sausage radical spaceform\n"
  949. //TW UPDATE
  950. "scaledpan findpan convolve stack shudder\n"
  951. "\n"
  952. "Type 'modify brassage' for more info on modify brassage option... ETC.\n");
  953. return(USAGE_ONLY);
  954. }
  955. /******************************** USAGE2 ********************************/
  956. /*RWD 9:2001 usage message changes for loudness */
  957. int usage2(char *str)
  958. {
  959. if (!strcmp(str,"loudness")) {
  960. fprintf(stdout,
  961. "ADJUST LOUDNESS OF A SOUNDFILE\n\n"
  962. "USAGE: modify loudness 1 infile outfile gain\n"
  963. "OR: modify loudness 11-12 infile outfile gain\n"
  964. "OR: modify loudness 2 infile outfile gain\n" /* NORMALISE IF NESS */
  965. "OR: modify loudness 3 infile outfile [-llevel]\n" /* NORMALISE IF NESS */
  966. "OR: modify loudness 4 infile outfile [-llevel]\n" /* FORCE TO SET LEVEL */
  967. "OR: modify loudness 5 infile infile2 outfile\n" /* BALANCE */
  968. "OR: modify loudness 6 infile outfile\n" /* INVERT PHASE */
  969. "OR: modify loudness 7 infile infile2 etc.\n" /* FIND LOUDEST */
  970. "OR: modify loudness 8 infile infile2 etc. outfile\n\n" /* NORMALISE TO LOUDEST */
  971. "WHERE MODES ARE\n"
  972. "1) GAIN: adjust level by factor GAIN.\n"
  973. "2) dBGAIN: adjust level by GAIN dB. Range +-96.0\n"
  974. "3) NORMALISE: force level (if ness) to max possible, or to LEVEL given.\n"
  975. "4) FORCE LEVEL: force level to maximum possible, or to LEVEL given.\n"
  976. "5) BALANCE: force max level of file1 to max level of file 2.\n"
  977. "6) INVERT PHASE: Invert phase of the sound.\n"
  978. "7) FIND LOUDEST: find loudest file.\n"
  979. "8) EQUALISE: force all files to level of loudest file.\n"
  980. "11) PROPORTIONAL: adjust level with envelope stretched to dur of sound.\n"
  981. "12) PROPORTIONAL dB: adjust level with dB envelope stretched to dur of sound.\n"
  982. " Infiles are rescaled in input order, with output names as\n"
  983. //TW " outfile, outfile1, outfile2, outfile3 etc.\n"
  984. " outfile0, outfile1, outfile2, outfile3 etc.\n"
  985. );
  986. } else if(!strcmp(str,"space")) {
  987. fprintf(stdout,
  988. "CREATE OR ALTER DISTRIBUTION OF SOUND IN STEREO SPACE\n\n"
  989. "USAGE: modify space 1 infile outfile pan [-pprescale]\n"
  990. "OR: modify space 2 infile outfile\n"
  991. "OR: modify space 3 infile outfile\n"
  992. "OR: modify space 4 infile outfile narrowing\n\n"
  993. "WHERE MODES ARE\n"
  994. "1) PAN: Position or move mono sound in a stereo field.\n"
  995. " Prescale reduces inlevel to avoid clipping (default 0.7)\n"
  996. "2) MIRROR: Invert stereo positions in a stereo file.\n"
  997. "3) MIRRORPAN: Invert stereo positions in a pan data file.\n"
  998. "4) NARROW: Narrow the stereo image of a sound.\n"
  999. " NARROWING range, -1 to 1\n"
  1000. " 1 leaves stereo image as it is.\n"
  1001. " .5 narrows stereo image by half.\n"
  1002. " 0 converts stereo image to mono.\n"
  1003. " -ve vals work similarly, but also invert stereo image.\n");
  1004. //TW UPDATES
  1005. } else if(!strcmp(str,"spaceform")) {
  1006. fprintf(stdout,
  1007. "CREATE A SINUSOIDAL SPATIAL DISTRIBUTION DATA FILE\n\n"
  1008. "USAGE: modify spaceform outpanfile cyclelen width dur quantisation phase\n\n"
  1009. "CYCLELEN is the duration of one complete sinusoidal pan cycle\n"
  1010. "WIDTH is the width of the pan (from 0 to full width,1)\n"
  1011. "DUR is the duration of the output file.\n"
  1012. "QUANTISATION is time step between successive space-position specifications.\n"
  1013. "PHASE is the angular position at which the pan starts.\n"
  1014. " 0 is full left, 360 is full right.\n"
  1015. "cyclelen and width may vary over time\n");
  1016. } else if(!strcmp(str,"scaledpan")) {
  1017. fprintf(stdout,
  1018. "DISTRIBUTE SOUND IN STEREO SPACE, SCALING PAN DATA TO SNDFILE DURATION\n\n"
  1019. "USAGE: modify scaledpan infile outfile pan [-pprescale]\n\n"
  1020. "PAN breakpoint file of time, position pairs.\n"
  1021. " Positions sound in a stereo field, from -1 (Left) to 1 (Right) or beyond.\n"
  1022. "PRESCALE reduces input level to avoid clipping (default 0.7)\n");
  1023. } else if(!strcmp(str,"findpan")) {
  1024. fprintf(stdout,
  1025. "FIND STEREO-PAN POSITION OF A SOUND IN A STEREO FILE\n\n"
  1026. "USAGE: modify findpan infile time\n\n"
  1027. "Process assumes file contains a sound which has previously been panned to a position\n"
  1028. "in the stereo field. The process will give misleading results if this is not the case.\n");
  1029. } else if(!strcmp(str,"stack")) {
  1030. fprintf(stdout,
  1031. "CREATE A MIX WHICH STACKS TRANPOSED VERSIONS OF SOURCE ON ONE ANOTHER\n\n"
  1032. "USAGE: modify stack infile outfile transpos count lean atk-offset gain dur [-s] [-n]\n\n"
  1033. "TRANSPOS when numeric, is (semitone) transposition between successive copies\n"
  1034. " or (as a file) a set of transposition values for each stack component.\n"
  1035. "COUNT is the number of copies in the stack.\n"
  1036. "LEAN is the loudness of the highest component, relative to the lowest.\n"
  1037. "ATK_OFFSET is time at which attack of sound occurs.\n"
  1038. "GAIN is an overall amplifying factor on the ouptut sound.\n"
  1039. "DUR how much of the output to make (a proportion, from 0 to 1).\n"
  1040. "-s see the relative levels of the layers in the stack.\n"
  1041. "-n Normalise the output.\n");
  1042. } else if(!strcmp(str,"convolve")) {
  1043. fprintf(stdout,
  1044. "CONVOLVE THE FIRST SOUND WITH THE SECOND\n\n"
  1045. "USAGE: modify convolve 1 infile1 infile2 outfile\n"
  1046. "OR: modify convolve 2 infile1 infile2 outfile tranposfile\n\n"
  1047. "TRANSPOSFILE is textfile of time / semitone-transposition pairs\n"
  1048. "infile2 must NOT be longer than infile1\n"
  1049. "and both files must have the same channel count.\n");
  1050. } else if(!strcmp(str,"shudder")) {
  1051. fprintf(stdout,
  1052. "SHUDDER A STEREO FILE\n\n"
  1053. "USAGE: modify shudder infile outfile\n"
  1054. " starttime frq scatter stereo_spread mindepth maxdepth minwidth maxwidth [-b]\n\n"
  1055. "START_TIME is time when Shuddering will begin.\n"
  1056. "FREQUENCY is (average) frequency of the shuddering.\n"
  1057. "SCATTER randomises the shudder events, in time. (0 - 1)\n"
  1058. "STEREO_SPREAD positions the shudder events in space. (0 - 1)\n"
  1059. "DEPTH amplitude of shudders (each gets randval btwn MIN & MAX) Range 0-1\n"
  1060. "EVENT WIDTH durations of shudder events (each gets randval btwn MIN & MAX)\n"
  1061. "-b Balance average level of the stereo channels\n");
  1062. } else if(!strcmp(str,"speed")) {
  1063. fprintf(stdout,
  1064. "CHANGE THE SPEED & PITCH OF THE SRC SOUND.\n\n"
  1065. "USAGE: modify speed 1 infile outfile speed [-o]\n"
  1066. "OR: modify speed 2 infile outfile semitone-transpos [-o]\n"
  1067. "OR: modify speed 3 infile outtextfile speed [-o]\n"
  1068. "OR: modify speed 4 infile outtextfile semitone-transpos [-o]\n"
  1069. "OR: modify speed 5 infile outfile accel goaltime [-sstarttime]\n"
  1070. "OR: modify speed 6 infile outfile vibrate vibdepth\n"
  1071. "WHERE MODES ARE\n"
  1072. "1) Vary speed/pitch of a sound.\n"
  1073. "2) Vary speed/pitch by constant (fractional) no. of semitones.\n"
  1074. "3) Get information on varying speed in a time-changing manner.\n"
  1075. "4) Get info on time-variable speedchange in semitones.\n"
  1076. " -o brkpnt times read as outfile times (default: as infile times).\n"
  1077. "5) Accelerate or decelerate a sound.\n"
  1078. " ACCEL: multiplication of speed reached by GOALTIME.\n"
  1079. " GOALTIME: time in OUTPUT file at which accelerated speed reached.\n"
  1080. " If infile not exhausted there, it continues to accel.\n"
  1081. " If insound finishes before GOALTIME reached,\n"
  1082. " outfile won't reach specified acceleration value.\n"
  1083. " STARTTIME: time in input/output file at which accel begins.\n"
  1084. "6) Add vibrato to a sound.\n"
  1085. " VIBRATE: is rate of vibrato shaking in cycles-per-second.\n"
  1086. " VIBDEPTH: is vibrato depth in (possibly fractional) semitones.\n"
  1087. " both of these may vary in time.\n");
  1088. } else if(!strcmp(str,"revecho")) {
  1089. fprintf(stdout,
  1090. "CREATE REVERB, ECHO, OR RESONANCE AROUND SOUND\n\n"
  1091. "USAGE: modify revecho 1 infl outfl delay mix feedback tail [-pprescale] [-i]\n"
  1092. "OR: modify revecho 2 infl outfl delay mix feedback\n"
  1093. " lfomod lfofreq lfophase lfodelay\n"
  1094. " tail [-pprescale] [-sseed]\n"
  1095. "OR: modify revecho 3 infl outfl [-ggain] [-rroll_off] [-ssize] [-ecount] [-n]\n\n"
  1096. "WHERE MODES ARE\n"
  1097. "1) STANDARD DELAY with feedback, & mix (0=dry) of original & delayed signal.\n"
  1098. "2) VARYING DELAY with low frequency oscillator varying delay time.\n"
  1099. "3) STADIUM ECHO create stadium P.A. type echos.\n\n"
  1100. "DELAY Delay time, in milliseconds.\n"
  1101. "MIX amount of delayed signal in final mix: 0 gives 'dry' result.\n"
  1102. "FEEDBACK produces resonance related to delay time (with short times).\n"
  1103. "TAIL is time to allow delayed signal to decay to zero.\n"
  1104. "PRESCALE prescales input level, to avoid overload.\n"
  1105. "-i inverts the dry signal (for phasing effects).\n"
  1106. "LFOMOD is the depth of delay-variation sweep.\n"
  1107. "LFOFREQ is the freq of the sweep: -ve vals give random oscillations.\n"
  1108. "LFOPHASE is the start phase of the sweep.\n"
  1109. "LFODELAY is the time before the seep begins.\n"
  1110. "SEED Nonzero value gives reproducible output (with same seed)\n"
  1111. " where random oscillations are used.\n"
  1112. "GAIN to apply to input signal: Default is %lf\n"
  1113. "SIZE multiplies average time between echoes: (Default time 0.1 secs).\n"
  1114. "ROLL_OFF rate of loss of level across stadium (default 1)\n"
  1115. "COUNT number of stadium echoes: Default (max) is %d\n"
  1116. "-n Normalise the output, preventing overload,\n",STAD_PREGAIN_DFLT,MAX_ECHOCNT);
  1117. } else if(!strcmp(str,"radical")) {
  1118. fprintf(stdout,
  1119. "RADICAL CHANGES TO THE SOUND.\n\n"
  1120. "USAGE: modify radical 1 infile outfile\n"
  1121. "OR: modify radical 2 infile outfile repeats chunklen [-sscatter] [-n]\n"
  1122. "OR: modify radical 3 infile outfile dur [-ldown] [-hup] [-sstart] [-eend] [-f]\n"
  1123. "OR: modify radical 4 infile outfile bit_resolution srate_division\n"
  1124. "OR: modify radical 5 infile outfile modulating-frq\n"
  1125. "OR: modify radical 6 infile1 infile2 outfile\n\n"
  1126. "OR: modify radical 7 infile1 outfile bit_resolution\n\n"
  1127. "MODES ARE\n"
  1128. "1) REVERSE: sound plays backwards.\n"
  1129. "2) SHRED: sound is shredded, within its existing duration.\n"
  1130. " REPEATS no. of repeats of shredding process.\n"
  1131. " CHUNKLEN average length of chunks to cut & permute.\n"
  1132. " SCATTER randomisation of cuts (0 to K): default 1.\n"
  1133. " where K = total no. of chunks (snd-duration/chunklen).\n"
  1134. " If scatter = 0, reorders without shredding.\n"
  1135. " NB: chunklen * scatter MUST be < program's snd buffer.\n"
  1136. " NB2: If Input sound > internal buffer len,\n"
  1137. " each buffer of sound shredded independently.\n"
  1138. " -n flag gives a slightly smoother output\n"
  1139. "3) SCRUB BACK & FORTH: as if handwinding over a tape-head.\n"
  1140. " DUR is minimum length of outfile required.\n"
  1141. " DOWN is lowest downward transposition (semitones).\n"
  1142. " UP is highest upward transposition (semitones).\n"
  1143. " START scrubs starts before time 'start' secs.\n"
  1144. " END scrubs end after time 'end' secs.\n"
  1145. " -f single forwards scrub only (ignores \"DUR\")\n"
  1146. "4) LOSE RESOLUTION: sound converted to lower srate, or bit-resolution.\n"
  1147. " BIT_RESOLUTION range(1 - 16): default 16-bit.\n"
  1148. " SRATE_DIVISION range(1-256): default 1 (normal)\n"
  1149. " entered value will be rounded to a power of 2.\n"
  1150. "5) RING MODULATE: against input modulating frequency, creating sidebands.\n"
  1151. "6) CROSS MODULATE: Two infiles are multiplied, creating complex sidebands.\n"
  1152. " Any combo of mono & stereo files works but,\n"
  1153. " files with more channels must have same channel count.\n"
  1154. "7) QUANTISE: sound converted to specific bit-resolution (mid-rise).\n"
  1155. " BIT_RESOLUTION range(1 - 16): default 16-bit.\n");
  1156. } else if(!strcmp(str,"brassage")) { /* BRASSAGE = GRANULA */
  1157. fprintf(stdout, /* NB has to use direct fprintf as 2 screenfulls */
  1158. "GRANULAR RECONSTITUTION OF SOUNDFILE\n\n"
  1159. "MODES ARE...\n"
  1160. "1) PITCHSHIFT 4) SCRAMBLE\n"
  1161. "2) TIMESTRETCH 5) GRANULATE\n"
  1162. "3) REVERB 6) BRASSAGE\n"
  1163. " 7) FULL MONTY\n"
  1164. //TW temporary cmdline restriction
  1165. "USAGE:\n"
  1166. "modify brassage 1 infile outfile pitchshift\n"
  1167. "modify brassage 2 infile outfile velocity\n"
  1168. "modify brassage 3 infile outfile density pitch amp [-rrange]\n"
  1169. "modify brassage 4 infile outfile grainsize [-rrange]\n"
  1170. "modify brassage 5 infile outfile density \n\n"
  1171. "modify brassage 6 infile outfile velocity density grainsize pitchshft amp space\n"
  1172. " bsplice esplice\n"
  1173. " [-rrange] [-jjitter] [-loutlength] [-cchannel] [-x] [-n]\n\n"
  1174. "modify brassage 7 infile outfile velocity density hvelocity hdensity\n"
  1175. " grainsize pitchshift amp space bsplice esplice\n"
  1176. " hgrainsize hpitchshift hamp hspace hbsplice hesplice\n"
  1177. " [-rrange] [-jjitter] [-loutlength] [-cchannel] [-x] [-n]\n"
  1178. "\n"
  1179. #ifdef IS_PC
  1180. "MORE??? ----- (hit keyboard)\n");
  1181. while(!kbhit())
  1182. ;
  1183. if(kbhit()) {
  1184. #else
  1185. "\n");
  1186. #endif
  1187. fprintf(stdout,
  1188. "VELOCITY: speed of advance in infile, relative to outfile. (>=0)\n"
  1189. " This is inverse of timestretch, (& permits infinite timestretch).\n"
  1190. "DENSITY: amount of grain overlap (>0 : <1 leaves intergrain silence)\n"
  1191. " Extremely small values will cease to perform predictably.\n"
  1192. "GRAINSIZE: grainsize in MS (must be > 2 * splicelen) (Default %.0lf)\n"
  1193. "PITCHSHIFT:is pitchshift in +|- (fractions of) semitones.\n"
  1194. "AMP: is gain on grains (range 0-1) (Default 1.0)\n"
  1195. " use only if you want amp to vary (over a range &/or in time)\n"
  1196. "BSPLICE: length of startsplices on grains,in MS (Default %.0lf)\n"
  1197. "ESPLICE: length of endsplices on grains,in MS (Default %.0lf)\n"
  1198. "SPACE: set stereo position in outputfile. 0=L,1=R (Range 0-1).\n"
  1199. #ifndef MULTICHAN
  1200. " Space flag on STEREO input, mixes it to mono before acting.\n"
  1201. #else
  1202. " Set space param to zero, to force multichan output.\n"
  1203. " Otherwise multichan input mixes to mono\n"
  1204. " (or selects 1 channel of your choice - see below)\n"
  1205. " before generating a spatialised stereo output.\n"
  1206. #endif
  1207. "RANGE: of search for nextgrain, before infile 'now' (Default 0 MS).\n"
  1208. "JITTER: Randomisation of grain position (Range 0-1) Default (%.2lf).\n"
  1209. "OUTLENGTH: maximum outfile length (if end of data not reached).\n"
  1210. " Set to zero (Default) for this parameter to be ignored.\n"
  1211. " BUT if VELOCITY is ANYWHERE 0: OUTLENGTH must be given.\n"
  1212. #ifndef MULTICHAN
  1213. "CHANNEL Extract & work on just 1 channel of stereo snd: Range(1-2).\n"
  1214. #else
  1215. "CHANNEL Extract/work on 1 chan of multichan snd: Range(1-chancnt) OR\n"
  1216. " (For -ve values) e.g. val -N, spatialise to N-channel space.\n"
  1217. #endif
  1218. " Set to zero (Default) for this parameter to be ignored.\n"
  1219. "-x: do exponential splices (Default: linear).\n"
  1220. "-n: no interpolation for pitch vals, (quick but dirty).\n"
  1221. "\n"
  1222. "HVELOCITY,HDENSITY,HGRAINSIZE,HPITCHSHIFT,HAMP,HBSPLICE,HESPLICE,HSPACE\n"
  1223. "allow a range of values to be specified for any of these params. e.g. With\n"
  1224. "PITCHSHIFT & HPITCHSHIFT set, random pitchshift chosen between these limits.\n"
  1225. "AND NB PITCHSHIFT & HPITCHSHIFT can both vary through time.\n\n"
  1226. "All params, except OUTLENGTH and CHANNEL, can vary through time.\n",
  1227. GRS_DEFAULT_GRAINSIZE,GRS_DEFAULT_SPLICELEN,GRS_DEFAULT_SPLICELEN,GRS_DEFAULT_SCATTER);
  1228. #ifdef IS_PC
  1229. }
  1230. #endif
  1231. } else if (!strcmp(str,"sausage")) {
  1232. fprintf(stdout,
  1233. "GRANULAR RECONSTITUTION OF SEVERAL SOUNDFILES SCRAMBLED TOGETHER.\n\n"
  1234. //TW temporary cmdline restriction
  1235. "USAGE (name of outfile must NOT end with a '1')\n"
  1236. "modify sausage infile [infile2 ...] outfile velocity density\n"
  1237. " hvelocity hdensity grainsize pitchshift amp space bsplice esplice\n"
  1238. " hgrainsize hpitchshift hamp hspace hbsplice hesplice\n"
  1239. " [-rrange] [-jjitter] [-loutlength] [-cchannel] [-d] [-x] [-n]\n\n"
  1240. "VELOCITY: speed of advance in infiles, relative to outfile. (>=0)\n"
  1241. " inverse of timestretch, (permits infinite timestretch).\n"
  1242. "DENSITY: grain overlap (>0 : <1 leaves intergrain silence)\n"
  1243. " Extremely small values don't perform predictably.\n"
  1244. "GRAINSIZE: grainsize in MS (must be > 2 * splicelen) (Default %.0lf)\n"
  1245. "PITCHSHIFT:pitchshift in +|- (fractions of) semitones.\n"
  1246. "AMP: gain on grains (range 0-1) (Default 1.0)\n"
  1247. " use if amp variation required (over a range &/or in time)\n"
  1248. "BSPLICE: grain-startsplice length,in MS (Default %.0lf)\n"
  1249. "ESPLICE: grain-endsplice length,in MS (Default %.0lf)\n"
  1250. "SPACE: stereo position in outputfile. 0=L,1=R (Range 0-1).\n"
  1251. #ifndef MULTICHAN
  1252. " Space flag on STEREO input, mixes to mono before acting.\n"
  1253. #else
  1254. " Set all space params to zero, to force multichan output.\n"
  1255. " Otherwise multichan input mixes to mono\n"
  1256. " (or selects 1 channel of your choice - see below)\n"
  1257. " before generating a spatialised stereo output.\n"
  1258. #endif
  1259. "RANGE: of search for nextgrain, before infile 'now' (Default 0 MS).\n"
  1260. "JITTER: Randomisation of grain position (Range 0-1) Default (%.2lf).\n"
  1261. "OUTLENGTH: max outfile length (if end of data not reached).\n"
  1262. " Set to zero (Default) to ignore.\n"
  1263. " BUT if VELOCITY is ANYWHERE 0: OUTLENGTH must be given.\n"
  1264. #ifndef MULTICHAN
  1265. "CHANNEL: work on just 1 channel of stereo snd: Range(1-2).\n"
  1266. #else
  1267. "CHANNEL: work on just 1 chan of multichan snd: Range(1-chancnt).\n"
  1268. " or (for -ve vals) e.g val -N, spatialise to N-channel space.\n"
  1269. #endif
  1270. " Set to zero (Default) to ignore.\n"
  1271. "-x: do exponential splices (Default: linear).\n"
  1272. "-n: no interpolation for pitch vals, (quick but dirty).\n"
  1273. "\n"
  1274. "HVELOCITY,HDENSITY,HGRAINSIZE,HPITCHSHIFT,HAMP,HBSPLICE,HESPLICE,HSPACE\n"
  1275. "allow a range of values to be specified for any of these params. e.g. With\n"
  1276. "PITCHSHIFT & HPITCHSHIFT set, random pitchshift chosen between these limits.\n"
  1277. "AND NB PITCHSHIFT & HPITCHSHIFT can both vary through time.\n\n"
  1278. "All params, except OUTLENGTH and CHANNEL, can vary through time.\n",
  1279. GRS_DEFAULT_GRAINSIZE,GRS_DEFAULT_SPLICELEN,GRS_DEFAULT_SPLICELEN,GRS_DEFAULT_SCATTER);
  1280. } else
  1281. fprintf(stdout,"Unknown option '%s'\n",str);
  1282. return(USAGE_ONLY);
  1283. }
  1284. /******************************** USAGE3 ********************************/
  1285. int usage3(char *str1,char *str2)
  1286. {
  1287. sprintf(errstr,"Insufficient parameters on command line.\n");
  1288. return(USAGE_ONLY);
  1289. }
  1290. /******************************** SINTAB_PCONSISTENCY ********************************/
  1291. int sintab_pconsistency(dataptr dz)
  1292. {
  1293. int exit_status;
  1294. double val;
  1295. if(dz->brksize[SIN_FRQ]) {
  1296. if((exit_status = get_maxvalue(SIN_FRQ,&val,dz))<0)
  1297. return exit_status;
  1298. } else
  1299. val = dz->param[SIN_FRQ];
  1300. //TW SIN_FRQ parameter is actually the duration of a cycle = 1/frq. already
  1301. // val = 1.0/val;
  1302. val /= 2.0;
  1303. if (val <= dz->param[SIN_QUANT]) {
  1304. sprintf(errstr,"You must reduce the quantisation time to handle the maximum frequency you've specified.\n");
  1305. return(DATA_ERROR);
  1306. }
  1307. return(FINISHED);
  1308. }
  1309. /******************************** INNER_LOOP (redundant) ********************************/
  1310. int inner_loop
  1311. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1312. {
  1313. return(FINISHED);
  1314. }
  1315. /******************************** READ_STACKDATA ********************************/
  1316. #define SMALLARRAY 16
  1317. int read_stackdata(char *str,dataptr dz)
  1318. {
  1319. aplptr ap = dz->application;
  1320. int do_file = 0;
  1321. int arraysize = SMALLARRAY;
  1322. double *p, dummy = 0.0;
  1323. char temp[200], *q;
  1324. int n = 0, m;
  1325. FILE *fp;
  1326. if(!sloom) {
  1327. /* NEW CMDLINE convention: filenames CAN start with numbers: */
  1328. /* BUT can't BE numbers in their entirety (e.g. 123.456) */
  1329. if(value_is_numeric(str)) {
  1330. if(sscanf(str,"%lf",&dummy)!=1) {
  1331. sprintf(errstr,"Failed to read a numeric value [%s] for transposition\n",str);
  1332. return(DATA_ERROR);
  1333. }
  1334. } else {
  1335. //TW Now traps bad pathnames, and names starting with '-', only
  1336. if(file_has_invalid_startchar(str)) {
  1337. sprintf(errstr,"Invalid characters in filename '%s'\n",str);
  1338. return(DATA_ERROR);
  1339. }
  1340. do_file = 1;
  1341. }
  1342. } else { /* TK convention, all numeric values are preceded by NUMERICVAL_MARKER */
  1343. if(str[0]==NUMERICVAL_MARKER) {
  1344. str++;
  1345. if(strlen(str)<=0 || sscanf(str,"%lf",&dummy)!=1) {
  1346. sprintf(errstr,"Invalid parameter value (%s) encountered.\n",str);
  1347. return(DATA_ERROR);
  1348. }
  1349. } else
  1350. do_file = 1;
  1351. }
  1352. if(do_file) {
  1353. if((fp = fopen(str,"r"))==NULL) {
  1354. sprintf(errstr, "Can't open datafile %s to read data.\n",str);
  1355. return(DATA_ERROR);
  1356. }
  1357. if((dz->parray[STACK_TRANS] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  1358. sprintf(errstr,"INSUFFICIENT MEMORY for transposition data in file %s.\n",str);
  1359. return(MEMORY_ERROR);
  1360. }
  1361. p = dz->parray[STACK_TRANS];
  1362. while(fgets(temp,200,fp)==temp) {
  1363. q = temp;
  1364. if(*q == ';') // Allow comments in file
  1365. continue;
  1366. while(get_float_from_within_string(&q,p)) {
  1367. if(*p < ap->min_special || *p > ap->max_special) {
  1368. sprintf(errstr,"Transposition value no %ld (%lf) out of range (%lf to %lf)\n",
  1369. n+1L,*p,ap->min_special,ap->max_special);
  1370. return(DATA_ERROR);
  1371. }
  1372. *p = semitone_to_ratio(*p);
  1373. p++;
  1374. if(++n >= arraysize) {
  1375. arraysize += SMALLARRAY;
  1376. if((dz->parray[STACK_TRANS] =
  1377. (double *)realloc((char *)(dz->parray[STACK_TRANS]),arraysize * sizeof(double)))==NULL) {
  1378. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate transposition data from file %s.\n",str);
  1379. return(MEMORY_ERROR);
  1380. }
  1381. p = dz->parray[STACK_TRANS] + n;
  1382. }
  1383. }
  1384. }
  1385. if(n == 0) {
  1386. sprintf(errstr,"No data in file %s\n",str);
  1387. return(DATA_ERROR);
  1388. }
  1389. if((dz->parray[STACK_TRANS] = (double *)realloc((char *)(dz->parray[STACK_TRANS]),n * sizeof(double)))==NULL) {
  1390. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate transposition data from file %s.\n",str);
  1391. return(MEMORY_ERROR);
  1392. }
  1393. if(fclose(fp)<0) {
  1394. fprintf(stdout,"WARNING: Failed to close transposition file %s.\n",str);
  1395. fflush(stdout);
  1396. }
  1397. dz->itemcnt = n;
  1398. p = dz->parray[STACK_TRANS]; /* sort : smallest at foot */
  1399. for(n=0;n<dz->itemcnt-1;n++) {
  1400. for(m=1;m<dz->itemcnt;m++) {
  1401. if(p[m] < p[n]) {
  1402. dummy = p[n];
  1403. p[n] = p[m];
  1404. p[m] = dummy;
  1405. }
  1406. }
  1407. }
  1408. } else {
  1409. if(dummy > ap->max_special || dummy < ap->min_special) {
  1410. sprintf(errstr,"Transposition value (%lf) out of range (%lf to %lf)\n",
  1411. dummy,ap->min_special,ap->max_special);
  1412. return(DATA_ERROR);
  1413. }
  1414. dummy = semitone_to_ratio(dummy);
  1415. if((dz->parray[STACK_TRANS] = (double *)malloc(sizeof(double)))==NULL) {
  1416. sprintf(errstr,"INSUFFICIENT MEMORY for transposition data\n");
  1417. return(MEMORY_ERROR);
  1418. }
  1419. dz->parray[STACK_TRANS][0] = dummy;
  1420. dz->itemcnt = 0;
  1421. }
  1422. return(FINISHED);
  1423. }
  1424. /******************************** SEMITONE_TO_RATIO ********************************/
  1425. double semitone_to_ratio(double val) {
  1426. val /= 12.0;
  1427. val = pow(2.0,val);
  1428. return val;
  1429. }
  1430. /******************************** CONVOLVE_PCONSISTENCY ********************************/
  1431. int convolve_pconsistency(dataptr dz)
  1432. {
  1433. int exit_status;
  1434. double minval;
  1435. switch(dz->mode) {
  1436. case(CONV_NORMAL):
  1437. if(dz->insams[1] > dz->insams[0]) {
  1438. sprintf(errstr,"Convolving file cannot be larger than file to be convolved.\n");
  1439. return(DATA_ERROR);
  1440. }
  1441. break;
  1442. case(CONV_TVAR):
  1443. if(dz->brksize[CONV_TRANS]) {
  1444. if((exit_status = get_minvalue_in_brktable(&minval,CONV_TRANS,dz))<0)
  1445. return(exit_status);
  1446. } else
  1447. minval = dz->param[CONV_TRANS];
  1448. if(((double)dz->insams[1]/minval) > (double)(dz->insams[0])) {
  1449. sprintf(errstr,"Convolving file, at lowest transposition, cannot be larger than file to be convolved.\n");
  1450. return(DATA_ERROR);
  1451. }
  1452. break;
  1453. }
  1454. return(FINISHED);
  1455. }
  1456. /******************************** CREATE_CONVOLVE_BUFS ********************************/
  1457. //TW ADDED AND CONVERTED
  1458. int create_convolve_bufs(dataptr dz)
  1459. {
  1460. int bigbufsize, seccnt, cfile_len, cfile_size = dz->insams[1] * sizeof(float),total_bufsize;
  1461. double limit;
  1462. int sum;
  1463. int fsecbytesize = F_SECSIZE * sizeof(float);
  1464. if(cfile_size < 0) {
  1465. sprintf(errstr,"Size of convolving file will cause numerical overflow in calculating required memory space.\n");
  1466. return(MEMORY_ERROR);
  1467. }
  1468. seccnt = cfile_size/fsecbytesize;
  1469. if(seccnt * fsecbytesize < cfile_size)
  1470. seccnt++;
  1471. cfile_size = seccnt * fsecbytesize;
  1472. if(cfile_size < 0) {
  1473. sprintf(errstr,"Size of convolving file will cause numerical overflow in calculating required memory space.\n");
  1474. return(MEMORY_ERROR);
  1475. }
  1476. if((bigbufsize = (int)((long)Malloc(-1))) < cfile_size)
  1477. bigbufsize = cfile_size;
  1478. else {
  1479. seccnt = bigbufsize/fsecbytesize;
  1480. if(seccnt * fsecbytesize < bigbufsize)
  1481. seccnt++;
  1482. bigbufsize = seccnt * fsecbytesize;
  1483. }
  1484. if(bigbufsize < 0) {
  1485. sprintf(errstr,"Insufficient memory for sound buffers.\n");
  1486. return(MEMORY_ERROR);
  1487. }
  1488. cfile_size += (dz->infile->channels * sizeof(float)); /* additional space for wrap_around points */
  1489. if(cfile_size < 0) {
  1490. sprintf(errstr,"Size of convolving file will cause numerical overflow in calculating required memory space.\n");
  1491. return(MEMORY_ERROR);
  1492. }
  1493. if((total_bufsize = bigbufsize * 2) < 0) {
  1494. sprintf(errstr,"Insufficient memory for sound buffers.\n");
  1495. return(MEMORY_ERROR);
  1496. }
  1497. #if 0
  1498. if((total_bufsize += cfile_size) < total_bufsize) {
  1499. sprintf(errstr,"Size of convolving file will cause numerical overflow in calculating required memory space.\n");
  1500. return(MEMORY_ERROR);
  1501. }
  1502. #endif
  1503. dz->buflen = bigbufsize/sizeof(float);
  1504. if((dz->bigbuf = (float *)Malloc(total_bufsize)) <= 0) {
  1505. sprintf(errstr,"Insufficient memory for sound buffers.\n");
  1506. return(MEMORY_ERROR);
  1507. }
  1508. cfile_len = cfile_size/sizeof(float);
  1509. dz->sampbuf[0] = dz->bigbuf;
  1510. dz->sampbuf[1] = dz->sampbuf[0] + dz->buflen;
  1511. dz->sampbuf[2] = dz->sampbuf[1] + cfile_len;
  1512. memset(dz->bigbuf,0,((dz->buflen * 2) + cfile_len) * sizeof(float));
  1513. sum = dz->buflen + dz->insams[1]; /* total no. of vals convolving buffer of 1st file with all 2nd file */
  1514. if((dz->tempsize = dz->insams[0] + dz->insams[1]) < 0)
  1515. dz->tempsize = INT_MAX;
  1516. limit = floor((double) INT_MAX/(double)sizeof(double));
  1517. if((double)sum > limit) {
  1518. sprintf(errstr,"Size of convolving file will cause numerical overflow in calculating required memory space.\n");
  1519. return(MEMORY_ERROR);
  1520. }
  1521. if((dz->parray[0] = (double *)malloc(sum * sizeof(double)))==NULL) {
  1522. sprintf(errstr,"Insufficent memory for convolve calculations buffer.\n");
  1523. return(MEMORY_ERROR);
  1524. }
  1525. memset((char *)dz->parray[0],0,sum * sizeof(double));
  1526. return(FINISHED);
  1527. }
  1528. /******************************** READ_LOUDNESS ********************************/
  1529. int read_loudness(char *str,dataptr dz)
  1530. {
  1531. int istime, exit_status;
  1532. int arraysize = BIGARRAY;
  1533. double *p, lasttime = 0;
  1534. char temp[200], *q;
  1535. int n = 0;
  1536. FILE *fp;
  1537. if((fp = fopen(str,"r"))==NULL) {
  1538. sprintf(errstr, "Can't open datafile %s to read data.\n",str);
  1539. return(DATA_ERROR);
  1540. }
  1541. if((exit_status = setup_and_init_brktable_constants(dz)) < 0)
  1542. return(exit_status);
  1543. if((dz->brk[LOUD_GAIN] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  1544. sprintf(errstr,"Cannot create memory for loudness breaktable\n");
  1545. return(MEMORY_ERROR);
  1546. }
  1547. p = dz->brk[LOUD_GAIN];
  1548. istime = 1;
  1549. while(fgets(temp,200,fp)==temp) {
  1550. q = temp;
  1551. if(*q == ';') // Allow comments in file
  1552. continue;
  1553. while(get_float_from_within_string(&q,p)) {
  1554. if(istime) {
  1555. if(*p < 0.0) {
  1556. sprintf(errstr,"INVALID TIME (%lf) IN LOUDNESS ENVELOPE DATA.\n",*p);
  1557. return(DATA_ERROR);
  1558. }
  1559. if(n == 0) {
  1560. if(!flteq(*p,0.0)) {
  1561. sprintf(errstr,"LOUDNESS ENVELOPE MUST BEGIN AT TIME ZERO.\n");
  1562. return(DATA_ERROR);
  1563. }
  1564. } else if(*p <= lasttime) {
  1565. sprintf(errstr,"TIMES DO NOT ADVANCE IN LOUDNESS ENVELOPE (AT TIME %lf)\n",*p);
  1566. return(DATA_ERROR);
  1567. }
  1568. lasttime = *p;
  1569. } else {
  1570. switch(dz->mode) {
  1571. case(LOUD_PROPOR):
  1572. if(*p < 0.0) {
  1573. sprintf(errstr,"INVALID LOUDNESS VALUE (%lf) IN LOUDNESS ENVELOPE DATA.\n",*p);
  1574. return(DATA_ERROR);
  1575. }
  1576. break;
  1577. case(LOUD_DB_PROPOR):
  1578. *p = dbtogain(*p);
  1579. break;
  1580. }
  1581. }
  1582. p++;
  1583. if(++n >= arraysize) {
  1584. arraysize += BIGARRAY;
  1585. if((dz->brk[LOUD_GAIN] = (double *)realloc((char *)(dz->brk[LOUD_GAIN]),arraysize * sizeof(double)))==NULL) {
  1586. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate loudness data from file %s.\n",str);
  1587. return(MEMORY_ERROR);
  1588. }
  1589. p = dz->brk[LOUD_GAIN] + n;
  1590. }
  1591. istime = !istime;
  1592. }
  1593. }
  1594. if((dz->brk[LOUD_GAIN] = (double *)realloc((char *)(dz->brk[LOUD_GAIN]),n * sizeof(double)))==NULL) {
  1595. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate loudness data from file %s.\n",str);
  1596. return(MEMORY_ERROR);
  1597. }
  1598. if(fclose(fp)<0) {
  1599. fprintf(stdout,"WARNING: Failed to close loudness file %s.\n",str);
  1600. fflush(stdout);
  1601. }
  1602. if(n == 0) {
  1603. sprintf(errstr,"No data in file %s\n",str);
  1604. return(DATA_ERROR);
  1605. }
  1606. if(!EVEN(n)) {
  1607. sprintf(errstr,"LOUDNESS ENVELOPE DATA INCORRECTLY PAIRED IN FILE %s.\n",str);
  1608. return(DATA_ERROR);
  1609. }
  1610. dz->brksize[0] = n/2;
  1611. return(FINISHED);
  1612. }
  1613. /******************************** SETUP_AND_INIT_BRKTABLE_CONSTANTS ********************************/
  1614. int setup_and_init_brktable_constants(dataptr dz)
  1615. {
  1616. if((dz->brk = (double **)malloc(sizeof(double *)))==NULL) {
  1617. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1618. return(MEMORY_ERROR);
  1619. }
  1620. if((dz->brkptr = (double **)malloc(sizeof(double *)))==NULL) {
  1621. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1622. return(MEMORY_ERROR);
  1623. }
  1624. if((dz->brksize = (int *)malloc(sizeof(int) ))==NULL) {
  1625. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1626. return(MEMORY_ERROR);
  1627. }
  1628. if((dz->firstval = (double *)malloc(sizeof(double) ))==NULL) {
  1629. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1630. return(MEMORY_ERROR);
  1631. }
  1632. if((dz->lastind = (double *)malloc(sizeof(double) ))==NULL) {
  1633. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1634. return(MEMORY_ERROR);
  1635. }
  1636. if((dz->lastval = (double *)malloc(sizeof(double) ))==NULL) {
  1637. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1638. return(MEMORY_ERROR);
  1639. }
  1640. if((dz->brkinit = (int *)malloc(sizeof(int) ))==NULL) {
  1641. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1642. return(MEMORY_ERROR);
  1643. }
  1644. dz->brk[0] = NULL;
  1645. dz->brkptr[0] = NULL;
  1646. dz->brkinit[0] = 0;
  1647. dz->brksize[0] = 0;
  1648. return(FINISHED);
  1649. }