blur.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <globcon.h>
  26. #include <pnames.h>
  27. #include <modeno.h>
  28. #include <arrays.h>
  29. #include <flags.h>
  30. #include <blur.h>
  31. #include <cdpmain.h>
  32. #include <formants.h>
  33. #include <speccon.h>
  34. #include <sfsys.h>
  35. #include <osbind.h>
  36. #include <string.h>
  37. #include <blur.h>
  38. #define round(x) lround((x))
  39. #define FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST (1)
  40. #define SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST (2)
  41. #define BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER (0)
  42. static int randomly_select_blokstokeep_and_sort_in_ascending_order(dataptr dz);
  43. static int delete_unwanted_bloks(dataptr dz);
  44. static int insert(int k,int n,int *iarray,int permcnt);
  45. static int shuflup(int n,int * iarray,int permcnt);
  46. static int read_domain_samps(int *reached_end_of_file,int *ssampsread,int windows_wanted,dataptr dz);
  47. static int copy_domain_to_domainbuf(int *reached_end_of_infile,int *ssampsread,int bufwlen,int permcnt,
  48. int shuf_d_windows,float *dbufptr,float *dbufend,dataptr dz);
  49. static int copywindows_from_domain_to_image(float *domainbuf,float * dbufend,dataptr dz);
  50. static int get_randplace(int *randh,int *rande,dataptr dz);
  51. static int get_other_randplace(int *order,int randh,int rande,int *randh2,int *rande2,dataptr dz);
  52. static int chorusing(int cc,int cc2,int randend,int randend2,int order,dataptr dz);
  53. static int do_afix_ffix(int *cc,int *cc2,int *vc,dataptr dz);
  54. static int do_a(int cc,int vc,int randend,dataptr dz);
  55. static int do_fvar(int cc,int vc,int randend,dataptr dz);
  56. static int do_afix_f(int *cc,int *cc2,int *vc,dataptr dz);
  57. static int do_a_ffix(int *cc,int *cc2,int *vc,dataptr dz);
  58. static int do_a_f(int *cc,int *cc2,int *vc,dataptr dz);
  59. static int do_afix(int cc,int vc,int randend, dataptr dz);
  60. static int do_ffix(int cc,int vc,int randend,dataptr dz);
  61. static int getnewfrq_choru(int cc,int vc,dataptr dz);
  62. static int getnewfrq2_choru(int cc,int vc,dataptr dz);
  63. static int get_sbufposition_corresponding_to_frq(int *channo,double frq,dataptr dz);
  64. static int advance_to_starttime(float **inputbuf_end,int *samps_read,int *drnk_bufno,dataptr dz);
  65. static int copy_window_to_outbuf(dataptr dz);
  66. static int get_randstep(int *step,dataptr dz);
  67. static int adjust_buffers(int *step,float **inputbuf_end,int *samps_read,int *drnk_bufno, dataptr dz);
  68. static int flush_outbuf(dataptr dz);
  69. static int invert_step_back_to_step_fwd_at_start_of_file(int *step,int reflect_off_end,dataptr dz);
  70. static int place_sbufptr_in_bigbuf_range(int *bigbufs_baktrak,dataptr dz);
  71. static int invert_step_back_to_step_fwd(int *step,float *orig_sbuf,int *samps_read,
  72. float **inputbuf_end, int reflect_off_end,int drnk_bufno,dataptr dz);
  73. static int baktrak_to_correct_bigbuf(int bigbufs_baktrak,int *samps_read,float **inputbuf_end,
  74. int *drnk_bufno,dataptr dz);
  75. static int invert_step_fwd_to_step_back_at_end_of_file(int *step,int reflect_off_start,int drnk_bufno,dataptr dz);
  76. static int advance_to_correct_bigbuf(float **inputbuf_end,int *samps_read,int *drnk_bufno,dataptr dz);
  77. static int invert_step_fwd_to_step_back(int *step,float *orig_sbuf,int *samps_read,
  78. float **inputbuf_end,int reflect_off_start,int drnk_bufno,dataptr dz);
  79. static int read_first_inbuf(dataptr dz);
  80. static int wrap_samps(unsigned int wrapsamps,float **insbuf,dataptr dz);
  81. static int copy_1st_window(dataptr dz);
  82. /********************************** SPECAVRG **********************************/
  83. int specavrg(dataptr dz)
  84. {
  85. int exit_status;
  86. int cc, vc, k=0, n, m, q;
  87. if(dz->brksize[AVRG_AVRG]) {
  88. dz->iparam[AVRG_AVRGSPAN] = dz->iparam[AVRG_AVRG]/2;
  89. dz->iparam[AVRG_AVRG] = (dz->iparam[AVRG_AVRGSPAN] * 2) + 1; /* always odd */
  90. }
  91. if(dz->iparam[AVRG_AVRGSPAN]>0) {
  92. if((exit_status = get_amp(dz->flbufptr[0],dz))<0)
  93. return(exit_status);
  94. for(cc = 0, vc = 0; cc < dz->iparam[AVRG_AVRGSPAN]; cc++, vc+=2) {
  95. dz->amp[cc] = 0.0f;
  96. k = cc + dz->iparam[AVRG_AVRGSPAN] + 1; /* SMALL AVERAGE AT BOTTOM */
  97. for(n = 0, m = 0; n < k; n++, m += 2)
  98. dz->amp[cc] = (float)(dz->amp[cc] + dz->flbufptr[0][m]);
  99. dz->amp[cc] = (float)(dz->amp[cc]/(double)(k));
  100. }
  101. q = dz->clength - dz->iparam[AVRG_AVRGSPAN];
  102. m = dz->iparam[AVRG_AVRGSPAN] * 2;
  103. for(cc = dz->iparam[AVRG_AVRGSPAN], vc = m; cc < q; cc++, vc += 2) {
  104. dz->amp[cc] = 0.0f; /* TRUE AVERAGE */
  105. for(n = vc - m;n <= vc + m; n += 2)
  106. dz->amp[cc] = (float)(dz->amp[cc] + dz->flbufptr[0][n]);
  107. dz->amp[cc] = (float)(dz->amp[cc]/(double)dz->iparam[AVRG_AVRG]);
  108. }
  109. for(cc = q, vc = k*q; cc < dz->clength; cc++, vc+=2) {
  110. dz->amp[cc] = 0.0f;
  111. k = cc - dz->iparam[AVRG_AVRGSPAN]; /* SMALL AVERAGE AT TOP */
  112. for(n = k, m = k*2; n < dz->clength; n++, m += 2)
  113. dz->amp[cc] = (float)(dz->amp[cc] + dz->flbufptr[0][m]);
  114. dz->amp[cc] = (float)(dz->amp[cc]/(double)(dz->clength-k));
  115. }
  116. if((exit_status = put_amp(dz->flbufptr[0],dz))<0)
  117. return(exit_status);
  118. }
  119. return(FINISHED);
  120. }
  121. /************************** SPECSUPR *****************************/
  122. int specsupr(dataptr dz)
  123. {
  124. int exit_status;
  125. chvptr quietest, loudest;
  126. int invtrindex, vc;
  127. if(dz->iparam[SUPR_INDX]>(dz->clength/2)) { /* IF MORE CHANS TO SUPPRESS THAN TO KEEP */
  128. invtrindex = dz->clength - dz->iparam[SUPR_INDX];
  129. if((exit_status = initialise_ring_vals(invtrindex,BIGAMP,dz))<0) /* PRESET RING VALS TO MAX */
  130. return(exit_status);
  131. for(vc = 0; vc < dz->wanted; vc += 2) { /* IF QUIETER THAN PREVIOUS CHANS, STORE */
  132. if((exit_status = if_one_of_quietest_chans_store_in_ring(vc,dz))<0)
  133. return(exit_status);
  134. dz->flbufptr[0][vc] = 0.0f; /* ZERO ALL CHANNELS AS WE GO */
  135. }
  136. quietest = dz->ringhead;
  137. do { /* REINSERT AMP OF QUIETEST CHANS ONLY */
  138. dz->flbufptr[0][quietest->loc] = quietest->val;
  139. } while((quietest = quietest->next)!=dz->ringhead);
  140. } else { /* IF MORE CHANS TO KEEP THAN TO SUPPRESS */
  141. if((exit_status = initialise_ring_vals(dz->iparam[SUPR_INDX],-BIGAMP,dz))<0)
  142. return(exit_status); /* PRESET RING VALS TO MIN */
  143. for(vc = 0; vc < dz->wanted; vc += 2) {
  144. if((exit_status = if_one_of_loudest_chans_store_in_ring(vc,dz))<0)
  145. return(exit_status); /* IF LOUDER THAN PREVIOUS CHANS, STORE */
  146. }
  147. loudest = dz->ringhead;
  148. do {
  149. dz->flbufptr[0][loudest->loc] = 0.0f; /* ZERO AMPLITUDE IN LOUDEST CHANNELS ONLY */
  150. } while((loudest = loudest->next)!=dz->ringhead);
  151. }
  152. return(FINISHED);
  153. }
  154. /************************ SPECSCAT *****************************/
  155. int specscat(dataptr dz)
  156. {
  157. int exit_status;
  158. double pre_totalamp = 0.0, post_totalamp;
  159. if(dz->brksize[SCAT_CNT])
  160. dz->iparam[SCAT_THISCNT] = dz->iparam[SCAT_CNT];
  161. if(dz->brksize[SCAT_BLOKSIZE]) {
  162. dz->iparam[SCAT_BLOKS_PER_WINDOW] = dz->clength/dz->iparam[SCAT_BLOKSIZE];
  163. if((dz->iparam[SCAT_BLOKS_PER_WINDOW]*dz->iparam[SCAT_BLOKSIZE])!=dz->clength)
  164. dz->iparam[SCAT_BLOKS_PER_WINDOW]++;
  165. }
  166. if((dz->brksize[SCAT_CNT] || dz->brksize[SCAT_BLOKSIZE])
  167. && dz->iparam[SCAT_CNT] >= dz->iparam[SCAT_BLOKS_PER_WINDOW]) {
  168. sprintf(errstr,"Blokcnt exceeds number of blocks per window at %.4lf secs\n",
  169. dz->time - dz->frametime);
  170. return(USER_ERROR);
  171. }
  172. if(!dz->vflag[SCAT_NO_NORM]) {
  173. if((exit_status = get_totalamp(&pre_totalamp,dz->flbufptr[0],dz->wanted))<0)
  174. return(exit_status);
  175. }
  176. if(dz->vflag[SCAT_RANDCNT])
  177. dz->iparam[SCAT_THISCNT] = (int)((drand48() * dz->iparam[SCAT_CNT]) + 1.0); /* TRUNCATE */
  178. if((exit_status = randomly_select_blokstokeep_and_sort_in_ascending_order(dz))<0)
  179. return(exit_status);
  180. if((exit_status = delete_unwanted_bloks(dz))<0)
  181. return(exit_status);
  182. if(!dz->vflag[SCAT_NO_NORM]) {
  183. if((exit_status = get_totalamp(&post_totalamp,dz->flbufptr[0],dz->wanted))<0)
  184. return(exit_status);
  185. if((exit_status = normalise(pre_totalamp,post_totalamp,dz))<0)
  186. return(exit_status);
  187. }
  188. return(FINISHED);
  189. }
  190. /********** RANDOMLY_SELECT_BLOKSTOKEEP_AND_SORT_IN_ASCENDING_ORDER **********
  191. *
  192. * (1) preset all SCAT_KEEP array vals to max.
  193. * (2) insert blokno between 0 and SCAT_BLOKS_PER_WINDOW in 1st position in SCAT_KEEP array.
  194. * (3) insert blokno between 0 and SCAT_BLOKS_PER_WINDOW in next position in SCAT_KEEP array.
  195. * (4) ensure its a NEW value
  196. * (5) if it's not a new value, try again.
  197. * (6) order the existing new values
  198. */
  199. int randomly_select_blokstokeep_and_sort_in_ascending_order(dataptr dz)
  200. {
  201. int exit_status;
  202. int n, m, k, keepcnt, bad_value, inserted;
  203. for(n=0;n<dz->clength+1;n++)
  204. dz->iparray[SCAT_KEEP][n] = dz->clength+1; /* 1 */
  205. k = (int)(drand48() * dz->iparam[SCAT_BLOKS_PER_WINDOW]);/* TRUNC */
  206. dz->iparray[SCAT_KEEP][0] = k; /* 2 */
  207. keepcnt = 1;
  208. for(n=1;n<dz->iparam[SCAT_THISCNT];n++) {
  209. k = (int)(drand48() * dz->iparam[SCAT_BLOKS_PER_WINDOW]);/* TRUNC */ /* 3 */
  210. bad_value = 0;
  211. inserted = 0;
  212. for(m=0;m<keepcnt;m++) { /* 4 */
  213. if(k==dz->iparray[SCAT_KEEP][m]) {
  214. bad_value = 1;
  215. break;
  216. }
  217. } /* 5 */
  218. if(bad_value) {
  219. n--;
  220. continue;
  221. }
  222. for(m=0;m<keepcnt;m++) { /* 6 */
  223. if(k<dz->iparray[SCAT_KEEP][m]) {
  224. if((exit_status = insert(k,m,dz->iparray[SCAT_KEEP],keepcnt))<0)
  225. return(exit_status);
  226. inserted = 1;
  227. break;
  228. }
  229. }
  230. if(!inserted)
  231. dz->iparray[SCAT_KEEP][keepcnt] = k;
  232. keepcnt++;
  233. }
  234. if(keepcnt!=dz->iparam[SCAT_THISCNT]) {
  235. sprintf(errstr,"Error in perm arithmetic.randomly_select_blokstokeep_and_sort_in_ascending_order()\n");
  236. return(PROGRAM_ERROR);
  237. }
  238. return(FINISHED);
  239. }
  240. /****************************** DELETE_UNWANTED_BLOKS *****************************/
  241. int delete_unwanted_bloks(dataptr dz)
  242. {
  243. int this_blok = 0; /* INDEX TO BLKS TO RETAIN */
  244. int n, c_end, vc_end;
  245. int cc = 0, vc;
  246. for(n = 0; n < dz->iparam[SCAT_BLOKS_PER_WINDOW]; n++) {
  247. if(n==dz->iparray[SCAT_KEEP][this_blok]) { /* If keeping it */
  248. if((cc += dz->iparam[SCAT_BLOKSIZE]) >= dz->clength)/* Jump over it, and, if at window end, break */
  249. break;
  250. if(++this_blok >= dz->iparam[SCAT_THISCNT]) { /* If at end of kept bloks */
  251. vc = cc * 2;
  252. while(vc < dz->wanted) { /* zero any remaining chans */
  253. dz->flbufptr[0][AMPP] = 0.0F;
  254. vc += 2;
  255. }
  256. break;
  257. }
  258. } else { /* if NOT keeping it */
  259. if((c_end = cc + dz->iparam[SCAT_BLOKSIZE]) >= dz->clength)
  260. c_end = dz->clength; /* mark end of blok */
  261. vc = cc * 2;
  262. vc_end = c_end * 2;
  263. while(vc < vc_end) { /* zero it */
  264. dz->flbufptr[0][AMPP] = 0.0F;
  265. vc += 2;
  266. }
  267. if(vc >= dz->wanted) /* If at window end, break */
  268. break;
  269. }
  270. }
  271. return(FINISHED);
  272. }
  273. /****************************** INSERT ***************************/
  274. int insert(int k,int n,int *iarray,int permcnt)
  275. {
  276. int exit_status;
  277. if((exit_status = shuflup(n,iarray,permcnt))<0)
  278. return(exit_status);
  279. iarray[n] = k;
  280. return(FINISHED);
  281. }
  282. /****************************** SHUFLUP ***************************/
  283. int shuflup(int n,int * iarray,int permcnt)
  284. {
  285. int z = permcnt;
  286. while(z > n) {
  287. iarray[z] = iarray[z-1];
  288. z--;
  289. }
  290. return(FINISHED);
  291. }
  292. /**************************** SPECSPREAD ***************************/
  293. int specspread(dataptr dz)
  294. {
  295. int exit_status;
  296. int cc, vc;
  297. double specenv_amp, ampdiff, pre_totalamp, post_totalamp;
  298. rectify_window(dz->flbufptr[0],dz);
  299. if((exit_status = extract_specenv(0,0,dz))<0)
  300. return(exit_status);
  301. if((exit_status = get_totalamp(&pre_totalamp,dz->flbufptr[0],dz->wanted))<0)
  302. return(exit_status);
  303. for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
  304. if((exit_status = getspecenvamp(&specenv_amp,(double)dz->flbufptr[0][FREQ],0,dz))<0)
  305. return(exit_status);
  306. ampdiff = specenv_amp - dz->flbufptr[0][AMPP];
  307. dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] + (ampdiff * dz->param[SPREAD_SPRD]));
  308. }
  309. if((exit_status = get_totalamp(&post_totalamp,dz->flbufptr[0],dz->wanted))<0)
  310. return(exit_status);
  311. if((exit_status = normalise(pre_totalamp,post_totalamp,dz))<0)
  312. return(exit_status);
  313. return(FINISHED);
  314. }
  315. /******************************** SPECSHUFFLE *****************************/
  316. int specshuffle(dataptr dz)
  317. {
  318. int exit_status;
  319. int permcnt = 0, ssampsread;
  320. int shuf_d_windows = dz->iparam[SHUF_DMNCNT] * dz->iparam[SHUF_GRPSIZE];
  321. int bufwlen = dz->buflen/dz->wanted;
  322. float *domainbuf, *dbufptr, *dbufend;
  323. int reached_end_of_infile = FALSE;
  324. int min_windows_to_get = min(shuf_d_windows+1,bufwlen);
  325. dz->flbufptr[0] = dz->bigfbuf;
  326. dz->flbufptr[1] = dz->flbufptr[2];
  327. if(sloom)
  328. dz->total_samps_read = 0;
  329. if((domainbuf = (float *)malloc((size_t)(shuf_d_windows * (dz->wanted * sizeof(float)))))==NULL) {
  330. sprintf(errstr,"INSUFFICIENT MEMORY for domain buffer.\n");
  331. return(MEMORY_ERROR);
  332. }
  333. dbufptr = domainbuf;
  334. dbufend = domainbuf + (shuf_d_windows * dz->wanted);
  335. if((exit_status = read_domain_samps(&reached_end_of_infile,&ssampsread,min_windows_to_get,dz))<0)
  336. return(exit_status);
  337. if(exit_status == FINISHED) {
  338. sprintf(errstr,"Insufficient data in soundfile to do this shuffle.\n");
  339. return(GOAL_FAILED);
  340. }
  341. copy_1st_window(dz);
  342. for(;;) {
  343. dbufptr = domainbuf;
  344. if((exit_status = copy_domain_to_domainbuf
  345. (&reached_end_of_infile,&ssampsread,bufwlen,permcnt,shuf_d_windows,dbufptr,dbufend,dz))<0)
  346. return(exit_status);
  347. if(exit_status==FINISHED)
  348. break;
  349. copywindows_from_domain_to_image(domainbuf,dbufend,dz);
  350. permcnt++;
  351. }
  352. if(dz->flbufptr[1] > dz->flbufptr[2])
  353. return (int) write_samps(dz->flbufptr[2],(dz->flbufptr[1] - dz->flbufptr[2]),dz);
  354. return(FINISHED);
  355. }
  356. /********************** READ_DOMAIN_SAMPS *******************/
  357. int read_domain_samps(int *reached_end_of_file,int *ssampsread,int windows_wanted,dataptr dz)
  358. {
  359. int exit_status;
  360. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
  361. return exit_status;
  362. if(dz->ssampsread < windows_wanted * dz->wanted)
  363. return(FINISHED);
  364. *ssampsread = dz->ssampsread;
  365. if(dz->ssampsread < dz->buflen)
  366. *reached_end_of_file = TRUE;
  367. return(CONTINUE);
  368. }
  369. /********************** COPY_DOMAIN_TO_DOMAINBUF *******************/
  370. int copy_domain_to_domainbuf
  371. (int *reached_end_of_infile,int *ssampsread,int bufwlen,int permcnt,int shuf_d_windows,
  372. float *dbufptr,float *dbufend,dataptr dz)
  373. {
  374. int exit_status;
  375. int n, windows_needed;
  376. float *data_end;
  377. if(reached_end_of_infile)
  378. data_end = dz->bigfbuf + *ssampsread;
  379. else
  380. data_end = dz->flbufptr[2];
  381. for(n=0;n<shuf_d_windows;n++) {
  382. if(dbufptr >= dbufend) {
  383. sprintf(errstr,"Error in buffer arithmetic: specshuffle()\n");
  384. return(PROGRAM_ERROR);
  385. }
  386. if(dz->flbufptr[0] >= data_end) {
  387. if(!(*reached_end_of_infile)) {
  388. windows_needed = min(shuf_d_windows-n,bufwlen);
  389. if((exit_status = read_domain_samps(reached_end_of_infile,ssampsread,windows_needed,dz))<0)
  390. return(exit_status);
  391. if(*reached_end_of_infile)
  392. data_end = dz->bigfbuf + *ssampsread;
  393. dz->flbufptr[0] = dz->bigfbuf;
  394. } else
  395. exit_status = FINISHED;
  396. if(exit_status==FINISHED) {
  397. if(permcnt==0) {
  398. sprintf(errstr,"Insufficient data in soundfile to do this shuffle.\n");
  399. return(GOAL_FAILED);
  400. }
  401. return(FINISHED);
  402. }
  403. }
  404. memmove((char *)dbufptr,(char *)dz->flbufptr[0],(size_t)(dz->wanted * sizeof(float)));
  405. dbufptr += dz->wanted;
  406. dz->flbufptr[0] += dz->wanted;
  407. }
  408. return(CONTINUE);
  409. }
  410. /************************** COPYWINDOWS_FROM_DOMAIN_TO_IMAGE ********************************/
  411. int copywindows_from_domain_to_image(float *domainbuf,float * dbufend,dataptr dz)
  412. {
  413. int exit_status;
  414. int n, m;
  415. float *srcptr;
  416. for(n=0;n<dz->iparam[SHUF_IMGCNT];n++) {
  417. srcptr = domainbuf + (dz->iparray[SHUF_MAP][n] * dz->iparam[SHUF_GRPSIZE] * dz->wanted);
  418. for(m=0;m < dz->iparam[SHUF_GRPSIZE]; m++) {
  419. if(srcptr >= dbufend) {
  420. sprintf(errstr,"Error in buffer arithmetic: copywindows_from_domain_to_image()\n");
  421. return(PROGRAM_ERROR);
  422. }
  423. if(dz->flbufptr[1] >= dz->flbufptr[3]) {
  424. if((exit_status = write_exact_samps(dz->flbufptr[2],dz->buflen,dz))<0)
  425. return(exit_status);
  426. dz->flbufptr[1] = dz->flbufptr[2];
  427. }
  428. memmove((char *)dz->flbufptr[1],(char *)srcptr,(size_t)(dz->wanted * sizeof(float)));
  429. srcptr += dz->wanted;
  430. dz->flbufptr[1] += dz->wanted;
  431. }
  432. }
  433. return(FINISHED);
  434. }
  435. /************************* SPECCHORUS ***************************/
  436. int specchorus(dataptr dz)
  437. {
  438. int exit_status;
  439. //TW cc2 is never set for modes other than CH_AMP_FRQ, CH_AMP_FRQ_UP, CH_AMP_FRQ_DN
  440. int cc, cc2 = 0, order = 0;
  441. int randhere = 0, randhere2 = 0, randend = 0, randend2 = 0;
  442. double pre_totalamp = 0.0, post_totalamp;
  443. if((exit_status = get_randplace(&randhere,&randend,dz))<0)
  444. return(exit_status);
  445. cc = randhere;
  446. if(dz->mode == CH_AMP_FRQ || dz->mode == CH_AMP_FRQ_UP || dz->mode == CH_AMP_FRQ_DN) {
  447. if((exit_status = get_other_randplace(&order,randhere,randend,&randhere2,&randend2,dz))<0)
  448. return(exit_status);
  449. cc2 = randhere2;
  450. }
  451. if(dz->iparam[CHORU_SPRTYPE]!=F_VAR && dz->iparam[CHORU_SPRTYPE]!=F_FIX) {
  452. if((exit_status = get_totalamp(&pre_totalamp,dz->flbufptr[0],dz->wanted))<0)
  453. return(exit_status);
  454. }
  455. if((exit_status = chorusing(cc,cc2,randend,randend2,order,dz))<0)
  456. return(exit_status);
  457. if(dz->iparam[CHORU_SPRTYPE]!=F_VAR && dz->iparam[CHORU_SPRTYPE]!=F_FIX) {
  458. if((exit_status = get_totalamp(&post_totalamp,dz->flbufptr[0],dz->wanted))<0)
  459. return(exit_status);
  460. if((exit_status = normalise(pre_totalamp,post_totalamp,dz))<0)
  461. return(exit_status);
  462. }
  463. return(FINISHED);
  464. }
  465. /************************** GET_RANDPLACE *************************/
  466. int get_randplace(int *randh,int *rande,dataptr dz)
  467. {
  468. *randh = (int)(drand48() * dz->iparam[CHORU_RTABSIZE]);
  469. if((*rande = *randh + dz->clength) >= dz->iparam[CHORU_RTABSIZE])
  470. *rande = dz->iparam[CHORU_RTABSIZE];
  471. return(FINISHED);
  472. }
  473. /************************** GET_OTHER_RANDPLACE **************************/
  474. int get_other_randplace(int *order,int randh,int rande,int *randh2,int *rande2,dataptr dz)
  475. {
  476. int firstlen, firstlen2;
  477. *randh2 = (int)(drand48() * dz->iparam[CHORU_RTABSIZE]);
  478. if((*rande2 = *randh2 + dz->clength) > dz->iparam[CHORU_RTABSIZE])
  479. *rande2 = dz->iparam[CHORU_RTABSIZE];
  480. firstlen = rande - randh;
  481. firstlen2 = *rande2 - *randh2;
  482. if(firstlen<firstlen2) /* 1 */
  483. *order = FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST;
  484. else if(firstlen2<firstlen) /* 2 */
  485. *order = SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST;
  486. else
  487. *order = BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER; /* 3 */
  488. return(FINISHED);
  489. }
  490. /******************************* CHORUSING *****************************/
  491. int chorusing(int cc,int cc2,int randend,int randend2,int order,dataptr dz)
  492. {
  493. int exit_status;
  494. int vc;
  495. switch(dz->iparam[CHORU_SPRTYPE]) {
  496. case(A_FIX):
  497. vc = 0;
  498. if((exit_status = do_afix(cc,vc,randend,dz))<0)
  499. return(exit_status);
  500. break;
  501. case(F_FIX):
  502. vc = 1;
  503. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  504. if((exit_status = do_ffix(cc,vc,randend,dz))<0)
  505. return(exit_status);
  506. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  507. break;
  508. case(AF_FIX):
  509. vc = 0;
  510. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  511. switch(order) {
  512. case(BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER):
  513. while(cc<randend) {
  514. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  515. return(exit_status);
  516. }
  517. cc = cc2 = 0;
  518. while(vc < dz->wanted) {
  519. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  520. return(exit_status);
  521. }
  522. break;
  523. case(FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  524. while(cc<randend) {
  525. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  526. return(exit_status);
  527. }
  528. cc = 0;
  529. while(cc2 < randend2) {
  530. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  531. return(exit_status);
  532. }
  533. cc2 = 0;
  534. while(vc < dz->wanted) {
  535. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  536. return(exit_status);
  537. }
  538. break;
  539. case(SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  540. while(cc2<randend2) {
  541. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  542. return(exit_status);
  543. }
  544. cc2 = 0;
  545. while(cc < randend) {
  546. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  547. return(exit_status);
  548. }
  549. cc = 0;
  550. while(vc < dz->wanted) {
  551. if((exit_status = do_afix_ffix(&cc,&cc2,&vc,dz))<0)
  552. return(exit_status);
  553. }
  554. break;
  555. }
  556. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  557. break;
  558. case(A_VAR):
  559. vc = 0;
  560. if((exit_status = do_a(cc,vc,randend,dz))<0)
  561. return(exit_status);
  562. break;
  563. case(F_VAR):
  564. vc = 1;
  565. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  566. if((exit_status = do_fvar(cc,vc,randend,dz))<0)
  567. return(exit_status);
  568. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  569. break;
  570. case(A_FIX_F_VAR):
  571. vc = 0;
  572. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  573. switch(order) {
  574. case(BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER):
  575. while(cc<randend) {
  576. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  577. return(exit_status);
  578. }
  579. cc = cc2 = 0;
  580. while(vc < dz->wanted) {
  581. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  582. return(exit_status);
  583. }
  584. break;
  585. case(FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  586. while(cc<randend) {
  587. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  588. return(exit_status);
  589. }
  590. cc = 0;
  591. while(cc2 < randend2) {
  592. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  593. return(exit_status);
  594. }
  595. cc2 = 0;
  596. while(vc < dz->wanted) {
  597. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  598. return(exit_status);
  599. }
  600. break;
  601. case(SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  602. while(cc2<randend2) {
  603. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  604. return(exit_status);
  605. }
  606. cc2 = 0;
  607. while(cc < randend) {
  608. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  609. return(exit_status);
  610. }
  611. cc = 0;
  612. while(vc < dz->wanted) {
  613. if((exit_status = do_afix_f(&cc,&cc2,&vc,dz))<0)
  614. return(exit_status);
  615. }
  616. break;
  617. default:
  618. sprintf(errstr,"Impossible order value %d: chorusing()\n",order);
  619. return(PROGRAM_ERROR);
  620. }
  621. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  622. break;
  623. case(A_VAR_F_FIX):
  624. vc = 0;
  625. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  626. switch(order) {
  627. case(BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER):
  628. while(cc<randend) {
  629. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  630. return(exit_status);
  631. }
  632. cc = cc2 = 0;
  633. while(vc < dz->wanted) {
  634. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  635. return(exit_status);
  636. }
  637. break;
  638. case(FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  639. while(cc<randend) {
  640. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  641. return(exit_status);
  642. }
  643. cc = 0;
  644. while(cc2 < randend2) {
  645. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  646. return(exit_status);
  647. }
  648. cc2 = 0;
  649. while(vc < dz->wanted) {
  650. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  651. return(exit_status);
  652. }
  653. break;
  654. case(SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  655. while(cc2<randend2) {
  656. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  657. return(exit_status);
  658. }
  659. cc2 = 0;
  660. while(cc < randend) {
  661. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  662. return(exit_status);
  663. }
  664. cc = 0;
  665. while(vc < dz->wanted) {
  666. if((exit_status = do_a_ffix(&cc,&cc2,&vc,dz))<0)
  667. return(exit_status);
  668. }
  669. break;
  670. default:
  671. sprintf(errstr,"Impossible (2) order value %d: chorusing()\n",order);
  672. return(PROGRAM_ERROR);
  673. }
  674. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  675. break;
  676. case(AF_VAR):
  677. vc = 0;
  678. memset((char *)dz->windowbuf[0],0,(size_t)(dz->wanted * sizeof(float)));
  679. switch(order) {
  680. case(BOTH_ACCESSES_OF_RANDTABLE_REACH_END_TOGETHER):
  681. while(cc<randend) {
  682. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  683. return(exit_status);
  684. }
  685. cc = cc2 = 0;
  686. while(vc < dz->wanted) {
  687. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  688. return(exit_status);
  689. }
  690. break;
  691. case(FIRST_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  692. while(cc<randend) {
  693. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  694. return(exit_status);
  695. }
  696. cc = 0;
  697. while(cc2 < randend2) {
  698. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  699. return(exit_status);
  700. }
  701. cc2 = 0;
  702. while(vc < dz->wanted) {
  703. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  704. return(exit_status);
  705. }
  706. break;
  707. case(SECOND_ACCESS_OF_RANDTABLE_REACHES_END_FIRST):
  708. while(cc2<randend2) {
  709. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  710. return(exit_status);
  711. }
  712. cc2 = 0;
  713. while(cc < randend) {
  714. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  715. return(exit_status);
  716. }
  717. cc = 0;
  718. while(vc < dz->wanted) {
  719. if((exit_status = do_a_f(&cc,&cc2,&vc,dz))<0)
  720. return(exit_status);
  721. }
  722. break;
  723. default:
  724. sprintf(errstr,"Impossible (3) order value %d: chorusing()\n",order);
  725. return(PROGRAM_ERROR);
  726. }
  727. memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
  728. break;
  729. default:
  730. sprintf(errstr,"Impossible sprtype value %d in chorusing()\n",dz->iparam[CHORU_SPRTYPE]);
  731. return(PROGRAM_ERROR);
  732. }
  733. return(FINISHED);
  734. }
  735. /******************************* DO_AFIX_FFIX *********************/
  736. int do_afix_ffix(int *cc,int *cc2,int *vc,dataptr dz)
  737. {
  738. int exit_status;
  739. dz->flbufptr[0][*vc] = (float)(dz->flbufptr[0][*vc] * dz->parray[CHORU_RTABA][*cc]);
  740. (*cc)++;
  741. (*vc)++;
  742. if((exit_status = getnewfrq_choru(*cc2,*vc,dz))<0)
  743. return(exit_status);
  744. (*cc2)++;
  745. (*vc)++;
  746. return(FINISHED); /* number in flbufptr[0] */
  747. }
  748. /*************************** DO_A ****************************/
  749. int do_a(int cc,int vc,int randend,dataptr dz)
  750. {
  751. while(cc < randend) {
  752. dz->flbufptr[0][vc] = (float)(pow(dz->param[CHORU_AMPR],dz->parray[CHORU_RTABA][cc]) * dz->flbufptr[0][vc]);
  753. cc++;
  754. vc += 2;
  755. }
  756. cc = 0;
  757. while(vc < dz->wanted) {
  758. dz->flbufptr[0][vc] = (float)(pow(dz->param[CHORU_AMPR],dz->parray[CHORU_RTABA][cc]) * dz->flbufptr[0][vc]);
  759. cc++;
  760. vc += 2;
  761. }
  762. return(FINISHED);
  763. }
  764. /***************************** DO_FVAR *****************************/
  765. int do_fvar(int cc,int vc,int randend,dataptr dz)
  766. {
  767. int exit_status;
  768. while(cc < randend) {
  769. if((exit_status = getnewfrq2_choru(cc,vc,dz))<0)
  770. return(exit_status);
  771. cc++;
  772. vc += 2;
  773. }
  774. cc = 0;
  775. while(vc < dz->wanted) {
  776. if((exit_status = getnewfrq2_choru(cc,vc,dz))<0)
  777. return(exit_status);
  778. cc++;
  779. vc += 2;
  780. }
  781. return(FINISHED);
  782. }
  783. /******************************* DO_AFIX_F *********************/
  784. int do_afix_f(int *cc,int *cc2,int *vc,dataptr dz)
  785. {
  786. int exit_status;
  787. dz->flbufptr[0][*vc] = (float)(dz->flbufptr[0][*vc] * dz->parray[CHORU_RTABA][*cc]);
  788. (*cc)++;
  789. (*vc)++;
  790. if((exit_status = getnewfrq2_choru(*cc2,*vc,dz))<0)
  791. return(exit_status);
  792. (*cc2)++;
  793. (*vc)++;
  794. return(FINISHED);
  795. }
  796. /************************* DO_A_FFIX ***************************/
  797. int do_a_ffix(int *cc,int *cc2,int *vc,dataptr dz)
  798. {
  799. int exit_status;
  800. dz->flbufptr[0][*vc] = (float)(dz->flbufptr[0][*vc] * pow(dz->param[CHORU_AMPR],dz->parray[CHORU_RTABA][*cc]));
  801. (*cc)++;
  802. (*vc)++;
  803. if((exit_status = getnewfrq_choru(*cc2,*vc,dz))<0)
  804. return(exit_status);
  805. (*cc2)++;
  806. (*vc)++;
  807. return(FINISHED);
  808. }
  809. /************************* DO_A_F ***************************/
  810. int do_a_f(int *cc,int *cc2,int *vc,dataptr dz)
  811. {
  812. int exit_status;
  813. dz->flbufptr[0][*vc] = (float)(dz->flbufptr[0][*vc] * pow(dz->param[CHORU_AMPR],dz->parray[CHORU_RTABA][*cc]));
  814. (*cc)++;
  815. (*vc)++;
  816. if((exit_status = getnewfrq_choru(*cc2,*vc,dz))<0)
  817. return(exit_status);
  818. (*cc2)++;
  819. (*vc)++;
  820. return(FINISHED);
  821. }
  822. /***************************** DO_AFIX *************************/
  823. int do_afix(int cc,int vc,int randend, dataptr dz)
  824. {
  825. while(cc < randend) {
  826. dz->flbufptr[0][vc] = (float)(dz->flbufptr[0][vc] * dz->parray[CHORU_RTABA][cc]);
  827. cc++;
  828. vc += 2;
  829. }
  830. cc = 0;
  831. while(vc < dz->wanted) {
  832. dz->flbufptr[0][vc] = (float)(dz->flbufptr[0][vc] * dz->parray[CHORU_RTABA][cc]);
  833. cc++;
  834. vc += 2;
  835. }
  836. return(FINISHED);
  837. }
  838. /*************************** DO_FFIX *************************/
  839. int do_ffix(int cc,int vc,int randend,dataptr dz)
  840. {
  841. int exit_status;
  842. while(cc < randend) {
  843. if((exit_status = getnewfrq_choru(cc,vc,dz))<0)
  844. return(exit_status);
  845. cc++;
  846. vc += 2;
  847. }
  848. cc = 0;
  849. while(vc < dz->wanted) {
  850. if((exit_status = getnewfrq_choru(cc,vc,dz))<0)
  851. return(exit_status);
  852. cc++;
  853. vc += 2;
  854. }
  855. return(FINISHED);
  856. }
  857. /************************* GETNEWFRQ_CHORU ****************************
  858. *
  859. * (1) If scatter takes frq > current chan, do the scatter downwards instead.
  860. * (1) If scatter takes frq < current chan, do the scatter upwards instead.
  861. * (3) Otherwise, keep originally calculated value.
  862. */
  863. int getnewfrq_choru(int cc,int vc,dataptr dz)
  864. {
  865. int exit_status;
  866. float amp;
  867. double newval;
  868. int new_chan;
  869. newval = dz->flbufptr[0][vc] * dz->parray[CHORU_RTABF][cc];
  870. if(newval > dz->nyquist || newval < dz->halfchwidth)
  871. return(FINISHED);
  872. if((exit_status = get_sbufposition_corresponding_to_frq(&new_chan,newval,dz))<0)
  873. return(exit_status);
  874. if((amp = dz->flbufptr[0][vc-1]) > dz->windowbuf[0][new_chan]) {
  875. dz->windowbuf[0][new_chan++] = amp;
  876. dz->windowbuf[0][new_chan] = (float)newval;
  877. }
  878. return(FINISHED);
  879. }
  880. /************************** GETNEWFRQ2_CHORU *************************/
  881. int getnewfrq2_choru(int cc,int vc,dataptr dz)
  882. {
  883. int exit_status;
  884. float amp;
  885. double newval, newscat = pow(dz->param[CHORU_FRQR],dz->parray[CHORU_RTABF][cc]);
  886. int new_vc;
  887. newval = dz->flbufptr[0][vc] * newscat;
  888. if(newval > dz->nyquist || newval < dz->halfchwidth)
  889. return(FINISHED);
  890. if((exit_status = get_sbufposition_corresponding_to_frq(&new_vc,newval,dz))<0)
  891. return(exit_status);
  892. if((amp = dz->flbufptr[0][vc-1]) > dz->windowbuf[0][new_vc]) {
  893. dz->windowbuf[0][new_vc++] = amp;
  894. dz->windowbuf[0][new_vc] = (float)newval;
  895. }
  896. return(FINISHED);
  897. }
  898. /****************************** GET_SBUFPOSITION_CORRESPONDING_TO_FRQ ****************************/
  899. int get_sbufposition_corresponding_to_frq(int *channo,double frq,dataptr dz)
  900. {
  901. frq += dz->halfchwidth;
  902. *channo = (int)(frq/dz->chwidth);/* TRUNCATE */ /* find channel number */
  903. *channo = min(dz->clength-1,max(0,*channo)); /* Outside range TRAP */
  904. (*channo) *= 2;
  905. return(FINISHED); /* number in flbufptr[0] */
  906. }
  907. /**************************** SPECNOISE ***************************/
  908. int specnoise(dataptr dz)
  909. {
  910. int exit_status;
  911. int vc;
  912. double totalamp;
  913. if((exit_status = get_totalamp(&totalamp,dz->flbufptr[0],dz->wanted))<0)
  914. return(exit_status);
  915. totalamp /= dz->clength;
  916. for(vc = 0; vc < dz->wanted; vc += 2)
  917. dz->flbufptr[0][vc] =
  918. (float)(((totalamp - dz->flbufptr[0][vc]) * dz->param[NOISE_NOIS]) + dz->flbufptr[0][vc]);
  919. return(FINISHED);
  920. }
  921. /****************************** SPECDRUNK ***************************/
  922. int specdrunk(dataptr dz)
  923. {
  924. int exit_status;
  925. int samps_read=0, step;
  926. float *inputbuf_end;
  927. int drnk_bufno = -1;
  928. dz->time = 0.0f;
  929. if((exit_status = advance_to_starttime(&inputbuf_end,&samps_read,&drnk_bufno,dz))<0)
  930. return(exit_status);
  931. dz->flbufptr[1] = dz->flbufptr[2];
  932. for(;;) {
  933. if((exit_status = copy_window_to_outbuf(dz))<0)
  934. return(exit_status);
  935. if((dz->time = (float)(dz->time + dz->frametime)) >= dz->param[DRNK_DUR])
  936. break;
  937. if((exit_status = get_randstep(&step,dz))<0)
  938. return(exit_status);
  939. dz->flbufptr[0] += step * dz->wanted;
  940. if(dz->flbufptr[0] < dz->bigfbuf || dz->flbufptr[0] >= inputbuf_end) {
  941. if((exit_status = adjust_buffers(&step,&inputbuf_end,&samps_read,&drnk_bufno,dz))<0)
  942. return(exit_status);
  943. }
  944. }
  945. if((exit_status = flush_outbuf(dz))<0)
  946. return(exit_status);
  947. return(FINISHED);
  948. }
  949. /****************************** ADVANCE_TO_STARTTIME ***************************/
  950. int advance_to_starttime(float **inputbuf_end,int *samps_read,int *drnk_bufno,dataptr dz)
  951. {
  952. int exit_status;
  953. double time_read = 0.0, previous_time_read = 0.0, time_in_buf;
  954. int startwindow_in_buf, w_to_buf;
  955. while(time_read <= dz->param[DRNK_STIME]) {
  956. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
  957. sprintf(errstr,"No data found in input analysis file.\n");
  958. return(SYSTEM_ERROR);
  959. }
  960. if(dz->ssampsread == 0) {
  961. sprintf(errstr,"No data found in input analysis file.\n");
  962. return(DATA_ERROR);
  963. }
  964. *samps_read = dz->ssampsread;
  965. (*drnk_bufno)++;
  966. w_to_buf = dz->ssampsread/dz->wanted;
  967. previous_time_read = time_read;
  968. time_read += (w_to_buf * dz->frametime);
  969. }
  970. *inputbuf_end = dz->bigfbuf + dz->ssampsread;
  971. time_in_buf = dz->param[DRNK_STIME] - previous_time_read;
  972. startwindow_in_buf = round(time_in_buf/dz->frametime);
  973. dz->flbufptr[0] = dz->bigfbuf + (startwindow_in_buf * dz->wanted);
  974. return(FINISHED);
  975. }
  976. /****************************** COPY_WINDOW_TO_OUTBUF ***************************/
  977. int copy_window_to_outbuf(dataptr dz)
  978. {
  979. int exit_status;
  980. int vc;
  981. for(vc = 0; vc < dz->wanted; vc++)
  982. dz->flbufptr[1][vc] = dz->flbufptr[0][vc];
  983. if((dz->flbufptr[1] += dz->wanted) >= dz->flbufptr[3]) {
  984. if((exit_status = write_exact_samps(dz->flbufptr[2],dz->buflen,dz))<0)
  985. return(exit_status);
  986. dz->flbufptr[1] = dz->flbufptr[2];
  987. }
  988. return(FINISHED);
  989. }
  990. /****************************** GET_RANDSTEP ***************************/
  991. int get_randstep(int *step,dataptr dz)
  992. {
  993. switch(dz->vflag[DRNK_NO_ZEROSTEPS]) {
  994. case(FALSE):
  995. *step = (int)(drand48() * dz->iparam[DRNK_TWICERANGE]); /* TRUNCATE */
  996. *step -= dz->iparam[DRNK_RANGE];
  997. break;
  998. case(TRUE):
  999. do {
  1000. *step = (int)(drand48() * dz->iparam[DRNK_TWICERANGE]); /* TRUNCATE */
  1001. *step -= dz->iparam[DRNK_RANGE];
  1002. } while(*step==0);
  1003. break;
  1004. default:
  1005. sprintf(errstr,"unknown case in get_randstep()\n");
  1006. return(PROGRAM_ERROR);
  1007. }
  1008. return(FINISHED);
  1009. }
  1010. /****************************** ADJUST_BUFFERS ***********************/
  1011. int adjust_buffers(int *step,float **inputbuf_end,int *samps_read,int *drnk_bufno, dataptr dz)
  1012. {
  1013. //TW UPDATED
  1014. int exit_status;
  1015. int bigbufs_baktrak = 0;
  1016. int baksamps, total_samps_read, seektest;
  1017. int reflect_off_start = FALSE, reflect_off_end = FALSE;
  1018. if(*drnk_bufno < 0) {
  1019. sprintf(errstr,"ADJUST_BUFFERS START bufno = %d (less than zero)\n",*drnk_bufno);
  1020. return(PROGRAM_ERROR);
  1021. }
  1022. do {
  1023. if(dz->flbufptr[0] < dz->bigfbuf) { /* IF OFF START OF BUFFER */
  1024. if(*drnk_bufno == 0) { /* IF OFF START OF FILE */
  1025. if((exit_status = invert_step_back_to_step_fwd_at_start_of_file(step,reflect_off_end,dz))<0)
  1026. return(exit_status);
  1027. reflect_off_start = TRUE;
  1028. } else { /* ELSE NOT OFF START OF FILE */
  1029. if((exit_status = place_sbufptr_in_bigbuf_range(&bigbufs_baktrak,dz))<0)
  1030. return(exit_status);
  1031. baksamps = (bigbufs_baktrak * dz->buflen) + *samps_read;
  1032. if((seektest = sndseekEx(dz->ifd[0],-baksamps,1)) <= 0) { /* IF FELL OF FILE START */
  1033. if(seektest<0) {
  1034. sprintf(errstr,"sndseekEx() failed.\n");
  1035. return(SYSTEM_ERROR);
  1036. }
  1037. if((exit_status = invert_step_back_to_step_fwd
  1038. (step,dz->flbufptr[0],samps_read,inputbuf_end,reflect_off_end,*drnk_bufno,dz))<0)
  1039. return(exit_status);
  1040. reflect_off_start = TRUE;
  1041. } else {
  1042. if((exit_status = baktrak_to_correct_bigbuf(bigbufs_baktrak,samps_read,inputbuf_end,drnk_bufno,dz))<0)
  1043. return(exit_status);
  1044. reflect_off_start = FALSE;
  1045. }
  1046. }
  1047. } else
  1048. reflect_off_start = FALSE;
  1049. total_samps_read = min(dz->insams[0],(*drnk_bufno+1) * dz->buflen);
  1050. if(dz->flbufptr[0] >= *inputbuf_end) { /* IF OFF END OF BUFFER */
  1051. if(total_samps_read >= dz->insams[0]) { /* IF OFF END OF FILE */
  1052. if((exit_status = invert_step_fwd_to_step_back_at_end_of_file(step,reflect_off_start,*drnk_bufno,dz))<0)
  1053. return(exit_status);
  1054. reflect_off_end = TRUE;
  1055. } else { /* ELSE NOT END OF FILE */
  1056. if((exit_status = advance_to_correct_bigbuf(inputbuf_end,samps_read,drnk_bufno,dz))<0)
  1057. return(exit_status);
  1058. if(dz->flbufptr[0] >= *inputbuf_end) { /* IF FELL OFF END OF FILE */
  1059. if((exit_status = invert_step_fwd_to_step_back
  1060. (step,dz->flbufptr[0],samps_read,inputbuf_end,reflect_off_start,*drnk_bufno,dz))<0)
  1061. return(exit_status);
  1062. reflect_off_end = TRUE;
  1063. } else
  1064. reflect_off_end = FALSE;
  1065. }
  1066. } else
  1067. reflect_off_end = FALSE;
  1068. } while(reflect_off_end);
  1069. if(*drnk_bufno < 0) {
  1070. sprintf(errstr,"ADJUST_BUFFERS END bufno = %d (less than zero)\n",*drnk_bufno);
  1071. return(PROGRAM_ERROR);
  1072. }
  1073. return(FINISHED);
  1074. }
  1075. /****************************** FLUSH_OUTBUF ***************************/
  1076. int flush_outbuf(dataptr dz)
  1077. {
  1078. int exit_status;
  1079. int samps_to_write;
  1080. if(dz->flbufptr[1] != dz->flbufptr[2]) {
  1081. samps_to_write = dz->flbufptr[1] - dz->flbufptr[2];
  1082. if((exit_status = (int) write_samps(dz->flbufptr[2],samps_to_write,dz))<0)
  1083. return(exit_status);
  1084. }
  1085. return(FINISHED);
  1086. }
  1087. /****************************** INVERT_STEP_BACK_TO_STEP_FWD_AT_START_OF_FILE ***********************/
  1088. int invert_step_back_to_step_fwd_at_start_of_file(int *step,int reflect_off_end,dataptr dz)
  1089. {
  1090. if(reflect_off_end) {
  1091. sprintf(errstr,"Step turned out to be too large.\n");
  1092. return(DATA_ERROR);
  1093. }
  1094. *step = -(*step); /* REFLECT FROM START OF FILE */
  1095. dz->flbufptr[0] += (*step) * 2 * dz->wanted;
  1096. return(FINISHED);
  1097. }
  1098. /****************************** PLACE_SBUFPTR_IN_BIGBUF_RANGE ***********************/
  1099. int place_sbufptr_in_bigbuf_range(int *bigbufs_baktrak,dataptr dz)
  1100. {
  1101. while(dz->flbufptr[0] < dz->bigfbuf) { /* GO BACK THROUGH BUFS */
  1102. dz->flbufptr[0] += dz->big_fsize;
  1103. (*bigbufs_baktrak)++;
  1104. }
  1105. return(FINISHED);
  1106. }
  1107. /****************************** INVERT_STEP_BACK_TO_STEP_FWD ***********************/
  1108. int invert_step_back_to_step_fwd
  1109. (int *step,float *orig_sbuf,int *samps_read,float **inputbuf_end, int reflect_off_end,int drnk_bufno,dataptr dz)
  1110. {
  1111. int exit_status;
  1112. if(reflect_off_end) {
  1113. sprintf(errstr,"Step turned out ot be too large.\n");
  1114. return(DATA_ERROR);
  1115. }
  1116. if(sndseekEx(dz->ifd[0],drnk_bufno * dz->buflen,0)<0) {
  1117. sprintf(errstr,"Seek problem in invert_step_back_to_step_fwd().\n");
  1118. return(SYSTEM_ERROR);
  1119. }
  1120. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
  1121. sprintf(errstr,"Problem reading buffer:in invert_step_back_to_step_fwd().\n");
  1122. return(SYSTEM_ERROR);
  1123. }
  1124. if(dz->ssampsread == 0) {
  1125. sprintf(errstr,"Problem reading buffer:in invert_step_back_to_step_fwd().\n");
  1126. return(DATA_ERROR);
  1127. }
  1128. *samps_read = dz->ssampsread;
  1129. *inputbuf_end = dz->bigfbuf + dz->ssampsread;
  1130. *step = -(*step); /* REVERSE STEP */
  1131. dz->flbufptr[0] = orig_sbuf + ((*step) * 2 * dz->wanted);
  1132. return(FINISHED);
  1133. }
  1134. /****************************** BAKTRAK_TO_CORRECT_BIGBUF ***********************/
  1135. int baktrak_to_correct_bigbuf(int bigbufs_baktrak,int *samps_read,float **inputbuf_end,int *drnk_bufno,dataptr dz)
  1136. {
  1137. int exit_status;
  1138. *drnk_bufno -= bigbufs_baktrak;
  1139. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
  1140. sprintf(errstr,"Problem reading buffer in baktrak_to_correct_bigbuf().\n");
  1141. return(SYSTEM_ERROR);
  1142. }
  1143. if(dz->ssampsread == 0) {
  1144. sprintf(errstr,"Problem reading buffer in baktrak_to_correct_bigbuf().\n");
  1145. return(DATA_ERROR);
  1146. }
  1147. *samps_read = dz->ssampsread;
  1148. *inputbuf_end = dz->bigfbuf + dz->ssampsread;
  1149. return(FINISHED);
  1150. }
  1151. /****************************** INVERT_STEP_FWD_TO_STEP_BACK_AT_END_OF_FILE ***********************/
  1152. int invert_step_fwd_to_step_back_at_end_of_file(int *step,int reflect_off_start,int drnk_bufno,dataptr dz)
  1153. {
  1154. if(reflect_off_start) { /* IF OFF END OF FILE */
  1155. sprintf(errstr,"Step turned out ot be too large.\n");
  1156. return(DATA_ERROR); /* REFLECTED FROM BOTH ENDS !! */
  1157. }
  1158. *step = -(*step); /* REFLECT FROM END OF FILE */
  1159. dz->flbufptr[0] += (*step) * 2 * dz->wanted;
  1160. if(dz->flbufptr[0] < dz->bigfbuf && drnk_bufno == 0) {
  1161. sprintf(errstr,"Step turned out ot be too large.\n");
  1162. return(DATA_ERROR); /* REFLECTED FROM BOTH ENDS !! */
  1163. }
  1164. return(FINISHED);
  1165. }
  1166. /****************************** ADVANCE_TO_CORRECT_BIGBUF ***********************/
  1167. int advance_to_correct_bigbuf(float **inputbuf_end,int *samps_read,int *drnk_bufno,dataptr dz)
  1168. {
  1169. int exit_status;
  1170. if(*drnk_bufno < 0) {
  1171. sprintf(errstr,"advance_to_correct_bigbuf: drnk_bufno = %d (less than zero)\n",*drnk_bufno);
  1172. return(PROGRAM_ERROR);
  1173. }
  1174. while(dz->flbufptr[0] >= *inputbuf_end) { /* ADVANCE ALONG FILE */
  1175. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0)
  1176. return(exit_status);
  1177. *samps_read = dz->ssampsread;
  1178. if(dz->ssampsread == 0)
  1179. break;
  1180. *inputbuf_end = dz->bigfbuf + dz->ssampsread;
  1181. (*drnk_bufno)++;
  1182. dz->flbufptr[0] -= dz->big_fsize;
  1183. }
  1184. return(FINISHED);
  1185. }
  1186. /****************************** INVERT_STEP_FWD_TO_STEP_BACK ***********************/
  1187. int invert_step_fwd_to_step_back
  1188. (int *step,float *orig_sbuf,int *samps_read,float **inputbuf_end,int reflect_off_start,int drnk_bufno,dataptr dz)
  1189. {
  1190. int exit_status;
  1191. if(reflect_off_start) {
  1192. sprintf(errstr,"Step turned out ot be too large.\n");
  1193. return(DATA_ERROR); /* REFLECTED FROM BOTH ENDS!! */
  1194. }
  1195. if(sndseekEx(dz->ifd[0],drnk_bufno * dz->buflen,0)<0) {
  1196. sprintf(errstr,"Seek problem in invert_step_fwd_to_step_back().\n");
  1197. return(SYSTEM_ERROR);
  1198. }
  1199. if((exit_status = read_samps(dz->bigfbuf,dz)) < 0) {
  1200. sprintf(errstr,"Problem reading buffer in invert_step_fwd_to_step_back().\n");
  1201. return exit_status;
  1202. }
  1203. if(dz->ssampsread == 0) {
  1204. sprintf(errstr,"Problem reading buffer in invert_step_fwd_to_step_back().\n");
  1205. return(PROGRAM_ERROR);
  1206. }
  1207. *samps_read = dz->ssampsread;
  1208. *inputbuf_end = dz->bigfbuf + dz->ssampsread;
  1209. *step = -(*step); /* REVERSE STEP */
  1210. dz->flbufptr[0] = orig_sbuf + ((*step) * 2 * dz->wanted);
  1211. return(FINISHED);
  1212. }
  1213. /****************************** SPECWEAVE ***************************/
  1214. int specweave(dataptr dz)
  1215. {
  1216. int exit_status;
  1217. int vc;
  1218. int samps_to_write, n = 0;
  1219. float *insbuf = dz->flbufptr[0];
  1220. float *outsbuf = dz->flbufptr[2];
  1221. unsigned int wrapsamps = dz->iparam[WEAVE_BAKTRAK] * dz->wanted;
  1222. if((exit_status = read_first_inbuf(dz))<0)
  1223. return(exit_status);
  1224. for(;;) {
  1225. for(vc = 0; vc < dz->wanted; vc++)
  1226. outsbuf[vc] = insbuf[vc];
  1227. insbuf += dz->iparray[WEAVE_WEAV][n] * dz->wanted;
  1228. if(insbuf < dz->bigfbuf) {
  1229. sprintf(errstr,"Backtracking failure in specweave().\n");
  1230. return(PROGRAM_ERROR);
  1231. }
  1232. if(insbuf >= dz->flbufptr[1]) {
  1233. if((exit_status = wrap_samps(wrapsamps,&insbuf,dz))<0)
  1234. return(exit_status);
  1235. if(exit_status == FINISHED) {
  1236. outsbuf += dz->wanted;
  1237. break;
  1238. }
  1239. }
  1240. if(++n>=dz->itemcnt)
  1241. n = 0;
  1242. if((outsbuf += dz->wanted)>= dz->flbufptr[3]) { /* outbuf full */
  1243. if((exit_status = write_exact_samps(dz->flbufptr[2],dz->buflen,dz))<0)
  1244. return(exit_status);
  1245. outsbuf = dz->flbufptr[2];
  1246. }
  1247. }
  1248. if(outsbuf != dz->flbufptr[2]) {
  1249. samps_to_write = outsbuf - dz->flbufptr[2];
  1250. if((exit_status = write_samps(dz->flbufptr[2],samps_to_write,dz))<0)
  1251. return(exit_status);
  1252. }
  1253. return(FINISHED);
  1254. }
  1255. /****************************** READ_FIRST_INBUF ***************************/
  1256. int read_first_inbuf(dataptr dz)
  1257. {
  1258. int exit_status;
  1259. if((exit_status = read_samps(dz->flbufptr[0],dz)) < 0) {
  1260. sprintf(errstr,"Failed to read data from infile.\n");
  1261. return(exit_status);
  1262. }
  1263. dz->flbufptr[1] = dz->flbufptr[0] + dz->ssampsread; /* mark current end of inbuf */
  1264. return(FINISHED);
  1265. }
  1266. /****************************** WRAP_SAMPS ***************************/
  1267. int wrap_samps(unsigned int wrapsamps,float **insbuf,dataptr dz)
  1268. {
  1269. int exit_status;
  1270. memmove((char *)dz->bigfbuf,(char *)dz->flbufptr[4],(size_t)(wrapsamps * sizeof(float)));
  1271. if((exit_status = read_samps(dz->flbufptr[0],dz)) < 0)
  1272. return exit_status;
  1273. if(dz->ssampsread == 0)
  1274. return(FINISHED); /* no more data in infile */
  1275. dz->flbufptr[1] = dz->flbufptr[0] + dz->ssampsread; /* mark current end of inbuf */
  1276. if((*insbuf -= dz->big_fsize) >= dz->flbufptr[1])/* must have weaved off end of infile */
  1277. return(FINISHED);
  1278. return(CONTINUE);
  1279. }
  1280. /*************************** COPY_1ST_WINDOW ***********************/
  1281. int copy_1st_window(dataptr dz)
  1282. {
  1283. memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(dz->wanted * sizeof(float)));
  1284. dz->flbufptr[0] += dz->wanted;
  1285. dz->flbufptr[1] += dz->wanted;
  1286. return(FINISHED);
  1287. }