distorte.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* floatsam version*/
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <structures.h>
  25. #include <tkglobals.h>
  26. #include <globcon.h>
  27. #include <modeno.h>
  28. #include <arrays.h>
  29. #include <distort.h>
  30. #include <cdpmain.h>
  31. #include <stdlib.h>
  32. #include <sfsys.h>
  33. #include <osbind.h>
  34. static int distorte_func(int cyclestart,int cyclend,int current_buf,dataptr dz);
  35. static int distorte_func_crosbuf(int cyclestart,int cyclend,int current_buf,dataptr dz);
  36. static int distorte_rising( int cyclestart,int cyclend,int current_buf,dataptr dz);
  37. static int distorte_falling(int cyclestart,int cyclend,int current_buf,dataptr dz);
  38. static int distorte_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz);
  39. static int distorte_linrise(int cyclestart,int cyclend,int current_buf,dataptr dz);
  40. static int distorte_linfall(int cyclestart,int cyclend,int current_buf,dataptr dz);
  41. static int distorte_lintrof(int cyclestart,int cyclend,int current_buf,dataptr dz);
  42. static int distorte_userdef(int cyclestart,int cyclend,int current_buf,dataptr dz);
  43. static int distorte_rising_troffed( int cyclestart,int cyclend,int current_buf,dataptr dz);
  44. static int distorte_falling_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz);
  45. static int distorte_linrise_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz);
  46. static int distorte_linfall_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz);
  47. static int distorte_rising_bufcross( int cyclestart,int cyclend,int current_buf,dataptr dz);
  48. static int distorte_falling_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  49. static int distorte_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  50. static int distorte_linrise_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  51. static int distorte_linfall_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  52. static int distorte_lintrof_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  53. static int distorte_userdef_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  54. static int distorte_rising_troffed_bufcross( int cyclestart,int cyclend,int current_buf,dataptr dz);
  55. static int distorte_falling_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  56. static int distorte_linrise_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  57. static int distorte_linfall_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz);
  58. static double do_firsthalf_trof(int k,int cyclehlf,dataptr dz);
  59. static double do_lasthalf_trof(int k,int cyclehlf,dataptr dz);
  60. static double do_rising(int k,int cyclelen,dataptr dz);
  61. static double do_falling(int k,int cyclelen,dataptr dz);
  62. static double do_lintrof_firsthalf(int k,int cyclehlf,dataptr dz) ;
  63. static double do_lintrof_lasthalf(int k,int cyclehlf,dataptr dz);
  64. static double do_rising_troffed(int k,int cyclelen,dataptr dz);
  65. static double do_falling_troffed(int k,int cyclelen,dataptr dz);
  66. static double do_linrise_troffed(int k,int cyclelen,dataptr dz);
  67. static double do_linfall_troffed(int k,int cyclelen,dataptr dz);
  68. static int read_from_user_envelope(double *env_val,double table_index,int init,dataptr dz);
  69. /************************** DISTORT_ENV **************************/
  70. int distort_env(int *current_buf,int initial_phase,int *current_pos,int *buffer_overrun,int *cnt,dataptr dz)
  71. {
  72. int exit_status = CONTINUE;
  73. int cyclestart = *current_pos;
  74. float *b = dz->sampbuf[*current_buf];
  75. dz->param[ONE_LESS_TROF] = 1.0 - dz->param[DISTORTE_TROF];
  76. exit_status = get_full_cycle(b,buffer_overrun,current_buf,initial_phase,current_pos,DISTORTE_CYCLECNT,dz);
  77. if(*buffer_overrun)
  78. distorte_func_crosbuf(cyclestart,*current_pos,*current_buf,dz);
  79. else
  80. distorte_func(cyclestart,*current_pos,*current_buf,dz);
  81. (*cnt)++;
  82. return(exit_status);
  83. }
  84. /***************************** GET_FULL_CYCLE *******************************/
  85. int get_full_cycle(float *b,int *buffer_overrun,int *current_buf,int initial_phase,int *current_pos,int cyclecnt_param,dataptr dz)
  86. {
  87. int exit_status;
  88. register int i = *current_pos;
  89. register int n;
  90. switch(initial_phase) {
  91. case(1):
  92. for(n=0;n<dz->iparam[cyclecnt_param];n++) {
  93. while(b[i]>=0.0) {
  94. if(++i >= dz->ssampsread) {
  95. if((exit_status = change_buf(current_buf,buffer_overrun,&b,dz))!=CONTINUE) {
  96. *current_pos = i;
  97. return(exit_status);
  98. }
  99. i = 0;
  100. }
  101. }
  102. while(b[i]<=0.0) {
  103. if(++i >= dz->ssampsread) {
  104. if((exit_status = change_buf(current_buf,buffer_overrun,&b,dz))!=CONTINUE) {
  105. *current_pos = i;
  106. return(exit_status);
  107. }
  108. i = 0;
  109. }
  110. }
  111. }
  112. break;
  113. case(-1):
  114. for(n=0;n<dz->iparam[DISTORTE_CYCLECNT];n++) {
  115. while(b[i]<=0.0) {
  116. if(++i >= dz->ssampsread) {
  117. if((exit_status = change_buf(current_buf,buffer_overrun,&b,dz))!=CONTINUE) {
  118. *current_pos = i;
  119. return(exit_status);
  120. }
  121. i = 0;
  122. }
  123. }
  124. while(b[i]>=0.0) {
  125. if(++i >= dz->ssampsread) {
  126. if((exit_status = change_buf(current_buf,buffer_overrun,&b,dz))!=CONTINUE) {
  127. *current_pos = i;
  128. return(exit_status);
  129. }
  130. i = 0;
  131. }
  132. }
  133. }
  134. break;
  135. }
  136. *current_pos = i;
  137. return(CONTINUE);
  138. }
  139. /***************************** CHANGE_BUF *******************************/
  140. int change_buf(int *current_buf,int *buffer_overrun,float **buf,dataptr dz)
  141. {
  142. int exit_status;
  143. if(dz->samps_left<=0)
  144. return(FINISHED);
  145. if(*buffer_overrun==TRUE) {
  146. sprintf(errstr,"Buffer overflow: cycle(set) too long at %lf secs.\n",
  147. (double)dz->total_samps_read/(double)dz->infile->srate);
  148. return(GOAL_FAILED);
  149. }
  150. *buffer_overrun = TRUE;
  151. *current_buf = !(*current_buf);
  152. *buf = dz->sampbuf[*current_buf];
  153. if((exit_status = read_samps(*buf,dz))<0)
  154. return(exit_status);
  155. return(CONTINUE);
  156. }
  157. /***************************** DISTORTE_FUNC **************************/
  158. int distorte_func(int cyclestart,int cyclend,int current_buf,dataptr dz)
  159. {
  160. switch(dz->mode) {
  161. case(DISTORTE_RISING): return distorte_rising(cyclestart,cyclend,current_buf,dz);
  162. case(DISTORTE_FALLING): return distorte_falling(cyclestart,cyclend,current_buf,dz);
  163. case(DISTORTE_TROFFED): return distorte_troffed(cyclestart,cyclend,current_buf,dz);
  164. case(DISTORTE_LINRISE): return distorte_linrise(cyclestart,cyclend,current_buf,dz);
  165. case(DISTORTE_LINFALL): return distorte_linfall(cyclestart,cyclend,current_buf,dz);
  166. case(DISTORTE_LINTROF): return distorte_lintrof(cyclestart,cyclend,current_buf,dz);
  167. case(DISTORTE_USERDEF): return distorte_userdef(cyclestart,cyclend,current_buf,dz);
  168. case(DISTORTE_RISING_TR): return distorte_rising_troffed(cyclestart,cyclend,current_buf,dz);
  169. case(DISTORTE_FALLING_TR): return distorte_falling_troffed(cyclestart,cyclend,current_buf,dz);
  170. case(DISTORTE_LINRISE_TR): return distorte_linrise_troffed(cyclestart,cyclend,current_buf,dz);
  171. case(DISTORTE_LINFALL_TR): return distorte_linfall_troffed(cyclestart,cyclend,current_buf,dz);
  172. default:
  173. sprintf(errstr,"Unknown case: distorte_func()\n");
  174. return(PROGRAM_ERROR);
  175. }
  176. return(FINISHED); /* NOTREACHED */
  177. }
  178. /**************************** DISTORTE_FUNC_CROSBUF ************************/
  179. int distorte_func_crosbuf(int cyclestart,int cyclend,int current_buf,dataptr dz)
  180. {
  181. switch(dz->mode) {
  182. case(DISTORTE_RISING): return distorte_rising_bufcross( cyclestart,cyclend,current_buf,dz);
  183. case(DISTORTE_FALLING): return distorte_falling_bufcross(cyclestart,cyclend,current_buf,dz);
  184. case(DISTORTE_TROFFED): return distorte_troffed_bufcross(cyclestart,cyclend,current_buf,dz);
  185. case(DISTORTE_LINRISE): return distorte_linrise_bufcross(cyclestart,cyclend,current_buf,dz);
  186. case(DISTORTE_LINFALL): return distorte_linfall_bufcross(cyclestart,cyclend,current_buf,dz);
  187. case(DISTORTE_LINTROF): return distorte_lintrof_bufcross(cyclestart,cyclend,current_buf,dz);
  188. case(DISTORTE_USERDEF): return distorte_userdef_bufcross(cyclestart,cyclend,current_buf,dz);
  189. case(DISTORTE_RISING_TR): return distorte_rising_troffed_bufcross( cyclestart,cyclend,current_buf,dz);
  190. case(DISTORTE_FALLING_TR): return distorte_falling_troffed_bufcross(cyclestart,cyclend,current_buf,dz);
  191. case(DISTORTE_LINRISE_TR): return distorte_linrise_troffed_bufcross(cyclestart,cyclend,current_buf,dz);
  192. case(DISTORTE_LINFALL_TR): return distorte_linfall_troffed_bufcross(cyclestart,cyclend,current_buf,dz);
  193. default:
  194. sprintf(errstr,"Unknown case: distorte_func_crosbuf()\n");
  195. return(PROGRAM_ERROR);
  196. }
  197. return(FINISHED); /* NOTREACHED */
  198. }
  199. /************************** DISTORTE_TROFFED *******************************/
  200. int distorte_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz)
  201. {
  202. register int k = 0, j = cyclestart;
  203. int cyclelen = cyclend - cyclestart;
  204. int cyclehlf = cyclelen/2;
  205. int cyclemid = cyclestart + cyclehlf;
  206. float *b = dz->sampbuf[current_buf];
  207. while(j<cyclemid) {
  208. b[j] = (float)/*ound*/(b[j] * do_firsthalf_trof(k,cyclehlf,dz));
  209. j++;
  210. k++;
  211. }
  212. k = 0;
  213. cyclehlf = cyclelen - cyclehlf;
  214. while(j < cyclend) {
  215. b[j] = (float)/*round*/(b[j] * do_lasthalf_trof(k,cyclehlf,dz));
  216. j++;
  217. k++;
  218. }
  219. return(FINISHED);
  220. }
  221. /*************************** DISTORTE_RISING ******************************/
  222. int distorte_rising(int cyclestart,int cyclend,int current_buf,dataptr dz)
  223. {
  224. register int k = 0, j = cyclestart;
  225. int cyclelen = cyclend - cyclestart;
  226. float *b = dz->sampbuf[current_buf];
  227. while(j<cyclend) {
  228. b[j] = (float)/*round*/((double)b[j] * do_rising(k,cyclelen,dz));
  229. j++;
  230. k++;
  231. }
  232. return(FINISHED);
  233. }
  234. /************************** DISTORTE_FALLING ******************************/
  235. int distorte_falling(int cyclestart,int cyclend,int current_buf,dataptr dz)
  236. {
  237. register int k = 0, j = cyclestart;
  238. int cyclelen = cyclend - cyclestart;
  239. float *b = dz->sampbuf[current_buf];
  240. while(j<cyclend) {
  241. b[j] = (float)/*round*/((double)b[j] * do_falling(k,cyclelen,dz));
  242. j++;
  243. k++;
  244. }
  245. return(FINISHED);
  246. }
  247. /************************* DISTORTE_LINRISE **************************/
  248. int distorte_linrise(int cyclestart,int cyclend,int current_buf,dataptr dz)
  249. {
  250. register int k = 0, j = cyclestart;
  251. double z;
  252. int cyclelen = cyclend - cyclestart;
  253. float *b = dz->sampbuf[current_buf];
  254. while(j<cyclend) {
  255. z = (double)k/(double)cyclelen;
  256. b[j] = (float)/*round*/((double)b[j] * z);
  257. j++;
  258. k++;
  259. }
  260. return(FINISHED);
  261. }
  262. /***************************** DISTORTE_LINFALL ***************************/
  263. int distorte_linfall(int cyclestart,int cyclend,int current_buf,dataptr dz)
  264. {
  265. register int k = 0, j = cyclestart;
  266. double z;
  267. int cyclelen = cyclend - cyclestart;
  268. float *b = dz->sampbuf[current_buf];
  269. while(j<cyclend) {
  270. z = 1.0 - ((double)k/(double)cyclelen);
  271. b[j] = (float)/*round*/((double)b[j] * z);
  272. j++;
  273. k++;
  274. }
  275. return(FINISHED);
  276. }
  277. /****************************** DISTORTE_LINTROF ****************************/
  278. int distorte_lintrof(int cyclestart,int cyclend,int current_buf,dataptr dz)
  279. {
  280. register int k = 0, j = cyclestart;
  281. int cyclelen = cyclend - cyclestart;
  282. int cyclehlf = cyclelen/2;
  283. int cyclemid = cyclestart + cyclehlf;
  284. float *b = dz->sampbuf[current_buf];
  285. while(j<cyclemid) {
  286. b[j] = (float)/*round*/((double)b[j] * do_lintrof_firsthalf(k,cyclehlf,dz));
  287. j++;
  288. k++;
  289. }
  290. k = 0;
  291. cyclehlf = cyclelen - cyclehlf;
  292. while(j < cyclend) {
  293. b[j] = (float)/*round*/((double)b[j] * do_lintrof_lasthalf(k,cyclehlf,dz));
  294. j++;
  295. k++;
  296. }
  297. return(FINISHED);
  298. }
  299. /*************************** DISTORTE_USERDEF ***************************/
  300. int distorte_userdef(int cyclestart,int cyclend,int current_buf,dataptr dz)
  301. {
  302. int exit_status;
  303. register int k = 0, j = cyclestart;
  304. int cyclelen = cyclend - cyclestart;
  305. double index;
  306. double z;
  307. int init = 1;
  308. float *b = dz->sampbuf[current_buf];
  309. while(j<cyclend) {
  310. index = (double)k/(double)cyclelen;
  311. if((exit_status = read_from_user_envelope(&z,index,init,dz))<0)
  312. return(exit_status);
  313. b[j] = (float)/*round*/((double)b[j] * z);
  314. j++;
  315. k++;
  316. init = 0;
  317. }
  318. return(FINISHED);
  319. }
  320. /*************************** DISTORTE_RISING_TROFFED ***********************/
  321. int distorte_rising_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz)
  322. {
  323. register int k = 0, j = cyclestart;
  324. int cyclelen = cyclend - cyclestart;
  325. float *b = dz->sampbuf[current_buf];
  326. while(j<cyclend) {
  327. b[j] = (float) /*round*/((double)b[j] * do_rising_troffed(k,cyclelen,dz));
  328. j++;
  329. k++;
  330. }
  331. return(FINISHED);
  332. }
  333. /********************** DISTORTE_FALLING_TROFFED *************************/
  334. int distorte_falling_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz)
  335. {
  336. register int k = 0, j = cyclestart;
  337. int cyclelen = cyclend - cyclestart;
  338. float *b = dz->sampbuf[current_buf];
  339. while(j<cyclend) {
  340. b[j] = (float)/*round*/((double)b[j] * do_falling_troffed(k,cyclelen,dz));
  341. j++;
  342. k++;
  343. }
  344. return(FINISHED);
  345. }
  346. /************************* DISTORTE_LINRISE_TROFFED **************************/
  347. int distorte_linrise_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz)
  348. {
  349. register int k = 0, j = cyclestart;
  350. int cyclelen = cyclend - cyclestart;
  351. float *b = dz->sampbuf[current_buf];
  352. while(j<cyclend) {
  353. b[j] = (float)/*round*/((double)b[j] * do_linrise_troffed(k,cyclelen,dz));
  354. j++;
  355. k++;
  356. }
  357. return(FINISHED);
  358. }
  359. /*************************** DISTORTE_LINFALL_TROFFED ***************************/
  360. int distorte_linfall_troffed(int cyclestart,int cyclend,int current_buf,dataptr dz)
  361. {
  362. register int k = 0, j = cyclestart;
  363. int cyclelen = cyclend - cyclestart;
  364. float *b = dz->sampbuf[current_buf];
  365. while(j<cyclend) {
  366. b[j] = (float)/*round*/((double)b[j] * do_linfall_troffed(k,cyclelen,dz));
  367. j++;
  368. k++;
  369. }
  370. return(FINISHED);
  371. }
  372. /********************** DISTORTE_TROFFED_BUFCROSS ***************************/
  373. int distorte_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  374. {
  375. int exit_status;
  376. register int k = 0, j = cyclestart;
  377. int overspill;
  378. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  379. int cyclehlf = cyclelen/2;
  380. int cyclemid = cyclestart + cyclehlf;
  381. float *b = dz->sampbuf[!current_buf];
  382. if((overspill = cyclemid - dz->buflen) < 0) { /* CYCLEMID<BUFLEN */
  383. while(j<cyclemid) {
  384. b[j] = (float)/*round*/(b[j] * do_firsthalf_trof(k,cyclehlf,dz));
  385. j++; k++;
  386. }
  387. k = 0;
  388. cyclehlf = cyclelen - cyclehlf;
  389. while(j < dz->buflen) {
  390. b[j] = (float)/*round*/(b[j] * do_lasthalf_trof(k,cyclehlf,dz));
  391. j++; k++;
  392. }
  393. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  394. return(exit_status);
  395. b = dz->sampbuf[current_buf];
  396. j = 0;
  397. } else { /* CYCLEMID >= BUFLEN */
  398. while(j<dz->buflen) {
  399. b[j] = (float)/*round*/(b[j] * do_firsthalf_trof(k,cyclehlf,dz));
  400. j++; k++;
  401. }
  402. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  403. return(exit_status);
  404. b = dz->sampbuf[current_buf];
  405. j = 0;
  406. while(j<overspill) {
  407. b[j] = (float)/*round*/(b[j] * do_firsthalf_trof(k,cyclehlf,dz));
  408. j++; k++;
  409. }
  410. k = 0;
  411. cyclehlf = cyclelen - cyclehlf;
  412. }
  413. while(j < cyclend) {
  414. b[j] = (float)/*round*/(b[j] * do_lasthalf_trof(k,cyclehlf,dz));
  415. j++;
  416. k++;
  417. }
  418. return(FINISHED);
  419. }
  420. /********************** DISTORTE_RISING_BUFCROSS **************************/
  421. int distorte_rising_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  422. {
  423. int exit_status;
  424. register int k = 0, j = cyclestart;
  425. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  426. float *b = dz->sampbuf[!current_buf];
  427. while(j<dz->buflen) {
  428. b[j] = (float)/*round*/((double)b[j] * do_rising(k,cyclelen,dz));
  429. j++;
  430. k++;
  431. }
  432. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  433. return(exit_status);
  434. b = dz->sampbuf[current_buf];
  435. j = 0;
  436. while(j<cyclend) {
  437. b[j] = (float)/*round*/((double)b[j] * do_rising(k,cyclelen,dz));
  438. j++;
  439. k++;
  440. }
  441. return(FINISHED);
  442. }
  443. /******************** DISTORTE_FALLING_BUFCROSS *************************/
  444. int distorte_falling_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  445. {
  446. int exit_status;
  447. register int k = 0, j = cyclestart;
  448. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  449. float *b = dz->sampbuf[!current_buf];
  450. while(j<dz->buflen) {
  451. b[j] = (float)/*round*/((double)b[j] * do_falling(k,cyclelen,dz));
  452. j++;
  453. k++;
  454. }
  455. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  456. return(exit_status);
  457. b = dz->sampbuf[current_buf];
  458. j = 0;
  459. while(j<cyclend) {
  460. b[j] = (float)/*round*/((double)b[j] * do_falling(k,cyclelen,dz));
  461. j++;
  462. k++;
  463. }
  464. return(FINISHED);
  465. }
  466. /********************* DISTORTE_LINRISE_BUFCROSS *************************/
  467. int distorte_linrise_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  468. {
  469. int exit_status;
  470. register int k = 0, j = cyclestart;
  471. double z;
  472. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  473. float *b = dz->sampbuf[!current_buf];
  474. while(j<dz->buflen) {
  475. z = (double)k/(double)cyclelen;
  476. b[j] = (float)/*round*/((double)b[j] * z);
  477. j++;
  478. k++;
  479. }
  480. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  481. return(exit_status);
  482. b = dz->sampbuf[current_buf];
  483. j = 0;
  484. while(j<cyclend) {
  485. z = (double)k/(double)cyclelen;
  486. b[j] = (float)/*round*/((double)b[j] * z);
  487. j++;
  488. k++;
  489. }
  490. return(FINISHED);
  491. }
  492. /********************* DISTORTE_LINFALL_BUFCROSS **************************/
  493. int distorte_linfall_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  494. {
  495. int exit_status;
  496. register int k = 0, j = cyclestart;
  497. double z;
  498. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  499. float *b = dz->sampbuf[!current_buf];
  500. while(j<dz->buflen) {
  501. z = 1.0 - ((double)k/(double)cyclelen);
  502. b[j] = (float)/*round*/((double)b[j] * z);
  503. j++;
  504. k++;
  505. }
  506. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  507. return(exit_status);
  508. b = dz->sampbuf[current_buf];
  509. j = 0;
  510. while(j<cyclend) {
  511. z = 1.0 - ((double)k/(double)cyclelen);
  512. b[j] = (float)/*round*/((double)b[j] * z);
  513. j++;
  514. k++;
  515. }
  516. return(FINISHED);
  517. }
  518. /*********************** DISTORTE_LINTROF_BUFCROSS ****************************/
  519. int distorte_lintrof_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  520. {
  521. int exit_status;
  522. register int k = 0, j = cyclestart;
  523. int overspill;
  524. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  525. int cyclehlf = cyclelen/2;
  526. int cyclemid = cyclestart + cyclehlf;
  527. float *b = dz->sampbuf[!current_buf];
  528. if((overspill = cyclemid - dz->buflen) < 0) { /* CYCLEMID<BUFLEN */
  529. while(j<cyclemid) {
  530. b[j] = (float)/*round*/((double)b[j] * do_lintrof_firsthalf(k,cyclehlf,dz));
  531. j++;
  532. k++;
  533. }
  534. k = 0;
  535. cyclehlf = cyclelen - cyclehlf;
  536. while(j < dz->buflen) {
  537. b[j] = (float)/*round*/((double)b[j] * do_lintrof_lasthalf(k,cyclehlf,dz));
  538. j++;
  539. k++;
  540. }
  541. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  542. return(exit_status);
  543. b = dz->sampbuf[current_buf];
  544. j = 0;
  545. } else { /* CYCLEMID >= BUFLEN */
  546. while(j<dz->buflen) {
  547. b[j] = (float)/*round*/((double)b[j] * do_lintrof_firsthalf(k,cyclehlf,dz));
  548. j++;
  549. k++;
  550. }
  551. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  552. return(exit_status);
  553. b = dz->sampbuf[current_buf];
  554. j = 0;
  555. while(j<overspill) {
  556. b[j] = (float)/*round*/((double)b[j] * do_lintrof_firsthalf(k,cyclehlf,dz));
  557. j++;
  558. k++;
  559. }
  560. k = 0;
  561. cyclehlf = cyclelen - cyclehlf;
  562. }
  563. while(j < cyclend) {
  564. b[j] = (float)/*round*/((double)b[j] * do_lintrof_lasthalf(k,cyclehlf,dz));
  565. j++;
  566. k++;
  567. }
  568. return(FINISHED);
  569. }
  570. /********************** DISTORTE_USERDEF_BUFCROSS **************************/
  571. int distorte_userdef_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  572. {
  573. int exit_status;
  574. register int k = 1, j = cyclestart;
  575. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  576. double index = 0.0;
  577. double z;
  578. int init = 1;
  579. float *b = dz->sampbuf[!current_buf];
  580. while(j<dz->buflen) {
  581. index = (double)k/(double)cyclelen;
  582. if((exit_status = read_from_user_envelope(&z,index,init,dz))<0)
  583. return(exit_status);
  584. b[j] = (float)/*round*/((double)b[j] * z);
  585. j++;
  586. k++;
  587. init = 0;
  588. }
  589. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  590. return(exit_status);
  591. b = dz->sampbuf[current_buf];
  592. j = 0;
  593. while(j<cyclend) {
  594. index = (double)k/(double)cyclelen;
  595. if((exit_status = read_from_user_envelope(&z,index,init,dz))<0)
  596. return(exit_status);
  597. b[j] = (float)/*round*/((double)b[j] * z);
  598. j++;
  599. k++;
  600. }
  601. return(FINISHED);
  602. }
  603. /********************** DISTORTE_RISING_TROFFED_BUFCROSS **************************/
  604. int distorte_rising_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  605. {
  606. int exit_status;
  607. register int k = 0, j = cyclestart;
  608. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  609. float *b = dz->sampbuf[!current_buf];
  610. while(j<dz->buflen) {
  611. b[j] = (float)/*round*/((double)b[j] * do_rising_troffed(k,cyclelen,dz));
  612. j++;
  613. k++;
  614. }
  615. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  616. return(exit_status);
  617. b = dz->sampbuf[current_buf];
  618. j = 0;
  619. while(j<cyclend) {
  620. b[j] = (float)/*round*/((double)b[j] * do_rising_troffed(k,cyclelen,dz));
  621. j++;
  622. k++;
  623. }
  624. return(FINISHED);
  625. }
  626. /******************** DISTORTE_FALLING_TROFFED_BUFCROSS *************************/
  627. int distorte_falling_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  628. {
  629. int exit_status;
  630. register int k = 0, j = cyclestart;
  631. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  632. float *b = dz->sampbuf[!current_buf];
  633. while(j<dz->buflen) {
  634. b[j] = (float)/*round*/((double)b[j] * do_falling_troffed(k,cyclelen,dz));
  635. j++;
  636. k++;
  637. }
  638. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  639. return(exit_status);
  640. b = dz->sampbuf[current_buf];
  641. j = 0;
  642. while(j<cyclend) {
  643. b[j] = (float)/*round*/((double)b[j] * do_falling_troffed(k,cyclelen,dz));
  644. j++;
  645. k++;
  646. }
  647. return(FINISHED);
  648. }
  649. /********************* DISTORTE_LINRISE_TROFFED_BUFCROSS *************************/
  650. int distorte_linrise_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  651. {
  652. int exit_status;
  653. register int k = 0, j = cyclestart;
  654. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  655. float *b = dz->sampbuf[!current_buf];
  656. while(j<dz->buflen) {
  657. b[j] = (float)/*round*/((double)b[j] * do_linrise_troffed(k,cyclelen,dz));
  658. j++;
  659. k++;
  660. }
  661. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  662. return(exit_status);
  663. b = dz->sampbuf[current_buf];
  664. j = 0;
  665. while(j<cyclend) {
  666. b[j] = (float)/*round*/((double)b[j] * do_linrise_troffed(k,cyclelen,dz));
  667. j++;
  668. k++;
  669. }
  670. return(FINISHED);
  671. }
  672. /******************* DISTORTE_LINFALL_TROFFED_BUFCROSS **************************/
  673. int distorte_linfall_troffed_bufcross(int cyclestart,int cyclend,int current_buf,dataptr dz)
  674. {
  675. int exit_status;
  676. register int k = 0, j = cyclestart;
  677. int cyclelen = (cyclend + dz->buflen)- cyclestart;
  678. float *b = dz->sampbuf[!current_buf];
  679. while(j<dz->buflen) {
  680. b[j] = (float)/*round*/((double)b[j] * do_linfall_troffed(k,cyclelen,dz));
  681. j++;
  682. k++;
  683. }
  684. if((exit_status = write_samps(dz->sampbuf[!current_buf],dz->buflen,dz))<0)
  685. return(exit_status);
  686. b = dz->sampbuf[current_buf];
  687. j = 0;
  688. while(j<cyclend) {
  689. b[j] = (float)/*round*/((double)b[j] * do_linfall_troffed(k,cyclelen,dz));
  690. j++;
  691. k++;
  692. }
  693. return(FINISHED);
  694. }
  695. /******************* DO_FIRSTHALF_TROF **************************/
  696. double do_firsthalf_trof(int k,int cyclehlf,dataptr dz)
  697. {
  698. double z = 1.0 - ((double)k/(double)cyclehlf);
  699. z = (pow(z,dz->param[DISTORTE_EXPON]) * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  700. return (z);
  701. }
  702. /******************* DO_LASTHALF_TROF **************************/
  703. double do_lasthalf_trof(int k,int cyclehlf,dataptr dz)
  704. {
  705. double z = (double)k/(double)cyclehlf;
  706. z = (pow(z,dz->param[DISTORTE_EXPON]) * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  707. return(z);
  708. }
  709. /******************* DO_RISING **************************/
  710. double do_rising(int k,int cyclelen,dataptr dz)
  711. {
  712. double z = (double)k/(double)cyclelen;
  713. z = pow(z,dz->param[DISTORTE_EXPON]);
  714. return z;
  715. }
  716. /******************* DO_FALLING **************************/
  717. double do_falling(int k,int cyclelen,dataptr dz)
  718. {
  719. double z = 1.0 - ((double)k/(double)cyclelen);
  720. z = pow(z,dz->param[DISTORTE_EXPON]);
  721. return z;
  722. }
  723. /************************ DO_LINTROF_FIRSTHALF *******************************/
  724. double do_lintrof_firsthalf(int k,int cyclehlf,dataptr dz)
  725. {
  726. double z = 1.0 - ((double)k/(double)cyclehlf);
  727. z = (z * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  728. return z;
  729. }
  730. /************************ DO_LINTROF_LASTHALF *******************************/
  731. double do_lintrof_lasthalf(int k,int cyclehlf,dataptr dz)
  732. {
  733. double z = (double)k/(double)cyclehlf;
  734. z = (z * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  735. return z;
  736. }
  737. /************************ DO_RISING_TROFFED *******************************/
  738. double do_rising_troffed(int k,int cyclelen,dataptr dz)
  739. {
  740. double z = (double)k/(double)cyclelen;
  741. z = pow(z,dz->param[DISTORTE_EXPON]);
  742. z *= dz->param[ONE_LESS_TROF];
  743. z += dz->param[DISTORTE_TROF];
  744. return(z);
  745. }
  746. /************************ DO_FALLING_TROFFED *******************************/
  747. double do_falling_troffed(int k,int cyclelen,dataptr dz)
  748. {
  749. double z = 1.0 - ((double)k/(double)cyclelen);
  750. z = (pow(z,dz->param[DISTORTE_EXPON]) * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  751. return z;
  752. }
  753. /************************ DO_LINRISE_TROFFED *******************************/
  754. double do_linrise_troffed(int k,int cyclelen,dataptr dz)
  755. {
  756. double z = (double)k/(double)cyclelen;
  757. z = (z * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  758. return z;
  759. }
  760. /************************ DO_LINFALL_TROFFED *******************************/
  761. double do_linfall_troffed(int k,int cyclelen,dataptr dz)
  762. {
  763. double z = 1.0 - ((double)k/(double)cyclelen);
  764. z = (z * dz->param[ONE_LESS_TROF]) + dz->param[DISTORTE_TROF];
  765. return z;
  766. }
  767. /************************ READ_FROM_USER_ENVELOPE *******************************/
  768. int read_from_user_envelope(double *env_val,double table_index,int init,dataptr dz)
  769. {
  770. double *p;
  771. double hi_env, lo_env, hi_index, lo_index;
  772. double env;
  773. if(init)
  774. dz->ptr[DISTORTE_ENV] = dz->parray[DISTORTE_ENV];
  775. p = dz->ptr[DISTORTE_ENV];
  776. while(table_index > *p) {
  777. if((p += 2) >= dz->ptr[DISTORTE_ENVEND]) {
  778. sprintf(errstr,"Problem reading user envelope data: read_from_user_envelope()\n");
  779. return(PROGRAM_ERROR);
  780. }
  781. }
  782. if(p != dz->parray[DISTORTE_ENV]) {
  783. hi_env = *(p+1);
  784. hi_index = *p;
  785. lo_env = *(p-1);
  786. lo_index = *(p-2);
  787. env = (double)((table_index - lo_index)/(hi_index - lo_index));
  788. env *= (double)(hi_env - lo_env);
  789. env += (double)lo_env;
  790. } else
  791. env = *(p+1);
  792. dz->ptr[DISTORTE_ENV] = p;
  793. *env_val = env;
  794. return(FINISHED);
  795. }