ap_envel.c 81 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802
  1. /*
  2. * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* floatsam version */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <math.h>
  26. #include <structures.h>
  27. #include <cdpmain.h>
  28. #include <tkglobals.h>
  29. #include <pnames.h>
  30. #include <envel.h>
  31. #include <processno.h>
  32. #include <modeno.h>
  33. #include <globcon.h>
  34. #include <logic.h>
  35. #include <filetype.h>
  36. #include <mixxcon.h>
  37. #include <flags.h>
  38. #include <speccon.h>
  39. #include <arrays.h>
  40. #include <special.h>
  41. #include <formants.h>
  42. #include <sfsys.h>
  43. #include <osbind.h>
  44. #include <srates.h>
  45. //#ifdef unix
  46. #define round(x) lround((x))
  47. //#endif
  48. /********************************************************************************************/
  49. /********************************** FORMERLY IN buffers.c ***********************************/
  50. /********************************************************************************************/
  51. static int do_special_brkpnt_envelling_buffer(dataptr dz);
  52. static int create_pluck_buffers(dataptr dz);
  53. /********************************************************************************************/
  54. /********************************** FORMERLY IN pconsistency.c ******************************/
  55. /********************************************************************************************/
  56. static int setup_envel_windowsize(dataptr dz);
  57. static double get_outfile_wsize_in_msecs(int envwindow_sampsize,dataptr dz);
  58. static void inject_dbl_parameter(int paramno,dataptr dz);
  59. static int setup_endofsndfile_value_if_needed(dataptr dz);
  60. static int create_envsyn_buf(dataptr dz);
  61. /********************************************************************************************/
  62. /********************************** FORMERLY IN specialin.c *********************************/
  63. /********************************************************************************************/
  64. static int read_env_create_file(char *str,dataptr dz);
  65. static int read_createfile_level(char *q,int cnt,dataptr dz);
  66. static int reallocate_create_table_memory(int thissize,dataptr dz);
  67. static int read_envsyn_file(char *str,dataptr dz);
  68. /***************************************************************************************/
  69. /************************************ NEW FUNCTIONS ************************************/
  70. /***************************************************************************************/
  71. //TW UPDATE
  72. static int scale_envelope_data(dataptr dz);
  73. /***************************** ESTABLISH_BUFPTRS_AND_EXTRA_BUFFERS **************************/
  74. int establish_bufptrs_and_extra_buffers(dataptr dz)
  75. {
  76. // int is_spec = FALSE;
  77. dz->extra_bufcnt = -1; /* ENSURE EVERY CASE HAS A PAIR OF ENTRIES !! */
  78. dz->bptrcnt = 0;
  79. dz->bufcnt = 0;
  80. switch(dz->process) {
  81. case(ENV_EXTRACT):
  82. case(ENV_WARPING):
  83. case(ENV_REPLACE):
  84. dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  85. case(ENV_IMPOSE):
  86. switch(dz->mode) {
  87. case(ENV_DB_BRKFILE_IN):
  88. case(ENV_BRKFILE_IN):
  89. dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  90. default:
  91. dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  92. }
  93. break;
  94. //TW NEW CASE
  95. case(ENV_PROPOR):
  96. dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  97. case(ENV_DOVETAILING):
  98. case(ENV_CURTAILING):
  99. case(ENV_SWELL):
  100. case(ENV_ATTACK):
  101. dz->extra_bufcnt = 0; dz->bufcnt = 3; break;
  102. case(ENV_PLUCK):
  103. dz->extra_bufcnt = 0; dz->bufcnt = 5; break;
  104. case(ENV_TREMOL):
  105. //TW NEW CASE
  106. case(TIME_GRID):
  107. dz->extra_bufcnt = 0; dz->bufcnt = 1; break;
  108. case(ENVSYN):
  109. dz->extra_bufcnt = 0; dz->bptrcnt = 1; break;
  110. case(ENV_ENVTOBRK):
  111. case(ENV_ENVTODBBRK):
  112. case(ENV_BRKTOENV):
  113. case(ENV_CREATE):
  114. case(ENV_RESHAPING):
  115. case(ENV_REPLOTTING):
  116. case(ENV_DBBRKTOENV):
  117. case(ENV_DBBRKTOBRK):
  118. case(ENV_BRKTODBBRK):
  119. dz->extra_bufcnt = 0; dz->bufcnt = 0; break;
  120. default:
  121. sprintf(errstr,"Unknown program type [%d] in establish_bufptrs_and_extra_buffers()\n",dz->process);
  122. return(PROGRAM_ERROR);
  123. }
  124. if(dz->extra_bufcnt < 0) {
  125. sprintf(errstr,"bufcnts have not been set: establish_bufptrs_and_extra_buffers()\n");
  126. return(PROGRAM_ERROR);
  127. }
  128. if(dz->process == ENVSYN)
  129. return establish_spec_bufptrs_and_extra_buffers(dz);
  130. return establish_groucho_bufptrs_and_extra_buffers(dz);
  131. }
  132. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  133. int setup_internal_arrays_and_array_pointers(dataptr dz)
  134. {
  135. int n;
  136. dz->ptr_cnt = -1; /* base constructor...process */
  137. dz->array_cnt = -1;
  138. dz->iarray_cnt = -1;
  139. dz->larray_cnt = -1;
  140. switch(dz->process) {
  141. case(ENV_CREATE):
  142. case(ENV_DOVETAILING):
  143. case(ENV_CURTAILING):
  144. case(ENV_SWELL):
  145. case(ENV_ATTACK):
  146. dz->array_cnt = 4; dz->iarray_cnt = 1; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  147. case(ENV_TREMOL):
  148. dz->array_cnt = 1; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  149. case(ENV_EXTRACT):
  150. case(ENV_IMPOSE):
  151. //TW NEW CASE
  152. case(ENV_PROPOR):
  153. case(ENV_REPLACE):
  154. case(ENV_ENVTOBRK):
  155. case(ENV_ENVTODBBRK):
  156. case(ENV_BRKTOENV):
  157. case(ENV_DBBRKTOENV):
  158. case(ENV_DBBRKTOBRK):
  159. case(ENV_BRKTODBBRK):
  160. case(ENV_WARPING):
  161. case(ENV_RESHAPING):
  162. case(ENV_REPLOTTING):
  163. case(ENV_PLUCK):
  164. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  165. //TW NEW CASE
  166. case(TIME_GRID):
  167. dz->array_cnt = 2; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0; break;
  168. case(ENVSYN):
  169. dz->array_cnt = 1; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 2; dz->fptr_cnt = 0; break;
  170. }
  171. /*** WARNING ***
  172. ANY APPLICATION DEALING WITH A NUMLIST INPUT: MUST establish AT LEAST 1 double array: i.e. dz->array_cnt = at least 1
  173. **** WARNING ***/
  174. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  175. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  176. return(PROGRAM_ERROR);
  177. }
  178. if(dz->array_cnt > 0) {
  179. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  180. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  181. return(MEMORY_ERROR);
  182. }
  183. for(n=0;n<dz->array_cnt;n++)
  184. dz->parray[n] = NULL;
  185. }
  186. if(dz->iarray_cnt > 0) {
  187. if((dz->iparray = (int **)malloc(dz->iarray_cnt * sizeof(int *)))==NULL) {
  188. sprintf(errstr,"INSUFFICIENT MEMORY for internal int arrays.\n");
  189. return(MEMORY_ERROR);
  190. }
  191. for(n=0;n<dz->iarray_cnt;n++)
  192. dz->iparray[n] = NULL;
  193. }
  194. if(dz->larray_cnt > 0) {
  195. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  196. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  197. return(MEMORY_ERROR);
  198. }
  199. for(n=0;n<dz->larray_cnt;n++)
  200. dz->lparray[n] = NULL;
  201. }
  202. if(dz->ptr_cnt > 0) {
  203. if((dz->ptr = (double **)malloc(dz->ptr_cnt * sizeof(double *)))==NULL) {
  204. sprintf(errstr,"INSUFFICIENT MEMORY for internal pointer arrays.\n");
  205. return(MEMORY_ERROR);
  206. }
  207. for(n=0;n<dz->ptr_cnt;n++)
  208. dz->ptr[n] = NULL;
  209. }
  210. if(dz->fptr_cnt > 0) {
  211. //TW FIXED
  212. // if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(int *)))==NULL) {
  213. if((dz->fptr = (float **)malloc(dz->fptr_cnt * sizeof(float *)))==NULL) {
  214. sprintf(errstr,"INSUFFICIENT MEMORY for internal float-pointer arrays.\n");
  215. return(MEMORY_ERROR);
  216. }
  217. for(n=0;n<dz->fptr_cnt;n++)
  218. dz->fptr[n] = NULL;
  219. }
  220. return(FINISHED);
  221. }
  222. /****************************** ASSIGN_PROCESS_LOGIC *********************************/
  223. int assign_process_logic(dataptr dz)
  224. {
  225. switch(dz->process) {
  226. case(ENV_DOVETAILING): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  227. case(ENV_CURTAILING): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  228. case(ENV_SWELL): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  229. case(ENV_ATTACK): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  230. case(ENV_ENVTOBRK): setup_process_logic(ENVFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  231. case(ENV_ENVTODBBRK): setup_process_logic(ENVFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  232. case(ENV_BRKTOENV): setup_process_logic(BRKFILES_ONLY, CREATE_ENVFILE, ENVFILE_OUT, dz); break;
  233. case(ENV_WARPING): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  234. case(ENV_RESHAPING):
  235. switch(dz->mode) {
  236. case(ENV_TSTRETCHING):
  237. setup_process_logic(ENVFILES_ONLY, UNEQUAL_ENVFILE, ENVFILE_OUT, dz); break;
  238. default:
  239. setup_process_logic(ENVFILES_ONLY, EQUAL_ENVFILE, ENVFILE_OUT, dz); break;
  240. }
  241. break;
  242. case(ENV_REPLOTTING): setup_process_logic(BRKFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  243. case(ENV_DBBRKTOENV): setup_process_logic(DB_BRKFILES_ONLY, CREATE_ENVFILE, ENVFILE_OUT, dz); break;
  244. case(ENV_DBBRKTOBRK): setup_process_logic(DB_BRKFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  245. case(ENV_BRKTODBBRK): setup_process_logic(BRKFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  246. case(ENV_CREATE):
  247. switch(dz->mode) {
  248. case(ENV_ENVFILE_OUT):
  249. setup_process_logic(NO_FILE_AT_ALL, CREATE_ENVFILE, ENVFILE_OUT, dz); break;
  250. case(ENV_BRKFILE_OUT):
  251. setup_process_logic(NO_FILE_AT_ALL, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  252. default:
  253. sprintf(errstr,"Unknown case for ENV_CREATE in assign_process_logic()\n");
  254. return(PROGRAM_ERROR);
  255. }
  256. break;
  257. case(ENV_EXTRACT):
  258. switch(dz->mode) {
  259. case(ENV_ENVFILE_OUT):
  260. setup_process_logic(SNDFILES_ONLY, EXTRACT_ENVFILE, ENVFILE_OUT, dz); break;
  261. case(ENV_BRKFILE_OUT):
  262. setup_process_logic(SNDFILES_ONLY, TO_TEXTFILE, BRKFILE_OUT, dz); break;
  263. default:
  264. sprintf(errstr,"Unknown case for ENV_EXTRACT in assign_process_logic()\n");
  265. return(PROGRAM_ERROR);
  266. }
  267. break;
  268. //TW NEW CASE
  269. case(ENV_PROPOR):
  270. setup_process_logic(SNDFILE_AND_UNRANGED_BRKFILE, UNEQUAL_SNDFILE, SNDFILE_OUT, dz);
  271. break;
  272. case(ENV_IMPOSE):
  273. switch(dz->mode) {
  274. case(ENV_ENVFILE_IN):
  275. setup_process_logic(SNDFILE_AND_ENVFILE, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  276. case(ENV_SNDFILE_IN):
  277. setup_process_logic(TWO_SNDFILES, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  278. case(ENV_BRKFILE_IN):
  279. setup_process_logic(SNDFILE_AND_UNRANGED_BRKFILE, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  280. case(ENV_DB_BRKFILE_IN):
  281. setup_process_logic(SNDFILE_AND_DB_BRKFILE,UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  282. default:
  283. sprintf(errstr,"Unknown case for ENV_IMPOSE in assign_process_logic()\n");
  284. return(PROGRAM_ERROR);
  285. }
  286. break;
  287. case(ENV_REPLACE):
  288. switch(dz->mode) {
  289. case(ENV_ENVFILE_IN):
  290. setup_process_logic(SNDFILE_AND_ENVFILE, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  291. case(ENV_SNDFILE_IN):
  292. setup_process_logic(TWO_SNDFILES, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  293. case(ENV_BRKFILE_IN):
  294. setup_process_logic(SNDFILE_AND_BRKFILE, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  295. case(ENV_DB_BRKFILE_IN):
  296. setup_process_logic(SNDFILE_AND_DB_BRKFILE,UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  297. default:
  298. sprintf(errstr,"Unknown mode for ENV_REPLACE in assign_process_logic()\n");
  299. return(PROGRAM_ERROR);
  300. }
  301. break;
  302. case(ENV_PLUCK): setup_process_logic(SNDFILES_ONLY, UNEQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  303. case(ENV_TREMOL): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  304. //TW NEW CASE
  305. case(TIME_GRID): setup_process_logic(SNDFILES_ONLY, EQUAL_SNDFILE, SNDFILE_OUT, dz); break;
  306. case(ENVSYN): setup_process_logic(NO_FILE_AT_ALL, CREATE_ENVFILE, ENVFILE_OUT, dz); break;
  307. default:
  308. sprintf(errstr,"Unknown process: assign_process_logic()\n");
  309. return(PROGRAM_ERROR);
  310. break;
  311. }
  312. if(dz->has_otherfile) {
  313. switch(dz->input_data_type) {
  314. case(ALL_FILES):
  315. case(TWO_SNDFILES):
  316. case(SNDFILE_AND_ENVFILE):
  317. case(SNDFILE_AND_BRKFILE):
  318. case(SNDFILE_AND_UNRANGED_BRKFILE):
  319. case(SNDFILE_AND_DB_BRKFILE):
  320. break;
  321. case(MANY_SNDFILES):
  322. if(dz->process==INFO_TIMELIST)
  323. break;
  324. /* fall thro */
  325. default:
  326. sprintf(errstr,"Most processes accepting files with different properties\n"
  327. "can only take 2 sound infiles.\n");
  328. return(PROGRAM_ERROR);
  329. }
  330. }
  331. return(FINISHED);
  332. }
  333. /***************************** SET_LEGAL_INFILE_STRUCTURE **************************
  334. *
  335. * Allows 2nd infile to have different props to first infile.
  336. */
  337. void set_legal_infile_structure(dataptr dz)
  338. {
  339. switch(dz->process) {
  340. case(ENV_IMPOSE):
  341. //TW NEW CASE
  342. case(ENV_PROPOR):
  343. case(ENV_REPLACE):
  344. dz->has_otherfile = TRUE;
  345. break;
  346. default:
  347. dz->has_otherfile = FALSE;
  348. break;
  349. }
  350. }
  351. /***************************************************************************************/
  352. /****************************** FORMERLY IN internal.c *********************************/
  353. /***************************************************************************************/
  354. /****************************** SET_LEGAL_INTERNALPARAM_STRUCTURE *********************************/
  355. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  356. {
  357. int exit_status = FINISHED;
  358. switch(process) {
  359. /* DANGER: if programs with >1 options added!! */
  360. /* comment: these programs have NO options. 1st internal param is a dummy to ensure */
  361. /* ENV_SAMP_WSIZE is always dz->iparam[5] */
  362. case(ENV_CREATE): case(ENV_WARPING): case(ENV_RESHAPING):
  363. case(ENV_IMPOSE): case(ENV_REPLACE): case(ENV_BRKTOENV):
  364. case(ENV_DBBRKTOENV): case(ENV_DBBRKTOBRK): case(ENV_BRKTODBBRK):
  365. //TW + NEW CASE
  366. case(ENV_SWELL): case(ENV_PROPOR):
  367. exit_status = set_internalparam_data("0i",ap); break;
  368. case(ENV_EXTRACT):
  369. switch(mode) {
  370. case(ENV_ENVFILE_OUT): /*DANGER: as above */
  371. exit_status = set_internalparam_data("0i",ap); break;
  372. case(ENV_BRKFILE_OUT): /* as below */
  373. exit_status = set_internalparam_data("i",ap); break;
  374. }
  375. break;
  376. /* comment: these programs have 1 option. No dummy internal param needed. */
  377. case(ENV_REPLOTTING):
  378. case(ENV_DOVETAILING):
  379. case(ENV_CURTAILING):
  380. case(ENV_ENVTOBRK):
  381. case(ENV_ENVTODBBRK):
  382. exit_status = set_internalparam_data("i",ap); break;
  383. /* commrnt: these progs work differently: no problems here!! */
  384. case(ENV_ATTACK): exit_status = set_internalparam_data("id",ap); break;
  385. case(ENV_PLUCK): exit_status = set_internalparam_data("ii",ap); break;
  386. case(ENV_TREMOL): exit_status = set_internalparam_data("",ap); break;
  387. //TW NEW CASE
  388. case(TIME_GRID): exit_status = set_internalparam_data("",ap); break;
  389. case(ENVSYN): exit_status = set_internalparam_data("",ap); break;
  390. default:
  391. sprintf(errstr,"Unknown process in set_legal_internalparam_structure()\n");
  392. return(PROGRAM_ERROR);
  393. }
  394. return(exit_status);
  395. }
  396. /********************************************************************************************/
  397. /********************************** FORMERLY IN specialin.c *********************************/
  398. /********************************************************************************************/
  399. /********************** READ_SPECIAL_DATA ************************/
  400. int read_special_data(char *str,dataptr dz)
  401. {
  402. // int exit_status = FINISHED;
  403. aplptr ap = dz->application;
  404. switch(ap->special_data) {
  405. case(ENV_TRIGGER_RAMP): return read_env_ramp_brk(str,dz);
  406. case(ENV_CREATEFILE): return read_env_create_file(str,dz);
  407. case(ENVSYN_ENVELOPE): return read_envsyn_file(str,dz);
  408. default:
  409. sprintf(errstr,"Unknown special_data type: read_special_data()\n");
  410. return(PROGRAM_ERROR);
  411. }
  412. return(FINISHED); /* NOTREACHED */
  413. }
  414. /************************* READ_ENV_RAMP_BRK *****************************/
  415. int read_env_ramp_brk(char *filename,dataptr dz)
  416. {
  417. // double maxval = 1.0;
  418. // double minval = 0.0;
  419. int arraysize = BIGARRAY;
  420. double *p, lasttime = 0.0;
  421. int istime = TRUE;
  422. int n = 0, final_size;
  423. char temp[200], *q;
  424. FILE *fp;
  425. if((fp = fopen(filename,"r"))==NULL) {
  426. sprintf(errstr,"Failed to open envelope ramp file %s\n",filename);
  427. return(DATA_ERROR);
  428. }
  429. if((dz->rampbrk = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  430. sprintf(errstr,"INSUFFICIENT MEMORY to create ramp array.\n");
  431. return(MEMORY_ERROR);
  432. }
  433. p = dz->rampbrk;
  434. while(fgets(temp,200,fp)!=NULL) { /* READ AND TEST BRKPNT VALS */
  435. q = temp;
  436. while(get_float_from_within_string(&q,p)) {
  437. if(istime) {
  438. if(p!=dz->rampbrk) {
  439. if(*p <= lasttime) {
  440. sprintf(errstr,"Times (%lf & %lf) in ramp brkpntfile %s are not in increasing order.\n",
  441. lasttime,*p,filename);
  442. return(DATA_ERROR);
  443. }
  444. }
  445. lasttime = *p;
  446. } else {
  447. if(*p < 0.0 || *p > 1.0) {
  448. sprintf(errstr,"Brkpntfile value (%lf) out of range (0 - 1)\n",*p);
  449. return(DATA_ERROR);
  450. }
  451. }
  452. istime = !istime;
  453. p++;
  454. if(++n >= arraysize) {
  455. arraysize += BIGARRAY;
  456. if((dz->rampbrk = (double *)realloc((char *)(dz->rampbrk),arraysize * sizeof(double)))==NULL) {
  457. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate ramp array.\n");
  458. return(MEMORY_ERROR);
  459. }
  460. p = dz->rampbrk + n;
  461. }
  462. }
  463. }
  464. if(n < 2) {
  465. sprintf(errstr,"No significant data in ramp brkpnt file %s\n",filename);
  466. return(DATA_ERROR);
  467. }
  468. if(ODD(n)) {
  469. sprintf(errstr,"Data not paired correctly in ramp brkpntfile %s\n",filename);
  470. return(DATA_ERROR);
  471. }
  472. final_size = n;
  473. if(dz->rampbrk[0] != 0.0) { /* Force base-time to zero */
  474. for(n=0;n<final_size;n+=2)
  475. dz->rampbrk[n] -= dz->rampbrk[0];
  476. }
  477. if((dz->rampbrk = (double *)realloc((char *)(dz->rampbrk),final_size * sizeof(double)))==NULL) {
  478. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate ramp array.\n");
  479. return(MEMORY_ERROR);
  480. }
  481. dz->rampbrksize = final_size/2;
  482. return(FINISHED);
  483. }
  484. /************************* READ_ENV_CREATE_FILE *****************************/
  485. int read_env_create_file(char *str,dataptr dz)
  486. {
  487. int exit_status;
  488. int cnt = 0;
  489. double lasttime = 0.0;
  490. int gotlevel = TRUE;
  491. char temp[200], *q, *p;
  492. int arraysize = BIGARRAY;
  493. FILE *fp;
  494. if((fp = fopen(str,"r"))==NULL) {
  495. sprintf(errstr,"Cannot open envelope create file %s\n",str);
  496. return(DATA_ERROR);
  497. }
  498. if((dz->parray[ENV_CREATE_INLEVEL] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  499. sprintf(errstr,"INSUFFICIENT MEMORY to make level data array.\n");
  500. return(MEMORY_ERROR);
  501. }
  502. if((dz->parray[ENV_CREATE_INTIME] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  503. sprintf(errstr,"INSUFFICIENT MEMORY to make time data array.\n");
  504. return(MEMORY_ERROR);
  505. }
  506. if((dz->iparray[ENV_SLOPETYPE] = (int *)malloc(arraysize * sizeof(int)))==NULL) {
  507. sprintf(errstr,"INSUFFICIENT MEMORY to make slope data array.\n");
  508. return(MEMORY_ERROR);
  509. }
  510. while(fgets(temp,200,fp)!=NULL) { /* READ AND TEST BRKPNT VALS */
  511. q = temp;
  512. while(get_word_from_string(&q,&p)) {
  513. if(gotlevel) {
  514. if(*p=='e') {
  515. sprintf(errstr,"Time and (exponential) level out of sequence in createfile.\n");
  516. return(DATA_ERROR);
  517. }
  518. if(sscanf(p,"%lf",&dz->parray[ENV_CREATE_INTIME][cnt])!=1) {
  519. sprintf(errstr,"Cannot read time %d\n",cnt);
  520. return(PROGRAM_ERROR);
  521. }
  522. if(dz->parray[ENV_CREATE_INTIME][cnt] < dz->application->min_special
  523. || dz->parray[ENV_CREATE_INTIME][cnt] > dz->application->max_special) {
  524. sprintf(errstr,"Envelope time out of range %lf - %lf.\n",
  525. dz->application->min_special,dz->application->max_special);
  526. return(DATA_ERROR);
  527. }
  528. if((cnt > 0)
  529. && (dz->parray[ENV_CREATE_INTIME][cnt] <= lasttime + (2.0 * ENV_MIN_WSIZE * MS_TO_SECS))) {
  530. sprintf(errstr,"timegap %lf - %lf is too small.\n",
  531. dz->parray[ENV_CREATE_INTIME][cnt],dz->parray[ENV_CREATE_INTIME][cnt-1]);
  532. return(DATA_ERROR);
  533. }
  534. lasttime = dz->parray[ENV_CREATE_INTIME][cnt];
  535. gotlevel = FALSE;
  536. } else {
  537. switch(*p) {
  538. case('e'): dz->iparray[ENV_SLOPETYPE][cnt] = ENVTYPE_EXP; p++; break;
  539. default: dz->iparray[ENV_SLOPETYPE][cnt] = ENVTYPE_LIN; break;
  540. }
  541. if((exit_status = read_createfile_level(p,cnt,dz))<0)
  542. return(exit_status);
  543. if(++cnt >= arraysize) {
  544. arraysize += BIGARRAY;
  545. if((exit_status = reallocate_create_table_memory(arraysize,dz))<0)
  546. return(exit_status);
  547. }
  548. gotlevel = TRUE;
  549. }
  550. }
  551. }
  552. if(!gotlevel) {
  553. sprintf(errstr,"Levels and Times not correctly paired: read_env_create_file()\n");
  554. return(DATA_ERROR);
  555. }
  556. if(cnt<=0) {
  557. sprintf(errstr,"Failed to read any data from file %s.\n",str);
  558. return(DATA_ERROR);
  559. }
  560. if((exit_status = reallocate_create_table_memory(cnt,dz))<0)
  561. return(exit_status);
  562. dz->itemcnt = cnt;
  563. return(FINISHED);
  564. }
  565. /**************************** READ_CREATEFILE_LEVEL ********************************/
  566. int read_createfile_level(char *q,int cnt,dataptr dz)
  567. {
  568. int exit_status;
  569. int is_a_dB_val = is_dB(q);
  570. if(sscanf(q,"%lf",&(dz->parray[ENV_CREATE_INLEVEL][cnt]))!=1) {
  571. sprintf(errstr,"Cannot read level %d: read_createfile_level()\n",cnt);
  572. return(PROGRAM_ERROR);
  573. }
  574. if(is_a_dB_val) {
  575. if((exit_status = convert_dB_at_or_below_zero_to_gain(&(dz->parray[ENV_CREATE_INLEVEL][cnt])))<0)
  576. return(exit_status);
  577. } else if(dz->parray[ENV_CREATE_INLEVEL][cnt] < dz->application->min_special2
  578. || dz->parray[ENV_CREATE_INLEVEL][cnt] > dz->application->max_special2) {
  579. sprintf(errstr,"Level value %lf out of range\n",dz->parray[ENV_CREATE_INLEVEL][cnt]);
  580. return(DATA_ERROR);
  581. }
  582. if(flteq(dz->parray[ENV_CREATE_INLEVEL][cnt],dz->parray[ENV_CREATE_INLEVEL][cnt-1]))
  583. dz->iparray[ENV_SLOPETYPE][cnt] = ENVTYPE_LIN; /* Force linear interp, for equal levels */
  584. return(FINISHED);
  585. }
  586. /************** REALLOCATE_CREATE_TABLE_MEMORY ***********/
  587. int reallocate_create_table_memory(int thissize,dataptr dz)
  588. {
  589. if((dz->parray[ENV_CREATE_INLEVEL]= (double *)realloc(dz->parray[ENV_CREATE_INLEVEL],thissize * sizeof(double)))==NULL
  590. || (dz->parray[ENV_CREATE_INTIME] = (double *)realloc(dz->parray[ENV_CREATE_INTIME],thissize * sizeof(double)))==NULL
  591. || (dz->iparray[ENV_SLOPETYPE] = (int *)realloc(dz->iparray[ENV_SLOPETYPE],thissize * sizeof(int)))==NULL) {
  592. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate envelope arrays.\n");
  593. return(MEMORY_ERROR);
  594. }
  595. return(FINISHED);
  596. }
  597. /********************************************************************************************/
  598. /********************************** FORMERLY IN preprocess.c ********************************/
  599. /********************************************************************************************/
  600. /****************************** PARAM_PREPROCESS *********************************/
  601. int param_preprocess(dataptr dz)
  602. {
  603. // int exit_status = FINISHED;
  604. switch(dz->process) {
  605. case(ENV_CREATE): case(ENV_EXTRACT): case(ENV_IMPOSE):
  606. case(ENV_REPLACE): case(ENV_ENVTOBRK): case(ENV_ENVTODBBRK):
  607. case(ENV_BRKTOENV): case(ENV_DBBRKTOENV): case(ENV_DBBRKTOBRK):
  608. case(ENV_BRKTODBBRK): case(ENV_WARPING): case(ENV_RESHAPING):
  609. case(ENV_REPLOTTING): case(ENV_DOVETAILING): case(ENV_CURTAILING):
  610. case(ENV_SWELL): case(ENV_ATTACK): case(ENV_PLUCK):
  611. //TW + NEW CASES
  612. case(ENV_TREMOL): case(ENV_PROPOR): case(TIME_GRID):
  613. return envel_preprocess(dz);
  614. case(ENVSYN):
  615. break;
  616. default:
  617. sprintf(errstr,"PROGRAMMING PROBLEM: Unknown process in param_preprocess()\n");
  618. return(PROGRAM_ERROR);
  619. }
  620. return(FINISHED); /* NOTREACHED */
  621. }
  622. /********************************************************************************************/
  623. /********************************** FORMERLY IN procgrou.c **********************************/
  624. /********************************************************************************************/
  625. /**************************** GROUCHO_PROCESS_FILE ****************************/
  626. int groucho_process_file(dataptr dz) /* FUNCTIONS FOUND IN PROCESS.C */
  627. {
  628. int exit_status = FINISHED;
  629. switch(dz->process) {
  630. case(ENV_EXTRACT): case(ENV_IMPOSE): case(ENV_REPLACE):
  631. case(ENV_WARPING): case(ENV_RESHAPING): case(ENV_REPLOTTING):
  632. case(ENV_DOVETAILING): case(ENV_CURTAILING): case(ENV_SWELL):
  633. case(ENV_ATTACK): case(ENV_PLUCK): case(ENV_TREMOL):
  634. //TW NEW CASES
  635. case(ENV_PROPOR): case(TIME_GRID):
  636. display_virtual_time(0L,dz);
  637. break;
  638. }
  639. switch(dz->process) {
  640. case(ENV_CREATE): case(ENV_EXTRACT): case(ENV_IMPOSE): case(ENV_REPLACE):
  641. case(ENV_ENVTOBRK): case(ENV_ENVTODBBRK):
  642. case(ENV_BRKTOENV): case(ENV_DBBRKTOENV): case(ENV_DBBRKTOBRK): case(ENV_BRKTODBBRK):
  643. case(ENV_WARPING): case(ENV_RESHAPING): case(ENV_REPLOTTING):
  644. case(ENV_DOVETAILING): case(ENV_CURTAILING):
  645. case(ENV_SWELL): case(ENV_ATTACK): case(ENV_PLUCK): case(ENV_TREMOL):
  646. //TW NEW CASE
  647. case(ENV_PROPOR):
  648. if((exit_status = process_envelope(dz))<0)
  649. return(exit_status);
  650. break;
  651. //TW NEW CASE
  652. case(TIME_GRID):
  653. if((exit_status = do_grids(dz))<0)
  654. return(exit_status);
  655. break;
  656. case(ENVSYN):
  657. if((exit_status = envsyn(dz))<0)
  658. return(exit_status);
  659. break;
  660. default:
  661. sprintf(errstr,"Unknown case in process_file()\n");
  662. return(PROGRAM_ERROR);
  663. }
  664. return(FINISHED);
  665. }
  666. /********************************************************************************************/
  667. /********************************** FORMERLY IN pconsistency.c ******************************/
  668. /********************************************************************************************/
  669. /****************************** CHECK_PARAM_VALIDITY_AND_CONSISTENCY *********************************/
  670. int check_param_validity_and_consistency(dataptr dz)
  671. {
  672. int exit_status = FINISHED, chans = 0;
  673. int srate = 0;
  674. //TW UPDATE
  675. // handle_pitch_zeros(dz);
  676. switch(dz->process) {
  677. case(ENV_BRKTOENV):
  678. case(ENV_DBBRKTOENV):
  679. if((exit_status = setup_envel_windowsize(dz))<0)
  680. return(exit_status);
  681. dz->infile->srate = round(SECS_TO_MS/dz->outfile->window_size);
  682. dz->infile->channels = 1;
  683. return create_sized_outfile(dz->outfilename,dz);
  684. case(ENV_CREATE):
  685. if((exit_status = setup_envel_windowsize(dz))<0)
  686. return(exit_status);
  687. if(dz->mode == ENV_ENVFILE_OUT) {
  688. dz->infile->srate = round(SECS_TO_MS/dz->outfile->window_size);
  689. dz->infile->channels = 1;
  690. }
  691. return create_sized_outfile(dz->wordstor[0],dz);
  692. case(ENV_EXTRACT):
  693. if((exit_status = setup_envel_windowsize(dz))<0)
  694. return(exit_status);
  695. if(dz->mode == ENV_ENVFILE_OUT) {
  696. chans = dz->infile->channels;
  697. srate = dz->infile->srate;
  698. dz->infile->channels = 1;
  699. dz->infile->srate = round(SECS_TO_MS/dz->outfile->window_size);
  700. }
  701. if((exit_status = create_sized_outfile(dz->wordstor[0],dz))<0)
  702. return(exit_status);
  703. if(dz->mode == ENV_ENVFILE_OUT) {
  704. dz->infile->channels = chans;
  705. dz->infile->srate = srate;
  706. }
  707. break;
  708. //TW + NEW CASE
  709. case(ENV_IMPOSE): case(ENV_REPLACE): case(ENV_PROPOR):
  710. case(ENV_ENVTOBRK): case(ENV_ENVTODBBRK): case(ENV_DBBRKTOBRK):
  711. case(ENV_BRKTODBBRK): case(ENV_WARPING): case(ENV_RESHAPING):
  712. case(ENV_REPLOTTING): case(ENV_DOVETAILING): case(ENV_CURTAILING):
  713. case(ENV_SWELL): case(ENV_ATTACK):
  714. return setup_envel_windowsize(dz);
  715. case(ENVSYN):
  716. if((exit_status = setup_envel_windowsize(dz))<0)
  717. return(exit_status);
  718. dz->infile->srate = round((double)SECS_TO_MS/(double)dz->outfile->window_size);
  719. dz->infile->channels = 1;
  720. if((exit_status = create_sized_outfile(dz->wordstor[0],dz))<0)
  721. return(exit_status);
  722. break;
  723. }
  724. return(FINISHED);
  725. }
  726. /************************* SETUP_ENVEL_WINDOWSIZE *********************
  727. *
  728. * This operation performed here because ENV_SAMP_WSIZE needed for buffer_definition.
  729. */
  730. int setup_envel_windowsize(dataptr dz)
  731. {
  732. int exit_status;
  733. switch(dz->process) {
  734. case(ENV_DBBRKTOBRK):
  735. case(ENV_BRKTODBBRK):
  736. break;
  737. case(ENV_CREATE):
  738. if(dz->mode==ENV_ENVFILE_OUT)
  739. dz->outfile->window_size = (float)dz->param[ENV_WSIZE]; /* 0 buffers */
  740. break;
  741. case(ENV_REPLOTTING):
  742. case(ENVSYN):
  743. dz->outfile->window_size = (float)dz->param[ENV_WSIZE]; /* 0 buffers */
  744. break;
  745. case(ENV_BRKTOENV): /* 0 buffers */
  746. case(ENV_DBBRKTOENV):
  747. dz->outfile->window_size = (float)dz->param[ENV_WSIZE];
  748. break;
  749. case(ENV_ENVTOBRK): /* 0 buffers */
  750. case(ENV_ENVTODBBRK):
  751. inject_dbl_parameter(ENV_WSIZE,dz);
  752. dz->param[ENV_WSIZE] = (double)dz->infile->window_size;
  753. break;
  754. case(ENV_RESHAPING): /* 0 buffers */
  755. inject_dbl_parameter(ENV_WSIZE,dz);
  756. dz->param[ENV_WSIZE] = (double)dz->infile->window_size;
  757. if((exit_status = generate_samp_windowsize(dz->infile,dz)) < 0)
  758. return(exit_status);
  759. dz->outfile->window_size = dz->infile->window_size;
  760. break;
  761. case(ENV_EXTRACT):
  762. if((exit_status = generate_samp_windowsize(dz->infile,dz)) < 0)
  763. return(exit_status);
  764. dz->outfile->window_size =
  765. (float)get_outfile_wsize_in_msecs((int)dz->iparam[ENV_SAMP_WSIZE],dz);
  766. break;
  767. case(ENV_WARPING):
  768. if((exit_status = generate_samp_windowsize(dz->infile,dz))<0)
  769. return(exit_status);
  770. dz->outfile->window_size =
  771. (float)get_outfile_wsize_in_msecs((int)dz->iparam[ENV_SAMP_WSIZE],dz);
  772. break;
  773. //TW NEW CASE
  774. case(ENV_PROPOR):
  775. if(dz->extrabrkno < 0) {
  776. sprintf(errstr,"extrabrkno not established: setup_envel_windowsize()\n");
  777. return(PROGRAM_ERROR);
  778. }
  779. if(dz->brksize[dz->extrabrkno] < 2) {
  780. sprintf(errstr,"Brktable must have at least 2 value-pairs.\n");
  781. return(DATA_ERROR);
  782. }
  783. if((exit_status = scale_envelope_data(dz))<0)
  784. return(exit_status);
  785. dz->iparam[ENV_SAMP_WSIZE] = 0; /* forces default size onto buffers for */
  786. break; /* non-standard brkpnt-applied envelling */
  787. case(ENV_IMPOSE):
  788. switch(dz->mode) {
  789. case(ENV_ENVFILE_IN):
  790. inject_dbl_parameter(ENV_WSIZE,dz);
  791. dz->param[ENV_WSIZE] = (double)dz->otherfile->window_size; /* wsize is derived from 2nd input file */
  792. return generate_samp_windowsize(dz->infile,dz);
  793. case(ENV_SNDFILE_IN):/* wsize is a user input parameter. Apply it to 'otherfile' as that ENV extracted 1st, */
  794. return generate_samp_windowsize(dz->otherfile,dz); /* while 2nd file may have different srate or chans. */
  795. case(ENV_BRKFILE_IN):
  796. case(ENV_DB_BRKFILE_IN):
  797. if(dz->extrabrkno < 0) {
  798. sprintf(errstr,"extrabrkno not established: setup_envel_windowsize()\n");
  799. return(PROGRAM_ERROR);
  800. }
  801. if(dz->brksize[dz->extrabrkno] < 2) {
  802. sprintf(errstr,"Brktable must have at least 2 value-pairs.\n");
  803. return(DATA_ERROR);
  804. }
  805. if((exit_status = setup_endofsndfile_value_if_needed(dz))<0)
  806. return(exit_status);
  807. dz->iparam[ENV_SAMP_WSIZE] = 0; /* forces default size onto buffers for */
  808. break; /* non-standard brkpnt-applied envelling */
  809. default:
  810. sprintf(errstr,"Unknown case for ENV_IMPOSE in setup_envel_windowsize()\n");
  811. return(PROGRAM_ERROR);
  812. }
  813. break;
  814. case(ENV_REPLACE):
  815. switch(dz->mode) {
  816. case(ENV_ENVFILE_IN):
  817. inject_dbl_parameter(ENV_WSIZE,dz);
  818. dz->param[ENV_WSIZE] = (double)dz->otherfile->window_size; /* wsize is derived from 2nd input file */
  819. return generate_samp_windowsize(dz->infile,dz);
  820. case(ENV_SNDFILE_IN): /* wsize is a user input parameter: Apply to 'otherfile' as that ENV extracted 1st, */
  821. return generate_samp_windowsize(dz->otherfile,dz); /* while 2nd file may have different srate or chans */
  822. case(ENV_BRKFILE_IN):
  823. case(ENV_DB_BRKFILE_IN):
  824. if(dz->extrabrkno < 0) {
  825. sprintf(errstr,"extrabrkno not established: setup_envel_windowsize()\n");
  826. return(PROGRAM_ERROR);
  827. }
  828. //DELETED AUGUST 2005
  829. // inject_dbl_parameter(ENV_WSIZE,dz); /* envelling done in standard way */
  830. // dz->param[ENV_WSIZE] = ENV_DEFAULT_WSIZE; /* wsize is set to a default value */
  831. return generate_samp_windowsize(dz->infile,dz);
  832. default:
  833. sprintf(errstr,"Unknown case for ENV_REPLACE in setup_envel_windowsize()\n");
  834. return(PROGRAM_ERROR);
  835. }
  836. break;
  837. case(ENV_CURTAILING):
  838. case(ENV_DOVETAILING):
  839. case(ENV_SWELL):
  840. case(ENV_ATTACK):
  841. dz->iparam[ENV_WSIZE] = 0; /* forces default size onto buffers */
  842. break;
  843. default:
  844. sprintf(errstr,"Unknown case in setup_envel_windowsize()\n");
  845. return(PROGRAM_ERROR);
  846. }
  847. return(FINISHED);
  848. }
  849. /**************************** GENERATE_SAMP_WINDOWSIZE [GENERATE_BLOK] ************************/
  850. int generate_samp_windowsize(fileptr thisfile,dataptr dz)
  851. {
  852. int unadjusted_envwindow_sampsize, j, k, chansecsize;
  853. int channels = thisfile->channels;
  854. int srate = thisfile->srate;
  855. chansecsize = (int)(ENV_FSECSIZE * channels);
  856. unadjusted_envwindow_sampsize = round(dz->param[ENV_WSIZE] * MS_TO_SECS * (double)srate) * channels;
  857. if(unadjusted_envwindow_sampsize < chansecsize) {
  858. k = chansecsize;
  859. while(unadjusted_envwindow_sampsize<k)
  860. k /= 2;
  861. j = k * 2;
  862. if(j - unadjusted_envwindow_sampsize > unadjusted_envwindow_sampsize - k)
  863. dz->iparam[ENV_SAMP_WSIZE] = (int)k;
  864. else
  865. dz->iparam[ENV_SAMP_WSIZE] = (int)j;
  866. } else if(unadjusted_envwindow_sampsize >= chansecsize) {
  867. k = round((double)unadjusted_envwindow_sampsize/(double)chansecsize);
  868. dz->iparam[ENV_SAMP_WSIZE] = (int)(chansecsize * k);
  869. }
  870. return(FINISHED);
  871. }
  872. /************************* GET_OUTFILE_WSIZE_IN_MSECS *********************/
  873. double get_outfile_wsize_in_msecs(int envwindow_sampsize,dataptr dz)
  874. {
  875. double size = (double)(envwindow_sampsize/dz->infile->channels)/(double)dz->infile->srate;
  876. size *= SECS_TO_MS;
  877. return(size);
  878. }
  879. /******************************** INJECT_DBL_PARAMETER *************************/
  880. void inject_dbl_parameter(int paramno,dataptr dz)
  881. {
  882. dz->is_active[paramno] = (char)1;
  883. dz->is_int[paramno] = (char)0;
  884. dz->no_brk[paramno] = (char)1;
  885. }
  886. /***************************** SETUP_ENDOFSNDFILE_VALUE_IF_NEEDED **************************
  887. *
  888. * If envtable longer than sound, curtail to length of sndfile.
  889. * Prevents ridiculously long interpolation vals occuring at end of envfile.
  890. */
  891. int setup_endofsndfile_value_if_needed(dataptr dz)
  892. {
  893. int paramno = dz->extrabrkno;
  894. double lasttime, lastval, nexttime, nextval, timediff, valdiff, timeratio, endval;
  895. double endtime;
  896. double infiledur = (double)(dz->insams[0]/dz->infile->channels)/(double)(dz->infile->srate);
  897. double *startaddr = dz->brk[paramno];
  898. double *endaddr = dz->brk[paramno] + ((dz->brksize[paramno] - 1) * 2);
  899. if(*startaddr >= infiledur - FLTERR) {
  900. sprintf(errstr,"Envelope starts effectively beyond end of sndfile: can't proceed.\n");
  901. return(DATA_ERROR);
  902. }
  903. if((endtime = *endaddr) > infiledur + FLTERR) {
  904. while(endaddr > startaddr) {
  905. endtime = *endaddr;
  906. if(endtime > infiledur+FLTERR)
  907. endaddr -= 2;
  908. else
  909. break;
  910. }
  911. lasttime = *endaddr;
  912. lastval = *(endaddr + 1);
  913. endaddr += 2;
  914. nexttime = *endaddr;
  915. nextval = *(endaddr + 1);
  916. timediff = nexttime - lasttime;
  917. timeratio = (infiledur - lasttime)/timediff;
  918. valdiff = nextval - lastval;
  919. endval = (valdiff * timeratio) + lastval;
  920. *endaddr = infiledur;
  921. *(endaddr+1) = endval;
  922. dz->brksize[paramno] = ((endaddr - startaddr)/2) + 1;
  923. }
  924. return(FINISHED);
  925. }
  926. /********************************************************************************************/
  927. /********************************** FORMERLY IN buffers.c ***********************************/
  928. /********************************************************************************************/
  929. /**************************** ALLOCATE_LARGE_BUFFERS ******************************/
  930. int allocate_large_buffers(dataptr dz)
  931. {
  932. switch(dz->process) {
  933. case(ENV_DOVETAILING): case(ENV_CURTAILING): case(ENV_EXTRACT):
  934. case(ENV_WARPING): case(ENV_IMPOSE): case(ENV_REPLACE):
  935. case(ENV_SWELL): case(ENV_ATTACK):
  936. //TW NEW CASE
  937. case(ENV_PROPOR):
  938. return create_sndbufs_for_envel(dz);
  939. case(ENV_PLUCK):
  940. return create_pluck_buffers(dz);
  941. case(ENV_TREMOL):
  942. //TW NEW CASE
  943. case(TIME_GRID):
  944. return create_sndbufs(dz);
  945. case(ENV_ENVTOBRK): case(ENV_ENVTODBBRK): case(ENV_BRKTOENV):
  946. case(ENV_DBBRKTOENV): case(ENV_DBBRKTOBRK): case(ENV_BRKTODBBRK):
  947. case(ENV_CREATE): case(ENV_RESHAPING): case(ENV_REPLOTTING):
  948. return(FINISHED);
  949. case(ENVSYN):
  950. return create_envsyn_buf(dz);
  951. default:
  952. sprintf(errstr,"Unknown program no. in allocate_large_buffers()\n");
  953. return(PROGRAM_ERROR);
  954. }
  955. return(FINISHED); /* NOTREACHED */
  956. }
  957. /*************************** CREATE_SNDBUFS_FOR_ENVEL **************************
  958. *
  959. * 1) some processes use NO sndfile-buffers: ENV_CREATE: ENV_REPLOTTING: ENV_CONVERTBRK: ENV_CONVERTENV
  960. * 2) some processes have no ENV_SAMP_WSIZE: default set to ZERO, DOVETAILING: CURTAILING.
  961. * 3) Also, ENV_SAMP_WSIZE may be LESS than SECSIZE, but if so,
  962. * will always be a simple fraction thereof (see generate_samp_windowsize()).
  963. */
  964. int create_sndbufs_for_envel(dataptr dz)
  965. {
  966. size_t bigbufsize;
  967. int n;
  968. int bufactor;
  969. if(dz->bufcnt==0) /* Processes with no soundfiles */
  970. return(FINISHED);
  971. if(dz->iparam[ENV_SAMP_WSIZE]==0) { /* Processes which apply brkfiles directly to snd */
  972. if(dz->process != ENV_CURTAILING
  973. && dz->process != ENV_DOVETAILING
  974. && dz->process != ENV_SWELL
  975. && dz->process != ENV_ATTACK
  976. //TW NEW CASE
  977. && dz->process != ENV_PROPOR
  978. && !(dz->process == ENV_IMPOSE && (dz->mode == ENV_BRKFILE_IN || dz->mode == ENV_DB_BRKFILE_IN))) {
  979. sprintf(errstr,"Error in setting ENV_SAMP_WSIZE prior to create_sndbufs_for_envel()\n");
  980. return(PROGRAM_ERROR);
  981. }
  982. if(dz->bufcnt!=3) {
  983. sprintf(errstr,"Insufficient pointers: create_sndbufs_for_envel()\n");
  984. return(PROGRAM_ERROR);
  985. }
  986. return do_special_brkpnt_envelling_buffer(dz);
  987. }
  988. /* All other cases */
  989. bufactor = max((int)dz->iparam[ENV_SAMP_WSIZE],ENV_FSECSIZE); /* 2 */ /* 3 */
  990. if(dz->sbufptr == 0 || dz->sampbuf == 0) {
  991. sprintf(errstr,"buffer pointers not allocated: create_sndbufs_for_envel()\n");
  992. return(PROGRAM_ERROR);
  993. }
  994. bigbufsize = (size_t) Malloc(-1);
  995. bigbufsize /= dz->bufcnt;
  996. dz->buflen = (int)(bigbufsize/sizeof(float));
  997. if((dz->buflen = (dz->buflen/bufactor) * bufactor)<=0) {
  998. dz->buflen = bufactor;
  999. }
  1000. bigbufsize = dz->buflen * sizeof(float);
  1001. if((dz->bigbuf = (float *)malloc((bigbufsize * dz->bufcnt))) == NULL) {
  1002. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1003. return(MEMORY_ERROR);
  1004. }
  1005. for(n=0;n<dz->bufcnt;n++)
  1006. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1007. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1008. return(FINISHED);
  1009. }
  1010. /*************************** DO_SPECIAL_BRKPNT_ENVELLING_BUFFER **************************/
  1011. int do_special_brkpnt_envelling_buffer(dataptr dz)
  1012. {
  1013. size_t bigbufsize;
  1014. size_t fsecsizebytes = ENV_FSECSIZE * sizeof(float);
  1015. size_t extended_buffer_size = (size_t) Malloc(-1);
  1016. extended_buffer_size = (extended_buffer_size/fsecsizebytes) * fsecsizebytes;
  1017. bigbufsize = extended_buffer_size - fsecsizebytes; /* overflow sector */
  1018. dz->buflen = (int)(bigbufsize/sizeof(float));
  1019. if((dz->bigbuf = (float *)malloc(extended_buffer_size)) == NULL) {
  1020. sprintf(errstr, "INSUFFICIENT MEMORY to create sound buffer.\n");
  1021. return(MEMORY_ERROR);
  1022. }
  1023. dz->sbufptr[0] = dz->sampbuf[0] = dz->bigbuf; /* INITIAL POSITION OF buffer start */
  1024. return(FINISHED);
  1025. }
  1026. /*************************** CREATE_PLUCK_BUFFERS ***************************/
  1027. int create_pluck_buffers(dataptr dz)
  1028. {
  1029. size_t bigbufsize;
  1030. int sec_cnt=0, extrasamps;
  1031. int obuf_offset, ibuf_offset;
  1032. int pluklen = dz->iparam[ENV_PLK_WAVELEN] * dz->iparam[ENV_PLK_CYCLEN];
  1033. int shsecsize = ENV_FSECSIZE;
  1034. int fsecsizebytes = ENV_FSECSIZE * sizeof(float);
  1035. if((extrasamps = max(0,pluklen - dz->iparam[ENV_PLK_ENDSAMP])) > 0) {
  1036. if(((sec_cnt = extrasamps/ENV_FSECSIZE) * ENV_FSECSIZE)!=extrasamps)
  1037. sec_cnt++;
  1038. extrasamps = sec_cnt * ENV_FSECSIZE;
  1039. }
  1040. bigbufsize = (size_t)Malloc(-1);
  1041. bigbufsize = (bigbufsize/fsecsizebytes) * fsecsizebytes;
  1042. /*RWD*/
  1043. dz->buflen = (int)(bigbufsize / sizeof(float));
  1044. if(dz->buflen <= 0) {
  1045. sprintf(errstr,"INSUFFICIENT MEMORY for sound buffers.\n");
  1046. return(MEMORY_ERROR);
  1047. }
  1048. dz->buflen += extrasamps;
  1049. if((dz->bigbuf = (float *)Malloc(dz->buflen * sizeof(float)))==NULL) {
  1050. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1051. return(MEMORY_ERROR);
  1052. }
  1053. dz->sampbuf[PLK_BUFEND] = dz->bigbuf + dz->buflen;
  1054. dz->sampbuf[PLK_INITBUF] = dz->bigbuf + extrasamps;
  1055. if((dz->sampbuf[PLK_PLUKEND] = dz->sampbuf[PLK_INITBUF] + dz->iparam[ENV_PLK_ENDSAMP]) >dz->sampbuf[PLK_BUFEND]) {
  1056. sprintf(errstr,"INSUFFICIENT MEMORY: Pluck too long for buffers.\n");
  1057. return(MEMORY_ERROR);
  1058. }
  1059. if((dz->sampbuf[PLK_OUTBUF] = dz->sampbuf[PLK_PLUKEND] - pluklen) < dz->bigbuf) {
  1060. sprintf(errstr,"Problem in buffer arithmetic: create_pluck_buffers(): 1\n");
  1061. return(PROGRAM_ERROR);
  1062. }
  1063. obuf_offset = (dz->sampbuf[PLK_OUTBUF] - dz->bigbuf);
  1064. if(((sec_cnt = obuf_offset/ENV_FSECSIZE) * ENV_FSECSIZE)!=obuf_offset)
  1065. sec_cnt++;
  1066. ibuf_offset = sec_cnt * ENV_FSECSIZE;
  1067. dz->sampbuf[PLK_INBUF] = dz->bigbuf + (ibuf_offset);
  1068. sec_cnt = (dz->sampbuf[PLK_BUFEND] - dz->sampbuf[PLK_OUTBUF]) / shsecsize;
  1069. dz->iparam[ENV_PLK_OBUFLEN] = sec_cnt * shsecsize;
  1070. if(dz->sampbuf[PLK_INBUF] + dz->iparam[ENV_PLK_OBUFLEN] != dz->sampbuf[PLK_BUFEND]) {
  1071. sprintf(errstr,"Problem in buffer arithmetic: create_pluck_buffers(): 2\n");
  1072. return(PROGRAM_ERROR);
  1073. }
  1074. if((dz->iparam[ENV_PLK_OWRAPLEN] = dz->sampbuf[PLK_INBUF] - dz->sampbuf[PLK_OUTBUF])<0) {
  1075. sprintf(errstr,"Problem in buffer arithmetic: create_pluck_buffers(): 3\n");
  1076. return(PROGRAM_ERROR);
  1077. }
  1078. //TW : THIS IS CORRECT: original code was incorrect
  1079. if(dz->iparam[ENV_PLK_OWRAPLEN] >= ENV_FSECSIZE) {
  1080. sprintf(errstr,"Problem in buffer arithmetic: create_pluck_buffers(): 4\n");
  1081. return(PROGRAM_ERROR);
  1082. }
  1083. dz->sampbuf[PLK_OBUFWRAP] = dz->sampbuf[PLK_OUTBUF] + dz->iparam[ENV_PLK_OBUFLEN];
  1084. if(dz->sampbuf[PLK_BUFEND] - dz->sampbuf[PLK_OBUFWRAP] != dz->iparam[ENV_PLK_OWRAPLEN]) {
  1085. sprintf(errstr,"Problem in buffer arithmetic: create_pluck_buffers(): 5\n");
  1086. return(PROGRAM_ERROR);
  1087. }
  1088. memset((char *)dz->bigbuf,0,dz->buflen * sizeof(float));
  1089. return(FINISHED);
  1090. }
  1091. /********************************************************************************************/
  1092. /********************************** FORMERLY IN cmdline.c ***********************************/
  1093. /********************************************************************************************/
  1094. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1095. {
  1096. if (!strcmp(prog_identifier_from_cmdline,"create")) dz->process = ENV_CREATE;
  1097. else if(!strcmp(prog_identifier_from_cmdline,"extract")) dz->process = ENV_EXTRACT;
  1098. else if(!strcmp(prog_identifier_from_cmdline,"impose")) dz->process = ENV_IMPOSE;
  1099. else if(!strcmp(prog_identifier_from_cmdline,"replace")) dz->process = ENV_REPLACE;
  1100. else if(!strcmp(prog_identifier_from_cmdline,"brktoenv")) dz->process = ENV_BRKTOENV;
  1101. else if(!strcmp(prog_identifier_from_cmdline,"envtobrk")) dz->process = ENV_ENVTOBRK;
  1102. else if(!strcmp(prog_identifier_from_cmdline,"envtodb")) dz->process = ENV_ENVTODBBRK;
  1103. else if(!strcmp(prog_identifier_from_cmdline,"warp")) dz->process = ENV_WARPING;
  1104. else if(!strcmp(prog_identifier_from_cmdline,"reshape")) dz->process = ENV_RESHAPING;
  1105. else if(!strcmp(prog_identifier_from_cmdline,"replot")) dz->process = ENV_REPLOTTING;
  1106. else if(!strcmp(prog_identifier_from_cmdline,"dovetail")) dz->process = ENV_DOVETAILING;
  1107. else if(!strcmp(prog_identifier_from_cmdline,"curtail")) dz->process = ENV_CURTAILING;
  1108. else if(!strcmp(prog_identifier_from_cmdline,"dbtoenv")) dz->process = ENV_DBBRKTOENV;
  1109. else if(!strcmp(prog_identifier_from_cmdline,"dbtogain")) dz->process = ENV_DBBRKTOBRK;
  1110. else if(!strcmp(prog_identifier_from_cmdline,"gaintodb")) dz->process = ENV_BRKTODBBRK;
  1111. else if(!strcmp(prog_identifier_from_cmdline,"swell")) dz->process = ENV_SWELL;
  1112. else if(!strcmp(prog_identifier_from_cmdline,"attack")) dz->process = ENV_ATTACK;
  1113. else if(!strcmp(prog_identifier_from_cmdline,"pluck")) dz->process = ENV_PLUCK;
  1114. else if(!strcmp(prog_identifier_from_cmdline,"tremolo")) dz->process = ENV_TREMOL;
  1115. //TW NEW CASES
  1116. else if(!strcmp(prog_identifier_from_cmdline,"scaled")) dz->process = ENV_PROPOR;
  1117. else if(!strcmp(prog_identifier_from_cmdline,"timegrid")) dz->process = TIME_GRID;
  1118. else if(!strcmp(prog_identifier_from_cmdline,"cyclic")) dz->process = ENVSYN;
  1119. else {
  1120. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1121. return(USAGE_ONLY);
  1122. }
  1123. return FINISHED;
  1124. }
  1125. /********************************************************************************************/
  1126. /********************************** FORMERLY IN usage.c *************************************/
  1127. /********************************************************************************************/
  1128. /******************************** USAGE1 ********************************/
  1129. int usage1(void)
  1130. {
  1131. fprintf(stdout,
  1132. "\nUSAGE: envel NAME (mode) (infile) (infile2) outfile parameters:\n"
  1133. "\n"
  1134. "where NAME can be any one of\n"
  1135. "\n"
  1136. " ENVELOPE GENERATION OPERATIONS\n"
  1137. "create cyclic\n"
  1138. "\n"
  1139. " ENVELOPE OPERATION ON A SNDFILE\n"
  1140. "extract impose replace warp\n"
  1141. "tremolo swell attack pluck\n"
  1142. //TW NEW CASES
  1143. "dovetail curtail scaled timegrid\n"
  1144. "\n"
  1145. " ENVELOPE OPERATION ON AN ENVELOPE-FILE\n"
  1146. "reshape\n"
  1147. "envtobrk envtodb\n"
  1148. "\n"
  1149. " ENVELOPE OPERATION ON A BRKPNT (TEXT) FILE\n\n"
  1150. "replot\n"
  1151. "dbtogain gaintodb\n"
  1152. "brktoenv dbtoenv\n"
  1153. "\n"
  1154. "Type 'envel warp' for more info on envel warp.. ETC.\n");
  1155. return(USAGE_ONLY);
  1156. }
  1157. /******************************** USAGE2 ********************************/
  1158. int usage2(char *str)
  1159. {
  1160. if(!strcmp(str,"create")) {
  1161. fprintf(stdout,
  1162. "CREATE AN ENVELOPE.\n\n"
  1163. "USAGE: envel create 1 envfile createfile wsize\n"
  1164. "OR: envel create 2 brkfile createfile\n\n"
  1165. "MODES..\n"
  1166. "1) creates a BINARY envelope file:\n"
  1167. " If you specify starttime > 0,vals from 0 to starttime hold your startlevel.\n"
  1168. "2) creates a (TEXT) BRKPNT file: File starts at time you specify.\n\n"
  1169. "WSIZE window_size (in MS) of envelope to be created.\n"
  1170. " Range (%.0lf - filelen)\n"
  1171. "CREATEFILE is a textfile with the following format:\n"
  1172. " time [e]level time [e]level ......\n"
  1173. "where time-level pairs can be repeated as often as desired.\n"
  1174. "Level is a number between 0 and 1, or a dB value between %.0lfdB and 0dB\n"
  1175. "(you must write 'dB' if you want dB).\n"
  1176. "If preceded by an 'e', envelope rises[falls] exponentially to that level.\n"
  1177. "Default is linear rise[fall].\n\n"
  1178. "Times are in seconds, must increase through the file,\n"
  1179. "and be separated by at least %.3lf secs\n",
  1180. ENV_MIN_WSIZE,MIN_DB_ON_16_BIT,2.0 * ENV_MIN_WSIZE * MS_TO_SECS);
  1181. } else if(!strcmp(str,"extract")) {
  1182. fprintf(stdout,
  1183. "EXTRACT ENVELOPE FROM AN INPUT SOUNDFILE.\n\n"
  1184. "USAGE: envel extract 1 infile outenvfile wsize\n"
  1185. "OR: envel extract 2 infile outbrkfile wsize [-ddatareduce]\n\n"
  1186. "MODE 1 extracts a binary envelope file:\n"
  1187. "MODE 2 extracts a (text) brkpnt file.\n\n"
  1188. "WSIZE window_size (in MS) for scanning envelope: Range (%.0lf - filelen)\n"
  1189. "DATAREDUCE variable determines quantity v. accuracy of data written to brkfile\n"
  1190. " Range(0 - 1)\n",ENV_MIN_WSIZE);
  1191. } else if(!strcmp(str,"impose")) {
  1192. fprintf(stdout,
  1193. "IMPOSE AN ENVELOPE ON AN INPUT SOUNDFILE.\n\n"
  1194. "USAGE: envel impose 1 input_sndfile imposed-sndfile outsndfile wsize\n"
  1195. "USAGE: envel impose 2 input_sndfile imposed-envfile outsndfile\n"
  1196. "USAGE: envel impose 3 input_sndfile imposed-brkfile outsndfile\n"
  1197. "USAGE: envel impose 4 input_sndfile imposed-brkfile-dB outsndfile\n\n"
  1198. "MODE 1 imposes an envelope extracted from another sndfile.\n"
  1199. "MODE 2 imposes an envelope from a binary envelope file.\n"
  1200. "MODE 3 imposes an envelope from a (text) brkpnt file: val range (0 - 1).\n"
  1201. "MODE 4 imposes an envelope from a (text) brkpnt file with dB vals (%.0lf to 0).\n\n"
  1202. "WSIZE window_size (in MS) for scanning envelope: Range (%.0lf - filelen)\n\n"
  1203. "In MODES 1 & 2, the whole sndfile is enveloped.\n"
  1204. "In MODES 3 & 4, brkpnt may start (and end) at any time in file,\n"
  1205. " effectively editing it. Must have at least 2 brkpnt pairs.\n",
  1206. MIN_DB_ON_16_BIT,ENV_MIN_WSIZE);
  1207. } else if(!strcmp(str,"replace")) {
  1208. fprintf(stdout,
  1209. "REPLACE THE EXISTING ENVELOPE OF AN INPUT SOUNDFILE\n"
  1210. " WITH A DIFFERENT ENVELOPE.\n\n"
  1211. "USAGE: envel replace 1 input_sndfile replacing-sndfile outsndfile wsize\n"
  1212. "USAGE: envel replace 2 input_sndfile replacing-envfile outsndfile\n"
  1213. "USAGE: envel replace 3 input_sndfile replacing-brkfile outsndfile\n"
  1214. "USAGE: envel replace 4 input_sndfile replacing-brkfile-dB outsndfile\n\n"
  1215. "MODES:\n"
  1216. "1 replaces envelope with new one extracted from another sndfile.\n"
  1217. "2 replaces envelope with new one from a binary envelope file.\n"
  1218. "3 replaces envelope with new one from (text) brkpnt file: valrange 0-1.\n"
  1219. "4 replaces envelope with new one from (text) brkpnt file in dB (-96 to 0).\n\n"
  1220. "In all cases, the entire sndfile is enveloped\n\n"
  1221. "WSIZE window_size (in MS) for scanning envelope: Range (%.0lf - filelen)\n\n"
  1222. "MODE 1 is especially useful for restoring the amplitude contour of a sound\n"
  1223. "after filtering with time-varying Q-value.\n",ENV_MIN_WSIZE);
  1224. } else if(!strcmp(str,"brktoenv")) {
  1225. fprintf(stdout,
  1226. "CONVERT A (TEXT) BRKPNT ENVELOPE TO A BINARY ENVELOPE FILE.\n\n"
  1227. "USAGE: envel brktoenv inbrkfile outenvfile wsize\n\n"
  1228. "WSIZE window_size (in MS) for scanning envelope: Range (%.0lf - filelen)\n\n"
  1229. "If brkpnt starttime > zero, new envelope will start from zero,\n"
  1230. "holding the brktabel startval as far as first brktable time.\n",ENV_MIN_WSIZE);
  1231. } else if(!strcmp(str,"envtobrk")) {
  1232. fprintf(stdout,
  1233. "CONVERT A BINARY ENVELOPE FILE TO A (TEXT) BRKPNT ENVELOPE.\n\n"
  1234. "USAGE: envel envtobrk inenvfile outbrkfile [-ddatareduce]\n\n"
  1235. "DATAREDUCE variable determines quantity v. accuracy of data written to brkfile.\n"
  1236. " Range(0 - 1)\n");
  1237. } else if(!strcmp(str,"envtodb")) {
  1238. fprintf(stdout,
  1239. "CONVERT A BINARY ENVELOPE FILE TO A (TEXT) BRKPNT ENVELOPE WITH dB VALUES.\n\n"
  1240. "USAGE: envel envtodb inenvfile outbrkfile [-ddatareduce]\n\n"
  1241. "DATAREDUCE variable determines quantity v. accuracy of data written to brkfile.\n"
  1242. " Range(0 - 1)\n");
  1243. } else if(!strcmp(str,"dovetail")){
  1244. fprintf(stdout,
  1245. "DOVETAIL SNDFILE BY ENVELOPING THE START AND END OF IT.\n\n"
  1246. "USAGE:\nenvel dovetail 1 infile outfile infadedur outfadedur intype outtype [-ttimes]\n"
  1247. "OR: \nenvel dovetail 2 infile outfile infadedur outfadedur [-ttimes]\n\n"
  1248. "In mode 2, the dovetail slopes are doubly exponential (steeper).\n\n"
  1249. "INFADE-DUR is duration of start-of-file fade-in.\n"
  1250. "OUTFADE-DUR is duration of end-of-file fade-out.\n"
  1251. " Infade-dur and Outfade-dur must not overlap each another.\n"
  1252. //TW UPDATES
  1253. "INTYPE 0 for linear fade, 1 (default) for exponential fade, at start.\n"
  1254. "OUTTYPE 0 for linear fade, 1 (default) for exponential fade, at end.\n"
  1255. "-t times for fade durations are given in the units....\n"
  1256. " seconds (-t0) samples (-t1), or grouped-samples (-t2)\n");
  1257. } else if(!strcmp(str,"curtail")){
  1258. fprintf(stdout,
  1259. "CURTAIL SNDFILE BY FADING TO ZERO AT SOME TIME WITHIN IT.\n\n"
  1260. "USAGE: envel curtail 1 sndfile outfile fadestart fadeend envtype [-ttimes]\n"
  1261. "OR: envel curtail 2 sndfile outfile fadestart fade-dur envtype [-ttimes]\n"
  1262. "OR: envel curtail 3 sndfile outfile fadestart envtype [-ttimes]\n\n"
  1263. "OR: envel curtail 4 sndfile outfile fadestart fadeend [-ttimes]\n"
  1264. "OR: envel curtail 5 sndfile outfile fadestart fade-dur [-ttimes]\n"
  1265. "OR: envel curtail 6 sndfile outfile fadestart [-ttimes]\n\n"
  1266. "MODES 4-6 produce doubly exponential (steeper) editing slope.\n\n"
  1267. "FADESTART is start-time of fade.\n"
  1268. "FADEEND is end-time of fade. (In MODE 3, assumed to be endtime of origsnd).\n"
  1269. "FADE-DUR is duration of fade-out.\n"
  1270. "ENVTYPE 0 for linear fade, 1 (default) for exponential fade.\n"
  1271. "-t TIMES for fade start, end or duration are given in the units....\n"
  1272. " seconds (-t0) samples (-t1), or grouped-samples (-t2)\n");
  1273. } else if(!strcmp(str,"warp")) {
  1274. fprintf(stdout,
  1275. "WARP THE ENVELOPE OF AN SOUNDFILE\n\n"
  1276. "envel warp 1-12 sndfile outsndfile wsize various_params\n"
  1277. "envel warp 13 sndfile outsndfile rampfile wsize various_params\n"
  1278. "envel warp 14-15 sndfile outsndfile wsize various_params\n\n"
  1279. "where MODE NUMBERS stand for are....\n"
  1280. "1 NORMALISE 5 LIFT 9 INVERT 13 TRIGGER\n"
  1281. "2 REVERSE 6 TIMESTRETCH 10 LIMIT 14 CEILING\n"
  1282. "3 EXAGGERATE 7 FLATTEN 11 CORRUGATE 15 DUCKED\n"
  1283. "4 ATTENUATE 8 GATE 12 EXPAND \n\n"
  1284. "WSIZE is duration of enveloping window, in MS.\n\n"
  1285. "for more info on MODES, and their 'various_params', type e.g.:\n"
  1286. " 'envel warp normalise' for more info on 'normalise' option... etc\n");
  1287. } else if(!strcmp(str,"reshape")) {
  1288. fprintf(stdout,
  1289. "WARP THE ENVELOPE IN A BINARY ENVELOPE FILE\n\n"
  1290. "envel reshape 1-12 envfile outenvfile various_params\n"
  1291. "envel reshape 13 envfile outenvfile rampfile various_params\n"
  1292. "envel reshape 14-15 envfile outenvfile various_params\n\n"
  1293. "where MODE NUMBERS stand for are....\n"
  1294. "1 NORMALISE 5 LIFT 9 INVERT 13 TRIGGER\n"
  1295. "2 REVERSE 6 TIMESTRETCH 10 LIMIT 14 CEILING\n"
  1296. "3 EXAGGERATE 7 FLATTEN 11 CORRUGATE 15 DUCKED\n"
  1297. "4 ATTENUATE 8 GATE 12 EXPAND \n\n"
  1298. "for more info on MODES, and their 'various_params', type e.g.:\n"
  1299. " 'envel reshape normalise' for more info on 'normalise' option... etc\n");
  1300. } else if(!strcmp(str,"replot")) {
  1301. fprintf(stdout,
  1302. "WARP THE ENVELOPE IN A (TEXT) BRKPNT ENVELOPE FILE\n\n"
  1303. "envel replot 1-12 brkfile outbrkfile wsize various_params [-dreduce]\n"
  1304. "envel replot 13 brkfile outbrkfile rampfile wsize various_params [-dreduce]\n"
  1305. "envel replot 14-15 brkfile outbrkfile wsize various_params [-dreduce]\n\n"
  1306. "where MODE NUMBERS stand for are....\n"
  1307. "1 NORMALISE 5 LIFT 9 INVERT 13 TRIGGER\n"
  1308. "2 REVERSE 6 TIMESTRETCH 10 LIMIT 14 CEILING\n"
  1309. "3 EXAGGERATE 7 FLATTEN 11 CORRUGATE 15 DUCKED\n"
  1310. "4 ATTENUATE 8 GATE 12 EXPAND \n\n"
  1311. "WSIZE is duration of enveloping window, in MS.\n"
  1312. "REDUCE forces interpolation of data in brkpnt outfile\n"
  1313. " to reduce unnecessary data output: Range(0-1).\n\n"
  1314. "for more info on MODES, and their 'various_params', type e.g.:\n"
  1315. " 'envel replot normalise' for more info on 'normalise' option... etc\n"
  1316. "NB: TRIGGER works better using reshape or warp.\n");
  1317. } else if(!strcmp(str,"dbtoenv")) {
  1318. fprintf(stdout,
  1319. "CONVERT A (TEXT) BRKPNT FILE WITH VALS IN dB TO AN ENVELOPE FILE\n\n"
  1320. "envel dbtoenv db_brkfile outenvfile wsize\n\n"
  1321. "WSIZE is duration of enveloping window, in MS.\n");
  1322. } else if(!strcmp(str,"dbtogain")) {
  1323. fprintf(stdout,
  1324. "CONVERT A (TEXT) BRKPNT FILE WITH dB VALS TO GAIN VALS\n\n"
  1325. "envel dbtogain db_brkfile outbrkfile\n");
  1326. } else if(!strcmp(str,"gaintodb")) {
  1327. fprintf(stdout,
  1328. "CONVERT A (TEXT) BRKPNT FILE WITH GAIN VALS TO dB VALS\n\n"
  1329. "envel gaintodb brkfile out_db_brkfile\n");
  1330. } else if(!strcmp(str,"swell")) {
  1331. fprintf(stdout,
  1332. "CAUSE SOUND TO FADE IN TO AND OUT FROM A PEAK MOMENT\n\n"
  1333. "envel swell infile outfile peaktime peaktype\n\n"
  1334. "PEAKTYPE: 0 linear: 1 (default) exponential\n");
  1335. } else if(!strcmp(str,"attack")) {
  1336. fprintf(stdout,
  1337. "EMPHASIZE THE ATTACK OF A SOUND\n\n"
  1338. "envel attack 1 infile outfile gate gain onset decay [-tenvtype]\n"
  1339. "envel attack 2 infile outfile time gain onset decay [-tenvtype]\n"
  1340. "envel attack 3 infile outfile time gain onset decay [-tenvtype]\n"
  1341. "envel attack 4 infile outfile gain onset decay [-tenvtype]\n\n"
  1342. "MODES ARE:\n"
  1343. "1) Set attack point where snd level first exceeds gate-level.\n"
  1344. "2) attack point at max level around your approx-time (+- %.0lf MS)\n"
  1345. "3) attack point at your exact-time.\n"
  1346. "4) attack point at maxlevel in sndfile.\n\n"
  1347. "GAIN: Amplification of attack point\n"
  1348. "GATE: Level for attack point to be recognised: Range(0 - 1)\n"
  1349. "TIME: Time (approx or exact) of attack point,in secs.\n"
  1350. "ONSET: Attack onset duration (MS): Range(%.0lf to %.0lf)\n"
  1351. "DECAY: Attack decay duration (MS): Range(%.0lf to <infiledur)\n"
  1352. "ENVTYPE: 0 linear: 1 exponential(default).\n",
  1353. ENV_ATK_SRCH,ENV_MIN_ATK_ONSET,ENV_MAX_ATK_ONSET,ENV_MIN_ATK_ONSET);
  1354. } else if(!strcmp(str,"pluck")) {
  1355. fprintf(stdout,
  1356. "PLUCK START OF SOUND (MONO FILES ONLY)\n\n"
  1357. "envel pluck infile outfile startsamp wavelen [-aatkcycles] [-ddecayrate]\n\n"
  1358. "STARTSAMP Sample, in src sound, at which pluck will END:\n"
  1359. " must be a sample AT A ZERO_CROSSING...\n"
  1360. "WAVELEN no of (absolute) samples in pluck wavelen: \n"
  1361. " should be same as src_signal's wavelen immediately after STARTSAMP\n"
  1362. "ATKCYCLES no of wavecycles in pluck-attack : Range(%.0lf - %.0lf) (Default %.0lf)\n"
  1363. "DECAYRATE rate of decay of the pluck_attack: Range(%.0lf - %.0lf) (Default %.0lf)\n",
  1364. ENV_PLK_CYCLEN_MIN,ENV_PLK_CYCLEN_MAX,ENV_PLK_CYCLEN_DEFAULT,
  1365. ENV_PLK_DECAY_MIN,ENV_PLK_DECAY_MAX,ENV_PLK_DECAY_DEFAULT);
  1366. } else if(!strcmp(str,"tremolo")) {
  1367. fprintf(stdout,
  1368. "TREMOLO A SOUND\n\n"
  1369. "USAGE: envel tremolo mode infile outfile frq depth gain\n\n"
  1370. "MODES:\n"
  1371. "1) Interpolate linearly between frqs in any frq brktable (default).\n"
  1372. "2) Interpolate logarithmically (like pitch). (Care with zero frqs).\n\n"
  1373. "FRQ frequency of tremolo (0 - %.0lf) \n"
  1374. "DEPTH depth of tremolo: Range(0 to 1: default %.3lf)\n"
  1375. "GAIN Overall signal gain, or envelope: Range(0 to 1: default 1)\n\n"
  1376. "Frq, Depth and Gain may vary over time.\n",ENV_TREM_MAXFRQ,ENV_TREM_DEFAULT_DEPTH);
  1377. //TW NEW CASES
  1378. } else if(!strcmp(str,"scaled")) {
  1379. fprintf(stdout,
  1380. "IMPOSE AN ENVELOPE ON AN INPUT SOUNDFILE, SCALING IT TIMEWISE TO SOUND'S DURATION.\n\n"
  1381. "USAGE: envel scaled input_sndfile imposed-brkfile outsndfile\n\n"
  1382. "Must have at least 2 brkpnt pairs.\n");
  1383. } else if(!strcmp(str,"timegrid")) {
  1384. fprintf(stdout,
  1385. "PARTITION SOUNDFILE INTO STAGGERED GRIDS.\n"
  1386. "EACH GRID IS SEQUENCE OF WINDOWS FROM SOURCE, AT THEIR ORIGINAL TIMES, SEPARATED BY SILENCE.\n\n"
  1387. "USAGE: envel timegrid input_sndfile generic_outsndfile_name gridcnt gridwidth splicelen\n\n"
  1388. "GRIDCNT Number of grids (and hence output files).\n"
  1389. "GRIDWIDTH Duration of Grid windows, in seconds.\n"
  1390. "SPLICELEN Splice length, in mS\n\n"
  1391. "gridwidth and splicelen may vary over time.\n");
  1392. } else if(!strcmp(str,"cyclic")) {
  1393. fprintf(stdout,
  1394. "CREATE A SEQUENCE OF REPEATED ENVELOPES, IN A BINARY ENVELOPE FILE.\n\n"
  1395. "USAGE: envel cyclic 1-3 outf wsize total-dur cell-dur phase trough env-exp\n"
  1396. "OR: envel cyclic 4 outf userenv wsize total-dur cell-dur phase\n\n"
  1397. "MODES:\n"
  1398. "(1) Rising. (2) Falling. (3) Troughed (falls then rises) (4) User-defined\n\n"
  1399. "WSIZE Envelope window size (ms) : Resolution of envelope generated.\n"
  1400. "TOTAL-DUR Duration of output file.\n"
  1401. "CELL-DUR Duration of individual (repeated) units: can vary over time.\n"
  1402. "PHASE Where in cell-envelope to begin output: 0=start, 1=end of cell.\n"
  1403. "TROUGH Lowest point of envelope cell (Range 0 -1): can vary over time.\n"
  1404. "ENV-EXP Shape of env: 1 linear: <1 steep at top, > 1 steep at bottom.\n\n"
  1405. "USERENV textfile of time/val(0-1) pairs defining env (time units arbitrary)\n"
  1406. " as the envelope is stretched to each unit duration.\n");
  1407. } else
  1408. fprintf(stdout,"Unknown option '%s'\n",str);
  1409. return(USAGE_ONLY);
  1410. }
  1411. /******************************** USAGE3 ********************************/
  1412. int usage3(char *str1,char *str2)
  1413. {
  1414. if((!strcmp(str1,"warp")) || (!strcmp(str1,"reshape")) || (!strcmp(str1,"replot"))) {
  1415. if(!strcmp(str2,"normalise")) {
  1416. fprintf(stdout,
  1417. "NORMALISE envelope. Expand so that highest env point is max possible.\n\n"
  1418. "No other extra parameters needed.\n");
  1419. } else if(!strcmp(str2,"reverse")) {
  1420. fprintf(stdout,
  1421. "TIME-REVERSE envelope.\n\n"
  1422. "No other extra parameters needed.\n");
  1423. } else if(!strcmp(str2,"ceiling")) {
  1424. fprintf(stdout,
  1425. "Force envelope up to its MAXIMUM LEVEL, EVERYWHERE.\n"
  1426. "No other extra parameters needed.\n");
  1427. } else if(!strcmp(str2,"ducked")) {
  1428. fprintf(stdout,
  1429. "CREATE DUCKING ENVELOPE.\n\n"
  1430. "2 other parameters.\n"
  1431. " GATE: Range(0 - 1)\n"
  1432. " THRESHOLD: Range(0 - 1)\n"
  1433. "With Envelope Warping:\n"
  1434. "When input envelope exceeds threshold, output envelope is reduced\n"
  1435. "to GATE level. Elsewhere it is unchanged.\n\n"
  1436. "With Envelope Reshaping or Replotting:\n"
  1437. "When input envelope exceeds threshold, output envelope takes\n"
  1438. "GATE level. Elsewhere it gives unity gain.\n\n"
  1439. "This can be used to create an envelope to apply to another sound\n"
  1440. "which will be mixed with sound from which original envelope extracted.\n"
  1441. "Gate and Threshold may vary through time.\n");
  1442. } else if(!strcmp(str2,"exaggerate")) {
  1443. fprintf(stdout,
  1444. "EXAGGERATE envelope contour.\n"
  1445. "1 other parameter :\n"
  1446. " EXAGGERATE: Range > 0.0\n"
  1447. " <1, Low vals boosted: >1, High vals boosted.\n"
  1448. " Value 1, gives no change.\n\n"
  1449. "Exagg may vary over time\n");
  1450. } else if(!strcmp(str2,"attenuate")) {
  1451. fprintf(stdout,
  1452. "ATTENUATE an envelope.\n"
  1453. "1 other parameter : ATTENUATION : Range (0-1)\n\n"
  1454. "Atten may vary over time\n");
  1455. } else if(!strcmp(str2,"lift")) {
  1456. fprintf(stdout,
  1457. "LIFT envelope by fixed amount.\n"
  1458. "1 other parameter: LIFT: Range (0 - 1)\n\n"
  1459. "Lift may vary over time\n");
  1460. } else if(!strcmp(str2,"timestretch")) {
  1461. fprintf(stdout,
  1462. "TIMESTRETCH an envelope.\n"
  1463. "1 other parameter: TIMESTRETCH: Range > 0.0\n"
  1464. "Note that timestretch < 1.0 shrinks the envelope.\n");
  1465. } else if(!strcmp(str2,"flatten")) {
  1466. fprintf(stdout,
  1467. "FLATTEN envelope contour.\n"
  1468. "1 other parameter: FLATTEN: Range (1 - %ld windows)\n\n"
  1469. "Flatten may vary over time\n",round(MAX_ENV_FLATN));
  1470. } else if(!strcmp(str2,"gate")) {
  1471. fprintf(stdout,
  1472. "GATE envelope. Levels less than gate are set to zero.\n"
  1473. "2 other parameters:\n"
  1474. " GATE: Range (0 - 1)\n"
  1475. " SMOOTHING: Range (0 - %ld windows)\n"
  1476. "SMOOTHING excises low-level segments of less than SMOOTHING windows.\n"
  1477. " value zero turns off smoothing effect.\n\n"
  1478. "Gate may vary over time\n",round(MAX_ENV_SMOOTH));
  1479. } else if(!strcmp(str2,"invert")) {
  1480. fprintf(stdout,
  1481. "INVERT envelope contour.\n"
  1482. "2 other parameters. GATE: Range (0 - <MIRROR)\n"
  1483. " MIRROR: Range (>GATE - 1)\n"
  1484. "Levels below GATE-level are set to zero. All other levels,\n"
  1485. "above & below MIRROR, are inverted to other side of mirror.\n\n"
  1486. "Gate and Mirror may vary over time\n");
  1487. } else if(!strcmp(str2,"limit")) {
  1488. fprintf(stdout,
  1489. "LIMIT the envelope.\n"
  1490. "2 other parameters LIMIT: Range (THRESHOLD - 1)\n"
  1491. " THRESHOLD: Range (0 - LIMIT)\n"
  1492. "Levels above THRESHOLD are squeezed downwards so maxamp becomes LIMIT.\n\n"
  1493. "Limit and Threshold may vary over time\n");
  1494. } else if(!strcmp(str2,"corrugate")) {
  1495. fprintf(stdout,
  1496. "CORRUGATE the envelope. Take all troughs in the envelope to zero.\n"
  1497. " 2 other parameters:\n"
  1498. " TROFDEL: number of windows to set to zero, per trough.\n"
  1499. " Range(1 to <PEAK_SEPARATION).\n"
  1500. " PEAK_SEPARATION: Range(2 - %d): min windows between peaks.\n\n"
  1501. "Trofdel and Peak_separation may vary over time.\n",MAX_PEAK_SEPARATION);
  1502. } else if(!strcmp(str2,"expand")) {
  1503. fprintf(stdout,
  1504. "EXPAND the envelope level.\n"
  1505. "3 other parameters.\n"
  1506. " GATE: Range(0 - THRESHOLD)\n"
  1507. " THRESHOLD: Range(GATE - 1)\n"
  1508. " Levels below GATE set to 0. Other levels squeezed upwards\n"
  1509. " so minimum level becomes THRESHOLD.\n\n"
  1510. " SMOOTHING: excises low-level segments, < SMOOTHING windows in length.\n"
  1511. " Range(0 - %ld) : 0 turns off smoothing effect.\n\n"
  1512. "Gate and Threshold may vary over time\n",round(MAX_ENV_SMOOTH));
  1513. } else if(!strcmp(str2,"trigger")) {
  1514. fprintf(stdout,
  1515. "Create a new envelope of sudden ON bursts, \n"
  1516. "TRIGGERED by the rate of rise of the current envelope.\n"
  1517. "4 other parameters\n"
  1518. " RAMPFILE: is your new brkpnt envelope for the (triggered) bursts.\n"
  1519. " GATE: Range(0 - 1): to trigger, average-level must be > gate.\n"
  1520. " RISE: Minimum loudness-step to cause triggering. Range(>0 - 1)\n"
  1521. " DUR: max duration (in MS) of min-loudness step, to trigger.\n"
  1522. " Must be >= ENVELOPE_WINDOW duration.\n"
  1523. "Gate may vary over time\n");
  1524. } else
  1525. fprintf(stdout,"UNKNOWN MODE\n");
  1526. } else
  1527. fprintf(stdout,"Insufficient parameters on command line.\n");
  1528. return(USAGE_ONLY);
  1529. }
  1530. /******************************** INNER_LOOP (redundant) ********************************/
  1531. int inner_loop
  1532. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1533. {
  1534. //TW PREVENT WARNINGS
  1535. #if 0
  1536. peakscore = peakscore;
  1537. descnt = descnt;
  1538. in_start_portion = in_start_portion;
  1539. least = least;
  1540. pitchcnt = pitchcnt;
  1541. windows_in_buf = windows_in_buf;
  1542. dz = dz;
  1543. #endif
  1544. return(FINISHED);
  1545. }
  1546. //TW UPDATE : NEW FUNCTION
  1547. /******************************** SCALE_ENVELOPE_DATA ********************************/
  1548. int scale_envelope_data(dataptr dz)
  1549. {
  1550. int n = 0;
  1551. double scaler;
  1552. double *ebrk = dz->brk[dz->extrabrkno];
  1553. int lastindx = (dz->brksize[dz->extrabrkno] - 1) * 2;
  1554. double firsttime = ebrk[0];
  1555. double lasttime = ebrk[lastindx];
  1556. double timerange = lasttime - firsttime;
  1557. if(timerange <= 0.0) {
  1558. sprintf(errstr,"Time range in envelope file is too small, or inverted.\n");
  1559. return(DATA_ERROR);
  1560. }
  1561. if(firsttime > 0.0) {
  1562. while(n <=lastindx) {
  1563. ebrk[n] -= firsttime;
  1564. n += 2;
  1565. }
  1566. }
  1567. if(dz->duration <= 0.0) {
  1568. sprintf(errstr,"Duration of input file is anomalous.\n");
  1569. return(DATA_ERROR);
  1570. }
  1571. scaler = dz->duration/ebrk[lastindx];
  1572. n = 0;
  1573. while(n <= lastindx) {
  1574. ebrk[n] *= scaler;
  1575. n += 2;
  1576. }
  1577. return(FINISHED);
  1578. }
  1579. /******************************** READ_ENVSYN_FILE ********************************/
  1580. int read_envsyn_file(char *str,dataptr dz)
  1581. {
  1582. int cnt = 0, n;
  1583. double maxtime;
  1584. char temp[200], *p;
  1585. int arraysize = BIGARRAY;
  1586. FILE *fp;
  1587. if((dz->parray[ENVSYN_ENV] = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  1588. sprintf(errstr,"INSUFFICIENT MEMORY for user envelope.\n");
  1589. return(MEMORY_ERROR);
  1590. }
  1591. if((fp = fopen(str,"r"))==NULL) { /* 2 */
  1592. sprintf(errstr,"Failed to open envelope file %s\n",str);
  1593. return(DATA_ERROR);
  1594. }
  1595. while(fgets(temp,200,fp)!=NULL) { /* 3 */
  1596. p = temp;
  1597. while(get_float_from_within_string(&p,&(dz->parray[ENVSYN_ENV][cnt]))) {
  1598. if(cnt==0) { /* FORCE ZERO-TIME POINT AT TAB START */
  1599. if(dz->parray[ENVSYN_ENV][cnt]<0.0) {
  1600. sprintf(errstr,"-ve time (%lf) line %d in file %s\n",dz->parray[ENVSYN_ENV][cnt],(cnt/2)+1,str);
  1601. return(DATA_ERROR);
  1602. }
  1603. if(flteq(dz->parray[ENVSYN_ENV][cnt],0.0)) {
  1604. dz->parray[ENVSYN_ENV][cnt] = 0.0; /* FORCE 0.0 TIME TO exactly 0.0 */
  1605. } else { /* Add zero-time values */
  1606. dz->parray[ENVSYN_ENV][2] = dz->parray[ENVSYN_ENV][0];
  1607. dz->parray[ENVSYN_ENV][3] = dz->parray[ENVSYN_ENV][1];
  1608. dz->parray[ENVSYN_ENV][0] = 0.0;
  1609. cnt += 2;
  1610. }
  1611. } else {
  1612. if(EVEN(cnt)) { /* Time vals */
  1613. /* CHECK TIME SEQUENCING */
  1614. if(dz->parray[ENVSYN_ENV][cnt] <= dz->parray[ENVSYN_ENV][cnt-2]) {
  1615. sprintf(errstr,"Time values out of sequence (%lf : %lf)in envelope file at line %d\n",
  1616. dz->parray[ENVSYN_ENV][cnt-2],dz->parray[ENVSYN_ENV][cnt],(cnt/2)+1);
  1617. return(DATA_ERROR);
  1618. }
  1619. } else { /* Env values */
  1620. if(dz->parray[ENVSYN_ENV][cnt]<dz->application->min_special
  1621. || dz->parray[ENVSYN_ENV][cnt]>dz->application->max_special) { /* CHECK RANGE */
  1622. sprintf(errstr,"Invalid envelope value (%lf): line %d file %s\n",
  1623. dz->parray[ENVSYN_ENV][cnt],(cnt/2)+1,str);
  1624. return(DATA_ERROR);
  1625. }
  1626. }
  1627. }
  1628. if(++cnt >= arraysize) {
  1629. arraysize += BIGARRAY;
  1630. if((dz->parray[ENVSYN_ENV]=
  1631. (double *)realloc((char *)dz->parray[ENVSYN_ENV],arraysize*sizeof(double)))==NULL){
  1632. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate user envelope.\n");
  1633. return(MEMORY_ERROR);
  1634. }
  1635. }
  1636. }
  1637. }
  1638. if(ODD(cnt)) {
  1639. sprintf(errstr,"Envelope vals incorrectly paired in file %s\n",str);
  1640. return(DATA_ERROR);
  1641. }
  1642. if(cnt==0) {
  1643. sprintf(errstr,"No envelope values found in file %s\n",str);
  1644. return(DATA_ERROR);
  1645. }
  1646. if((dz->parray[ENVSYN_ENV]=(double *)realloc(dz->parray[ENVSYN_ENV],cnt * sizeof(double)))==NULL) {
  1647. sprintf(errstr,"INSUFFICIENT MEMORY to reallocate user envelope.\n");
  1648. return(MEMORY_ERROR);
  1649. }
  1650. dz->ptr[ENVSYN_ENVEND] = &(dz->parray[ENVSYN_ENV][cnt]); /* MARK END OF ENVELOPE DATA */
  1651. maxtime = dz->parray[ENVSYN_ENV][cnt-2]; /* FIND MAXIMUM TIME IN DATA */
  1652. for(n=2;n<cnt;n +=2) /* NORMALISE DATA TIMES TO LIE BETWEEN 0 AND 1 */
  1653. dz->parray[ENVSYN_ENV][n] = (float)(dz->parray[ENVSYN_ENV][n]/maxtime);
  1654. dz->parray[ENVSYN_ENV][cnt-2] = 1.0; /* FORCE FINAL TIME TO exactly 1.0 */
  1655. if(fclose(fp)<0) {
  1656. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",str);
  1657. fflush(stdout);
  1658. }
  1659. return(FINISHED);
  1660. }
  1661. /******************************** CREATE_ENVSYN_BUF ********************************/
  1662. /*RWD April 2004: NB bigbufsize strictly a local var now */
  1663. int create_envsyn_buf(dataptr dz)
  1664. {
  1665. size_t bigbufsize;
  1666. bigbufsize = (size_t) Malloc(-1);
  1667. bigbufsize = (bigbufsize/SECSIZE) * SECSIZE;
  1668. if(bigbufsize <= 0) {
  1669. sprintf(errstr,"INSUFFICIENT MEMORY for envelope data buffers.\n");
  1670. return(MEMORY_ERROR);
  1671. }
  1672. if((dz->bigfbuf = (float *)Malloc(bigbufsize))==NULL) {
  1673. sprintf(errstr,"INSUFFICIENT MEMORY to create envelope data buffer.\n");
  1674. return(MEMORY_ERROR);
  1675. }
  1676. dz->buflen = (int)(bigbufsize/sizeof(float));
  1677. dz->flbufptr[0] = dz->bigfbuf;
  1678. return(FINISHED);
  1679. }