brapcon.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  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 <limits.h>
  25. #include <structures.h>
  26. #include <tkglobals.h>
  27. #include <globcon.h>
  28. #include <processno.h>
  29. #include <modeno.h>
  30. #include <arrays.h>
  31. #include <modify.h>
  32. #include <sfsys.h>
  33. #include <osbind.h>
  34. //#ifdef unix
  35. #define round(x) lround((x))
  36. //#endif
  37. #define SAFETY ((long)4096)
  38. #define OSAFETY ((long)256)
  39. static int initialise_unused_brassage_vflags(dataptr dz);
  40. static void initialise_user_inaccessible_params(dataptr dz);
  41. static void param_check_and_convert(int *zerovel,dataptr dz);
  42. static void convert_pitch(int paramno,dataptr dz);
  43. static int initialise_data(dataptr dz);
  44. static int set_internal_flags(dataptr dz);
  45. static void initialise_channel_configuration(dataptr dz);
  46. static int granula_setup(dataptr dz);
  47. static int check_for_zeroes(int paramno,dataptr dz);
  48. static void convert_value_to_int(int paramno,double convertor,dataptr dz);
  49. static int make_splice_tables(dataptr dz);
  50. static void set_ranges(dataptr dz);
  51. static int calc_overflows(dataptr dz);
  52. static void set_this_range(int rangeno,int hino, int lono, int flagno, dataptr dz);
  53. static void set_this_drange(int rangeno,int hino, int lono, int flagno, dataptr dz);
  54. static int calc_max_scatter(int mgi,long *max_scatlen, dataptr dz);
  55. static void adjust_overflows(long mscat, dataptr dz);
  56. #ifdef MULTICHAN
  57. static int check_spatialisation_data(dataptr dz);
  58. #endif
  59. /********************************* GRANULA_PCONSISTENCY *************************************/
  60. int granula_pconsistency(dataptr dz)
  61. {
  62. int exit_status;
  63. int zerovel = FALSE;
  64. int total_flags = SFLAGCNT+FLAGCNT;
  65. /* int total_params = dz->application->max_param_cnt + dz->application->option_cnt;*/
  66. int n;
  67. long min_infilesize = LONG_MAX;
  68. initrand48();
  69. if(dz->application->vflag_cnt < GRS_MAX_VFLAGS
  70. &&(exit_status = initialise_unused_brassage_vflags(dz))<0)
  71. return(exit_status); /* Create flags inaccessible to user in certain modes */
  72. initialise_user_inaccessible_params(dz);
  73. switch(dz->process) { /* infilesize counted in mono samples OR STEREO sample-pairs */
  74. case(BRASSAGE):
  75. dz->iparam[ORIG_SMPSIZE] = dz->insams[0]/dz->infile->channels;
  76. break;
  77. case(SAUSAGE):
  78. for(n=0;n<dz->infilecnt;n++)
  79. min_infilesize = min(min_infilesize,dz->insams[n]);
  80. if(min_infilesize == LONG_MAX) {
  81. sprintf(errstr,"Problem estimating min infilesize.\n");
  82. return(PROGRAM_ERROR);
  83. }
  84. dz->iparam[ORIG_SMPSIZE] = min_infilesize/dz->infile->channels;
  85. break;
  86. }
  87. if((dz->iparray[GRS_FLAGS]=(int *)malloc(total_flags * sizeof(int)))==NULL) {
  88. sprintf(errstr,"INSUFFICEINT MEMORY for brassage internal flags.\n");
  89. return(MEMORY_ERROR); /* establish internal flagging */
  90. }
  91. for(n=0;n<total_flags;n++)
  92. dz->iparray[GRS_FLAGS][n] = 0;
  93. param_check_and_convert(&zerovel,dz);
  94. if(sloom) {
  95. if(zerovel) {
  96. if(dz->mode == GRS_TIMESTRETCH) {
  97. fprintf(stdout,"INFO: Infinite time-stretch (zero squeeze) found : Creating file of length 2.0 secs\n");
  98. fflush(stdout);
  99. dz->param[GRS_OUTLEN] = 2.0;
  100. /* NEW Mar 24: 2002*/
  101. dz->brksize[GRS_OUTLEN] = 0;
  102. convert_value_to_int(GRS_OUTLEN,(double)dz->infile->srate,dz);
  103. } else if(dz->param[GRS_OUTLEN] == 0.0) {
  104. sprintf(errstr, "Infinite time-stretch (zero squeeze) found : Outfile length must be specified.\n");
  105. return(USER_ERROR);
  106. }
  107. }
  108. } else {
  109. if(zerovel && dz->param[GRS_OUTLEN]==0.0) {
  110. sprintf(errstr, "Zero VELOCITY found: Outfile length must be specified.\n");
  111. return(USER_ERROR);
  112. }
  113. }
  114. #ifdef MULTICHAN
  115. dz->out_chans = 2;
  116. if (dz->iparam[GRS_CHAN_TO_XTRACT] < 0) { /* setup multichan output */
  117. dz->out_chans = -dz->iparam[GRS_CHAN_TO_XTRACT];
  118. dz->iparam[GRS_CHAN_TO_XTRACT] = 0; /* Force input to mix to mono (if not mono already) */
  119. }
  120. if((exit_status = check_spatialisation_data(dz))<0)
  121. return(exit_status);
  122. #endif
  123. if(dz->infile->channels ==MONO)
  124. dz->iparam[GRS_CHAN_TO_XTRACT] = 0; /* even if user has set it, in error */
  125. convert_pitch(GRS_PITCH,dz);
  126. convert_pitch(GRS_HPITCH,dz);
  127. dz->iparam[GRS_ARRAYSIZE] = BIGARRAY;
  128. if((exit_status = initialise_data(dz))<0) /* before setup_environment */
  129. return(exit_status);
  130. if((exit_status = set_internal_flags(dz))<0)
  131. return(exit_status);
  132. initialise_channel_configuration(dz);
  133. #ifndef MULTICHAN
  134. dz->infile->channels = dz->iparam[GRS_OUTCHANS]; /* set channel count for OUTPUT */
  135. #else
  136. dz->outfile->channels = dz->iparam[GRS_OUTCHANS]; /* preset channel count for OUTPUT */
  137. #endif
  138. if((exit_status = granula_setup(dz))<0)
  139. return(exit_status); /* has to be done before buffers.c */
  140. if(dz->process==SAUSAGE) {
  141. dz->bufcnt += (dz->infilecnt * 2);
  142. if((dz->sampbuf = (float **)realloc((char *)dz->sampbuf,dz->bufcnt * sizeof(float *)))==NULL
  143. || (dz->sbufptr = (float **)realloc((char *)dz->sbufptr,dz->bufcnt * sizeof(float *)))==NULL) {
  144. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate space for sausage.\n");
  145. return(MEMORY_ERROR);
  146. }
  147. }
  148. return(FINISHED);
  149. }
  150. /************************* INITIALISE_UNUSED_BRASSAGE_VFLAGS *************************/
  151. int initialise_unused_brassage_vflags(dataptr dz)
  152. {
  153. int n;
  154. if(dz->vflag==NULL) {
  155. if((dz->vflag = (char *)malloc(GRS_MAX_VFLAGS * sizeof(char)))==NULL) {
  156. sprintf(errstr,"INSUFFICEINT MEMORY for brassage flags.\n");
  157. return(MEMORY_ERROR);
  158. }
  159. } else {
  160. if((dz->vflag = (char *)realloc(dz->vflag,GRS_MAX_VFLAGS * sizeof(char)))==NULL) {
  161. sprintf(errstr,"INSUFFICEINT MEMORY to reallocate brassage flags.\n");
  162. return(MEMORY_ERROR);
  163. }
  164. }
  165. for(n=dz->application->vflag_cnt;n<GRS_MAX_VFLAGS;n++)
  166. dz->vflag[n] = FALSE;
  167. return(FINISHED);
  168. }
  169. /************************* INITIALISE_USER_INACCESSIBLE_PARAMS *************************/
  170. void initialise_user_inaccessible_params(dataptr dz)
  171. {
  172. switch(dz->mode) {
  173. case(GRS_PITCHSHIFT):
  174. case(GRS_TIMESTRETCH): /* Initialise search param, inaccessible to user in these modes */
  175. case(GRS_GRANULATE):
  176. dz->param[GRS_SRCHRANGE] = 0.0; /* NOT STRICTLY NECESSARY: as should not be used */
  177. /* fall thro */
  178. case(GRS_REVERB): /* Initialise scatter param, inaccessible to user in these modes */
  179. case(GRS_SCRAMBLE):
  180. dz->param[GRS_SCATTER] = GRS_DEFAULT_SCATTER;
  181. break;
  182. }
  183. }
  184. /************************** PARAM_CHECK_AND_CONVERT ************************************/
  185. void param_check_and_convert(int *zerovel,dataptr dz)
  186. {
  187. double sr = (double)dz->infile->srate;
  188. int paramno, total_params = dz->application->max_param_cnt + dz->application->option_cnt;
  189. for(paramno = 0;paramno < total_params; paramno++) {
  190. switch(paramno) {
  191. case(GRS_VELOCITY):
  192. case(GRS_HVELOCITY):
  193. if(*zerovel == FALSE)
  194. *zerovel = check_for_zeroes(paramno,dz);
  195. break;
  196. case(GRS_AMP):
  197. case(GRS_HAMP):
  198. /* not required for floats */
  199. /*convert_value_to_int(paramno,TWO_POW_15,dz);*/
  200. break;
  201. case(GRS_OUTLEN):
  202. convert_value_to_int(paramno,sr,dz);
  203. break;
  204. case(GRS_SRCHRANGE):
  205. case(GRS_GRAINSIZE):
  206. case(GRS_HGRAINSIZE):
  207. case(GRS_BSPLICE):
  208. case(GRS_HBSPLICE):
  209. case(GRS_ESPLICE):
  210. case(GRS_HESPLICE):
  211. convert_value_to_int(paramno,MS_TO_SECS * sr,dz);
  212. break;
  213. }
  214. }
  215. }
  216. /************************** CONVERT_PITCH ************************************/
  217. void convert_pitch(int paramno,dataptr dz)
  218. {
  219. double *p, *end;
  220. if(dz->brksize[paramno]) {
  221. p = dz->brk[paramno] + 1;
  222. end = dz->brk[paramno] + (dz->brksize[paramno] * 2);
  223. while(p < end) {
  224. *p *= OCTAVES_PER_SEMITONE;
  225. p += 2;
  226. }
  227. } else
  228. dz->param[paramno] = dz->param[paramno] * OCTAVES_PER_SEMITONE;
  229. }
  230. /******************************* INITIALISE_DATA **************************/
  231. int initialise_data(dataptr dz)
  232. {
  233. /* NEED TO BE INITALISED (??) AS THEY ARE INTERNAL */
  234. dz->param[GRS_VRANGE] = 0.0;
  235. dz->param[GRS_DRANGE] = 0.0;
  236. dz->param[GRS_PRANGE] = 0.0;
  237. dz->param[GRS_SPRANGE] = 0.0;
  238. dz->iparam[GRS_ARANGE] = 0;
  239. dz->iparam[GRS_GRANGE] = 0;
  240. dz->iparam[GRS_BRANGE] = 0;
  241. dz->iparam[GRS_ERANGE] = 0;
  242. dz->iparam[GRS_LONGS_BUFLEN]= 0;
  243. dz->iparam[GRS_BUF_XS] = 0;
  244. dz->iparam[GRS_LBUF_XS] = 0;
  245. dz->iparam[GRS_BUF_SMPXS] = 0;
  246. dz->iparam[GRS_LBUF_SMPXS] = 0;
  247. dz->iparam[GRS_GLBUF_SMPXS] = 0;
  248. dz->iparam[SAMPS_IN_INBUF] = 0;
  249. dz->iparam[GRS_IS_BTAB] = FALSE;
  250. dz->iparam[GRS_IS_ETAB] = FALSE;
  251. if((dz->parray[GRS_NORMFACT] = (double *)malloc(dz->iparam[GRS_ARRAYSIZE] * sizeof(double)))==NULL) {
  252. sprintf(errstr,"initialise_data()\n");
  253. return(PROGRAM_ERROR);
  254. }
  255. return(FINISHED);
  256. }
  257. /************************** SET_INTERNAL_FLAGS ************************************/
  258. int set_internal_flags(dataptr dz)
  259. {
  260. if(dz->process==SAUSAGE) {
  261. if(dz->brksize[GRS_HVELOCITY]) dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_VARIABLE_HI_BOUND;
  262. else dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_HI_BOUND;
  263. if(dz->brksize[GRS_HDENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_HI_BOUND;
  264. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_HI_BOUND;
  265. if(dz->brksize[GRS_HGRAINSIZE]) dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_VARIABLE_HI_BOUND;
  266. else dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_HI_BOUND;
  267. if(dz->brksize[GRS_HPITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_HI_BOUND;
  268. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_HI_BOUND;
  269. if(dz->brksize[GRS_HAMP]) dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_VARIABLE_HI_BOUND;
  270. else dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_HI_BOUND;
  271. if(dz->brksize[GRS_HSPACE]) dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_VARIABLE_HI_BOUND;
  272. else dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_HI_BOUND;
  273. if(dz->brksize[GRS_HBSPLICE]) dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_VARIABLE_HI_BOUND;
  274. else dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_HI_BOUND;
  275. if(dz->brksize[GRS_HESPLICE]) dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_VARIABLE_HI_BOUND;
  276. else dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_HI_BOUND;
  277. if(dz->brksize[GRS_VELOCITY]) dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_VARIABLE_VAL;
  278. else dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_FIXED_VAL;
  279. if(dz->brksize[GRS_DENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_VAL;
  280. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_FIXED_VAL;
  281. if(dz->brksize[GRS_GRAINSIZE]) dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_VARIABLE_VAL;
  282. else dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_FIXED_VAL;
  283. if(dz->brksize[GRS_PITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_VAL;
  284. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_FIXED_VAL;
  285. if(dz->brksize[GRS_AMP]) dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_VARIABLE_VAL;
  286. else dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_FIXED_VAL;
  287. if(dz->brksize[GRS_SPACE]) dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_VARIABLE_VAL;
  288. else dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_FIXED_VAL;
  289. if(dz->brksize[GRS_BSPLICE]) dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_VARIABLE_VAL;
  290. else dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_FIXED_VAL;
  291. if(dz->brksize[GRS_ESPLICE]) dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_VARIABLE_VAL;
  292. else dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_FIXED_VAL;
  293. if(dz->brksize[GRS_SRCHRANGE]) dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_VARIABLE_VAL;
  294. else dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_FIXED_VAL;
  295. if(dz->brksize[GRS_SCATTER]) dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_VARIABLE_VAL;
  296. else dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  297. return(FINISHED);
  298. }
  299. switch(dz->mode) {
  300. case(GRS_FULL_MONTY):
  301. if(dz->brksize[GRS_HVELOCITY]) dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_VARIABLE_HI_BOUND;
  302. else dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_HI_BOUND;
  303. if(dz->brksize[GRS_HDENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_HI_BOUND;
  304. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_HI_BOUND;
  305. if(dz->brksize[GRS_HGRAINSIZE]) dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_VARIABLE_HI_BOUND;
  306. else dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_HI_BOUND;
  307. if(dz->brksize[GRS_HPITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_HI_BOUND;
  308. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_HI_BOUND;
  309. if(dz->brksize[GRS_HAMP]) dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_VARIABLE_HI_BOUND;
  310. else dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_HI_BOUND;
  311. if(dz->brksize[GRS_HSPACE]) dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_VARIABLE_HI_BOUND;
  312. else dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_HI_BOUND;
  313. if(dz->brksize[GRS_HBSPLICE]) dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_VARIABLE_HI_BOUND;
  314. else dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_HI_BOUND;
  315. if(dz->brksize[GRS_HESPLICE]) dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_VARIABLE_HI_BOUND;
  316. else dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_HI_BOUND;
  317. /* fall thro */
  318. case(GRS_BRASSAGE):
  319. if(dz->brksize[GRS_VELOCITY]) dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_VARIABLE_VAL;
  320. else dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_FIXED_VAL;
  321. if(dz->brksize[GRS_DENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_VAL;
  322. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_FIXED_VAL;
  323. if(dz->brksize[GRS_GRAINSIZE]) dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_VARIABLE_VAL;
  324. else dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_FIXED_VAL;
  325. if(dz->brksize[GRS_PITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_VAL;
  326. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_FIXED_VAL;
  327. if(dz->brksize[GRS_AMP]) dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_VARIABLE_VAL;
  328. else dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_FIXED_VAL;
  329. if(dz->brksize[GRS_SPACE]) dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_VARIABLE_VAL;
  330. else dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_FIXED_VAL;
  331. if(dz->brksize[GRS_BSPLICE]) dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_VARIABLE_VAL;
  332. else dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG] |= G_FIXED_VAL;
  333. if(dz->brksize[GRS_ESPLICE]) dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_VARIABLE_VAL;
  334. else dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG] |= G_FIXED_VAL;
  335. if(dz->brksize[GRS_SRCHRANGE]) dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_VARIABLE_VAL;
  336. else dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_FIXED_VAL;
  337. if(dz->brksize[GRS_SCATTER]) dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_VARIABLE_VAL;
  338. else dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  339. break;
  340. case(GRS_PITCHSHIFT):
  341. if(dz->brksize[GRS_PITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_VAL;
  342. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_FIXED_VAL;
  343. dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  344. break;
  345. case(GRS_TIMESTRETCH):
  346. if(dz->brksize[GRS_VELOCITY]) dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_VARIABLE_VAL;
  347. else dz->iparray[GRS_FLAGS][G_VELOCITY_FLAG] |= G_FIXED_VAL;
  348. dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  349. break;
  350. case(GRS_GRANULATE):
  351. if(dz->brksize[GRS_DENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_VAL;
  352. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_FIXED_VAL;
  353. dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  354. break;
  355. case(GRS_SCRAMBLE):
  356. if(dz->brksize[GRS_SRCHRANGE])
  357. dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_VARIABLE_VAL;
  358. else
  359. dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_FIXED_VAL;
  360. dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  361. /* RWD Nov 2003 */
  362. if(dz->brksize[GRS_GRAINSIZE])
  363. dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_VARIABLE_VAL;
  364. else
  365. dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG] |= G_FIXED_VAL;
  366. break;
  367. case(GRS_REVERB):
  368. if(dz->brksize[GRS_DENSITY]) dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_VARIABLE_VAL;
  369. else dz->iparray[GRS_FLAGS][G_DENSITY_FLAG] |= G_FIXED_VAL;
  370. if(dz->brksize[GRS_PITCH]) dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_VARIABLE_VAL;
  371. else dz->iparray[GRS_FLAGS][G_PITCH_FLAG] |= G_FIXED_VAL;
  372. if(dz->brksize[GRS_AMP]) dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_VARIABLE_VAL;
  373. else dz->iparray[GRS_FLAGS][G_AMP_FLAG] |= G_FIXED_VAL;
  374. if(dz->brksize[GRS_SRCHRANGE]) dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_VARIABLE_VAL;
  375. else dz->iparray[GRS_FLAGS][G_RANGE_FLAG] |= G_FIXED_VAL;
  376. dz->iparray[GRS_FLAGS][G_SCATTER_FLAG] |= G_FIXED_VAL;
  377. dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_HI_BOUND;
  378. dz->iparray[GRS_FLAGS][G_SPACE_FLAG] |= G_FIXED_VAL;
  379. break;
  380. default:
  381. sprintf(errstr,"Unknown mode in set_internal_flags()\n");
  382. return(PROGRAM_ERROR);
  383. }
  384. #ifdef MULTICHAN
  385. switch(dz->mode) {
  386. case(GRS_FULL_MONTY):
  387. if(dz->param[GRS_HSPACE] == 0.0 && dz->param[GRS_SPACE] == 0)
  388. dz->iparray[GRS_FLAGS][G_SPACE_FLAG] = 0;
  389. break;
  390. case(GRS_BRASSAGE):
  391. if(dz->param[GRS_SPACE] == 0)
  392. dz->iparray[GRS_FLAGS][G_SPACE_FLAG] = 0;
  393. break;
  394. }
  395. #endif
  396. return(FINISHED);
  397. }
  398. /**************************** INITIALISE_CHANNEL_CONFIGURATION *******************************/
  399. #ifndef MULTICHAN
  400. void initialise_channel_configuration(dataptr dz)
  401. {
  402. if(dz->infile->channels == STEREO) {
  403. dz->iparam[GRS_CHANNELS] = TRUE; /** added MAY 1998 **/
  404. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG]) {
  405. dz->iparam[GRS_CHAN_TO_XTRACT] = BOTH_CHANNELS; /* force stereo input to be mixed to mono */
  406. dz->iparam[GRS_INCHANS] = MONO; /* input mixed to mono */
  407. dz->iparam[GRS_OUTCHANS] = STEREO; /* output spatialised to stereo */
  408. } else if(dz->iparam[GRS_CHAN_TO_XTRACT]) { /* specifies which stereo channel to select */
  409. dz->iparam[GRS_INCHANS] = MONO; /* input is single channel of stereo */
  410. dz->iparam[GRS_OUTCHANS] = MONO; /* not spatialised */
  411. } else {
  412. dz->iparam[GRS_INCHANS] = STEREO; /* input is stereo */
  413. dz->iparam[GRS_OUTCHANS] = STEREO; /* output is stereo */
  414. }
  415. } else {
  416. dz->iparam[GRS_CHANNELS] = FALSE;
  417. dz->iparam[GRS_INCHANS] = MONO; /* input is mono */
  418. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG])
  419. dz->iparam[GRS_OUTCHANS] = STEREO; /* output spatialised to stereo */
  420. else
  421. dz->iparam[GRS_OUTCHANS] = MONO; /* not spatialised */
  422. }
  423. }
  424. #else
  425. void initialise_channel_configuration(dataptr dz)
  426. {
  427. if(dz->infile->channels > MONO) {
  428. dz->iparam[GRS_CHANNELS] = TRUE;
  429. if(dz->iparam[GRS_CHAN_TO_XTRACT]) { /* specifies which multichan channel to select */
  430. dz->iparam[GRS_INCHANS] = MONO; /* input is single channel of multichan, grain is mono */
  431. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG])
  432. dz->iparam[GRS_OUTCHANS] = dz->out_chans; /* output spatialised to multichan */
  433. else
  434. dz->iparam[GRS_OUTCHANS] = MONO; /* not spatialised */
  435. } else if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG]) { /* if spatialising, but NOT extracting a specific channel */
  436. dz->iparam[GRS_CHAN_TO_XTRACT] = ALL_CHANNELS; /* force multichan input to be mixed to mono */
  437. dz->iparam[GRS_INCHANS] = MONO; /* input mixed to mono, grain is mono */
  438. dz->iparam[GRS_OUTCHANS] = dz->out_chans;/* output spatialised to multichan */
  439. } else {
  440. dz->iparam[GRS_INCHANS] = dz->infile->channels; /* Otherwise, grain is multichan */
  441. dz->iparam[GRS_OUTCHANS] = dz->infile->channels; /* output is same-multichan */
  442. }
  443. } else {
  444. dz->iparam[GRS_CHANNELS] = FALSE;
  445. dz->iparam[GRS_INCHANS] = MONO; /* input is mono, grain is mono */
  446. if(dz->iparray[GRS_FLAGS][G_SPACE_FLAG])
  447. dz->iparam[GRS_OUTCHANS] = dz->out_chans;/* output spatialised to multichan */
  448. else
  449. dz->iparam[GRS_OUTCHANS] = MONO; /* not spatialised, remains mono */
  450. }
  451. }
  452. #endif
  453. /*************************** GRANULA_SETUP ***********************/
  454. #ifndef MULTICHAN
  455. int granula_setup(dataptr dz)
  456. {
  457. int exit_status;
  458. if((exit_status = make_splice_tables(dz))<0)
  459. return(exit_status);
  460. set_ranges(dz);
  461. if((exit_status = calc_overflows(dz))<0)
  462. return(exit_status);
  463. dz->iparam[GRS_BUF_SMPXS] *= dz->iparam[GRS_INCHANS];
  464. dz->iparam[GRS_BUF_XS] *= dz->iparam[GRS_INCHANS];
  465. dz->iparam[GRS_GLBUF_SMPXS] *= dz->iparam[GRS_INCHANS];
  466. dz->iparam[GRS_LBUF_SMPXS] *= dz->iparam[GRS_OUTCHANS]; /* SEPT 1996 */
  467. dz->iparam[GRS_LBUF_XS] *= dz->iparam[GRS_OUTCHANS];
  468. return(FINISHED);
  469. }
  470. #else
  471. int granula_setup(dataptr dz)
  472. {
  473. int exit_status;
  474. if((exit_status = make_splice_tables(dz))<0)
  475. return(exit_status);
  476. set_ranges(dz);
  477. if((exit_status = calc_overflows(dz))<0)
  478. return(exit_status);
  479. dz->iparam[GRS_BUF_SMPXS] *= dz->iparam[GRS_INCHANS]; // extra space in INPUT buffer (must accept all input channels)
  480. // dz->iparam[GRS_BUF_XS] *= dz->iparam[GRS_INCHANS]; // TW this is redundant
  481. dz->iparam[GRS_GLBUF_SMPXS] *= dz->iparam[GRS_INCHANS]; // extra space in the GRAIN buffer is either mono
  482. // (where channel is extracted, or all channels mixed to mono)
  483. // or it is multichannel: GRS_INCHANS knows this
  484. dz->iparam[GRS_LBUF_SMPXS] *= dz->iparam[GRS_OUTCHANS]; // The output grain can be multichan via spatialisation, or via using multichan input
  485. // or multichan if multichan input goes direct to multichan output
  486. // dz->iparam[GRS_LBUF_XS] *= dz->iparam[GRS_OUTCHANS]; // TW : this is redundant
  487. return(FINISHED);
  488. }
  489. #endif
  490. /************************** CHECK_FOR_ZEROES ************************************/
  491. int check_for_zeroes(int paramno,dataptr dz)
  492. {
  493. double *p, *end;
  494. if(dz->brksize[paramno]) {
  495. p = dz->brk[paramno] + 1;
  496. end = dz->brk[paramno] + (dz->brksize[paramno] * 2);
  497. while(p < end) {
  498. if(flteq(*p,0.0))
  499. return TRUE;
  500. p++;
  501. }
  502. } else {
  503. if(flteq(dz->param[paramno],0.0))
  504. return TRUE;
  505. }
  506. return (FALSE);
  507. }
  508. /************************** CONVERT_VALUE_TO_INT ************************************/
  509. void convert_value_to_int(int paramno,double convertor,dataptr dz)
  510. {
  511. double *p, *end;
  512. if(dz->brksize[paramno]) {
  513. p = dz->brk[paramno] + 1;
  514. end = dz->brk[paramno] + (dz->brksize[paramno] * 2);
  515. while(p < end) {
  516. *p = (double)round(*p * convertor);
  517. p += 2;
  518. }
  519. dz->is_int[paramno] = TRUE;
  520. } else
  521. dz->iparam[paramno] = round(dz->param[paramno] * convertor);
  522. }
  523. /************************ MAKE_SPLICE_TABLES ******************************/
  524. int make_splice_tables(dataptr dz)
  525. { /* rwd: changed to eliminate f/p division */
  526. long n; /* plus quasi-exponential option */
  527. double dif,val,lastval;
  528. double length, newsum,lastsum,twodif;
  529. double *local_btabptr; /* better safe than sorry! */
  530. double *local_etabptr;
  531. if(dz->iparray[GRS_FLAGS][G_BSPLICE_FLAG]<=1) {
  532. if(dz->iparam[GRS_BSPLICE]==0) {
  533. dz->iparam[GRS_IS_BTAB] = TRUE; /* even though it's empty */
  534. return(FINISHED);
  535. }
  536. if((dz->parray[GRS_BSPLICETAB] = (double *)malloc(dz->iparam[GRS_BSPLICE] * sizeof(double)))==NULL) {
  537. sprintf(errstr,"make_splice_tables(): 1\n");
  538. return(PROGRAM_ERROR);
  539. }
  540. local_btabptr = dz->parray[GRS_BSPLICETAB];
  541. val = 0.0;
  542. length = (double)dz->iparam[GRS_BSPLICE];
  543. if(!dz->vflag[GRS_EXPON]) {
  544. dif = 1.0/length;
  545. lastval = dif;
  546. *local_btabptr++ = val;
  547. *local_btabptr++ = lastval;
  548. for(n=2;n<dz->iparam[GRS_BSPLICE];n++) {
  549. val = lastval + dif;
  550. lastval = val;
  551. *local_btabptr++ = val;
  552. }
  553. } else { /* do quasi-exponential splice */
  554. dif = 1.0/(length*length);
  555. twodif = dif*2.0;
  556. lastsum = 0.0;
  557. lastval = dif;
  558. *local_btabptr++ = val;
  559. *local_btabptr++ = lastval;
  560. for(n=2;n<dz->iparam[GRS_BSPLICE];n++) {
  561. newsum = lastsum + twodif;
  562. val = lastval + newsum + dif;
  563. *local_btabptr++ = val;
  564. lastval = val;
  565. lastsum = newsum;
  566. }
  567. }
  568. dz->iparam[GRS_IS_BTAB] = TRUE;
  569. }
  570. if(dz->iparray[GRS_FLAGS][G_ESPLICE_FLAG]<=1) {
  571. if(dz->iparam[GRS_ESPLICE]==0) {
  572. dz->iparam[GRS_IS_ETAB] = TRUE; /* even thogh it's empty! */
  573. return(FINISHED);
  574. }
  575. if((dz->parray[GRS_ESPLICETAB] = (double *)malloc(dz->iparam[GRS_ESPLICE] * sizeof(double)))==NULL) {
  576. sprintf(errstr,"make_splice_tables(): 2\n");
  577. return(PROGRAM_ERROR);
  578. }
  579. local_etabptr = dz->parray[GRS_ESPLICETAB] + dz->iparam[GRS_ESPLICE];
  580. val = 0.0;
  581. length = (double)dz->iparam[GRS_ESPLICE];
  582. if(!dz->vflag[GRS_EXPON]) {
  583. dif = 1.0/length;
  584. lastsum = dif;
  585. *--local_etabptr = val;
  586. *--local_etabptr = lastsum;
  587. for(n=dz->iparam[GRS_ESPLICE]-3;n>=0;n--){
  588. val = lastsum + dif;
  589. lastsum = val;
  590. *--local_etabptr = val;
  591. }
  592. } else {
  593. dif = 1.0/(length*length);
  594. twodif = dif*2.0;
  595. lastsum = 0.0;
  596. lastval = dif;
  597. *--local_etabptr = val;
  598. *--local_etabptr = lastval;
  599. for(n=dz->iparam[GRS_ESPLICE]-3;n>=0;n--) {
  600. newsum = lastsum + twodif;
  601. val = lastval + newsum + dif;
  602. *--local_etabptr = val;
  603. lastval = val;
  604. lastsum = newsum;
  605. }
  606. }
  607. dz->iparam[GRS_IS_ETAB] = TRUE;
  608. }
  609. return(FINISHED);
  610. }
  611. /************************* SET_RANGES *****************************/
  612. void set_ranges(dataptr dz)
  613. {
  614. int n;
  615. for(n=0;n<SFLAGCNT;n++) {
  616. if(dz->iparray[GRS_FLAGS][n]==RANGED) {
  617. switch(n) {
  618. case(G_VELOCITY_FLAG):
  619. set_this_drange(GRS_VRANGE,GRS_HVELOCITY,GRS_VELOCITY,G_VELOCITY_FLAG,dz);
  620. break;
  621. case(G_DENSITY_FLAG):
  622. set_this_drange(GRS_DRANGE,GRS_HDENSITY,GRS_DENSITY,G_DENSITY_FLAG,dz);
  623. break;
  624. case(G_GRAINSIZE_FLAG):
  625. set_this_range(GRS_GRANGE,GRS_HGRAINSIZE,GRS_GRAINSIZE,G_GRAINSIZE_FLAG,dz);
  626. break;
  627. case(G_BSPLICE_FLAG):
  628. set_this_range(GRS_BRANGE,GRS_HBSPLICE,GRS_BSPLICE,G_BSPLICE_FLAG,dz);
  629. break;
  630. case(G_ESPLICE_FLAG):
  631. set_this_range(GRS_ERANGE,GRS_HESPLICE,GRS_ESPLICE,G_ESPLICE_FLAG,dz);
  632. break;
  633. case(G_PITCH_FLAG):
  634. set_this_drange(GRS_PRANGE,GRS_HPITCH,GRS_PITCH,G_PITCH_FLAG,dz);
  635. break;
  636. case(G_AMP_FLAG):
  637. /*set_this_range*/set_this_drange(GRS_ARANGE,GRS_HAMP,GRS_AMP,G_AMP_FLAG,dz);
  638. break;
  639. case(G_SPACE_FLAG):
  640. set_this_drange(GRS_SPRANGE,GRS_HSPACE,GRS_SPACE,G_SPACE_FLAG,dz);
  641. break;
  642. }
  643. }
  644. }
  645. }
  646. /************************ CALC_OVERFLOWS *************************
  647. *
  648. * We will attempt to put data into output buffer until we reach its 'end'.
  649. * But out grain will extend GRAINSIZE beyond this> So we must have
  650. * an overflow area on the buffer equal to the maximum grainsize.
  651. *
  652. * On the input side, we will attempt to read from input buffer until we
  653. * get to its end, BUT, grainsize extends beyond this. Also, to create
  654. * an output of GRAINSIZE we need to use an input size of
  655. * (grainsize*transposition). So overflow on input buffer = maximum val
  656. * of (grainsize*transposition).
  657. * Lbuf_smpxs = overflow in Lbuf
  658. * gLbuf_smpxs = MAXIMUM GRAINSIZE
  659. * buf_smpxs = overflow in inbuf
  660. */
  661. int calc_overflows(dataptr dz) /* DO THIS AFTER THE CONVERSION OF PITCH from SEMITONES */
  662. {
  663. int exit_status;
  664. long max_scatter;
  665. double mt = 1.0; /* MAXIMUM TRANSPOSITION */
  666. double mg = 1.0; /* MAXIMUM GRAINSIZE */
  667. double max1, max2;
  668. int mgi;
  669. switch(dz->iparray[GRS_FLAGS][G_PITCH_FLAG]) {
  670. case(NOT_SET):
  671. mt = 1.0;
  672. break;
  673. case(FIXED):
  674. mt = dz->param[GRS_PITCH];
  675. break;
  676. case(VARIABLE):
  677. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_PITCH,dz))<0)
  678. return(exit_status);
  679. mt = max1;
  680. break;
  681. case(RANGED):
  682. mt = max(dz->param[GRS_HPITCH],dz->param[GRS_PITCH]);
  683. break;
  684. case(RANGE_VLO):
  685. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_PITCH,dz))<0)
  686. return(exit_status);
  687. mt = max(max1,dz->param[GRS_HPITCH]);
  688. break;
  689. case(RANGE_VHI):
  690. if((exit_status = get_maxvalue_in_brktable(&max2,GRS_HPITCH,dz))<0)
  691. return(exit_status);
  692. mt = max(max2,dz->param[GRS_PITCH]);
  693. break;
  694. case(RANGE_VHILO):
  695. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_PITCH,dz))<0)
  696. return(exit_status);
  697. if((exit_status = get_maxvalue_in_brktable(&max2,GRS_HPITCH,dz))<0)
  698. return(exit_status);
  699. mt = max(max1,max2);
  700. break;
  701. }
  702. mt = pow(2.0,mt); /* CONVERT OCTAVES TO TRANSPOSITION RATIO */
  703. switch(dz->iparray[GRS_FLAGS][G_GRAINSIZE_FLAG]) {
  704. case(NOT_SET):
  705. case(FIXED):
  706. mg = (double)dz->iparam[GRS_GRAINSIZE];
  707. break;
  708. case(VARIABLE):
  709. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_GRAINSIZE,dz))<0)
  710. return(exit_status);
  711. mg = max1;
  712. break;
  713. case(RANGED):
  714. // BUG: OCtober 2009
  715. mg = max(dz->iparam[GRS_HGRAINSIZE],dz->iparam[GRS_GRAINSIZE]);
  716. break;
  717. case(RANGE_VLO):
  718. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_GRAINSIZE,dz))<0)
  719. return(exit_status);
  720. mg = max(max1,(double)dz->iparam[GRS_HGRAINSIZE]);
  721. break;
  722. case(RANGE_VHI):
  723. if((exit_status = get_maxvalue_in_brktable(&max2,GRS_HGRAINSIZE,dz))<0)
  724. return(exit_status);
  725. mg = max(max2,(double)dz->iparam[GRS_GRAINSIZE]);
  726. break;
  727. case(RANGE_VHILO):
  728. if((exit_status = get_maxvalue_in_brktable(&max1,GRS_GRAINSIZE,dz))<0)
  729. return(exit_status);
  730. if((exit_status = get_maxvalue_in_brktable(&max2,GRS_HGRAINSIZE,dz))<0)
  731. return(exit_status);
  732. mg = max(max1,max2);
  733. break;
  734. }
  735. mgi = round(mg)+1;
  736. dz->iparam[GRS_GLBUF_SMPXS] = mgi; /* Overflow in outbuf = MAX-grainsize */
  737. dz->iparam[GRS_BUF_SMPXS] = round((double)mgi * mt); /* Overflow in inbuf = MAX-grainsize * transpos */
  738. if((exit_status = calc_max_scatter(mgi,&max_scatter,dz))<0)
  739. return(exit_status);
  740. adjust_overflows(max_scatter,dz);
  741. return(FINISHED);
  742. }
  743. /************************ SET_THIS_RANGE ******************************/
  744. void set_this_range(int rangeno,int hino, int lono, int flagno, dataptr dz)
  745. {
  746. dz->iparam[rangeno] = dz->iparam[hino] - dz->iparam[lono];
  747. if(dz->iparam[rangeno]==0)
  748. dz->iparray[GRS_FLAGS][flagno] = FIXED;
  749. }
  750. /************************ SET_THIS_DRANGE ******************************/
  751. void set_this_drange(int rangeno,int hino, int lono, int flagno, dataptr dz)
  752. {
  753. dz->param[rangeno] = dz->param[hino] - dz->param[lono];
  754. if(flteq(dz->param[rangeno],0.0))
  755. dz->iparray[GRS_FLAGS][flagno] = FIXED;
  756. }
  757. /******************************** CALC_MAX_SCATTER ****************************/
  758. int calc_max_scatter(int mgi,long *max_scatlen, dataptr dz) /* mgi = MAX GRAIN SIZE */
  759. {
  760. #define GRS_ROUNDUP (0.9999)
  761. int exit_status;
  762. long os = 0;
  763. double sc = 0.0;
  764. double min1, min2, minn/*, sr = (double)dz->infile->srate*/;
  765. int k = dz->iparray[GRS_FLAGS][G_DENSITY_FLAG];
  766. switch(k) {
  767. case(NOT_SET):
  768. case(FIXED):
  769. case(RANGED):
  770. os = (long)(((double)mgi/dz->param[GRS_DENSITY]) + GRS_ROUNDUP); /* ROUND UP */
  771. break;
  772. case(VARIABLE):
  773. if((exit_status = get_minvalue_in_brktable(&min1,GRS_DENSITY,dz))<0)
  774. return(exit_status);
  775. os = (long)(((double)mgi/min1) + GRS_ROUNDUP);
  776. break;
  777. case(RANGE_VLO):
  778. if((exit_status = get_minvalue_in_brktable(&min1,GRS_DENSITY,dz))<0)
  779. return(exit_status);
  780. minn = min(min1,dz->param[GRS_HDENSITY]);
  781. os = (long)(((double)mgi/minn) + GRS_ROUNDUP);
  782. break;
  783. case(RANGE_VHI):
  784. if((exit_status = get_minvalue_in_brktable(&min2,GRS_HDENSITY,dz))<0)
  785. return(exit_status);
  786. minn = min(min2,dz->param[GRS_DENSITY]);
  787. os = (long)(((double)mgi/minn) + GRS_ROUNDUP);
  788. break;
  789. case(RANGE_VHILO):
  790. if((exit_status = get_minvalue_in_brktable(&min1,GRS_DENSITY,dz))<0)
  791. return(exit_status);
  792. if((exit_status = get_minvalue_in_brktable(&min2,GRS_HDENSITY,dz))<0)
  793. return(exit_status);
  794. minn = min(min1,min2);
  795. os = (long)(((double)mgi/minn) + GRS_ROUNDUP);
  796. break;
  797. }
  798. switch(dz->iparray[GRS_FLAGS][G_SCATTER_FLAG]) {
  799. case(NOT_SET):
  800. case(FIXED):
  801. sc = dz->param[GRS_SCATTER];
  802. break;
  803. case(VARIABLE):
  804. if((exit_status = get_maxvalue_in_brktable(&sc,GRS_SCATTER,dz))<0)
  805. return(exit_status);
  806. break;
  807. }
  808. *max_scatlen = (long)(((double)os * sc) + GRS_ROUNDUP); /* ROUND UP */
  809. return(FINISHED);
  810. }
  811. /************************ ADJUST_OVERFLOWS ***************************
  812. * GRS_LBUF_SMPXS = overflow in calculation buffer Lbuf
  813. * iparam[GRS_GLBUF_SMPXS] = MAXIMUM GRAINSIZE
  814. * GRS_BUF_SMPXS = overflow in inbuf
  815. */
  816. /* RW NB we eliminate almost everything! */
  817. void adjust_overflows(long mscat, dataptr dz)
  818. {
  819. dz->iparam[GRS_BUF_SMPXS] += SAFETY; /* ADD SAFETY MARGINS !! */
  820. dz->iparam[GRS_GLBUF_SMPXS] += OSAFETY;
  821. dz->iparam[GRS_LBUF_SMPXS] = dz->iparam[GRS_GLBUF_SMPXS] + mscat;
  822. }
  823. #ifdef MULTICHAN
  824. /************************** CHECK_SPATIALISATION_DATA ************************************/
  825. int check_spatialisation_data(dataptr dz)
  826. {
  827. int exit_status;
  828. double maxspace, maxspaceh = 0.0;
  829. if(dz->process==SAUSAGE) {
  830. if(dz->brksize[GRS_HSPACE]) {
  831. if((exit_status = get_maxvalue_in_brktable(&maxspaceh,GRS_HSPACE,dz))<0)
  832. return(exit_status);
  833. } else
  834. maxspaceh = dz->param[GRS_HSPACE];
  835. if(dz->brksize[GRS_SPACE]) {
  836. if((exit_status = get_maxvalue_in_brktable(&maxspace,GRS_SPACE,dz))<0)
  837. return(exit_status);
  838. } else
  839. maxspace = dz->param[GRS_SPACE];
  840. maxspace = max(maxspace,maxspaceh);
  841. } else {
  842. switch(dz->mode) {
  843. case(GRS_FULL_MONTY):
  844. if(dz->brksize[GRS_HSPACE]) {
  845. if((exit_status = get_maxvalue_in_brktable(&maxspaceh,GRS_HSPACE,dz))<0)
  846. return(exit_status);
  847. } else
  848. maxspaceh = dz->param[GRS_HSPACE];
  849. /* fall thro */
  850. case(GRS_BRASSAGE):
  851. if(dz->brksize[GRS_SPACE]) {
  852. if((exit_status = get_maxvalue_in_brktable(&maxspace,GRS_SPACE,dz))<0)
  853. return(exit_status);
  854. } else
  855. maxspace = dz->param[GRS_SPACE];
  856. break;
  857. default:
  858. return FINISHED;
  859. }
  860. if(dz->mode == GRS_FULL_MONTY)
  861. maxspace = max(maxspace,maxspaceh);
  862. }
  863. if(dz->out_chans == 2) {
  864. if(maxspace > 1.0) {
  865. sprintf(errstr,"SPATIAL DATA MAX VALUE (%lf) INCOMPATIBLE WITH OUTPUT CHANNEL-CNT (STEREO) (data range for stereo 0-1)\n",maxspace);
  866. return(DATA_ERROR);
  867. }
  868. } else {
  869. if(maxspace > dz->out_chans) {
  870. sprintf(errstr,"SPATIAL DATA MAX VALUE (%lf) INCOMPATIBLE WITH OUTPUT CHANNEL CNT (dz->out_chans) SPECIFIED\n",maxspace);
  871. return(DATA_ERROR);
  872. }
  873. }
  874. return(FINISHED);
  875. }
  876. #endif