iterate.c 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* floatsam version */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <structures.h>
  26. #include <tkglobals.h>
  27. #include <globcon.h>
  28. #include <processno.h>
  29. #include <modeno.h>
  30. #include <arrays.h>
  31. #include <extend.h>
  32. #include <cdpmain.h>
  33. #include <sfsys.h>
  34. #include <osbind.h>
  35. #include <limits.h>
  36. //#ifdef unix
  37. #define round(x) lround((x))
  38. //#endif
  39. static int read_the_input_snd(dataptr dz);
  40. static int new_read_the_input_snd(int samplen,int wrap,dataptr dz);
  41. static void scale_input(dataptr dz);
  42. static int get_next_writestart(int write_start,dataptr dz);
  43. //TW UPDATED ALL THESE FUNCTIONS
  44. //HAVE DONE FLOAT CONVERSIONS HERE
  45. static int iterate(int cnt,int pass,double *gain,double *pshift,
  46. int write_end,int local_write_start,int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz);
  47. static int iter(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz);
  48. static int iter_stereo(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz);
  49. static int iter_shift_interp(int cnt,int passno, double *gain,double *pshift,int local_write_start,int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz);
  50. static int iter_shift_interp_stereo(int cnt,int passno, double *gain,double *pshift,int local_write_start,int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz);
  51. static int fixa_iter(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz);
  52. static int fixa_iter_stereo(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz);
  53. static int fixa_iter_shift_interp(int cnt,int passno,double *gain,double *pshift,int local_write_start,int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz);
  54. static int fixa_iter_shift_interp_stereo(int cnt,int passno,double *gain,double *pshift,int local_write_start,int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz);
  55. static int new_iterate(int cnt,int pass,double *gain,double *pshift,
  56. int write_end,int local_write_start,int inmsampsize,double level,int pstep,int iterating,dataptr dz);
  57. static int new_iter(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz);
  58. static int new_iter_stereo(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz);
  59. static int new_iter_shift_interp(int cnt,int passno, double *gain,double *pshift,int local_write_start,int inmsampsize,double level,int pstep,int iterating,dataptr dz);
  60. static int new_iter_shift_interp_stereo(int cnt,int passno, double *gain,double *pshift,int local_write_start,int inmsampsize,double level,int pstep,int iterating,dataptr dz);
  61. static int new_fixa_iter(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz);
  62. static int new_fixa_iter_stereo(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz);
  63. static int new_fixa_iter_shift_interp(int cnt,int passno,double *gain,double *pshift,int local_write_start,int inmsampsize,double level,int pstep,int iterating,dataptr dz);
  64. static int new_fixa_iter_shift_interp_stereo(int cnt,int passno,double *gain,double *pshift,int local_write_start,int inmsampsize,double level,int pstep,int iterating,dataptr dz);
  65. static double get_gain(dataptr dz);
  66. static double get_pshift(dataptr dz);
  67. static void do_endsplice(float *buf,int dur,int splicelen,double spliceincr,int chans);
  68. static int do_iteration_extend(dataptr dz);
  69. /****************************** DO_ITERATION *************************
  70. *
  71. * (1) First event is always copy of original.
  72. */
  73. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  74. #define ACCEPTABLE_LEVEL 0.75
  75. int do_iteration(dataptr dz)
  76. {
  77. int exit_status, iterating;
  78. int write_end, tail, cnt, arraysize = BIGARRAY;
  79. float *tailend;
  80. int bufs_written, finished;
  81. double level, thistime;
  82. int out_sampdur = 0, inmsampsize;
  83. int write_start, local_write_start;
  84. double one_over_sr = 1.0/(double)dz->infile->srate, maxsamp = 0.0;
  85. int passno, is_penult = 0, pstep;
  86. int k;
  87. double *gain, *pshift, gaingain = -1.0;
  88. int *wstart /*, chunkmsamps = 0, chunksampsize = 0 */ ;
  89. float *orig_inbuf = dz->sampbuf[0];
  90. if(dz->process == ITERATE_EXTEND)
  91. return do_iteration_extend(dz);
  92. pstep = ITER_STEP;
  93. iterating = 1;
  94. if ((gain = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  95. sprintf(errstr,"Insufficient memory to store gain values\n");
  96. return(MEMORY_ERROR);
  97. }
  98. if ((pshift = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  99. sprintf(errstr,"Insufficient memory to store pitch shift values\n");
  100. return(MEMORY_ERROR);
  101. }
  102. if ((wstart = (int *)malloc(arraysize * sizeof(int)))==NULL) {
  103. sprintf(errstr,"Insufficient memory to store pitch shift values\n");
  104. return(MEMORY_ERROR);
  105. }
  106. /*
  107. if(dz->process == ITERATE_EXTEND) {
  108. chunksampsize = dz->iparam[CHUNKEND] - dz->iparam[CHUNKSTART];
  109. chunkmsamps = chunksampsize/dz->infile->channels;
  110. }
  111. */
  112. if(dz->mode==ITERATE_DUR)
  113. out_sampdur = round(dz->param[ITER_DUR] * (double)dz->infile->srate) * dz->infile->channels;
  114. if(sloom) {
  115. switch(dz->mode) {
  116. case(ITERATE_DUR):
  117. dz->tempsize = out_sampdur;
  118. break;
  119. case(ITERATE_REPEATS):
  120. dz->tempsize = dz->insams[0] * (dz->iparam[ITER_REPEATS]+1); /* approx */
  121. break;
  122. }
  123. }
  124. for(passno=0;passno<2;passno++) {
  125. is_penult = 0;
  126. cnt = 0;
  127. bufs_written = 0;
  128. write_start = 0;
  129. maxsamp = 0.0;
  130. memset((char *)dz->sampbuf[1],0,dz->buflen * sizeof(float));
  131. level = dz->param[ITER_FADE];
  132. sndseekEx(dz->ifd[0],0L,0);
  133. display_virtual_time(0L,dz);
  134. fflush(stdout);
  135. dz->sampbuf[0] = orig_inbuf;
  136. if(passno > 0) {
  137. print_outmessage_flush("Second pass, for greater level\n");
  138. dz->tempsize = dz->total_samps_written;
  139. dz->total_samps_written = 0;
  140. memset((char *)dz->sampbuf[0],0,(dz->sampbuf[3] - dz->sampbuf[0]) * sizeof(float));
  141. }
  142. if((exit_status = read_the_input_snd(dz))<0)
  143. return(exit_status);
  144. if(dz->iparam[ITER_DO_SCALE])
  145. scale_input(dz);
  146. inmsampsize = dz->insams[0]/dz->infile->channels; /* no. of 'stereo'-samps to process */
  147. /* 1 */
  148. local_write_start = 0;
  149. switch(dz->iparam[ITER_PROCESS]) {
  150. case(MONO):
  151. iter(0,passno,gain,local_write_start,inmsampsize,level,&maxsamp,iterating,dz);
  152. break;
  153. case(STEREO):
  154. iter_stereo(0,passno,gain,local_write_start,inmsampsize,level,&maxsamp,iterating,dz);
  155. break;
  156. case(MN_INTP_SHIFT):
  157. iter_shift_interp(0,passno,gain,pshift,local_write_start,inmsampsize,level,&maxsamp,pstep,iterating,dz);
  158. break;
  159. case(ST_INTP_SHIFT):
  160. iter_shift_interp_stereo(0,passno,gain,pshift,local_write_start,inmsampsize,level,&maxsamp,pstep,iterating,dz);
  161. break;
  162. case(FIXA_MONO):
  163. fixa_iter(0,passno,gain,local_write_start,inmsampsize,level,&maxsamp,iterating,dz);
  164. break;
  165. case(FIXA_STEREO):
  166. fixa_iter_stereo(0,passno,gain,local_write_start,inmsampsize,level,&maxsamp,iterating,dz);
  167. break;
  168. case(FIXA_MN_INTP_SHIFT):
  169. fixa_iter_shift_interp(0,passno,gain,pshift,local_write_start,inmsampsize,level,&maxsamp,pstep,iterating,dz);
  170. break;
  171. case(FIXA_ST_INTP_SHIFT):
  172. fixa_iter_shift_interp_stereo(0,passno,gain,pshift,local_write_start,inmsampsize,level,&maxsamp,pstep,iterating,dz);
  173. break;
  174. }
  175. write_end = dz->insams[0];
  176. thistime = 0.0;
  177. if((exit_status = read_values_from_all_existing_brktables(thistime,dz))<0)
  178. return(exit_status);
  179. if(dz->brksize[ITER_DELAY])
  180. dz->iparam[ITER_MSAMPDEL] = round(dz->param[ITER_DELAY] * (double)dz->infile->srate);
  181. if(passno==0)
  182. wstart[cnt] = get_next_writestart(write_start,dz);
  183. write_start = wstart[cnt];
  184. local_write_start = write_start;
  185. finished = FALSE;
  186. for(;;) {
  187. switch(dz->mode) {
  188. case(ITERATE_DUR):
  189. if(write_start >= out_sampdur)
  190. finished = TRUE;
  191. break;
  192. case(ITERATE_REPEATS):
  193. if(cnt >= dz->iparam[ITER_REPEATS])
  194. finished = TRUE;
  195. break;
  196. }
  197. if(finished)
  198. break;
  199. while(local_write_start >= dz->buflen) {
  200. if(passno > 0) {
  201. if((exit_status = write_samps(dz->sampbuf[1],dz->buflen,dz))<0)
  202. return(exit_status);
  203. }
  204. bufs_written++;
  205. tail = write_end - dz->buflen;
  206. memset((char *)dz->sampbuf[1],0,dz->buflen * sizeof(float));
  207. if(tail > 0) {
  208. memmove((char *)dz->sampbuf[1],(char *)dz->sampbuf[2],tail * sizeof(float));
  209. tailend = dz->sampbuf[1] + tail;
  210. } else
  211. tailend = dz->sampbuf[2];
  212. memset((char *)tailend,0,(dz->sampbuf[3] - tailend) * sizeof(float));
  213. local_write_start -= dz->buflen;
  214. write_end -= dz->buflen;
  215. }
  216. cnt++;
  217. if((passno == 0) && (cnt >= arraysize)) {
  218. arraysize += BIGARRAY;
  219. if ((gain = (double *)realloc((char *)gain,arraysize * sizeof(double)))==NULL) {
  220. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  221. return(MEMORY_ERROR);
  222. }
  223. if ((pshift = (double *)realloc((char *)pshift,arraysize * sizeof(double)))==NULL) {
  224. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  225. return(MEMORY_ERROR);
  226. }
  227. if ((wstart = (int *)realloc((char *)wstart,arraysize * sizeof(int)))==NULL) {
  228. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  229. return(MEMORY_ERROR);
  230. }
  231. }
  232. thistime = ((dz->buflen * bufs_written) + local_write_start) * one_over_sr;
  233. if((exit_status = read_values_from_all_existing_brktables(thistime,dz))<0)
  234. return(exit_status);
  235. if(is_penult) {
  236. dz->param[ITER_PSCAT] = 0.0;
  237. dz->param[ITER_ASCAT] = 0.0;
  238. }
  239. if(dz->brksize[ITER_DELAY])
  240. dz->iparam[ITER_MSAMPDEL] = round(dz->param[ITER_DELAY] * (double)dz->infile->srate);
  241. write_end = iterate(cnt,passno,gain,pshift,write_end,local_write_start,inmsampsize,level,&maxsamp,pstep,iterating,dz);
  242. level *= dz->param[ITER_FADE];
  243. if(passno==0)
  244. wstart[cnt] = get_next_writestart(write_start,dz);
  245. write_start = wstart[cnt];
  246. local_write_start = write_start - (bufs_written * dz->buflen);
  247. }
  248. if(passno > 0) {
  249. if(write_end > 0) {
  250. if((exit_status = write_samps(dz->sampbuf[1],write_end,dz))<0)
  251. return(exit_status);
  252. }
  253. } else {
  254. if(maxsamp <= 0.0) {
  255. sprintf(errstr,"No significant signal level found");
  256. return(DATA_ERROR);
  257. }
  258. if(maxsamp < ACCEPTABLE_LEVEL || maxsamp > 0.99)
  259. gaingain = ACCEPTABLE_LEVEL/maxsamp;
  260. else
  261. gaingain = 1.0;
  262. switch(dz->iparam[ITER_PROCESS]) {
  263. case(MONO):
  264. case(STEREO):
  265. case(MN_INTP_SHIFT):
  266. case(ST_INTP_SHIFT):
  267. for(k=0;k<=cnt;k++)
  268. gain[k] *= gaingain;
  269. break;
  270. case(FIXA_MONO):
  271. case(FIXA_STEREO):
  272. case(FIXA_MN_INTP_SHIFT):
  273. case(FIXA_ST_INTP_SHIFT):
  274. for(k=0;k<=cnt;k++)
  275. gain[k] = gaingain;
  276. break;
  277. }
  278. }
  279. }
  280. return FINISHED;
  281. }
  282. /****************************** DO_ITERATION_EXTEND **************************/
  283. //2012 TW COMPLETELY UPDATED FUNCTION : (Better iterate-extend)
  284. int do_iteration_extend(dataptr dz)
  285. {
  286. int exit_status, iterating;
  287. int write_end, tail, cnt, arraysize = BIGARRAY, remnant = 0;
  288. float *tailend;
  289. int bufs_written, finished, units = 0;
  290. int twoseccnt = dz->infile->srate * 2;
  291. double level, thistime, localmax=0.0;
  292. int out_sampdur = 0, inmsampsize;
  293. int write_start, local_write_start;
  294. double srate = (double)dz->infile->srate, one_over_sr = 1.0/srate, maxsamp = 0.0;
  295. int passno, is_penult = 0, pstep;
  296. int k, orig_sampdel = 0, ii, jj, kk, n;
  297. double *gain, *pshift, gaingain = -1.0;
  298. int *wstart, /* chunkmsamps = 0, */ chunksampsize = 0;
  299. int splicelen = ITX_SPLICELEN;
  300. double spliceincr = 1.0/(double)ITX_SPLICELEN, splicer;
  301. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *ovflw = dz->sampbuf[2], *chunkbuf = dz->sampbuf[3];
  302. int chans = dz->infile->channels;
  303. pstep = ITER_SSTEP;
  304. iterating = 0;
  305. if ((gain = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  306. sprintf(errstr,"Insufficient memory to store gain values\n");
  307. return(MEMORY_ERROR);
  308. }
  309. if ((pshift = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  310. sprintf(errstr,"Insufficient memory to store pitch shift values\n");
  311. return(MEMORY_ERROR);
  312. }
  313. if ((wstart = (int *)malloc(arraysize * sizeof(int)))==NULL) {
  314. sprintf(errstr,"Insufficient memory to store pitch shift values\n");
  315. return(MEMORY_ERROR);
  316. }
  317. chunksampsize = dz->iparam[CHUNKEND] - dz->iparam[CHUNKSTART];
  318. /* chunkmsamps = chunksampsize/chans; */
  319. if(dz->mode==ITERATE_DUR)
  320. out_sampdur = round(dz->param[ITER_DUR] * srate) * chans;
  321. if(sloom) {
  322. switch(dz->mode) {
  323. case(ITERATE_DUR):
  324. dz->tempsize = out_sampdur;
  325. break;
  326. case(ITERATE_REPEATS):
  327. dz->tempsize = dz->insams[0] + (chunksampsize * dz->iparam[ITER_REPEATS]); /* approx */
  328. break;
  329. }
  330. }
  331. if(dz->mode == ITERATE_DUR)
  332. out_sampdur -= dz->insams[0] - dz->iparam[CHUNKEND];
  333. for(passno=0;passno<2;passno++) {
  334. is_penult = 0;
  335. cnt = 0;
  336. bufs_written = 0;
  337. write_start = 0;
  338. maxsamp = 0.0;
  339. memset((char *)obuf,0,dz->buflen * sizeof(float));
  340. level = 1.0;
  341. localmax = 0.0;
  342. if(passno > 0) {
  343. print_outmessage_flush("Second pass, for correct level\n");
  344. memset((char *)ibuf,0,(chunkbuf - ibuf) * sizeof(float));
  345. }
  346. sndseekEx(dz->ifd[0],0L,0);
  347. reset_filedata_counters(dz);
  348. display_virtual_time(0L,dz);
  349. fflush(stdout);
  350. if(passno == 0) {
  351. sndseekEx(dz->ifd[0],dz->iparam[CHUNKSTART],0);
  352. dz->total_samps_read = dz->iparam[CHUNKSTART];
  353. dz->samps_left = dz->insams[0] - dz->total_samps_read;
  354. dz->total_samps_written = dz->iparam[CHUNKSTART]; //For accountancy for local_write_start
  355. /* Make bakup copy of chunk to iterate, with splice at start */
  356. if((exit_status = new_read_the_input_snd(dz->buflen,0,dz))<0)
  357. return(exit_status);
  358. for(jj = 0; jj < chunksampsize;jj++)
  359. localmax = max(localmax,fabs(ibuf[jj]));
  360. if(localmax <= 0.0) {
  361. sprintf(errstr,"No significant signal found in frozen segment");
  362. return(DATA_ERROR);
  363. }
  364. memcpy((char *)chunkbuf,(char *)ibuf,(chunksampsize * sizeof(float)));
  365. jj = 0;
  366. splicer = 0.0;
  367. for(kk = 0; kk < splicelen; kk++) {
  368. for(ii=0; ii <chans;ii++) {
  369. chunkbuf[jj] = (float)(chunkbuf[jj] * splicer);
  370. jj++;
  371. }
  372. splicer += spliceincr;
  373. }
  374. } else {
  375. if(dz->iparam[CHUNKSTART] == 0) {
  376. if((exit_status = new_read_the_input_snd(chunksampsize,1,dz))<0)
  377. return(exit_status);
  378. } else {
  379. while(dz->total_samps_read < dz->iparam[CHUNKSTART]) {
  380. if((exit_status = new_read_the_input_snd(dz->buflen,0,dz))<0)
  381. return(exit_status);
  382. if(dz->total_samps_read < dz->iparam[CHUNKSTART]) {
  383. for(ii =0; ii < dz->buflen;ii++)
  384. ibuf[ii] = (float)(ibuf[ii] * gaingain);
  385. if((exit_status = write_samps(ibuf,dz->buflen,dz))<0)
  386. return(exit_status);
  387. write_end = dz->total_samps_written;
  388. } else {
  389. remnant = dz->iparam[CHUNKSTART] - (dz->total_samps_read - dz->ssampsread);
  390. if(remnant > 0) {
  391. for(ii =0; ii < remnant;ii++)
  392. ibuf[ii] = (float)(ibuf[ii] * gaingain);
  393. if((exit_status = write_samps(ibuf,remnant,dz))<0)
  394. return(exit_status);
  395. }
  396. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  397. write_end = dz->total_samps_written;
  398. sndseekEx(dz->ifd[0],dz->iparam[CHUNKSTART],0);
  399. dz->total_samps_read = dz->iparam[CHUNKSTART];
  400. dz->samps_left = dz->insams[0] - dz->total_samps_read;
  401. if((exit_status = new_read_the_input_snd(chunksampsize,1,dz))<0)
  402. return(exit_status);
  403. }
  404. }
  405. }
  406. }
  407. /*Put splice on END of iterated chunk in TRUE buffer */
  408. jj = chunksampsize + chans - 1;
  409. for(ii=0; ii <chans;ii++) {
  410. ibuf[jj] = (float)0; /* These are the wrap-around points */
  411. jj--;
  412. }
  413. splicer = 0.0;
  414. for(kk = 0; kk < splicelen; kk++) {
  415. for(ii=0; ii <chans;ii++) {
  416. ibuf[jj] = (float)(ibuf[jj] * splicer);
  417. jj--;
  418. }
  419. splicer += spliceincr;
  420. }
  421. inmsampsize = chunksampsize/chans;
  422. // copy this at its original level to output buffer (because it must match level of immediately previous sound)
  423. jj = 0;
  424. for(ii=0; ii < inmsampsize; ii++) {
  425. kk = ii*chans;
  426. for(n=0;n<chans;n++) {
  427. if(passno == 0)
  428. obuf[jj] = ibuf[kk]; // Copy at original level, as this is start of iterated chunk, to be level-assessed
  429. else
  430. obuf[jj] = (float)(ibuf[kk] * gaingain);
  431. jj++;
  432. kk++;
  433. }
  434. }
  435. iterating = 1;
  436. write_end = dz->total_samps_written + chunksampsize;
  437. thistime = (double)((dz->total_samps_read - chunksampsize)/chans)/srate;
  438. jj = 0; /* Put splice on START of iterated chunk */
  439. splicer = 0.0;
  440. for(kk = 0; kk < splicelen; kk++) {
  441. for(ii=0; ii <chans;ii++) {
  442. ibuf[jj] = (float)(ibuf[jj] * splicer);
  443. jj++;
  444. }
  445. splicer += spliceincr;
  446. }
  447. if((exit_status = read_values_from_all_existing_brktables(thistime,dz))<0)
  448. return(exit_status);
  449. if(dz->process == ITERATE_EXTEND) {
  450. orig_sampdel = round(dz->param[ITER_DELAY] * srate);
  451. dz->iparam[ITER_MSAMPDEL] = dz->iparam[CHUNKSTART]/chans + orig_sampdel;
  452. dz->iparam[ITER_MSAMPDEL] -= ITX_SPLICELEN * 2;
  453. }
  454. if(passno==0)
  455. wstart[cnt] = dz->iparam[ITER_MSAMPDEL] * chans;
  456. write_start = wstart[cnt];
  457. local_write_start = write_start - dz->iparam[CHUNKSTART];
  458. finished = FALSE;
  459. for(;;) {
  460. if(is_penult) { /* If previously got to end, break */
  461. /* If last repeat, get orig material, with splice at start */
  462. memcpy((char *)ibuf,(char *)chunkbuf,chunksampsize * sizeof(float));
  463. for(jj = 0, k = local_write_start; jj < chunksampsize; jj++,k++) { // Write the final iteration
  464. if(k >= dz->buflen) {
  465. if(passno == 0) {
  466. for(ii =0; ii < dz->buflen;ii++)
  467. maxsamp = max(maxsamp,fabs(obuf[ii]));
  468. } else {
  469. for(ii =0; ii < dz->buflen;ii++)
  470. obuf[ii] = (float)(obuf[ii] * gaingain);
  471. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  472. return(exit_status);
  473. }
  474. bufs_written++;
  475. tail = write_end - dz->buflen;
  476. memset((char *)obuf,0,dz->buflen * sizeof(float));
  477. if(tail > 0) {
  478. memmove((char *)obuf,(char *)ovflw,tail * sizeof(float));
  479. tailend = obuf + tail;
  480. } else
  481. tailend = ovflw;
  482. memset((char *)tailend,0,(chunkbuf - tailend) * sizeof(float));
  483. local_write_start -= dz->buflen;
  484. write_end -= dz->buflen;
  485. k = 0;
  486. }
  487. obuf[k] = (float)(obuf[k] + ibuf[jj]);
  488. }
  489. while(dz->samps_left > 0) {
  490. if((exit_status = new_read_the_input_snd(dz->buflen,0,dz))<0)
  491. return(exit_status);
  492. for(jj = 0; jj < dz->ssampsread; jj++,k++) {
  493. if(k >= dz->buflen) {
  494. if(passno == 0) {
  495. if(write_end > 0) {
  496. for(ii =0; ii < min(dz->buflen,write_end);ii++)
  497. maxsamp = max(maxsamp,fabs(obuf[ii]));
  498. }
  499. } else {
  500. for(ii =0; ii < dz->buflen;ii++)
  501. obuf[ii] = (float)(obuf[ii] * gaingain);
  502. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  503. return(exit_status);
  504. }
  505. bufs_written++;
  506. tail = write_end - dz->buflen;
  507. memset((char *)obuf,0,dz->buflen * sizeof(float));
  508. if(tail > 0) {
  509. memmove((char *)obuf,(char *)ovflw,tail * sizeof(float));
  510. tailend = obuf + tail;
  511. } else
  512. tailend = ovflw;
  513. memset((char *)tailend,0,(chunkbuf - tailend) * sizeof(float));
  514. local_write_start -= dz->buflen;
  515. write_end -= dz->buflen;
  516. k = 0;
  517. }
  518. obuf[k] = ibuf[jj];
  519. }
  520. }
  521. write_end = max(k,write_end);
  522. finished = 1;
  523. break;
  524. }
  525. if(cnt==0) {
  526. if(!dz->brksize[ITER_DELAY])
  527. dz->iparam[ITER_MSAMPDEL]= orig_sampdel;
  528. }
  529. /* Zet to normal iteration delay for 2nd Iteration: */
  530. iterating = 1;
  531. switch(dz->mode) {
  532. case(ITERATE_DUR):
  533. if(write_start >= out_sampdur)
  534. is_penult = 1;
  535. break;
  536. case(ITERATE_REPEATS):
  537. if(cnt >= dz->iparam[ITER_REPEATS] - 1)
  538. is_penult = 1;
  539. break;
  540. }
  541. if(finished)
  542. break;
  543. while(local_write_start >= dz->buflen) {
  544. if(passno > 0) {
  545. for(ii = 0;ii < dz->buflen;ii++)
  546. obuf[ii] = (float)(obuf[ii] * gaingain);
  547. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  548. return(exit_status);
  549. } else {
  550. for(ii=0;ii<dz->buflen;ii++)
  551. maxsamp = max(maxsamp,fabs(obuf[ii]));
  552. dz->total_samps_written += dz->buflen; // Accountancy for local_write_start
  553. if(sloom) {
  554. if(dz->total_samps_written > twoseccnt * units) {
  555. fprintf(stdout,"Processed %d secs\n",units * 10);
  556. fflush(stdout);
  557. units++;
  558. }
  559. }
  560. }
  561. bufs_written++;
  562. tail = write_end - dz->buflen;
  563. memset((char *)obuf,0,dz->buflen * sizeof(float));
  564. if(tail > 0) {
  565. memmove((char *)obuf,(char *)ovflw,tail * sizeof(float));
  566. tailend = obuf + tail;
  567. } else
  568. tailend = ovflw;
  569. memset((char *)tailend,0,(chunkbuf - tailend) * sizeof(float));
  570. local_write_start -= dz->buflen;
  571. write_end -= dz->buflen;
  572. }
  573. cnt++;
  574. if((passno == 0) && (cnt >= arraysize)) {
  575. arraysize += BIGARRAY;
  576. if ((gain = (double *)realloc((char *)gain,arraysize * sizeof(double)))==NULL) {
  577. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  578. return(MEMORY_ERROR);
  579. }
  580. if ((pshift = (double *)realloc((char *)pshift,arraysize * sizeof(double)))==NULL) {
  581. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  582. return(MEMORY_ERROR);
  583. }
  584. if ((wstart = (int *)realloc((char *)wstart,arraysize * sizeof(int)))==NULL) {
  585. sprintf(errstr,"Insufficient memory to store gain values (2)\n");
  586. return(MEMORY_ERROR);
  587. }
  588. }
  589. thistime = ((dz->buflen * bufs_written) + local_write_start) * one_over_sr;
  590. if((exit_status = read_values_from_all_existing_brktables(thistime,dz))<0)
  591. return(exit_status);
  592. if(is_penult) {
  593. dz->param[ITER_PSCAT] = 0.0;
  594. dz->param[ITER_ASCAT] = 0.0;
  595. continue; // We will write the final segment at original level, as part of tail of sound: no iteration pass here
  596. }
  597. if(dz->brksize[ITER_DELAY])
  598. dz->iparam[ITER_MSAMPDEL] = round(dz->param[ITER_DELAY] * srate);
  599. write_end = new_iterate(cnt,passno,gain,pshift,write_end,local_write_start,inmsampsize,level,pstep,iterating,dz);
  600. if(passno==0)
  601. wstart[cnt] = get_next_writestart(write_start,dz);
  602. write_start = wstart[cnt];
  603. local_write_start = write_start - dz->total_samps_written;
  604. }
  605. if(passno > 0) {
  606. if(write_end > 0) {
  607. for(ii =0; ii < write_end;ii++)
  608. obuf[ii] = (float)(obuf[ii] * gaingain);
  609. if((exit_status = write_samps(obuf,write_end,dz))<0)
  610. return(exit_status);
  611. }
  612. } else {
  613. if(write_end > 0) {
  614. for(ii =0; ii < write_end;ii++)
  615. maxsamp = max(maxsamp,fabs(obuf[ii]));
  616. }
  617. gaingain = (localmax/maxsamp) * dz->param[ITER_LGAIN];
  618. }
  619. }
  620. return FINISHED;
  621. }
  622. /*************************** READ_THE_INPUT_SND **************************/
  623. int read_the_input_snd(dataptr dz)
  624. {
  625. int samps, k, samps_read;
  626. int n;
  627. if((samps_read = fgetfbufEx(dz->sampbuf[0], dz->insams[0]/* + SECSIZE*/,dz->ifd[0],0)) <= 0) {
  628. sprintf(errstr,"Can't read bytes from input soundfile\n");
  629. if(samps_read<0)
  630. return(SYSTEM_ERROR);
  631. return(DATA_ERROR);
  632. }
  633. if(samps_read!=dz->insams[0]) {
  634. sprintf(errstr, "Failed to read all of source file. read_the_input_snd()\n");
  635. return(PROGRAM_ERROR);
  636. }
  637. samps = samps_read / dz->infile->channels;
  638. if(dz->vflag[IS_ITER_PSCAT]) {
  639. k = samps * dz->infile->channels;
  640. for(n=0;n<dz->infile->channels;n++) {
  641. dz->sampbuf[0][k] = (float)0;
  642. k++; /* GUARD POINTS FOR INTERPOLATION */
  643. }
  644. }
  645. return(FINISHED);
  646. }
  647. /*************************** NEW_READ_THE_INPUT_SND **************************/
  648. int new_read_the_input_snd(int samplen,int wrap,dataptr dz)
  649. {
  650. int samps, k, samps_read;
  651. int n;
  652. if((samps_read = fgetfbufEx(dz->sampbuf[0], samplen/* + SECSIZE*/,dz->ifd[0],0)) <= 0) {
  653. sprintf(errstr,"Can't read bytes from input soundfile\n");
  654. if(samps_read<0)
  655. return(SYSTEM_ERROR);
  656. return(DATA_ERROR);
  657. }
  658. dz->total_samps_read += samps_read;
  659. dz->samps_left -= samps_read;
  660. dz->ssampsread = samps_read;
  661. if(wrap) {
  662. if(samps_read!=samplen) {
  663. sprintf(errstr, "Failed to all of the input sound. new_read_the_input_snd()\n");
  664. return(PROGRAM_ERROR);
  665. }
  666. samps = samps_read / dz->infile->channels;
  667. if(dz->param[ITER_PSCAT] > 0.0) {
  668. k = samps * dz->infile->channels;
  669. for(n=0;n<dz->infile->channels;n++) {
  670. dz->sampbuf[0][k] = (float)0;
  671. k++; /* GUARD POINTS FOR INTERPOLATION */
  672. }
  673. }
  674. }
  675. return(FINISHED);
  676. }
  677. /******************************* SCALE_INPUT ****************************/
  678. void scale_input(dataptr dz)
  679. {
  680. int n;
  681. int end = dz->insams[0];
  682. if(dz->iparam[ITER_PROCESS]!=FIXA_MONO && dz->iparam[ITER_PROCESS]!=FIXA_STEREO)
  683. end = dz->insams[0] + dz->infile->channels; /* ALLOW FOR GUARD POINTS */
  684. for(n=0; n < end; n++)
  685. dz->sampbuf[0][n] = (float)(dz->sampbuf[0][n] * dz->param[ITER_GAIN]);
  686. }
  687. /*************************** GET_NEXT_WRITESTART ****************************/
  688. int get_next_writestart(int write_start,dataptr dz)
  689. {
  690. int this_step;
  691. double d;
  692. int mwrite_start = write_start/dz->infile->channels;
  693. if((dz->process == ITERATE_EXTEND && dz->param[ITER_RANDOM] > 0.0)
  694. || (dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_RAND])) {
  695. d = ((drand48() * 2.0) - 1.0) * dz->param[ITER_RANDOM];
  696. d += 1.0;
  697. this_step = (int)round((double)dz->iparam[ITER_MSAMPDEL] * d);
  698. mwrite_start += this_step;
  699. } else
  700. mwrite_start += dz->iparam[ITER_MSAMPDEL];
  701. write_start = mwrite_start * dz->infile->channels;
  702. return(write_start);
  703. }
  704. /******************************* ITERATE *****************************/
  705. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  706. int new_iterate
  707. (int cnt,int pass,double *gain,double *pshift,int write_end,int local_write_start,
  708. int inmsampsize,double level,int pstep,int iterating,dataptr dz)
  709. {
  710. int wr_end = 0;
  711. switch(dz->iparam[ITER_PROCESS]) {
  712. case(MONO):
  713. wr_end = new_iter(cnt,pass,gain,local_write_start,inmsampsize,level,iterating,dz);
  714. break;
  715. case(STEREO):
  716. wr_end = new_iter_stereo(cnt,pass,gain,local_write_start,inmsampsize,level,iterating,dz);
  717. break;
  718. case(MN_INTP_SHIFT):
  719. wr_end = new_iter_shift_interp(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,pstep,iterating,dz);
  720. break;
  721. case(ST_INTP_SHIFT):
  722. wr_end = new_iter_shift_interp_stereo(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,pstep,iterating,dz);
  723. break;
  724. case(FIXA_MONO):
  725. wr_end = new_fixa_iter(cnt,pass,gain,local_write_start,inmsampsize,level,iterating,dz);
  726. break;
  727. case(FIXA_STEREO):
  728. wr_end = new_fixa_iter_stereo(cnt,pass,gain,local_write_start,inmsampsize,level,iterating,dz);
  729. break;
  730. case(FIXA_MN_INTP_SHIFT):
  731. wr_end = new_fixa_iter_shift_interp(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,pstep,iterating,dz);
  732. break;
  733. case(FIXA_ST_INTP_SHIFT):
  734. wr_end = new_fixa_iter_shift_interp_stereo(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,pstep,iterating,dz);
  735. break;
  736. }
  737. return max(wr_end,write_end);
  738. }
  739. /**************************** ITER ***************************/
  740. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  741. int new_iter(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz)
  742. {
  743. register int i, j = local_write_start;
  744. float *outbuf = dz->sampbuf[1];
  745. float *inbuf = dz->sampbuf[0];
  746. double z;
  747. double thisgain;
  748. if(passno == 0) {
  749. gain[cnt] = get_gain(dz);
  750. thisgain = gain[cnt];
  751. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  752. for(i=0; i < inmsampsize; i++) {
  753. z = outbuf[j] + (inbuf[i] * thisgain * level);
  754. outbuf[j++] = (float)z;
  755. }
  756. } else {
  757. for(i=0; i < inmsampsize; i++) {
  758. if(iterating)
  759. z = outbuf[j] + (inbuf[i] * thisgain);
  760. else
  761. z = outbuf[j] + inbuf[i];
  762. outbuf[j++] = (float)z;
  763. }
  764. }
  765. } else {
  766. thisgain = gain[cnt];
  767. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  768. for(i=0; i < inmsampsize; i++) {
  769. z = outbuf[j] + (inbuf[i] * thisgain * level);
  770. outbuf[j++] = (float)z;
  771. }
  772. } else {
  773. for(i=0; i < inmsampsize; i++) {
  774. if(iterating)
  775. z = outbuf[j] + (inbuf[i] * thisgain);
  776. else
  777. z = outbuf[j] + inbuf[i];
  778. outbuf[j++] = (float)z;
  779. }
  780. }
  781. }
  782. return(j);
  783. }
  784. /**************************** ITER_STEREO ***************************/
  785. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  786. int new_iter_stereo(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz)
  787. {
  788. register int i, j = local_write_start, k;
  789. int n;
  790. float *outbuf = dz->sampbuf[1];
  791. float *inbuf = dz->sampbuf[0];
  792. double z;
  793. double thisgain;
  794. if(passno == 0) {
  795. gain[cnt] = get_gain(dz);
  796. thisgain = gain[cnt];
  797. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  798. for(i=0; i < inmsampsize; i++) {
  799. k = i*dz->infile->channels;
  800. for(n=0;n<dz->infile->channels;n++) {
  801. z = outbuf[j] + (inbuf[k++] * thisgain * level);
  802. outbuf[j++] = (float)z;
  803. }
  804. }
  805. } else {
  806. for(i=0; i < inmsampsize; i++) {
  807. k = i*dz->infile->channels;
  808. for(n=0;n<dz->infile->channels;n++) {
  809. if(iterating)
  810. z = outbuf[j] + (inbuf[k++] * thisgain);
  811. else
  812. z = outbuf[j] + inbuf[k++];
  813. outbuf[j++] = (float)z;
  814. }
  815. }
  816. }
  817. } else {
  818. thisgain = gain[cnt];
  819. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  820. for(i=0; i < inmsampsize; i++) {
  821. k = i*dz->infile->channels;
  822. for(n=0;n<dz->infile->channels;n++) {
  823. z = outbuf[j] + (inbuf[k++] * thisgain * level);
  824. outbuf[j++] = (float)z;
  825. }
  826. }
  827. } else {
  828. for(i=0; i < inmsampsize; i++) {
  829. k = i*dz->infile->channels;
  830. for(n=0;n<dz->infile->channels;n++) {
  831. if(iterating)
  832. z = outbuf[j] + (inbuf[k++] * thisgain);
  833. else
  834. z = outbuf[j] + inbuf[k++];
  835. outbuf[j++] = (float)z;
  836. }
  837. }
  838. }
  839. }
  840. return(j);
  841. }
  842. /**************************** ITER_SHIFT_INTERP ***************************/
  843. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  844. int new_iter_shift_interp(int cnt,int passno, double *gain,double *pshift,int local_write_start,
  845. int inmsampsize,double level,int pstep,int iterating,dataptr dz)
  846. {
  847. register int i = 0, j = local_write_start;
  848. double d = 0.0, part = 0.0;
  849. float val, nextval, diff;
  850. float *outbuf = dz->sampbuf[1];
  851. float *inbuf = dz->sampbuf[0];
  852. double z;
  853. double thisgain;
  854. if(passno == 0) {
  855. gain[cnt] = get_gain(dz);
  856. thisgain = gain[cnt];
  857. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  858. while(i < inmsampsize) {
  859. val = inbuf[i++];
  860. nextval = inbuf[i];
  861. diff = nextval - val;
  862. z = val + ((double)diff * part);
  863. z = (z * thisgain * level);
  864. z += outbuf[j];
  865. outbuf[j++] = (float)z;
  866. d += dz->param[pstep];
  867. i = (int)d; /* TRUNCATE */
  868. part = d - (double)i;
  869. }
  870. } else {
  871. while(i < inmsampsize) {
  872. val = inbuf[i++];
  873. nextval = inbuf[i];
  874. diff = nextval - val;
  875. z = val + ((double)diff * part);
  876. if(iterating)
  877. z = (z * thisgain);
  878. z += outbuf[j];
  879. outbuf[j++] = (float)z;
  880. d += dz->param[pstep];
  881. i = (int)d; /* TRUNCATE */
  882. part = d - (double)i;
  883. }
  884. }
  885. pshift[cnt] = get_pshift(dz);
  886. dz->param[pstep] = pshift[cnt];
  887. } else {
  888. thisgain = gain[cnt];
  889. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  890. while(i < inmsampsize) {
  891. val = inbuf[i++];
  892. nextval = inbuf[i];
  893. diff = nextval - val;
  894. z = val + ((double)diff * part);
  895. z = (z * thisgain * level);
  896. z += outbuf[j];
  897. outbuf[j++] = (float)z;
  898. d += dz->param[pstep];
  899. i = (int)d; /* TRUNCATE */
  900. part = d - (double)i;
  901. }
  902. } else {
  903. while(i < inmsampsize) {
  904. val = inbuf[i++];
  905. nextval = inbuf[i];
  906. diff = nextval - val;
  907. z = val + ((double)diff * part);
  908. if(iterating)
  909. z = (z * thisgain);
  910. z += outbuf[j];
  911. outbuf[j++] = (float)z;
  912. d += dz->param[pstep];
  913. i = (int)d; /* TRUNCATE */
  914. part = d - (double)i;
  915. }
  916. }
  917. dz->param[pstep] = pshift[cnt];
  918. }
  919. return(j);
  920. }
  921. /*********************** ITER_SHIFT_INTERP_STEREO *************************/
  922. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  923. int new_iter_shift_interp_stereo(int cnt,int passno, double *gain,double *pshift,int local_write_start,
  924. int inmsampsize,double level,int pstep,int iterating,dataptr dz)
  925. {
  926. register int i = 0, j = local_write_start, k;
  927. int n;
  928. double d = 0.0, part = 0.0;
  929. float val, nextval, diff;
  930. float *outbuf = dz->sampbuf[1];
  931. float *inbuf = dz->sampbuf[0];
  932. double z;
  933. double thisgain;
  934. if(passno == 0) {
  935. gain[cnt] = get_gain(dz);
  936. thisgain = gain[cnt];
  937. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  938. while(i < inmsampsize) {
  939. k = i*dz->infile->channels;
  940. for(n=0;n<dz->infile->channels;n++) {
  941. val = inbuf[k];
  942. nextval = inbuf[k+dz->infile->channels];
  943. diff = nextval - val;
  944. z = val + ((double)diff * part);
  945. z = (z * thisgain * level);
  946. z += outbuf[j];
  947. outbuf[j++] = (float)z;
  948. k++;
  949. }
  950. d += dz->param[pstep];
  951. i = (int)d; /* TRUNCATE */
  952. part = d - (double)i;
  953. }
  954. } else {
  955. while(i < inmsampsize) {
  956. k = i*dz->infile->channels;
  957. for(n=0;n<dz->infile->channels;n++) {
  958. val = inbuf[k];
  959. nextval = inbuf[k+dz->infile->channels];
  960. diff = nextval - val;
  961. z = val + ((double)diff * part);
  962. if(iterating)
  963. z = (z * thisgain);
  964. z += outbuf[j];
  965. outbuf[j++] = (float)z;
  966. k++;
  967. }
  968. d += dz->param[pstep];
  969. i = (int)d; /* TRUNCATE */
  970. part = d - (double)i;
  971. }
  972. }
  973. pshift[cnt] = get_pshift(dz);
  974. dz->param[pstep] = pshift[cnt];
  975. } else {
  976. thisgain = gain[cnt];
  977. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  978. while(i < inmsampsize) {
  979. k = i*dz->infile->channels;
  980. for(n=0;n<dz->infile->channels;n++) {
  981. val = inbuf[k];
  982. nextval = inbuf[k+dz->infile->channels];
  983. diff = nextval - val;
  984. z = val + ((double)diff * part);
  985. z = (z * thisgain * level);
  986. z += outbuf[j];
  987. outbuf[j++] = (float)z;
  988. k++;
  989. }
  990. d += dz->param[pstep];
  991. i = (int)d; /* TRUNCATE */
  992. part = d - (double)i;
  993. }
  994. } else {
  995. while(i < inmsampsize) {
  996. k = i*dz->infile->channels;
  997. for(n=0;n<dz->infile->channels;n++) {
  998. val = inbuf[k];
  999. nextval = inbuf[k+dz->infile->channels];
  1000. diff = nextval - val;
  1001. z = val + ((double)diff * part);
  1002. if(iterating)
  1003. z = (z * thisgain);
  1004. z += outbuf[j];
  1005. outbuf[j++] = (float)z;
  1006. k++;
  1007. }
  1008. d += dz->param[pstep];
  1009. i = (int)d; /* TRUNCATE */
  1010. part = d - (double)i;
  1011. }
  1012. }
  1013. dz->param[pstep] = pshift[cnt];
  1014. }
  1015. return(j);
  1016. }
  1017. /**************************** FIXA_ITER ***************************/
  1018. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1019. int new_fixa_iter(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz)
  1020. {
  1021. register int i, j = local_write_start;
  1022. float *outbuf = dz->sampbuf[1];
  1023. float *inbuf = dz->sampbuf[0];
  1024. double z;
  1025. if(passno ==0) {
  1026. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1027. for(i=0; i < inmsampsize; i++) {
  1028. z = outbuf[j] + (inbuf[i] * level);
  1029. outbuf[j] = (float)z;
  1030. j++;
  1031. }
  1032. } else {
  1033. for(i=0; i < inmsampsize; i++) {
  1034. z = outbuf[j] + inbuf[i];
  1035. outbuf[j] = (float)z;
  1036. j++;
  1037. }
  1038. }
  1039. } else {
  1040. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1041. for(i=0; i < inmsampsize; i++) {
  1042. z = outbuf[j] + (inbuf[i] * level * gain[cnt]);
  1043. outbuf[j] = (float)z;
  1044. j++;
  1045. }
  1046. } else if(dz->process == ITERATE_EXTEND) {
  1047. for(i=0; i < inmsampsize; i++) {
  1048. z = outbuf[j] + inbuf[i];
  1049. outbuf[j] = (float)z;
  1050. j++;
  1051. }
  1052. } else {
  1053. for(i=0; i < inmsampsize; i++) {
  1054. if(iterating)
  1055. z = outbuf[j] + (inbuf[i] * gain[cnt]);
  1056. else
  1057. z = outbuf[j] + inbuf[i];
  1058. outbuf[j] = (float)z;
  1059. j++;
  1060. }
  1061. }
  1062. }
  1063. return(j);
  1064. }
  1065. /**************************** FIXA_ITER_STEREO ***************************/
  1066. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1067. int new_fixa_iter_stereo(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,int iterating,dataptr dz)
  1068. {
  1069. register int i, j = local_write_start, k;
  1070. int n;
  1071. float *outbuf = dz->sampbuf[1];
  1072. float *inbuf = dz->sampbuf[0];
  1073. double z;
  1074. if(passno == 0) {
  1075. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1076. for(i=0; i < inmsampsize; i++) {
  1077. k = i*dz->infile->channels;
  1078. for(n=0;n<dz->infile->channels;n++) {
  1079. z = outbuf[j] + (inbuf[k++] * level);
  1080. outbuf[j] = (float)z;
  1081. j++;
  1082. }
  1083. }
  1084. } else {
  1085. for(i=0; i < inmsampsize; i++) {
  1086. k = i*dz->infile->channels;
  1087. for(n=0;n<dz->infile->channels;n++) {
  1088. z = outbuf[j] + inbuf[k++];
  1089. outbuf[j] = (float)z;
  1090. j++;
  1091. }
  1092. }
  1093. }
  1094. } else {
  1095. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1096. for(i=0; i < inmsampsize; i++) {
  1097. k = i*dz->infile->channels;
  1098. for(n=0;n<dz->infile->channels;n++) {
  1099. z = outbuf[j] + (inbuf[k++] * level * gain[cnt]);
  1100. outbuf[j] = (float)z;
  1101. j++;
  1102. }
  1103. }
  1104. } else if(dz->process == ITERATE_EXTEND) {
  1105. for(i=0; i < inmsampsize; i++) {
  1106. k = i*dz->infile->channels;
  1107. for(n=0;n<dz->infile->channels;n++) {
  1108. z = outbuf[j] + inbuf[k++];
  1109. outbuf[j] = (float)z;
  1110. j++;
  1111. }
  1112. }
  1113. } else {
  1114. for(i=0; i < inmsampsize; i++) {
  1115. k = i*dz->infile->channels;
  1116. for(n=0;n<dz->infile->channels;n++) {
  1117. if(iterating)
  1118. z = outbuf[j] + (inbuf[k++] * gain[cnt]);
  1119. else
  1120. z = outbuf[j] + inbuf[k++];
  1121. outbuf[j] = (float)z;
  1122. j++;
  1123. }
  1124. }
  1125. }
  1126. }
  1127. return(j);
  1128. }
  1129. /**************************** FIXA_ITER_SHIFT_INTERP ***************************/
  1130. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1131. int new_fixa_iter_shift_interp(int cnt,int passno,double *gain,double *pshift,int local_write_start,
  1132. int inmsampsize,double level,int pstep,int iterating,dataptr dz)
  1133. {
  1134. register int i = 0, j = local_write_start;
  1135. double d = 0.0, part = 0.0;
  1136. float val, nextval, diff;
  1137. float *outbuf = dz->sampbuf[1];
  1138. float *inbuf = dz->sampbuf[0];
  1139. double z;
  1140. if(passno == 0) {
  1141. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1142. while(i < inmsampsize) {
  1143. val = inbuf[i++];
  1144. nextval = inbuf[i];
  1145. diff = nextval - val;
  1146. z = val + ((double)diff * part);
  1147. z = (z * level);
  1148. z += outbuf[j];
  1149. outbuf[j++] = (float)z;
  1150. d += dz->param[pstep];
  1151. i = (int)d; /* TRUNCATE */
  1152. part = d - (double)i;
  1153. }
  1154. } else {
  1155. while(i < inmsampsize) {
  1156. val = inbuf[i++];
  1157. nextval = inbuf[i];
  1158. diff = nextval - val;
  1159. z = val + ((double)diff * part);
  1160. z += outbuf[j];
  1161. outbuf[j++] = (float)z;
  1162. d += dz->param[pstep];
  1163. i = (int)d; /* TRUNCATE */
  1164. part = d - (double)i;
  1165. }
  1166. }
  1167. pshift[cnt] = get_pshift(dz);
  1168. } else {
  1169. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1170. while(i < inmsampsize) {
  1171. val = inbuf[i++];
  1172. nextval = inbuf[i];
  1173. diff = nextval - val;
  1174. z = val + ((double)diff * part);
  1175. z = (z * level * gain[cnt]);
  1176. z += outbuf[j];
  1177. outbuf[j++] = (float)z;
  1178. d += dz->param[pstep];
  1179. i = (int)d; /* TRUNCATE */
  1180. part = d - (double)i;
  1181. }
  1182. } else if(dz->process == ITERATE_EXTEND) {
  1183. while(i < inmsampsize) {
  1184. val = inbuf[i++];
  1185. nextval = inbuf[i];
  1186. diff = nextval - val;
  1187. z = val + ((double)diff * part);
  1188. z += outbuf[j];
  1189. outbuf[j++] = (float)z;
  1190. d += dz->param[pstep];
  1191. i = (int)d; /* TRUNCATE */
  1192. part = d - (double)i;
  1193. }
  1194. } else {
  1195. while(i < inmsampsize) {
  1196. val = inbuf[i++];
  1197. nextval = inbuf[i];
  1198. diff = nextval - val;
  1199. z = val + ((double)diff * part);
  1200. if(iterating)
  1201. z = (z * gain[cnt]);
  1202. z += outbuf[j];
  1203. outbuf[j++] = (float)z;
  1204. d += dz->param[pstep];
  1205. i = (int)d; /* TRUNCATE */
  1206. part = d - (double)i;
  1207. }
  1208. }
  1209. }
  1210. dz->param[pstep] = pshift[cnt];
  1211. return(j);
  1212. }
  1213. /*********************** FIXA_ITER_SHIFT_INTERP_STEREO *************************/
  1214. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1215. int new_fixa_iter_shift_interp_stereo(int cnt,int passno,double *gain,double *pshift,int local_write_start,
  1216. int inmsampsize,double level,int pstep,int iterating,dataptr dz)
  1217. {
  1218. register int i = 0, j = local_write_start, k;
  1219. int n;
  1220. double d = 0.0, part = 0.0;
  1221. float val, nextval, diff;
  1222. float *outbuf = dz->sampbuf[1];
  1223. float *inbuf = dz->sampbuf[0];
  1224. double z;
  1225. if(passno == 0) {
  1226. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1227. while(i < inmsampsize) {
  1228. k = i*dz->infile->channels;
  1229. for(n=0;n<dz->infile->channels;n++) {
  1230. val = inbuf[k];
  1231. nextval = inbuf[k+dz->infile->channels];
  1232. diff = nextval - val;
  1233. z = val + ((double)diff * part);
  1234. z = (z * level);
  1235. z += outbuf[j];
  1236. outbuf[j++] = (float)z;
  1237. k++;
  1238. }
  1239. d += dz->param[pstep];
  1240. i = (int)d; /* TRUNCATE */
  1241. part = d - (double)i;
  1242. }
  1243. } else {
  1244. while(i < inmsampsize) {
  1245. k = i*dz->infile->channels;
  1246. for(n=0;n<dz->infile->channels;n++) {
  1247. val = inbuf[k];
  1248. nextval = inbuf[k+dz->infile->channels];
  1249. diff = nextval - val;
  1250. z = val + ((double)diff * part);
  1251. z += outbuf[j];
  1252. outbuf[j++] = (float)z;
  1253. k++;
  1254. }
  1255. d += dz->param[pstep];
  1256. i = (int)d; /* TRUNCATE */
  1257. part = d - (double)i;
  1258. }
  1259. }
  1260. pshift[cnt] = get_pshift(dz);
  1261. } else {
  1262. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1263. while(i < inmsampsize) {
  1264. k = i*dz->infile->channels;
  1265. for(n=0;n<dz->infile->channels;n++) {
  1266. val = inbuf[k];
  1267. nextval = inbuf[k+dz->infile->channels];
  1268. diff = nextval - val;
  1269. z = val + ((double)diff * part);
  1270. z = (z * level * gain[cnt]);
  1271. z += outbuf[j];
  1272. outbuf[j++] = (float)z;
  1273. k++;
  1274. }
  1275. d += dz->param[pstep];
  1276. i = (int)d; /* TRUNCATE */
  1277. part = d - (double)i;
  1278. }
  1279. } else if(dz->process == ITERATE_EXTEND) {
  1280. while(i < inmsampsize) {
  1281. k = i*dz->infile->channels;
  1282. for(n=0;n<dz->infile->channels;n++) {
  1283. val = inbuf[k];
  1284. nextval = inbuf[k+dz->infile->channels];
  1285. diff = nextval - val;
  1286. z = val + ((double)diff * part);
  1287. z += outbuf[j];
  1288. outbuf[j++] = (float)z;
  1289. k++;
  1290. }
  1291. d += dz->param[pstep];
  1292. i = (int)d; /* TRUNCATE */
  1293. part = d - (double)i;
  1294. }
  1295. } else {
  1296. while(i < inmsampsize) {
  1297. k = i*dz->infile->channels;
  1298. for(n=0;n<dz->infile->channels;n++) {
  1299. val = inbuf[k];
  1300. nextval = inbuf[k+dz->infile->channels];
  1301. diff = nextval - val;
  1302. z = val + ((double)diff * part);
  1303. if(iterating)
  1304. z = (z * gain[cnt]);
  1305. z += outbuf[j];
  1306. outbuf[j++] = (float)z;
  1307. k++;
  1308. }
  1309. d += dz->param[pstep];
  1310. i = (int)d; /* TRUNCATE */
  1311. part = d - (double)i;
  1312. }
  1313. }
  1314. }
  1315. dz->param[pstep] = pshift[cnt];
  1316. return(j);
  1317. }
  1318. /******************************** GET_GAIN *****************************/
  1319. double get_gain(dataptr dz)
  1320. {
  1321. double scatter;
  1322. double newlgain = 0.0;
  1323. switch(dz->process) {
  1324. case(ITERATE_EXTEND):
  1325. newlgain = 1.0;
  1326. if (dz->param[ITER_ASCAT] > 0.0) {
  1327. scatter = drand48() * dz->param[ITER_ASCAT];
  1328. scatter = 1.0 - scatter;
  1329. newlgain = scatter;
  1330. }
  1331. break;
  1332. case(ITERATE):
  1333. newlgain = dz->param[ITER_GAIN];
  1334. if(dz->vflag[IS_ITER_ASCAT]) {
  1335. scatter = drand48() * dz->param[ITER_ASCAT];
  1336. scatter = 1.0 - scatter;
  1337. newlgain = scatter * (double)dz->param[ITER_GAIN];
  1338. }
  1339. }
  1340. return(newlgain);
  1341. }
  1342. /******************************** GET_PSHIFT *****************************/
  1343. double get_pshift(dataptr dz)
  1344. {
  1345. double scatter;
  1346. scatter = (drand48() * 2.0) - 1.0;
  1347. scatter *= dz->param[ITER_PSCAT];
  1348. return(pow(2.0,scatter * OCTAVES_PER_SEMITONE));
  1349. }
  1350. /******************************** ACCENT_STREAM *****************************/
  1351. int accent_stream(dataptr dz) {
  1352. int n = 0, thispos = 0, last_write_end = 0, oflo = 0, seccnt, s_read;
  1353. float *bptr, zz;
  1354. double maxzz = 0.0, minzz = 0.0;
  1355. int overlap ,i, j, exit_status, t,v,m,done = 0;
  1356. double *brrk, convertor, thisval, nextval, valincr, atten = 1.0;
  1357. int nexttime, thistime;
  1358. float *sbrk = dz->extrabuf[0];
  1359. int *la = dz->lparray[0];
  1360. if(((seccnt = dz->insams[0]/F_SECSIZE) * F_SECSIZE) < dz->insams[0])
  1361. seccnt++;
  1362. if((dz->ssampsread = fgetfbufEx(sbrk,seccnt * F_SECSIZE,dz->ifd[0],0)) < 0) {
  1363. sprintf(errstr,"Can't read samps from input soundfile.\n");
  1364. return(SYSTEM_ERROR);
  1365. }
  1366. s_read = dz->ssampsread;
  1367. for(n = 1;n < dz->itemcnt; n++) {
  1368. if(la[n] - la[n-1] <= 0) {
  1369. sprintf(errstr,"Entry times not in ascending order. Cannot proceed.\n");
  1370. return(DATA_ERROR);
  1371. }
  1372. }
  1373. if(dz->brksize[ACC_ATTEN]) {
  1374. if(dz->brksize[ACC_ATTEN]<2) {
  1375. sprintf(errstr,"Breaktable has only one value: Cannot proceed.\n");
  1376. return(DATA_ERROR);
  1377. }
  1378. convertor = (double)(dz->infile->srate * dz->infile->channels);
  1379. brrk = dz->brk[ACC_ATTEN];
  1380. n = 0;
  1381. nexttime = round(brrk[0] * convertor);
  1382. nextval = brrk[1];
  1383. for(m = 1,t = 2,v = 3; m < dz->brksize[ACC_ATTEN]; m++,t+=2,v+=2) {
  1384. thistime = nexttime;
  1385. thisval = nextval;
  1386. nexttime = round(brrk[t] * convertor);
  1387. nextval = brrk[v];
  1388. valincr = (nextval - thisval)/(double)(nexttime - thistime);
  1389. if(nexttime >= s_read) { /* IF brktable extends beyond end of sound */
  1390. nexttime = s_read;
  1391. done = 1;
  1392. }
  1393. atten = thisval;
  1394. while(n < nexttime) {
  1395. sbrk[n] = (float) /*round*/((double)sbrk[n] * atten);
  1396. atten += valincr;
  1397. n++;
  1398. }
  1399. if(done) /* IF brktable extends beyond end of sound: break */
  1400. break;
  1401. }
  1402. while(n < s_read) { /* IF brktable stops short of end of sound */
  1403. sbrk[n] = (float) /*round*/((double)sbrk[n] * atten);
  1404. n++;
  1405. }
  1406. } else if(dz->param[ACC_ATTEN] < 1.0) {
  1407. for(n=0;n<s_read;n++)
  1408. sbrk[n] = (float)/*round*/((double)sbrk[n] * dz->param[ACC_ATTEN]);
  1409. }
  1410. dz->tempsize = la[dz->itemcnt-1];
  1411. n = 0;
  1412. memset((char *)dz->sampbuf[0],0,dz->buflen * sizeof(float));
  1413. while(n < dz->itemcnt) {
  1414. thispos = la[n] - dz->total_samps_written;
  1415. if(thispos >= dz->buflen) {
  1416. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  1417. return(exit_status);
  1418. memset((char *)dz->sampbuf[0],0,dz->buflen * sizeof(float));
  1419. if(last_write_end > dz->buflen) {
  1420. last_write_end -= dz->buflen;
  1421. memcpy((char *)dz->sampbuf[0],(char *)(dz->sampbuf[0] + dz->buflen),last_write_end * sizeof(float));
  1422. } else {
  1423. last_write_end = 0;
  1424. }
  1425. } else {
  1426. bptr = dz->sampbuf[0] + thispos;
  1427. if((overlap = last_write_end - thispos) <= 0) {
  1428. memcpy((char *)bptr,(char *)sbrk,dz->insams[0]* sizeof(float));
  1429. last_write_end = thispos + dz->insams[0];
  1430. } else {
  1431. for(i=0,j = thispos;i<overlap; i++,j++) {
  1432. zz = *bptr + sbrk[i];
  1433. maxzz = max(zz,maxzz);
  1434. minzz = min(zz,minzz);
  1435. if(maxzz > F_MAXSAMP || minzz < F_MINSAMP) {
  1436. if(!oflo) {
  1437. fprintf(stdout,"WARNING: First overflow at event %d\n",n+1);
  1438. fflush(stdout);
  1439. }
  1440. oflo++;
  1441. }
  1442. *bptr = (float)zz;
  1443. bptr++;
  1444. }
  1445. memcpy((char *)bptr,(char *)(sbrk + overlap),(dz->insams[0] - overlap) * sizeof(float));
  1446. last_write_end = thispos + dz->insams[0];
  1447. }
  1448. n++;
  1449. }
  1450. }
  1451. if(last_write_end > 0) {
  1452. if((exit_status = write_samps(dz->sampbuf[0],last_write_end,dz))<0)
  1453. return(exit_status);
  1454. }
  1455. if(oflo) {
  1456. if(oflo > 1) {
  1457. fprintf(stdout,"WARNING: there were %d overflows\n",oflo);
  1458. fflush(stdout);
  1459. } else {
  1460. fprintf(stdout,"WARNING: there was %d overflow\n",oflo);
  1461. fflush(stdout);
  1462. }
  1463. }
  1464. return(FINISHED);
  1465. }
  1466. //TW NEW FUNCTION (converted for floats)
  1467. /******************************** DO_SEQUENCE *****************************/
  1468. int do_sequence(dataptr dz)
  1469. {
  1470. int exit_status = FINISHED, warned = 0;
  1471. double *d, transpos, time, level, kd, frac, sum;
  1472. float *obufptr, *ibufptr, *tbufptr;
  1473. int k, n, outlen, thissamp, samps_read, last_total_samps_written = 0, max_write = 0;
  1474. int m, c;
  1475. double thisval, nextval, diff, fracval, oval;
  1476. int chans = dz->infile->channels, srate = dz->infile->srate;
  1477. dz->total_samps_written = 0;
  1478. if((samps_read = fgetfbufEx(dz->sampbuf[0], dz->insams[0],dz->ifd[0],0)) <= 0) {
  1479. sprintf(errstr,"Can't read bytes from input soundfile.\n");
  1480. return(SYSTEM_ERROR);
  1481. }
  1482. for(d = dz->parray[0]; d < dz->parray[1]; d+=3) {
  1483. tbufptr = dz->sampbuf[3], ibufptr = dz->sampbuf[0];
  1484. time = *d;
  1485. transpos = *(d+1);
  1486. level = *(d+2) * dz->param[SEQ_ATTEN];
  1487. for(c = 0;c <chans;c++)
  1488. *tbufptr++ = *ibufptr++;
  1489. kd = 0.0;
  1490. do {
  1491. kd += transpos;
  1492. k = (int)floor(kd);
  1493. frac = kd - (double)k;
  1494. k *= chans;
  1495. if(k >= dz->insams[0] + chans)
  1496. break;
  1497. for(m=0;m<chans;m++) {
  1498. thisval = ibufptr[k];
  1499. nextval = ibufptr[k+chans];
  1500. diff = nextval - thisval;
  1501. fracval = diff * frac;
  1502. oval = thisval + fracval;
  1503. *tbufptr++ = (float)oval;
  1504. k++;
  1505. }
  1506. } while(k < dz->insams[0] + chans); /* allows for wraparound point(s) at end */
  1507. outlen = tbufptr - dz->sampbuf[3];
  1508. thissamp = ((int)round(time * srate) * chans) - last_total_samps_written;
  1509. while(thissamp >= dz->buflen) {
  1510. if((exit_status = write_samps(dz->sampbuf[1],dz->buflen,dz))<0)
  1511. return(exit_status);
  1512. last_total_samps_written = dz->total_samps_written;
  1513. memcpy((char *)dz->sampbuf[1],(char *)dz->sampbuf[2],dz->buflen * sizeof(float));
  1514. memset((char *)dz->sampbuf[2],0,dz->buflen * sizeof(float));
  1515. max_write = 0;
  1516. thissamp -= dz->buflen;
  1517. }
  1518. obufptr = dz->sampbuf[1] + thissamp;
  1519. tbufptr = dz->sampbuf[3];
  1520. for(n=0;n<outlen;n++) {
  1521. sum = *obufptr + (*tbufptr * level);
  1522. if(!warned && (sum >= F_MAXSAMP)) {
  1523. print_outwarning_flush("OVERLOAD!!\n");
  1524. warned = 1;
  1525. }
  1526. *obufptr = (float)sum;
  1527. obufptr++;
  1528. tbufptr++;
  1529. }
  1530. if((obufptr - dz->sampbuf[1]) > max_write)
  1531. max_write = obufptr - dz->sampbuf[1];
  1532. }
  1533. if(max_write > 0)
  1534. exit_status = write_samps(dz->sampbuf[1],max_write,dz);
  1535. return(exit_status);
  1536. }
  1537. /******************************** DO_DOUBLING ********************************/
  1538. /*RWD*/
  1539. #define SAMPLE_T float
  1540. int do_doubling(dataptr dz)
  1541. {
  1542. int exit_status, k, m;
  1543. double now = 0.0, spliceincr, spliceratio, seg_advance = 0;
  1544. int splicelen_samps, seg_samps = 0, samps_left, samps_remain, n;
  1545. int chans = dz->infile->channels, finished = 0;
  1546. SAMPLE_T *obuf = dz->sampbuf[1], *ibuf = dz->sampbuf[0], *sbuf = dz->sampbuf[2], *sbufend;
  1547. SAMPLE_T *obufend = dz->sampbuf[1] + dz->buflen;
  1548. SAMPLE_T *ibufend = dz->sampbuf[0] + dz->buflen, *dnsplic, *upsplic, val;
  1549. SAMPLE_T *splicend, *splicstt;
  1550. dz->tempsize = dz->insams[0];
  1551. if(!dz->vflag[NO_TIME_EXPAND]) {
  1552. for(k = 1; k < dz->iparam[SEG_REPETS]; k++) {
  1553. if((dz->tempsize += dz->insams[0]) < 0) {
  1554. dz->tempsize = INT_MAX;
  1555. break;
  1556. }
  1557. }
  1558. }
  1559. splicelen_samps = round(SPLICEDUR * dz->infile->srate);
  1560. if((splicend = (SAMPLE_T *)malloc(splicelen_samps * chans * sizeof(SAMPLE_T)))==NULL) {
  1561. sprintf(errstr,"Insufficient Memory for end-splice buffer\n");
  1562. return(MEMORY_ERROR);
  1563. }
  1564. if((splicstt = (SAMPLE_T *)malloc(splicelen_samps * chans * sizeof(SAMPLE_T)))==NULL) {
  1565. sprintf(errstr,"Insufficient Memory for start-splice buffer\n");
  1566. return(MEMORY_ERROR);
  1567. }
  1568. memset((char *)splicend,0,splicelen_samps * chans * sizeof(SAMPLE_T));
  1569. memset((char *)splicstt,0,splicelen_samps * chans * sizeof(SAMPLE_T));
  1570. spliceincr = 1.0/(double)splicelen_samps;
  1571. if(dz->brksize[SEG_DUR] == 0) {
  1572. dz->iparam[SEG_DUR] = round(dz->param[SEG_DUR] * dz->infile->srate);
  1573. seg_advance = dz->param[SEG_DUR] - SPLICEDUR;
  1574. seg_samps = dz->iparam[SEG_DUR] - splicelen_samps;
  1575. }
  1576. if((exit_status = read_samps(dz->sampbuf[0],dz))< 0) {
  1577. sprintf(errstr,"Failure to read from input file\n");
  1578. return(SYSTEM_ERROR);
  1579. }
  1580. ibufend = dz->sampbuf[0] + dz->ssampsread;
  1581. samps_left = dz->ssampsread;
  1582. while(samps_left > 0) {
  1583. if(dz->brksize[SEG_DUR] > 0) {
  1584. read_value_from_brktable(now,SEG_DUR, dz);
  1585. dz->iparam[SEG_DUR] = round(dz->param[SEG_DUR] * dz->infile->srate);
  1586. seg_advance = dz->param[SEG_DUR] - SPLICEDUR;
  1587. seg_samps = dz->iparam[SEG_DUR] - splicelen_samps;
  1588. }
  1589. spliceratio = 0.0;
  1590. sbuf = dz->sampbuf[2];
  1591. /* ZERO THE SEGMENT BUFFER */
  1592. memset((char *)sbuf,0,dz->iparam[SEGLEN] * sizeof(SAMPLE_T));
  1593. dnsplic = splicend;
  1594. /* Copy downsplice from previous segment into the segment buffer */
  1595. for(n = 0; n < splicelen_samps; n++) {
  1596. for(m = 0;m < chans; m++)
  1597. *sbuf++ = *dnsplic++;
  1598. }
  1599. sbuf = dz->sampbuf[2];
  1600. /* get upsplice of new segment */
  1601. upsplic = splicstt;
  1602. for(n = 0; n < splicelen_samps; n++) {
  1603. for(m = 0;m < chans; m++) {
  1604. val = (SAMPLE_T)(*ibuf * spliceratio);
  1605. /* store it */
  1606. *upsplic++ = val;
  1607. /* and also add it to new-segment buffer */
  1608. *sbuf = (SAMPLE_T)(val + *sbuf);
  1609. sbuf++;
  1610. ibuf++;
  1611. }
  1612. spliceratio += spliceincr;
  1613. samps_left -= chans;
  1614. if(samps_left <= 0) {
  1615. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0) {
  1616. sprintf(errstr,"Failure to read from input file\n");
  1617. return(SYSTEM_ERROR);
  1618. }
  1619. if((samps_left = dz->ssampsread) == 0) {
  1620. finished = 1;
  1621. break;
  1622. }
  1623. ibuf = dz->sampbuf[0];
  1624. ibufend = ibuf + dz->ssampsread;
  1625. }
  1626. }
  1627. if(finished)
  1628. break;
  1629. /* Copy body of new sement to seg buffer */
  1630. while(n < seg_samps) {
  1631. for(m = 0;m < chans; m++)
  1632. *sbuf++ = *ibuf++;
  1633. if((samps_left -= chans) <= 0) {
  1634. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0) {
  1635. sprintf(errstr,"Failure to read from input file\n");
  1636. return(SYSTEM_ERROR);
  1637. }
  1638. if((samps_left = dz->ssampsread) == 0) {
  1639. finished = 1;
  1640. break;
  1641. }
  1642. ibuf = dz->sampbuf[0];
  1643. ibufend = ibuf + dz->ssampsread;
  1644. }
  1645. n++;
  1646. }
  1647. if(finished)
  1648. break;
  1649. /* this is the COPYING-END of sbuf, prior to last splice */
  1650. sbufend = sbuf;
  1651. /* Do downsplice of new segment */
  1652. spliceratio = 1.0;
  1653. dnsplic = splicend;
  1654. for(n = 0; n < splicelen_samps; n++) {
  1655. spliceratio -= spliceincr;
  1656. for(m = 0;m < chans; m++) {
  1657. val = (SAMPLE_T)(*ibuf * spliceratio);
  1658. /* and store in new-seg buffer */
  1659. *sbuf++ = val;
  1660. /* and in downsplice buffer */
  1661. *dnsplic++ = val;
  1662. ibuf++;
  1663. }
  1664. if((samps_left -= chans) <= 0) {
  1665. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0) {
  1666. sprintf(errstr,"Failure to read from input file\n");
  1667. return(SYSTEM_ERROR);
  1668. }
  1669. if((samps_left = dz->ssampsread) == 0) {
  1670. finished = 1;
  1671. break;
  1672. }
  1673. ibuf = dz->sampbuf[0];
  1674. ibufend = ibuf + dz->ssampsread;
  1675. }
  1676. }
  1677. if(finished)
  1678. break;
  1679. sbuf = sbufend;
  1680. upsplic = splicstt;
  1681. /* Combine upslice with downsplice at end of seg buffer */
  1682. for(n = 0; n < splicelen_samps; n++) {
  1683. for(m = 0;m < chans; m++) {
  1684. *sbuf = (SAMPLE_T)(*sbuf + *upsplic++);
  1685. sbuf++;
  1686. }
  1687. }
  1688. for(k=0;k<dz->iparam[SEG_REPETS];k++) {
  1689. /* at 1st repeat, replace initial start-splice with splice from end of seg to start of seg */
  1690. if(k == 1) {
  1691. sbuf = dz->sampbuf[2];
  1692. dnsplic = splicend;
  1693. upsplic = splicstt;
  1694. for(n = 0; n < splicelen_samps; n++) {
  1695. for(m = 0;m < chans; m++)
  1696. *sbuf++ = (SAMPLE_T)(*dnsplic++ + *upsplic++);
  1697. }
  1698. }
  1699. sbuf = dz->sampbuf[2];
  1700. while(sbuf < sbufend) {
  1701. *obuf++ = *sbuf++;
  1702. if(obuf >= obufend) {
  1703. if((exit_status = write_samps(dz->sampbuf[1],dz->buflen,dz))<0)
  1704. return(exit_status);
  1705. obuf = dz->sampbuf[1];
  1706. }
  1707. }
  1708. }
  1709. if(dz->vflag[NO_TIME_EXPAND]) {
  1710. now += seg_advance * dz->iparam[SEG_REPETS];
  1711. ibuf += seg_samps * chans * (dz->iparam[SEG_REPETS] - 1);
  1712. ibuf -= splicelen_samps * chans;
  1713. while(ibuf > ibufend) {
  1714. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0) {
  1715. sprintf(errstr,"Failure to read from input file\n");
  1716. return(SYSTEM_ERROR);
  1717. }
  1718. if((samps_left = dz->ssampsread) == 0) {
  1719. finished = 1;
  1720. break;
  1721. }
  1722. ibuf -= dz->buflen;
  1723. ibufend = dz->sampbuf[0] + dz->ssampsread;
  1724. }
  1725. } else {
  1726. now += seg_advance;
  1727. }
  1728. if(finished)
  1729. break;
  1730. }
  1731. if((samps_remain = obuf - dz->sampbuf[1]) > 0) {
  1732. if((exit_status = write_samps(dz->sampbuf[1],samps_remain,dz))<0)
  1733. return(exit_status);
  1734. }
  1735. return(FINISHED);
  1736. }
  1737. /******************************** DO_SEQUENCE2 *****************************/
  1738. int do_sequence2(dataptr dz)
  1739. {
  1740. int exit_status = FINISHED, warned = 0;
  1741. double *d, transpos, time, level, kd, frac;
  1742. float *obufptr, *ibufptr, *tbufptr;
  1743. float *tbuffer = dz->sampbuf[dz->infilecnt+2];
  1744. float *obuf = dz->sampbuf[dz->infilecnt];
  1745. int obuflen = dz->lparray[0][dz->infilecnt];
  1746. float *ovflwbuf = dz->sampbuf[dz->infilecnt+1];
  1747. int k, n, outlen, thissamp, last_total_samps_written = 0, max_write = 0, dur;
  1748. int m, c, insno;
  1749. float thisval, nextval;
  1750. double diff, fracval, sum;
  1751. int chans = dz->infile->channels, srate = dz->infile->srate;
  1752. int splicelen = (int)round(dz->param[SEQ_SPLIC] * MS_TO_SECS * dz->infile->srate), this_splicelen, samps_read;
  1753. double spliceincr = 1.0/(double)splicelen, this_spliceincr;
  1754. splicelen *= dz->infile->channels;
  1755. dz->total_samps_written = 0;
  1756. for(n=0;n<dz->infilecnt;n++) {
  1757. if((samps_read = fgetfbufEx(dz->sampbuf[n], dz->insams[n],dz->ifd[n],0)) < 0) {
  1758. sprintf(errstr,"Can't read samples from input soundfile\n");
  1759. return(SYSTEM_ERROR);
  1760. }
  1761. }
  1762. for(d = dz->parray[0]; d < dz->parray[1]; d+=5) {
  1763. tbufptr = tbuffer;
  1764. memset((char *)tbuffer,0,obuflen * sizeof(float));
  1765. insno = (int)*d;
  1766. time = *(d+1);
  1767. transpos = *(d+2);
  1768. level = *(d+3) * dz->param[SEQ_ATTEN];
  1769. dur = (int)round(*(d+4) * dz->infile->srate) * dz->infile->channels;
  1770. ibufptr = dz->sampbuf[insno];
  1771. if(flteq(transpos,1.0)) {
  1772. memcpy((char *)tbuffer,(char *)ibufptr,dz->insams[insno] * sizeof(float));
  1773. tbufptr += dz->insams[insno];
  1774. } else {
  1775. for(c = 0;c <chans;c++)
  1776. *tbufptr++ = *ibufptr++;
  1777. kd = 0.0;
  1778. do {
  1779. kd += transpos;
  1780. k = (int)floor(kd);
  1781. frac = kd - (double)k;
  1782. k *= chans;
  1783. if(k >= dz->insams[insno] + chans)
  1784. break;
  1785. for(m=0;m<chans;m++) {
  1786. thisval = ibufptr[k];
  1787. nextval = ibufptr[k+chans];
  1788. diff = nextval - thisval;
  1789. fracval = diff * frac;
  1790. *tbufptr++ = (float)(thisval + fracval);
  1791. k++;
  1792. }
  1793. } while(k < dz->insams[insno] + chans); /* allows for wraparound point(s) at end */
  1794. }
  1795. if((outlen = tbufptr - tbuffer) > dur) {
  1796. this_splicelen = splicelen;
  1797. if(this_splicelen >= dur) {
  1798. this_splicelen = (dur/chans) - 1;
  1799. this_spliceincr = 1.0/(double)(this_splicelen);
  1800. this_splicelen *= chans;
  1801. } else
  1802. this_spliceincr = spliceincr;
  1803. do_endsplice(tbuffer,dur,this_splicelen,this_spliceincr,dz->infile->channels);
  1804. outlen = dur;
  1805. }
  1806. thissamp = ((int)round(time * srate) * chans) - last_total_samps_written;
  1807. while(thissamp >= obuflen) {
  1808. if((exit_status = write_samps(obuf,obuflen,dz))<0)
  1809. return(exit_status);
  1810. last_total_samps_written = dz->total_samps_written;
  1811. memcpy((char *)obuf,(char *)ovflwbuf,obuflen * sizeof(float));
  1812. memset((char *)ovflwbuf,0,obuflen * sizeof(float));
  1813. max_write = 0;
  1814. thissamp -= obuflen;
  1815. }
  1816. obufptr = obuf + thissamp;
  1817. tbufptr = tbuffer;
  1818. for(n=0;n<outlen;n++) {
  1819. sum = *obufptr + (*tbufptr * level);
  1820. if(!warned && (fabs(sum) > F_MAXSAMP)) {
  1821. print_outwarning_flush("OVERLOAD!!\n");
  1822. warned = 1;
  1823. }
  1824. *obufptr = (float)sum;
  1825. obufptr++;
  1826. tbufptr++;
  1827. }
  1828. if((obufptr - obuf) > max_write)
  1829. max_write = obufptr - obuf;
  1830. }
  1831. if(max_write > 0)
  1832. exit_status = write_samps(obuf,max_write,dz);
  1833. return(exit_status);
  1834. }
  1835. /******************************** DO_ENDSPLICE *****************************/
  1836. void do_endsplice(float *buf,int dur,int splicelen,double spliceincr,int chans)
  1837. {
  1838. int n, startsplice = dur - splicelen;
  1839. int m;
  1840. double thisincr = 1.0 - spliceincr;
  1841. for(n = startsplice; n < dur; n+=chans) {
  1842. for(m=0;m<chans;m++) {
  1843. buf[n+m] = (float)(buf[n+m] * thisincr);
  1844. thisincr -= spliceincr;
  1845. }
  1846. }
  1847. }
  1848. /******************************* ITERATE *****************************/
  1849. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1850. int iterate
  1851. (int cnt,int pass,double *gain,double *pshift,int write_end,int local_write_start,
  1852. int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz)
  1853. {
  1854. int wr_end = 0;
  1855. switch(dz->iparam[ITER_PROCESS]) {
  1856. case(MONO):
  1857. wr_end = iter(cnt,pass,gain,local_write_start,inmsampsize,level,maxsamp,iterating,dz);
  1858. break;
  1859. case(STEREO):
  1860. wr_end = iter_stereo(cnt,pass,gain,local_write_start,inmsampsize,level,maxsamp,iterating,dz);
  1861. break;
  1862. case(MN_INTP_SHIFT):
  1863. wr_end = iter_shift_interp(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,maxsamp,pstep,iterating,dz);
  1864. break;
  1865. case(ST_INTP_SHIFT):
  1866. wr_end = iter_shift_interp_stereo(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,maxsamp,pstep,iterating,dz);
  1867. break;
  1868. case(FIXA_MONO):
  1869. wr_end = fixa_iter(cnt,pass,gain,local_write_start,inmsampsize,level,maxsamp,iterating,dz);
  1870. break;
  1871. case(FIXA_STEREO):
  1872. wr_end = fixa_iter_stereo(cnt,pass,gain,local_write_start,inmsampsize,level,maxsamp,iterating,dz);
  1873. break;
  1874. case(FIXA_MN_INTP_SHIFT):
  1875. wr_end = fixa_iter_shift_interp(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,maxsamp,pstep,iterating,dz);
  1876. break;
  1877. case(FIXA_ST_INTP_SHIFT):
  1878. wr_end = fixa_iter_shift_interp_stereo(cnt,pass,gain,pshift,local_write_start,inmsampsize,level,maxsamp,pstep,iterating,dz);
  1879. break;
  1880. }
  1881. return max(wr_end,write_end);
  1882. }
  1883. /**************************** ITER ***************************/
  1884. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1885. int iter(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz)
  1886. {
  1887. register int i, j = local_write_start;
  1888. float *outbuf = dz->sampbuf[1];
  1889. float *inbuf = dz->sampbuf[0];
  1890. double z;
  1891. double thisgain;
  1892. if(passno == 0) {
  1893. gain[cnt] = get_gain(dz);
  1894. thisgain = gain[cnt];
  1895. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1896. for(i=0; i < inmsampsize; i++) {
  1897. z = outbuf[j] + (inbuf[i] * thisgain * level);
  1898. *maxsamp = max(*maxsamp,fabs(z));
  1899. outbuf[j++] = (float)z;
  1900. }
  1901. } else {
  1902. for(i=0; i < inmsampsize; i++) {
  1903. if(iterating)
  1904. z = outbuf[j] + (inbuf[i] * thisgain);
  1905. else
  1906. z = outbuf[j] + inbuf[i];
  1907. *maxsamp = max(*maxsamp,fabs(z));
  1908. outbuf[j++] = (float)z;
  1909. }
  1910. }
  1911. } else {
  1912. thisgain = gain[cnt];
  1913. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1914. for(i=0; i < inmsampsize; i++) {
  1915. z = outbuf[j] + (inbuf[i] * thisgain * level);
  1916. outbuf[j++] = (float)z;
  1917. }
  1918. } else {
  1919. for(i=0; i < inmsampsize; i++) {
  1920. if(iterating)
  1921. z = outbuf[j] + (inbuf[i] * thisgain);
  1922. else
  1923. z = outbuf[j] + inbuf[i];
  1924. outbuf[j++] = (float)z;
  1925. }
  1926. }
  1927. }
  1928. return(j);
  1929. }
  1930. /**************************** ITER_STEREO ***************************/
  1931. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1932. int iter_stereo(int cnt,int passno, double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz)
  1933. {
  1934. register int i, j = local_write_start, k;
  1935. int n;
  1936. float *outbuf = dz->sampbuf[1];
  1937. float *inbuf = dz->sampbuf[0];
  1938. double z;
  1939. double thisgain;
  1940. if(passno == 0) {
  1941. gain[cnt] = get_gain(dz);
  1942. thisgain = gain[cnt];
  1943. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1944. for(i=0; i < inmsampsize; i++) {
  1945. k = i*dz->infile->channels;
  1946. for(n=0;n<dz->infile->channels;n++) {
  1947. z = outbuf[j] + (inbuf[k++] * thisgain * level);
  1948. *maxsamp = max(*maxsamp,fabs(z));
  1949. outbuf[j++] = (float)z;
  1950. }
  1951. }
  1952. } else {
  1953. for(i=0; i < inmsampsize; i++) {
  1954. k = i*dz->infile->channels;
  1955. for(n=0;n<dz->infile->channels;n++) {
  1956. if(iterating)
  1957. z = outbuf[j] + (inbuf[k++] * thisgain);
  1958. else
  1959. z = outbuf[j] + inbuf[k++];
  1960. *maxsamp = max(*maxsamp,fabs(z));
  1961. outbuf[j++] = (float)z;
  1962. }
  1963. }
  1964. }
  1965. } else {
  1966. thisgain = gain[cnt];
  1967. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  1968. for(i=0; i < inmsampsize; i++) {
  1969. k = i*dz->infile->channels;
  1970. for(n=0;n<dz->infile->channels;n++) {
  1971. z = outbuf[j] + (inbuf[k++] * thisgain * level);
  1972. outbuf[j++] = (float)z;
  1973. }
  1974. }
  1975. } else {
  1976. for(i=0; i < inmsampsize; i++) {
  1977. k = i*dz->infile->channels;
  1978. for(n=0;n<dz->infile->channels;n++) {
  1979. if(iterating)
  1980. z = outbuf[j] + (inbuf[k++] * thisgain);
  1981. else
  1982. z = outbuf[j] + inbuf[k++];
  1983. outbuf[j++] = (float)z;
  1984. }
  1985. }
  1986. }
  1987. }
  1988. return(j);
  1989. }
  1990. /**************************** ITER_SHIFT_INTERP ***************************/
  1991. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  1992. int iter_shift_interp(int cnt,int passno, double *gain,double *pshift,int local_write_start,
  1993. int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz)
  1994. {
  1995. register int i = 0, j = local_write_start;
  1996. double d = 0.0, part = 0.0;
  1997. float val, nextval, diff;
  1998. float *outbuf = dz->sampbuf[1];
  1999. float *inbuf = dz->sampbuf[0];
  2000. double z;
  2001. double thisgain;
  2002. if(passno == 0) {
  2003. gain[cnt] = get_gain(dz);
  2004. thisgain = gain[cnt];
  2005. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2006. while(i < inmsampsize) {
  2007. val = inbuf[i++];
  2008. nextval = inbuf[i];
  2009. diff = nextval - val;
  2010. z = val + ((double)diff * part);
  2011. z = (z * thisgain * level);
  2012. z += outbuf[j];
  2013. // *maxsamp = max(*maxsamp,abs(z));
  2014. *maxsamp = max(*maxsamp,fabs(z));
  2015. outbuf[j++] = (float)z;
  2016. d += dz->param[pstep];
  2017. i = (int)d; /* TRUNCATE */
  2018. part = d - (double)i;
  2019. }
  2020. } else {
  2021. while(i < inmsampsize) {
  2022. val = inbuf[i++];
  2023. nextval = inbuf[i];
  2024. diff = nextval - val;
  2025. z = val + ((double)diff * part);
  2026. if(iterating)
  2027. z = (z * thisgain);
  2028. z += outbuf[j];
  2029. // *maxsamp = max(*maxsamp,abs(z));
  2030. *maxsamp = max(*maxsamp,fabs(z));
  2031. outbuf[j++] = (float)z;
  2032. d += dz->param[pstep];
  2033. i = (int)d; /* TRUNCATE */
  2034. part = d - (double)i;
  2035. }
  2036. }
  2037. pshift[cnt] = get_pshift(dz);
  2038. dz->param[pstep] = pshift[cnt];
  2039. } else {
  2040. thisgain = gain[cnt];
  2041. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2042. while(i < inmsampsize) {
  2043. val = inbuf[i++];
  2044. nextval = inbuf[i];
  2045. diff = nextval - val;
  2046. z = val + ((double)diff * part);
  2047. z = (z * thisgain * level);
  2048. z += outbuf[j];
  2049. outbuf[j++] = (float)z;
  2050. d += dz->param[pstep];
  2051. i = (int)d; /* TRUNCATE */
  2052. part = d - (double)i;
  2053. }
  2054. } else {
  2055. while(i < inmsampsize) {
  2056. val = inbuf[i++];
  2057. nextval = inbuf[i];
  2058. diff = nextval - val;
  2059. z = val + ((double)diff * part);
  2060. if(iterating)
  2061. z = (z * thisgain);
  2062. z += outbuf[j];
  2063. outbuf[j++] = (float)z;
  2064. d += dz->param[pstep];
  2065. i = (int)d; /* TRUNCATE */
  2066. part = d - (double)i;
  2067. }
  2068. }
  2069. dz->param[pstep] = pshift[cnt];
  2070. }
  2071. return(j);
  2072. }
  2073. /*********************** ITER_SHIFT_INTERP_STEREO *************************/
  2074. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  2075. int iter_shift_interp_stereo(int cnt,int passno, double *gain,double *pshift,int local_write_start,
  2076. int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz)
  2077. {
  2078. register int i = 0, j = local_write_start, k;
  2079. int n;
  2080. double d = 0.0, part = 0.0;
  2081. float val, nextval, diff;
  2082. float *outbuf = dz->sampbuf[1];
  2083. float *inbuf = dz->sampbuf[0];
  2084. double z;
  2085. double thisgain;
  2086. if(passno == 0) {
  2087. gain[cnt] = get_gain(dz);
  2088. thisgain = gain[cnt];
  2089. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2090. while(i < inmsampsize) {
  2091. k = i*dz->infile->channels;
  2092. for(n=0;n<dz->infile->channels;n++) {
  2093. val = inbuf[k];
  2094. nextval = inbuf[k+dz->infile->channels];
  2095. diff = nextval - val;
  2096. z = val + ((double)diff * part);
  2097. z = (z * thisgain * level);
  2098. z += outbuf[j];
  2099. // *maxsamp = max(*maxsamp,abs(z));
  2100. *maxsamp = max(*maxsamp,fabs(z));
  2101. outbuf[j++] = (float)z;
  2102. k++;
  2103. }
  2104. d += dz->param[pstep];
  2105. i = (int)d; /* TRUNCATE */
  2106. part = d - (double)i;
  2107. }
  2108. } else {
  2109. while(i < inmsampsize) {
  2110. k = i*dz->infile->channels;
  2111. for(n=0;n<dz->infile->channels;n++) {
  2112. val = inbuf[k];
  2113. nextval = inbuf[k+dz->infile->channels];
  2114. diff = nextval - val;
  2115. z = val + ((double)diff * part);
  2116. if(iterating)
  2117. z = (z * thisgain);
  2118. z += outbuf[j];
  2119. // *maxsamp = max(*maxsamp,abs(z));
  2120. *maxsamp = max(*maxsamp,fabs(z));
  2121. outbuf[j++] = (float)z;
  2122. k++;
  2123. }
  2124. d += dz->param[pstep];
  2125. i = (int)d; /* TRUNCATE */
  2126. part = d - (double)i;
  2127. }
  2128. }
  2129. pshift[cnt] = get_pshift(dz);
  2130. dz->param[pstep] = pshift[cnt];
  2131. } else {
  2132. thisgain = gain[cnt];
  2133. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2134. while(i < inmsampsize) {
  2135. k = i*dz->infile->channels;
  2136. for(n=0;n<dz->infile->channels;n++) {
  2137. val = inbuf[k];
  2138. nextval = inbuf[k+dz->infile->channels];
  2139. diff = nextval - val;
  2140. z = val + ((double)diff * part);
  2141. z = (z * thisgain * level);
  2142. z += outbuf[j];
  2143. outbuf[j++] = (float)z;
  2144. k++;
  2145. }
  2146. d += dz->param[pstep];
  2147. i = (int)d; /* TRUNCATE */
  2148. part = d - (double)i;
  2149. }
  2150. } else {
  2151. while(i < inmsampsize) {
  2152. k = i*dz->infile->channels;
  2153. for(n=0;n<dz->infile->channels;n++) {
  2154. val = inbuf[k];
  2155. nextval = inbuf[k+dz->infile->channels];
  2156. diff = nextval - val;
  2157. z = val + ((double)diff * part);
  2158. if(iterating)
  2159. z = (z * thisgain);
  2160. z += outbuf[j];
  2161. outbuf[j++] = (float)z;
  2162. k++;
  2163. }
  2164. d += dz->param[pstep];
  2165. i = (int)d; /* TRUNCATE */
  2166. part = d - (double)i;
  2167. }
  2168. }
  2169. dz->param[pstep] = pshift[cnt];
  2170. }
  2171. return(j);
  2172. }
  2173. /**************************** FIXA_ITER ***************************/
  2174. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  2175. int fixa_iter(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz)
  2176. {
  2177. register int i, j = local_write_start;
  2178. float *outbuf = dz->sampbuf[1];
  2179. float *inbuf = dz->sampbuf[0];
  2180. double z;
  2181. if(passno ==0) {
  2182. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2183. for(i=0; i < inmsampsize; i++) {
  2184. z = outbuf[j] + (inbuf[i] * level);
  2185. *maxsamp = max(*maxsamp,fabs(z));
  2186. outbuf[j] = (float)z;
  2187. j++;
  2188. }
  2189. } else {
  2190. for(i=0; i < inmsampsize; i++) {
  2191. z = outbuf[j] + inbuf[i];
  2192. *maxsamp = max(*maxsamp,fabs(z));
  2193. outbuf[j] = (float)z;
  2194. j++;
  2195. }
  2196. }
  2197. } else {
  2198. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2199. for(i=0; i < inmsampsize; i++) {
  2200. z = outbuf[j] + (inbuf[i] * level * gain[cnt]);
  2201. outbuf[j] = (float)z;
  2202. j++;
  2203. }
  2204. } else {
  2205. for(i=0; i < inmsampsize; i++) {
  2206. if(iterating)
  2207. z = outbuf[j] + (inbuf[i] * gain[cnt]);
  2208. else
  2209. z = outbuf[j] + inbuf[i];
  2210. outbuf[j] = (float)z;
  2211. j++;
  2212. }
  2213. }
  2214. }
  2215. return(j);
  2216. }
  2217. /**************************** FIXA_ITER_STEREO ***************************/
  2218. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  2219. int fixa_iter_stereo(int cnt,int passno,double *gain,int local_write_start,int inmsampsize,double level,double *maxsamp,int iterating,dataptr dz)
  2220. {
  2221. register int i, j = local_write_start, k;
  2222. int n;
  2223. float *outbuf = dz->sampbuf[1];
  2224. float *inbuf = dz->sampbuf[0];
  2225. double z;
  2226. if(passno == 0) {
  2227. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2228. for(i=0; i < inmsampsize; i++) {
  2229. k = i*dz->infile->channels;
  2230. for(n=0;n<dz->infile->channels;n++) {
  2231. z = outbuf[j] + (inbuf[k++] * level);
  2232. // *maxsamp = max(*maxsamp,abs(z));
  2233. *maxsamp = max(*maxsamp,fabs(z));
  2234. outbuf[j] = (float)z;
  2235. j++;
  2236. }
  2237. }
  2238. } else {
  2239. for(i=0; i < inmsampsize; i++) {
  2240. k = i*dz->infile->channels;
  2241. for(n=0;n<dz->infile->channels;n++) {
  2242. z = outbuf[j] + inbuf[k++];
  2243. // *maxsamp = max(*maxsamp,abs(z));
  2244. *maxsamp = max(*maxsamp,fabs(z));
  2245. outbuf[j] = (float)z;
  2246. j++;
  2247. }
  2248. }
  2249. }
  2250. } else {
  2251. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2252. for(i=0; i < inmsampsize; i++) {
  2253. k = i*dz->infile->channels;
  2254. for(n=0;n<dz->infile->channels;n++) {
  2255. z = outbuf[j] + (inbuf[k++] * level * gain[cnt]);
  2256. outbuf[j] = (float)z;
  2257. j++;
  2258. }
  2259. }
  2260. } else {
  2261. for(i=0; i < inmsampsize; i++) {
  2262. k = i*dz->infile->channels;
  2263. for(n=0;n<dz->infile->channels;n++) {
  2264. if(iterating)
  2265. z = outbuf[j] + (inbuf[k++] * gain[cnt]);
  2266. else
  2267. z = outbuf[j] + inbuf[k++];
  2268. outbuf[j] = (float)z;
  2269. j++;
  2270. }
  2271. }
  2272. }
  2273. }
  2274. return(j);
  2275. }
  2276. /**************************** FIXA_ITER_SHIFT_INTERP ***************************/
  2277. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  2278. int fixa_iter_shift_interp(int cnt,int passno,double *gain,double *pshift,int local_write_start,
  2279. int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz)
  2280. {
  2281. register int i = 0, j = local_write_start;
  2282. double d = 0.0, part = 0.0;
  2283. float val, nextval, diff;
  2284. float *outbuf = dz->sampbuf[1];
  2285. float *inbuf = dz->sampbuf[0];
  2286. double z;
  2287. if(passno == 0) {
  2288. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2289. while(i < inmsampsize) {
  2290. val = inbuf[i++];
  2291. nextval = inbuf[i];
  2292. diff = nextval - val;
  2293. z = val + ((double)diff * part);
  2294. z = (z * level);
  2295. z += outbuf[j];
  2296. *maxsamp = max(*maxsamp,fabs(z));
  2297. outbuf[j++] = (float)z;
  2298. d += dz->param[pstep];
  2299. i = (int)d; /* TRUNCATE */
  2300. part = d - (double)i;
  2301. }
  2302. } else {
  2303. while(i < inmsampsize) {
  2304. val = inbuf[i++];
  2305. nextval = inbuf[i];
  2306. diff = nextval - val;
  2307. z = val + ((double)diff * part);
  2308. z += outbuf[j];
  2309. *maxsamp = max(*maxsamp,fabs(z));
  2310. outbuf[j++] = (float)z;
  2311. d += dz->param[pstep];
  2312. i = (int)d; /* TRUNCATE */
  2313. part = d - (double)i;
  2314. }
  2315. }
  2316. pshift[cnt] = get_pshift(dz);
  2317. } else {
  2318. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2319. while(i < inmsampsize) {
  2320. val = inbuf[i++];
  2321. nextval = inbuf[i];
  2322. diff = nextval - val;
  2323. z = val + ((double)diff * part);
  2324. z = (z * level * gain[cnt]);
  2325. z += outbuf[j];
  2326. outbuf[j++] = (float)z;
  2327. d += dz->param[pstep];
  2328. i = (int)d; /* TRUNCATE */
  2329. part = d - (double)i;
  2330. }
  2331. } else {
  2332. while(i < inmsampsize) {
  2333. val = inbuf[i++];
  2334. nextval = inbuf[i];
  2335. diff = nextval - val;
  2336. z = val + ((double)diff * part);
  2337. if(iterating)
  2338. z = (z * gain[cnt]);
  2339. z += outbuf[j];
  2340. outbuf[j++] = (float)z;
  2341. d += dz->param[pstep];
  2342. i = (int)d; /* TRUNCATE */
  2343. part = d - (double)i;
  2344. }
  2345. }
  2346. }
  2347. dz->param[pstep] = pshift[cnt];
  2348. return(j);
  2349. }
  2350. /*********************** FIXA_ITER_SHIFT_INTERP_STEREO *************************/
  2351. //TW COMPLETELY UPDATED FUNCTION : (flt-converted)
  2352. int fixa_iter_shift_interp_stereo(int cnt,int passno,double *gain,double *pshift,int local_write_start,
  2353. int inmsampsize,double level,double *maxsamp,int pstep,int iterating,dataptr dz)
  2354. {
  2355. register int i = 0, j = local_write_start, k;
  2356. int n;
  2357. double d = 0.0, part = 0.0;
  2358. float val, nextval, diff;
  2359. float *outbuf = dz->sampbuf[1];
  2360. float *inbuf = dz->sampbuf[0];
  2361. double z;
  2362. if(passno == 0) {
  2363. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2364. while(i < inmsampsize) {
  2365. k = i*dz->infile->channels;
  2366. for(n=0;n<dz->infile->channels;n++) {
  2367. val = inbuf[k];
  2368. nextval = inbuf[k+dz->infile->channels];
  2369. diff = nextval - val;
  2370. z = val + ((double)diff * part);
  2371. z = (z * level);
  2372. z += outbuf[j];
  2373. *maxsamp = max(*maxsamp,fabs(z));
  2374. outbuf[j++] = (float)z;
  2375. k++;
  2376. }
  2377. d += dz->param[pstep];
  2378. i = (int)d; /* TRUNCATE */
  2379. part = d - (double)i;
  2380. }
  2381. } else {
  2382. while(i < inmsampsize) {
  2383. k = i*dz->infile->channels;
  2384. for(n=0;n<dz->infile->channels;n++) {
  2385. val = inbuf[k];
  2386. nextval = inbuf[k+dz->infile->channels];
  2387. diff = nextval - val;
  2388. z = val + ((double)diff * part);
  2389. z += outbuf[j];
  2390. *maxsamp = max(*maxsamp,fabs(z));
  2391. outbuf[j++] = (float)z;
  2392. k++;
  2393. }
  2394. d += dz->param[pstep];
  2395. i = (int)d; /* TRUNCATE */
  2396. part = d - (double)i;
  2397. }
  2398. }
  2399. pshift[cnt] = get_pshift(dz);
  2400. } else {
  2401. if(dz->process != ITERATE_EXTEND && dz->vflag[IS_ITER_FADE]) {
  2402. while(i < inmsampsize) {
  2403. k = i*dz->infile->channels;
  2404. for(n=0;n<dz->infile->channels;n++) {
  2405. val = inbuf[k];
  2406. nextval = inbuf[k+dz->infile->channels];
  2407. diff = nextval - val;
  2408. z = val + ((double)diff * part);
  2409. z = (z * level * gain[cnt]);
  2410. z += outbuf[j];
  2411. outbuf[j++] = (float)z;
  2412. k++;
  2413. }
  2414. d += dz->param[pstep];
  2415. i = (int)d; /* TRUNCATE */
  2416. part = d - (double)i;
  2417. }
  2418. } else {
  2419. while(i < inmsampsize) {
  2420. k = i*dz->infile->channels;
  2421. for(n=0;n<dz->infile->channels;n++) {
  2422. val = inbuf[k];
  2423. nextval = inbuf[k+dz->infile->channels];
  2424. diff = nextval - val;
  2425. z = val + ((double)diff * part);
  2426. if(iterating)
  2427. z = (z * gain[cnt]);
  2428. z += outbuf[j];
  2429. outbuf[j++] = (float)z;
  2430. k++;
  2431. }
  2432. d += dz->param[pstep];
  2433. i = (int)d; /* TRUNCATE */
  2434. part = d - (double)i;
  2435. }
  2436. }
  2437. }
  2438. dz->param[pstep] = pshift[cnt];
  2439. return(j);
  2440. }