pulser.c 114 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <pnames.h>
  26. #include <filetype.h>
  27. #include <processno.h>
  28. #include <modeno.h>
  29. #include <logic.h>
  30. #include <globcon.h>
  31. #include <cdpmain.h>
  32. #include <math.h>
  33. #include <mixxcon.h>
  34. #include <osbind.h>
  35. #include <standalone.h>
  36. #include <science.h>
  37. #include <ctype.h>
  38. #include <sfsys.h>
  39. #include <string.h>
  40. //#include <srates.h>
  41. #include <pnames.h>
  42. //#include <extdcon.h>
  43. #include <limits.h>
  44. //static int testflag;
  45. //#ifdef unix
  46. #define round(x) lround((x))
  47. //#endif
  48. #define srcsamps rampbrksize
  49. #define counted is_rectified
  50. char errstr[2400];
  51. int anal_infiles = 1;
  52. int sloom = 0;
  53. int sloombatch = 0;
  54. #define MINFADE 2 // minimum fade of element in MS
  55. const char* cdp_version = "7.0.0";
  56. //CDP LIB REPLACEMENTS
  57. static int setup_pulser_application(dataptr dz);
  58. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  59. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  60. static int setup_pulser_param_ranges_and_defaults(dataptr dz);
  61. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  62. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  63. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  64. static int establish_application(dataptr dz);
  65. static int initialise_vflags(dataptr dz);
  66. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  67. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  68. static int mark_parameter_types(dataptr dz,aplptr ap);
  69. static int assign_file_data_storage(int infilecnt,dataptr dz);
  70. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  71. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  72. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  73. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  74. static int pulser(int ochancnt,dataptr dz);
  75. static int do_pulser_preprocess(int ochancnt,dataptr dz);
  76. static int generate_packet(int *packetsize,double frq,double upfrq,int rise,int sustain,int decay,int srcsize,double srate,dataptr dz);
  77. static int output_packet(int obufpos,int packetsize,int chan,int *lastwrite,int ochancnt,dataptr dz);
  78. static void rndintperm(int *perm,int cnt);
  79. static void showpulsertime(int thisprocess,int samps_processed,double timerscale,dataptr dz);
  80. static int handle_the_special_data(char *str,dataptr dz);
  81. static int synthesize_src(double frq,double srate,double time,dataptr dz);
  82. static void incr_sinptr(int n,double onehzincr,double frq,dataptr dz);
  83. static int open_the_outfile(int ochancnt,dataptr dz);
  84. static double splint(int k,double time,dataptr dz);
  85. static int spline(int k,dataptr dz);
  86. static void pancalc(double position,double *leftgain,double *rightgain);
  87. static int store_chans_to_use_data(char *temp,int cnt,dataptr dz);
  88. static int get_chan_to_use(double time,dataptr dz);
  89. static int get_channel_string(char *str,dataptr dz);
  90. /**************************************** MAIN *********************************************/
  91. int main(int argc,char *argv[])
  92. {
  93. int exit_status, ochancnt = 1;
  94. dataptr dz = NULL;
  95. char **cmdline;
  96. int cmdlinecnt;
  97. int n;
  98. // aplptr ap;
  99. int is_launched = FALSE;
  100. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  101. fprintf(stdout,"%s\n",cdp_version);
  102. fflush(stdout);
  103. return 0;
  104. }
  105. /* CHECK FOR SOUNDLOOM */
  106. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  107. sloom = 0;
  108. sloombatch = 1;
  109. }
  110. if(sflinit("cdp")){
  111. sfperror("cdp: initialisation\n");
  112. return(FAILED);
  113. }
  114. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  115. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  116. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  117. return(FAILED);
  118. }
  119. dz->iparray = NULL;
  120. if(!sloom) {
  121. if(argc == 1) {
  122. usage1();
  123. return(FAILED);
  124. } else if(argc == 2) {
  125. usage2(argv[1]);
  126. return(FAILED);
  127. }
  128. }
  129. if(!sloom) {
  130. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  131. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. cmdline = argv;
  135. cmdlinecnt = argc;
  136. if((get_the_process_no(argv[0],dz))<0)
  137. return(FAILED);
  138. cmdline++;
  139. cmdlinecnt--;
  140. dz->maxmode = 3;
  141. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  142. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  143. return(exit_status);
  144. }
  145. cmdline++;
  146. cmdlinecnt--;
  147. // setup_particular_application =
  148. if((exit_status = setup_pulser_application(dz))<0) {
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  153. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  154. return(FAILED);
  155. }
  156. } else {
  157. //parse_TK_data() =
  158. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  159. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  160. return(exit_status);
  161. }
  162. }
  163. // ap = dz->application;
  164. // parse_infile_and_hone_type() =
  165. if(dz->process != PULSER3) {
  166. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  167. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  168. return(FAILED);
  169. }
  170. }
  171. // setup_param_ranges_and_defaults() =
  172. if((exit_status = setup_pulser_param_ranges_and_defaults(dz))<0) {
  173. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  174. return(FAILED);
  175. }
  176. // open_first_infile CDP LIB
  177. if(dz->process != PULSER3) {
  178. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  179. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  180. return(FAILED);
  181. }
  182. cmdlinecnt--;
  183. cmdline++;
  184. if(dz->process == PULSER2) {
  185. if((exit_status = handle_extra_infiles(&cmdline,&cmdlinecnt,dz))<0) {
  186. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  187. return(FAILED);
  188. }
  189. }
  190. }
  191. // handle_outfile() =
  192. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  193. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  194. return(FAILED);
  195. }
  196. // handle_formants() redundant
  197. // handle_formant_quiksearch() redundant
  198. // handle_formant_quiksearch() redundant
  199. if(dz->process == PULSER3) {
  200. if(dz->mode > 0) {
  201. if((dz->parray = (double **)malloc(8 * sizeof(double *)))==NULL) {
  202. sprintf(errstr,"INSUFFICIENT MEMORY to create synth data storage.\n");
  203. return(MEMORY_ERROR);
  204. }
  205. if((dz->iparray = (int **)malloc(2 * sizeof(int *)))==NULL) {
  206. sprintf(errstr,"INSUFFICIENT MEMORY to create synth data storage2.\n");
  207. return(MEMORY_ERROR);
  208. }
  209. } else {
  210. if((dz->parray = (double **)malloc(5 * sizeof(double *)))==NULL) {
  211. sprintf(errstr,"INSUFFICIENT MEMORY to create synth data storage.\n");
  212. return(MEMORY_ERROR);
  213. }
  214. }
  215. if((exit_status = handle_the_special_data(cmdline[0],dz))<0) {
  216. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  217. return(FAILED);
  218. }
  219. cmdlinecnt--;
  220. cmdline++;
  221. } else if(dz->mode == 0) {
  222. if((dz->parray = (double **)malloc(sizeof(double *)))==NULL) {
  223. sprintf(errstr,"INSUFFICIENT MEMORY to create spline data storage.\n");
  224. return(MEMORY_ERROR);
  225. }
  226. } else if(dz->process != PULSER3 && dz->mode == 2) {
  227. exit_status = get_channel_string(cmdline[0],dz);
  228. if(exit_status < 0) {
  229. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  230. return DATA_ERROR;
  231. }
  232. else if(exit_status == 0) { // Found a filename
  233. if((exit_status = handle_the_special_data(cmdline[0],dz))<0) {
  234. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  235. return(FAILED);
  236. }
  237. }
  238. cmdlinecnt--;
  239. cmdline++;
  240. }
  241. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  242. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  243. return(FAILED);
  244. }
  245. if(dz->process != PULSER3 && dz->mode == 2) {
  246. if(dz->iparray == NULL) {
  247. if(dz->brksize[PLS_WIDTH] || (dz->param[PLS_WIDTH] > 0.0))
  248. ochancnt = 2;
  249. } else
  250. ochancnt = 8;
  251. }
  252. if((exit_status = open_the_outfile(ochancnt,dz))<0) {
  253. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  254. return(FAILED);
  255. }
  256. // check_param_validity_and_consistency() redundant
  257. is_launched = TRUE;
  258. dz->bufcnt = 4;
  259. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  260. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  261. return(MEMORY_ERROR);
  262. }
  263. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt+1))==NULL) {
  264. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  265. return(MEMORY_ERROR);
  266. }
  267. for(n = 0;n <dz->bufcnt; n++)
  268. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  269. dz->sampbuf[n] = (float *)0;
  270. if((exit_status = do_pulser_preprocess(ochancnt,dz))<0) { // Also creates buffers
  271. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  272. return(FAILED);
  273. }
  274. if((exit_status = pulser(ochancnt,dz))<0) {
  275. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  276. return(FAILED);
  277. }
  278. if((exit_status = complete_output(dz))<0) { // CDP LIB
  279. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  280. return(FAILED);
  281. }
  282. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  283. free(dz);
  284. return(SUCCEEDED);
  285. }
  286. /**********************************************
  287. REPLACED CDP LIB FUNCTIONS
  288. **********************************************/
  289. /****************************** SET_PARAM_DATA *********************************/
  290. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  291. {
  292. ap->special_data = (char)special_data;
  293. ap->param_cnt = (char)paramcnt;
  294. ap->max_param_cnt = (char)maxparamcnt;
  295. if(ap->max_param_cnt>0) {
  296. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  297. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  298. return(MEMORY_ERROR);
  299. }
  300. strcpy(ap->param_list,paramlist);
  301. }
  302. return(FINISHED);
  303. }
  304. /****************************** SET_VFLGS *********************************/
  305. int set_vflgs
  306. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  307. {
  308. ap->option_cnt = (char) optcnt; /*RWD added cast */
  309. if(optcnt) {
  310. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  311. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  312. return(MEMORY_ERROR);
  313. }
  314. strcpy(ap->option_list,optlist);
  315. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  316. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  317. return(MEMORY_ERROR);
  318. }
  319. strcpy(ap->option_flags,optflags);
  320. }
  321. ap->vflag_cnt = (char) vflagcnt;
  322. ap->variant_param_cnt = (char) vparamcnt;
  323. if(vflagcnt) {
  324. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  325. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  326. return(MEMORY_ERROR);
  327. }
  328. strcpy(ap->variant_list,varlist);
  329. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  330. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  331. return(MEMORY_ERROR);
  332. }
  333. strcpy(ap->variant_flags,varflags);
  334. }
  335. return(FINISHED);
  336. }
  337. /***************************** APPLICATION_INIT **************************/
  338. int application_init(dataptr dz)
  339. {
  340. int exit_status;
  341. int storage_cnt;
  342. int tipc, brkcnt;
  343. aplptr ap = dz->application;
  344. if(ap->vflag_cnt>0)
  345. initialise_vflags(dz);
  346. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  347. ap->total_input_param_cnt = (char)tipc;
  348. if(tipc>0) {
  349. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  350. return(exit_status);
  351. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  352. return(exit_status);
  353. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  354. return(exit_status);
  355. }
  356. brkcnt = tipc;
  357. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  358. if(brkcnt>0) {
  359. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  360. return(exit_status);
  361. }
  362. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  363. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  364. return(exit_status);
  365. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  366. return(exit_status);
  367. }
  368. if((exit_status = mark_parameter_types(dz,ap))<0)
  369. return(exit_status);
  370. // establish_infile_constants() replaced by
  371. dz->infilecnt = 1;
  372. //establish_bufptrs_and_extra_buffers():
  373. return(FINISHED);
  374. }
  375. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  376. /* RWD mallo changed to calloc; helps debug verison run as release! */
  377. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  378. {
  379. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  380. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  381. return(MEMORY_ERROR);
  382. }
  383. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  384. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  385. return(MEMORY_ERROR);
  386. }
  387. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  388. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  389. return(MEMORY_ERROR);
  390. }
  391. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  392. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  393. return(MEMORY_ERROR);
  394. }
  395. return(FINISHED);
  396. }
  397. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  398. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  399. {
  400. int n;
  401. for(n=0;n<storage_cnt;n++) {
  402. dz->is_int[n] = (char)0;
  403. dz->no_brk[n] = (char)0;
  404. }
  405. return(FINISHED);
  406. }
  407. /***************************** MARK_PARAMETER_TYPES **************************/
  408. int mark_parameter_types(dataptr dz,aplptr ap)
  409. {
  410. int n, m; /* PARAMS */
  411. for(n=0;n<ap->max_param_cnt;n++) {
  412. switch(ap->param_list[n]) {
  413. case('0'): break; /* dz->is_active[n] = 0 is default */
  414. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  415. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  416. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  417. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  418. default:
  419. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  420. return(PROGRAM_ERROR);
  421. }
  422. } /* OPTIONS */
  423. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  424. switch(ap->option_list[n]) {
  425. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  426. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  427. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  428. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  429. default:
  430. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  431. return(PROGRAM_ERROR);
  432. }
  433. } /* VARIANTS */
  434. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  435. switch(ap->variant_list[n]) {
  436. case('0'): break;
  437. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  438. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  439. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  440. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  441. default:
  442. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  443. return(PROGRAM_ERROR);
  444. }
  445. } /* INTERNAL */
  446. for(n=0,
  447. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  448. switch(ap->internal_param_list[n]) {
  449. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  450. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  451. case('d'): dz->no_brk[m] = (char)1; break;
  452. default:
  453. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  454. return(PROGRAM_ERROR);
  455. }
  456. }
  457. return(FINISHED);
  458. }
  459. /************************ HANDLE_THE_OUTFILE *********************/
  460. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  461. {
  462. char *filename = (*cmdline)[0];
  463. if(filename[0]=='-' && filename[1]=='f') {
  464. dz->floatsam_output = 1;
  465. dz->true_outfile_stype = SAMP_FLOAT;
  466. filename+= 2;
  467. }
  468. if(!sloom) {
  469. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  470. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  471. return(DATA_ERROR);
  472. }
  473. }
  474. strcpy(dz->outfilename,filename);
  475. (*cmdline)++;
  476. (*cmdlinecnt)--;
  477. return(FINISHED);
  478. }
  479. /************************ OPEN_THE_OUTFILE *********************/
  480. int open_the_outfile(int ochancnt, dataptr dz)
  481. {
  482. int exit_status;
  483. if(dz->process == PULSER3) {
  484. dz->infile->channels = 1;
  485. dz->infile->srate = dz->iparam[PLS_SRATE];
  486. dz->outfile->channels = 1;
  487. dz->outfile->srate = dz->iparam[PLS_SRATE];
  488. dz->infile->stype = SAMP_SHORT;
  489. dz->outfile->stype = SAMP_SHORT;
  490. }
  491. if(ochancnt > 1) {
  492. dz->infile->channels = ochancnt;
  493. dz->outfile->channels = ochancnt;
  494. }
  495. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  496. return(exit_status);
  497. if(ochancnt > 1)
  498. dz->infile->channels = 1;
  499. return(FINISHED);
  500. }
  501. /***************************** ESTABLISH_APPLICATION **************************/
  502. int establish_application(dataptr dz)
  503. {
  504. aplptr ap;
  505. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  506. sprintf(errstr,"establish_application()\n");
  507. return(MEMORY_ERROR);
  508. }
  509. ap = dz->application;
  510. memset((char *)ap,0,sizeof(struct applic));
  511. return(FINISHED);
  512. }
  513. /************************* INITIALISE_VFLAGS *************************/
  514. int initialise_vflags(dataptr dz)
  515. {
  516. int n;
  517. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  518. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  519. return(MEMORY_ERROR);
  520. }
  521. for(n=0;n<dz->application->vflag_cnt;n++)
  522. dz->vflag[n] = FALSE;
  523. return FINISHED;
  524. }
  525. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  526. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  527. {
  528. int n;
  529. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  530. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  531. return(MEMORY_ERROR);
  532. }
  533. for(n=0;n<tipc;n++)
  534. ap->default_val[n] = 0.0;
  535. return(FINISHED);
  536. }
  537. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  538. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  539. {
  540. int n;
  541. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  542. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  543. return(MEMORY_ERROR);
  544. }
  545. for(n=0;n<tipc;n++)
  546. dz->is_active[n] = (char)0;
  547. return(FINISHED);
  548. }
  549. /************************* SETUP_PULSER_APPLICATION *******************/
  550. int setup_pulser_application(dataptr dz)
  551. {
  552. int exit_status;
  553. aplptr ap;
  554. if((exit_status = establish_application(dz))<0) // GLOBAL
  555. return(FAILED);
  556. ap = dz->application;
  557. if(dz->process == PULSER3) {
  558. switch(dz->mode) {
  559. case(0): exit_status = set_param_data(ap,SYN_SPEK,10,10,"dDddddddDD"); break;
  560. case(1):
  561. case(2): exit_status = set_param_data(ap,SYN_PARTIALS,10,10,"dDddddddDD"); break;
  562. }
  563. } else {
  564. switch(dz->mode) {
  565. case(0): exit_status = set_param_data(ap,0,10,10,"dDddddddDD"); break;
  566. case(1): exit_status = set_param_data(ap,0,10,9,"d0ddddddDD"); break;
  567. case(2): exit_status = set_param_data(ap,SPACEDATA,10,9,"d0ddDDddDD"); break;
  568. }
  569. }
  570. if(exit_status < 0)
  571. return FAILED;
  572. switch(dz->process) {
  573. case(PULSER):
  574. switch(dz->mode) {
  575. case(2): exit_status = set_vflgs(ap,"",0,"","eEpaobsw",8,8,"DDDDDDiD"); break;
  576. default: exit_status = set_vflgs(ap,"",0,"","eEpaobs",7,7,"DDDDDDi"); break;
  577. }
  578. break;
  579. case(PULSER2):
  580. switch(dz->mode) {
  581. case(2): exit_status = set_vflgs(ap,"",0,"","eEpaobswr",9,8,"DDDDDDiD0"); break;
  582. default: exit_status = set_vflgs(ap,"",0,"","eEpaobsr",8,7,"DDDDDDi0"); break;
  583. }
  584. break;
  585. case(PULSER3):
  586. exit_status = set_vflgs(ap,"",0,"","eEpaobsSc",9,9,"DDDDDDiiD");
  587. break;
  588. }
  589. if(exit_status < 0)
  590. return FAILED;
  591. // set_legal_infile_structure -->
  592. dz->has_otherfile = FALSE;
  593. // assign_process_logic -->
  594. switch(dz->process) {
  595. case(PULSER):
  596. dz->input_data_type = SNDFILES_ONLY;
  597. dz->process_type = UNEQUAL_SNDFILE;
  598. dz->outfiletype = SNDFILE_OUT;
  599. break;
  600. case(PULSER2):
  601. dz->input_data_type = MANY_SNDFILES;
  602. dz->process_type = UNEQUAL_SNDFILE;
  603. dz->outfiletype = SNDFILE_OUT;
  604. break;
  605. case(PULSER3):
  606. dz->input_data_type = NO_FILE_AT_ALL;
  607. dz->process_type = UNEQUAL_SNDFILE;
  608. dz->outfiletype = SNDFILE_OUT;
  609. break;
  610. }
  611. dz->maxmode = 3;
  612. return application_init(dz); //GLOBAL
  613. }
  614. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  615. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  616. {
  617. int exit_status;
  618. infileptr infile_info;
  619. if(!sloom) {
  620. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  621. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  622. return(MEMORY_ERROR);
  623. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  624. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  625. return(PROGRAM_ERROR);
  626. } else if(infile_info->filetype != SNDFILE) {
  627. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  628. return(DATA_ERROR);
  629. } else if(infile_info->channels != MONO) {
  630. sprintf(errstr,"File %s is not of correct type: must be MONO\n",cmdline[0]);
  631. return(DATA_ERROR);
  632. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  633. sprintf(errstr,"Failed to copy file parsing information\n");
  634. return(PROGRAM_ERROR);
  635. }
  636. free(infile_info);
  637. }
  638. return(FINISHED);
  639. }
  640. /************************* SETUP_ITERLINE_PARAM_RANGES_AND_DEFAULTS *******************/
  641. int setup_pulser_param_ranges_and_defaults(dataptr dz)
  642. {
  643. int exit_status;
  644. aplptr ap = dz->application;
  645. // set_param_ranges()
  646. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  647. // NB total_input_param_cnt is > 0 !!!
  648. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  649. return(FAILED);
  650. // get_param_ranges()
  651. ap->lo[PLS_DUR] = .02;
  652. ap->hi[PLS_DUR] = 32767;
  653. ap->default_val[PLS_DUR] = 4;
  654. if(dz->process == PULSER3 || dz->mode == 0) {
  655. ap->lo[PLS_PITCH] = 24;
  656. ap->hi[PLS_PITCH] = 96;
  657. ap->default_val[PLS_PITCH] = 60;
  658. }
  659. ap->lo[PLS_MINRISE] = 0.002;
  660. ap->hi[PLS_MINRISE] = 0.2;
  661. ap->default_val[PLS_MINRISE] = 0.02;
  662. ap->lo[PLS_MAXRISE] = 0.002;
  663. ap->hi[PLS_MAXRISE] = 0.2;
  664. ap->default_val[PLS_MAXRISE] = 0.02;
  665. ap->lo[PLS_MINSUS] = 0.0;
  666. ap->lo[PLS_MAXSUS] = 0.0;
  667. if(dz->process == PULSER && dz->mode == 2) {
  668. ap->hi[PLS_MAXSUS] = 1.0;
  669. ap->hi[PLS_MINSUS] = 1.0;
  670. } else {
  671. ap->hi[PLS_MAXSUS] = 0.2;
  672. ap->hi[PLS_MINSUS] = 0.2;
  673. }
  674. ap->default_val[PLS_MINSUS] = 0.0;
  675. ap->default_val[PLS_MAXSUS] = 0.0;
  676. ap->lo[PLS_MINDECAY] = 0.02;
  677. ap->hi[PLS_MINDECAY] = 2;
  678. ap->default_val[PLS_MINDECAY] = 0.05;
  679. ap->lo[PLS_MAXDECAY] = 0.02;
  680. ap->hi[PLS_MAXDECAY] = 2;
  681. ap->default_val[PLS_MAXDECAY] = 0.05;
  682. ap->lo[PLS_SPEED] = 0.05;
  683. ap->hi[PLS_SPEED] = 1;
  684. ap->default_val[PLS_SPEED] = 0.1;
  685. ap->lo[PLS_SCAT] = 0.0;
  686. ap->hi[PLS_SCAT] = 1.0;
  687. ap->default_val[PLS_SCAT] = 0.0;
  688. ap->lo[PLS_EXP] = 0.25;
  689. ap->hi[PLS_EXP] = 4;
  690. ap->default_val[PLS_EXP] = 1.0;
  691. ap->lo[PLS_EXP2] = 0.25;
  692. ap->hi[PLS_EXP2] = 4;
  693. ap->default_val[PLS_EXP2] = 1.0;
  694. ap->lo[PLS_PSCAT] = 0;
  695. ap->hi[PLS_PSCAT] = 1;
  696. ap->default_val[PLS_PSCAT] = 0;
  697. ap->lo[PLS_ASCAT] = 0;
  698. ap->hi[PLS_ASCAT] = 1;
  699. ap->default_val[PLS_ASCAT] = 0;
  700. ap->lo[PLS_OCT] = 0;
  701. ap->hi[PLS_OCT] = 24;
  702. ap->default_val[PLS_OCT] = 0;
  703. ap->lo[PLS_BEND] = 0;
  704. ap->hi[PLS_BEND] = 24;
  705. ap->default_val[PLS_BEND] = 0;
  706. ap->lo[PLS_SEED] = 0.0;
  707. ap->hi[PLS_SEED] = MAXSHORT;
  708. ap->default_val[PLS_SEED] = 0.0;
  709. if(dz->process == PULSER3) {
  710. ap->lo[PLS_SRATE] = 16000;
  711. ap->hi[PLS_SRATE] = 96000;
  712. ap->default_val[PLS_SRATE] = 44100.00;
  713. ap->lo[PLS_CNT] = 0;
  714. ap->hi[PLS_CNT] = 64;
  715. ap->default_val[PLS_CNT] = 0;
  716. }
  717. if(dz->process == PULSER && dz->mode == 2) {
  718. ap->lo[PLS_WIDTH] = 0;
  719. ap->hi[PLS_WIDTH] = 1;
  720. ap->default_val[PLS_WIDTH] = 0;
  721. }
  722. dz->maxmode = 3;
  723. if(!sloom)
  724. put_default_vals_in_all_params(dz);
  725. return(FINISHED);
  726. }
  727. /********************************* PARSE_SLOOM_DATA *********************************/
  728. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  729. {
  730. int exit_status;
  731. int cnt = 1, infilecnt;
  732. int filesize, insams, inbrksize;
  733. double dummy;
  734. int true_cnt = 0;
  735. // aplptr ap;
  736. while(cnt<=PRE_CMDLINE_DATACNT) {
  737. if(cnt > argc) {
  738. sprintf(errstr,"Insufficient data sent from TK\n");
  739. return(DATA_ERROR);
  740. }
  741. switch(cnt) {
  742. case(1):
  743. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  744. sprintf(errstr,"Cannot read process no. sent from TK\n");
  745. return(DATA_ERROR);
  746. }
  747. break;
  748. case(2):
  749. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  750. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  751. return(DATA_ERROR);
  752. }
  753. if(dz->mode > 0)
  754. dz->mode--;
  755. //setup_particular_application() =
  756. if((exit_status = setup_pulser_application(dz))<0)
  757. return(exit_status);
  758. // ap = dz->application;
  759. break;
  760. case(3):
  761. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  762. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  763. return(DATA_ERROR);
  764. }
  765. if(infilecnt < 1) {
  766. true_cnt = cnt + 1;
  767. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  768. }
  769. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  770. return(exit_status);
  771. break;
  772. case(INPUT_FILETYPE+4):
  773. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  774. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  775. return(DATA_ERROR);
  776. }
  777. break;
  778. case(INPUT_FILESIZE+4):
  779. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  780. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  781. return(DATA_ERROR);
  782. }
  783. dz->insams[0] = filesize;
  784. break;
  785. case(INPUT_INSAMS+4):
  786. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  787. sprintf(errstr,"Cannot read insams sent from TK\n");
  788. return(DATA_ERROR);
  789. }
  790. dz->insams[0] = insams;
  791. break;
  792. case(INPUT_SRATE+4):
  793. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  794. sprintf(errstr,"Cannot read srate sent from TK\n");
  795. return(DATA_ERROR);
  796. }
  797. break;
  798. case(INPUT_CHANNELS+4):
  799. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  800. sprintf(errstr,"Cannot read channels sent from TK\n");
  801. return(DATA_ERROR);
  802. }
  803. break;
  804. case(INPUT_STYPE+4):
  805. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  806. sprintf(errstr,"Cannot read stype sent from TK\n");
  807. return(DATA_ERROR);
  808. }
  809. break;
  810. case(INPUT_ORIGSTYPE+4):
  811. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  812. sprintf(errstr,"Cannot read origstype sent from TK\n");
  813. return(DATA_ERROR);
  814. }
  815. break;
  816. case(INPUT_ORIGRATE+4):
  817. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  818. sprintf(errstr,"Cannot read origrate sent from TK\n");
  819. return(DATA_ERROR);
  820. }
  821. break;
  822. case(INPUT_MLEN+4):
  823. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  824. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  825. return(DATA_ERROR);
  826. }
  827. break;
  828. case(INPUT_DFAC+4):
  829. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  830. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  831. return(DATA_ERROR);
  832. }
  833. break;
  834. case(INPUT_ORIGCHANS+4):
  835. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  836. sprintf(errstr,"Cannot read origchans sent from TK\n");
  837. return(DATA_ERROR);
  838. }
  839. break;
  840. case(INPUT_SPECENVCNT+4):
  841. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  842. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  843. return(DATA_ERROR);
  844. }
  845. dz->specenvcnt = dz->infile->specenvcnt;
  846. break;
  847. case(INPUT_WANTED+4):
  848. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  849. sprintf(errstr,"Cannot read wanted sent from TK\n");
  850. return(DATA_ERROR);
  851. }
  852. break;
  853. case(INPUT_WLENGTH+4):
  854. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  855. sprintf(errstr,"Cannot read wlength sent from TK\n");
  856. return(DATA_ERROR);
  857. }
  858. break;
  859. case(INPUT_OUT_CHANS+4):
  860. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  861. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  862. return(DATA_ERROR);
  863. }
  864. break;
  865. /* RWD these chanegs to samps - tk will have to deal with that! */
  866. case(INPUT_DESCRIPTOR_BYTES+4):
  867. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  868. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  869. return(DATA_ERROR);
  870. }
  871. break;
  872. case(INPUT_IS_TRANSPOS+4):
  873. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  874. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  875. return(DATA_ERROR);
  876. }
  877. break;
  878. case(INPUT_COULD_BE_TRANSPOS+4):
  879. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  880. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  881. return(DATA_ERROR);
  882. }
  883. break;
  884. case(INPUT_COULD_BE_PITCH+4):
  885. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  886. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  887. return(DATA_ERROR);
  888. }
  889. break;
  890. case(INPUT_DIFFERENT_SRATES+4):
  891. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  892. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  893. return(DATA_ERROR);
  894. }
  895. break;
  896. case(INPUT_DUPLICATE_SNDS+4):
  897. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  898. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  899. return(DATA_ERROR);
  900. }
  901. break;
  902. case(INPUT_BRKSIZE+4):
  903. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  904. sprintf(errstr,"Cannot read brksize sent from TK\n");
  905. return(DATA_ERROR);
  906. }
  907. if(inbrksize > 0) {
  908. switch(dz->input_data_type) {
  909. case(WORDLIST_ONLY):
  910. break;
  911. case(PITCH_AND_PITCH):
  912. case(PITCH_AND_TRANSPOS):
  913. case(TRANSPOS_AND_TRANSPOS):
  914. dz->tempsize = inbrksize;
  915. break;
  916. case(BRKFILES_ONLY):
  917. case(UNRANGED_BRKFILE_ONLY):
  918. case(DB_BRKFILES_ONLY):
  919. case(ALL_FILES):
  920. case(ANY_NUMBER_OF_ANY_FILES):
  921. if(dz->extrabrkno < 0) {
  922. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  923. return(DATA_ERROR);
  924. }
  925. if(dz->brksize == NULL) {
  926. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  927. return(PROGRAM_ERROR);
  928. }
  929. dz->brksize[dz->extrabrkno] = inbrksize;
  930. break;
  931. default:
  932. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  933. dz->input_data_type);
  934. return(PROGRAM_ERROR);
  935. }
  936. break;
  937. }
  938. break;
  939. case(INPUT_NUMSIZE+4):
  940. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  941. sprintf(errstr,"Cannot read numsize sent from TK\n");
  942. return(DATA_ERROR);
  943. }
  944. break;
  945. case(INPUT_LINECNT+4):
  946. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  947. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  948. return(DATA_ERROR);
  949. }
  950. break;
  951. case(INPUT_ALL_WORDS+4):
  952. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  953. sprintf(errstr,"Cannot read all_words sent from TK\n");
  954. return(DATA_ERROR);
  955. }
  956. break;
  957. case(INPUT_ARATE+4):
  958. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  959. sprintf(errstr,"Cannot read arate sent from TK\n");
  960. return(DATA_ERROR);
  961. }
  962. break;
  963. case(INPUT_FRAMETIME+4):
  964. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  965. sprintf(errstr,"Cannot read frametime sent from TK\n");
  966. return(DATA_ERROR);
  967. }
  968. dz->frametime = (float)dummy;
  969. break;
  970. case(INPUT_WINDOW_SIZE+4):
  971. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  972. sprintf(errstr,"Cannot read window_size sent from TK\n");
  973. return(DATA_ERROR);
  974. }
  975. break;
  976. case(INPUT_NYQUIST+4):
  977. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  978. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  979. return(DATA_ERROR);
  980. }
  981. break;
  982. case(INPUT_DURATION+4):
  983. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  984. sprintf(errstr,"Cannot read duration sent from TK\n");
  985. return(DATA_ERROR);
  986. }
  987. break;
  988. case(INPUT_MINBRK+4):
  989. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  990. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  991. return(DATA_ERROR);
  992. }
  993. break;
  994. case(INPUT_MAXBRK+4):
  995. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  996. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  997. return(DATA_ERROR);
  998. }
  999. break;
  1000. case(INPUT_MINNUM+4):
  1001. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  1002. sprintf(errstr,"Cannot read minnum sent from TK\n");
  1003. return(DATA_ERROR);
  1004. }
  1005. break;
  1006. case(INPUT_MAXNUM+4):
  1007. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  1008. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  1009. return(DATA_ERROR);
  1010. }
  1011. break;
  1012. default:
  1013. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  1014. return(PROGRAM_ERROR);
  1015. }
  1016. cnt++;
  1017. }
  1018. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  1019. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  1020. return(DATA_ERROR);
  1021. }
  1022. if(true_cnt)
  1023. cnt = true_cnt;
  1024. *cmdlinecnt = 0;
  1025. while(cnt < argc) {
  1026. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  1027. return(exit_status);
  1028. cnt++;
  1029. }
  1030. return(FINISHED);
  1031. }
  1032. /********************************* GET_TK_CMDLINE_WORD *********************************/
  1033. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  1034. {
  1035. if(*cmdlinecnt==0) {
  1036. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  1037. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1038. return(MEMORY_ERROR);
  1039. }
  1040. } else {
  1041. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  1042. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1043. return(MEMORY_ERROR);
  1044. }
  1045. }
  1046. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  1047. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  1048. return(MEMORY_ERROR);
  1049. }
  1050. strcpy((*cmdline)[*cmdlinecnt],q);
  1051. (*cmdlinecnt)++;
  1052. return(FINISHED);
  1053. }
  1054. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  1055. int assign_file_data_storage(int infilecnt,dataptr dz)
  1056. {
  1057. int exit_status;
  1058. int no_sndfile_system_files = FALSE;
  1059. dz->infilecnt = infilecnt;
  1060. if((exit_status = allocate_filespace(dz))<0)
  1061. return(exit_status);
  1062. if(no_sndfile_system_files)
  1063. dz->infilecnt = 0;
  1064. return(FINISHED);
  1065. }
  1066. /************************* redundant functions: to ensure libs compile OK *******************/
  1067. int assign_process_logic(dataptr dz)
  1068. {
  1069. return(FINISHED);
  1070. }
  1071. void set_legal_infile_structure(dataptr dz)
  1072. {}
  1073. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1074. {
  1075. int exit_status;
  1076. exit_status = set_internalparam_data("diiii", ap);
  1077. return(exit_status);
  1078. }
  1079. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1080. {
  1081. return(FINISHED);
  1082. }
  1083. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1084. {
  1085. return(FINISHED);
  1086. }
  1087. int read_special_data(char *str,dataptr dz)
  1088. {
  1089. return(FINISHED);
  1090. }
  1091. int inner_loop
  1092. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1093. {
  1094. return(FINISHED);
  1095. }
  1096. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1097. {
  1098. return(FINISHED);
  1099. }
  1100. /******************************** USAGE1 ********************************/
  1101. int usage1(void)
  1102. {
  1103. fprintf(stdout,
  1104. "\nGENERATE STREAMS OF PULSES\n\n"
  1105. "USAGE: pulser NAME (mode) [infile] outfile parameters: \n"
  1106. "\n"
  1107. "where NAME can be any one of\n"
  1108. "\n"
  1109. "pulser multi synth\n\n"
  1110. "Type 'pulser pulser' for more info on pulser pulser..ETC.\n");
  1111. return(USAGE_ONLY);
  1112. }
  1113. /********************************************************************************************/
  1114. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1115. {
  1116. if(!strcmp(prog_identifier_from_cmdline,"pulser")) dz->process = PULSER;
  1117. else if(!strcmp(prog_identifier_from_cmdline,"multi")) dz->process = PULSER2;
  1118. else if(!strcmp(prog_identifier_from_cmdline,"synth")) dz->process = PULSER3;
  1119. else {
  1120. fprintf(stderr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1121. return(USAGE_ONLY);
  1122. }
  1123. return(FINISHED);
  1124. }
  1125. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1126. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1127. {
  1128. int n;
  1129. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1130. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1131. return(MEMORY_ERROR);
  1132. }
  1133. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1134. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1135. return(MEMORY_ERROR);
  1136. }
  1137. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1138. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1139. return(MEMORY_ERROR);
  1140. }
  1141. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1142. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1143. return(MEMORY_ERROR);
  1144. }
  1145. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1146. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1147. return(MEMORY_ERROR);
  1148. }
  1149. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1150. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1151. return(MEMORY_ERROR);
  1152. }
  1153. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1154. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1155. return(MEMORY_ERROR);
  1156. }
  1157. for(n=0;n<brkcnt;n++) {
  1158. dz->brk[n] = NULL;
  1159. dz->brkptr[n] = NULL;
  1160. dz->brkinit[n] = 0;
  1161. dz->brksize[n] = 0;
  1162. }
  1163. return(FINISHED);
  1164. }
  1165. /******************************** USAGE2 ********************************/
  1166. int usage2(char *str)
  1167. {
  1168. if(!strcmp(str,"pulser")) {
  1169. fprintf(stderr,
  1170. "USAGE: pulser pulser 1 infile outfile dur pitch\n"
  1171. "OR: pulser pulser 2 infile outfile dur\n"
  1172. "OR: pulser pulser 3 infile outfile spacedata dur\n"
  1173. "minrise maxrise minsus maxsus mindecay maxdecay speed scatter\n"
  1174. "[-eexpr] [-Eexpd] [-ppscat] [-aascat] [-ooctav] [-bbend] [-sseed] (-wwidth])\n"
  1175. "ITERATE AN INPUT AND ENVELOPE THE SOUND GENERATED\n"
  1176. "TO PRODUCE PITCHED PACKETS WHICH ARE OUTPUT IN A STREAM.\n"
  1177. "MODE 1 : packets take spectral brightness (only) from source,\n"
  1178. " and pitch from pitch parameter.\n"
  1179. "MODE 2 : packets derived from (start of) source.\n"
  1180. "MODE 3 : packets derived from random startpoints within source.\n"
  1181. "DUR Duration of output stream.\n"
  1182. "SPACEDATA Zero (stereo output) ~~OR~~ gives 8-chan output, and expects...\n"
  1183. " String listing chans to use (vals from 1-8: in order, no repeats).\n"
  1184. " OR datafile (8-channel output).\n"
  1185. " Datafile consists of set of lines, each having\n"
  1186. " Time & List_of_chans_to_use (vals in range 1-8: no repeated vals).\n"
  1187. "PITCH (Mode 1) Midipitch of packets, Range 24 to 96 (may vary over time).\n"
  1188. "MIN,MAXRISE Min and max risetime of packet envelope (Range 0.002 to 0.2 secs).\n"
  1189. " (Risetime set as random value between the 2 limits)\n"
  1190. "MIN,MAXSUS Min and max sustain of packet envelope (Range 0.0 to 0.2 secs).\n"
  1191. " (Sustain set as random value between the 2 limits)\n"
  1192. "MIN,MAXDECAY Min and max decaytime of packet envelope (Range 0.02 to 2 secs).\n"
  1193. " (Decaytime set as random value between the 2 limits)\n"
  1194. "SPEED (Average) time between packets in output (Range 0.05 to 1sec).\n"
  1195. "SCATTER Randomisation of speed (0-1)\n"
  1196. "EXPR Rise slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1197. "EXPD Decay slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1198. "PSCAT Random jitter of pitch of packets: Range 0 - 1 semitones.\n"
  1199. "ASCAT Random jitter of amplitude of packets: Range 0 (no jitter) to 1.\n"
  1200. "OCTAV Amount of lower octave reinforcement : Range 0 - 1\n"
  1201. "BEND Amount of upward pitchbend of packets : Range 0 - 1 semitones.\n"
  1202. "SEED Same seed-number produces identical output on rerun (Integer >=1).\n"
  1203. "WIDTH Mode 3 only :Range 0-1\n"
  1204. " In Stereo (\"SPACEDATA\" = 0)\n"
  1205. " Width of scatter-of-positions of packets, across stereo panorama.\n"
  1206. " Zero value produces Mono output.\n"
  1207. " 8-chan (\"SPACEDATA\" is a file of 8-chan spatialisatio data)\n"
  1208. " Width of scatter-of-positions away from loudspeaker-centric.\n"
  1209. " Zero value produces outputs centred in the loudspeakers.\n"
  1210. "All params except DUR,SEED and MIN/MAX RISE,SUSTAIN,and DECAY can vary over time.\n"
  1211. "\n");
  1212. } else if(!strcmp(str,"multi")) {
  1213. fprintf(stderr,
  1214. "USAGE: pulser multi 1 infile1 [infile2 ......] outfile dur pitch\n"
  1215. "OR: pulser multi 2-3 infile1 [infile2 ......] infile outfile dur\n"
  1216. "minrise maxrise minsus maxsus mindecay maxdecay speed scatter\n"
  1217. "[-eexpr] [-Eexpd] [-ppscat] [-aascat] [-ooctav] [-bbend] [-sseed] [-r]\n"
  1218. "\n"
  1219. "ITERATE AN INPUT AND ENVELOPE THE SOUND GENERATED\n"
  1220. "TO PRODUCE PITCHED PACKETS WHICH ARE OUTPUT IN A STREAM.\n"
  1221. "INPUT SOURCE FILES ARE USED IN RANDOMLY PERMUTED SEQUENCES\n"
  1222. "\n"
  1223. "MODE 1 : packets take spectral brightness (only) from sources,\n"
  1224. " and pitch from pitch parameter.\n"
  1225. "MODE 2 : packets derived from (start of) sources.\n"
  1226. "MODE 3 : packets derived from random startpoints within sources.\n"
  1227. "\n"
  1228. "DUR Duration of output stream.\n"
  1229. "PITCH (Mode 1) Midipitch of packets, Range 24 to 96 (may vary over time).\n"
  1230. "MIN,MAXRISE Min and max risetime of packet envelope (Range 0.002 to 0.2 secs).\n"
  1231. " (Risetime set as random value between the 2 limits)\n"
  1232. "MIN,MAXSUS Min and max sustain of packet envelope (Range 0.0 to 0.2 secs).\n"
  1233. " (Sustain set as random value between the 2 limits)\n"
  1234. "MIN,MAXDECAY Min and max decaytime of packet envelope (Range 0.02 to 2 secs).\n"
  1235. " (Decaytime set as random value between the 2 limits)\n"
  1236. "SPEED (Average) time between packets in output (Range 0.05 to 1sec).\n"
  1237. "SCATTER Randomisation of speed (0-1)\n"
  1238. "EXPR Rise slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1239. "EXPD Decay slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1240. "PSCAT Random jitter of pitch of packets: Range 0 - 1 semitones.\n"
  1241. "ASCAT Random jitter of amplitude of packets: Range 0 (no jitter) to 1.\n"
  1242. "OCTAV Amount of lower octave reinforcement : Range 0 - 1\n"
  1243. "BEND Amount of upward pitchbend of packets : Range 0 - 1 semitones.\n"
  1244. "SEED Same seed-number produces identical output on rerun (Integer >=1).\n"
  1245. "-r Selection of source file used for next packet, entirely random."
  1246. " (Default, all files used once, in random order, then new randorder).\n"
  1247. "\n"
  1248. "All params except DUR, SEED and MIN/MAX RISE,SUSTAIN,DECAY can vary over time.\n"
  1249. "\n");
  1250. } else if(!strcmp(str,"synth")) {
  1251. fprintf(stderr,
  1252. "USAGE: pulser synth 1-3 outfile partials-data dur pitch\n"
  1253. "minrise maxrise minsus maxsus mindecay maxdecay speed scatter\n"
  1254. "[-eexpr] [-Eexpd] [-ppscat] [-aascat] [-ooctav] [-bbend] [-sseed] [-Ssrate]\n"
  1255. "[-ccount]\n"
  1256. "\n"
  1257. "ITERATE SYNTHESIZED WAVE-PACKETS DEFINED BY PARTIALS-DATA.\n"
  1258. "\n"
  1259. "PARTIALS DATA (pno = partial-number)\n"
  1260. "\n"
  1261. "MODE 1 : packets all have the same spectrum.\n"
  1262. " Partials data is pairs of \"pno level\"\n"
  1263. "MODE 2 : spectrum changes through time from one packet to next.\n"
  1264. "MODE 3 : spectrum changes at random from one packet to next (times ignored).\n"
  1265. " Partials data is lines of format \"time pno1 level1 [ pno2 level2 ...]\" \n"
  1266. " pno range 1-64 : level range -1 to 1 (-ve vals invert the phase).\n"
  1267. " Times must begin at zero and increase.\n"
  1268. "\n"
  1269. "DUR Duration of output stream.\n"
  1270. "PITCH Midipitch of packets, Range 24 to 96 (may vary over time).\n"
  1271. "MIN,MAXRISE Min and max risetime of packet envelope (Range 0.002 to 0.2 secs).\n"
  1272. " (Risetime set as random value between the 2 limits)\n"
  1273. "MIN,MAXSUS Min and max sustain of packet envelope (Range 0.0 to 0.2 secs).\n"
  1274. " (Sustain set as random value between the 2 limits)\n"
  1275. "MIN,MAXDECAY Min and max decaytime of packet envelope (Range 0.02 to 2 secs).\n"
  1276. " (Decaytime set as random value between the 2 limits)\n"
  1277. "SPEED (Average) time between packets in output (Range 0.05 to 1sec).\n"
  1278. "SCATTER Randomisation of speed (0-1)\n"
  1279. "EXPR Rise slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1280. "EXPD Decay slope (1 linear: >1 steeper: <1 shallower) (Range .25 to 4)\n"
  1281. "PSCAT Random jitter of pitch of packets: Range 0 - 1 semitones.\n"
  1282. "ASCAT Random jitter of amplitude of packets: Range 0 (no jitter) to 1.\n"
  1283. "OCTAV Amount of lower octave reinforcement : Range 0 - 1\n"
  1284. "BEND Amount of upward pitchbend of packets : Range 0 - 1 semitones.\n"
  1285. "SEED Same seed-number produces identical output on rerun (Integer >=1).\n"
  1286. "SRATE Sampling rate for synthesis (44100 to 96000).\n"
  1287. "COUNT Number of partials to use in synthesis.\n"
  1288. " Count must lie between 1 and 64 (maximum partials)\n"
  1289. " Fractional vals: e.g. 2.4 uses partials 1 & 2 at specified level,\n"
  1290. " and partial 3 at 0.4 of specified level\n"
  1291. " Zero (default) means (ignore this param and) use ALL partials.\n"
  1292. "\n"
  1293. "All params except DUR,SEED,SRATE and MIN/MAX RISE,SUS,DECAY can vary over time.\n"
  1294. "\n");
  1295. } else
  1296. fprintf(stderr,"Unknown option '%s'\n",str);
  1297. return(USAGE_ONLY);
  1298. }
  1299. int usage3(char *str1,char *str2)
  1300. {
  1301. fprintf(stderr,"Insufficient parameters on command line.\n");
  1302. return(USAGE_ONLY);
  1303. }
  1304. /****************************** GET_MODE *********************************/
  1305. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1306. {
  1307. char temp[200], *p;
  1308. if(sscanf(str,"%s",temp)!=1) {
  1309. sprintf(errstr,"Cannot read mode of program.\n");
  1310. return(USAGE_ONLY);
  1311. }
  1312. p = temp + strlen(temp) - 1;
  1313. while(p >= temp) {
  1314. if(!isdigit(*p)) {
  1315. fprintf(stderr,"Invalid mode of program entered.\n");
  1316. return(USAGE_ONLY);
  1317. }
  1318. p--;
  1319. }
  1320. if(sscanf(str,"%d",&dz->mode)!=1) {
  1321. fprintf(stderr,"Cannot read mode of program.\n");
  1322. return(USAGE_ONLY);
  1323. }
  1324. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1325. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1326. return(USAGE_ONLY);
  1327. }
  1328. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1329. return(FINISHED);
  1330. }
  1331. /**************************** DO_PULSER_PREPROCESS *************************************************************
  1332. *
  1333. * in buffer (insams[0]) PACKET BUFFER (maxpacket + insams[0]) OUTPUT BUFFER (maxpacket * 2)
  1334. * |-----------------|------------------------------------------|-----------------------------------------|
  1335. *
  1336. */
  1337. int do_pulser_preprocess(int ochancnt,dataptr dz)
  1338. {
  1339. int exit_status;
  1340. double srate = (double)dz->infile->srate, *sintab;
  1341. int maxpacket, seccnt, temp, insams, n, m, maxpar;
  1342. int mininsams, minoutsams, maxmax;
  1343. double maxtranspos, maxscat, maxbend, maxmaxd, maxmind;
  1344. unsigned int big_buffer_size, obuflen;
  1345. if(dz->brksize[PLS_MAXSUS]) {
  1346. if(get_maxvalue_in_brktable(&maxmaxd,PLS_MAXSUS,dz) < 0)
  1347. return(DATA_ERROR);
  1348. } else
  1349. maxmaxd = dz->param[PLS_MAXSUS];
  1350. if(dz->brksize[PLS_MINSUS]) {
  1351. if(get_maxvalue_in_brktable(&maxmind,PLS_MINSUS,dz) < 0)
  1352. return(DATA_ERROR);
  1353. } else
  1354. maxmind = dz->param[PLS_MINSUS];
  1355. if(maxmaxd < maxmind)
  1356. maxmaxd = maxmind;
  1357. maxmax = (int)round(maxmaxd * srate);
  1358. dz->iparam[PLS_MAXRISE] = (int)round(dz->param[PLS_MAXRISE] * srate);
  1359. dz->iparam[PLS_MINRISE] = (int)round(dz->param[PLS_MINRISE] * srate);
  1360. if(!dz->brksize[PLS_MINSUS])
  1361. dz->iparam[PLS_MINSUS] = (int)round(dz->param[PLS_MINSUS] * srate);
  1362. if(!dz->brksize[PLS_MAXSUS])
  1363. dz->iparam[PLS_MAXSUS] = (int)round(dz->param[PLS_MAXSUS] * srate);
  1364. if(!dz->brksize[PLS_MINSUS] && !dz->brksize[PLS_MAXSUS]) {
  1365. if(dz->iparam[PLS_MAXSUS] < dz->iparam[PLS_MINSUS]) {
  1366. temp = dz->iparam[PLS_MAXSUS];
  1367. dz->iparam[PLS_MAXSUS] = dz->iparam[PLS_MINSUS];
  1368. dz->iparam[PLS_MINSUS] = temp;
  1369. }
  1370. }
  1371. dz->iparam[PLS_MAXDECAY] = (int)round(dz->param[PLS_MAXDECAY] * srate);
  1372. dz->iparam[PLS_MINDECAY] = (int)round(dz->param[PLS_MINDECAY] * srate);
  1373. if(dz->iparam[PLS_MAXRISE] < dz->iparam[PLS_MINRISE]) {
  1374. temp = dz->iparam[PLS_MAXRISE];
  1375. dz->iparam[PLS_MAXRISE] = dz->iparam[PLS_MINRISE];
  1376. dz->iparam[PLS_MINRISE] = temp;
  1377. }
  1378. if(dz->iparam[PLS_MAXDECAY] < dz->iparam[PLS_MINDECAY]) {
  1379. temp = dz->iparam[PLS_MAXDECAY];
  1380. dz->iparam[PLS_MAXDECAY] = dz->iparam[PLS_MINDECAY];
  1381. dz->iparam[PLS_MINDECAY] = temp;
  1382. }
  1383. maxpacket = dz->iparam[PLS_MAXRISE] + maxmax + dz->iparam[PLS_MAXDECAY];
  1384. if(dz->process == PULSER3) {
  1385. if((dz->parray[2] = (double *)malloc((SYNTH_TABSIZE + 1) * sizeof(double)))==NULL) { // sin table
  1386. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1387. return(MEMORY_ERROR);
  1388. }
  1389. sintab = dz->parray[2];
  1390. for(n=0;n<SYNTH_TABSIZE;n++)
  1391. sintab[n] = sin(PI * 2.0 * ((double)n/(double)SYNTH_TABSIZE));
  1392. sintab[n] = sintab[0]; /* wrap around point */
  1393. if(dz->mode == 0)
  1394. maxpar = dz->itemcnt; // Only 1 set of partials to count
  1395. else {
  1396. maxpar = dz->iparray[1][0]; // Find largest set of partials
  1397. for(n = 1;n<dz->itemcnt;n++)
  1398. maxpar += dz->iparray[1][n];
  1399. }
  1400. if((dz->parray[3] = (double *)malloc(maxpar * sizeof(double)))==NULL) { // enough pointers into sin-table for largest set of partial
  1401. sprintf(errstr,"INSUFFICIENT MEMORY to store partial sintable pointers.\n");
  1402. return(MEMORY_ERROR);
  1403. }
  1404. if((dz->parray[6] = (double *)malloc(maxpar * sizeof(double)))==NULL) { // enough spaces for partial vals of largest set of partial
  1405. sprintf(errstr,"INSUFFICIENT MEMORY to store partial interpolated partial vals.\n");
  1406. return(MEMORY_ERROR);
  1407. }
  1408. if((dz->parray[7] = (double *)malloc(maxpar * sizeof(double)))==NULL) { // enough spaces for levels of largest set of partial
  1409. sprintf(errstr,"INSUFFICIENT MEMORY to store partial interpolated partial levels.\n");
  1410. return(MEMORY_ERROR);
  1411. }
  1412. for(n=0;n < maxpar;n++)
  1413. dz->parray[3][n] = 0.0;
  1414. if(!LEGAL_SRATE(dz->param[PLS_SRATE])) {
  1415. sprintf(errstr,"INVALID SAMPLING RATE ENTERED.\n");
  1416. return DATA_ERROR;
  1417. }
  1418. dz->counted = 0;
  1419. if(dz->brksize[PLS_CNT]) {
  1420. for(n = 0,m = 1;n<dz->brksize[PLS_CNT];n++,m+=2) {
  1421. if(dz->brk[PLS_CNT][m] < 1.0) {
  1422. sprintf(errstr,"Breakpoint values for partials-count cannot be less than 1.\n");
  1423. return(DATA_ERROR);
  1424. }
  1425. }
  1426. dz->counted = 1;
  1427. } else if(dz->param[PLS_CNT] > 0.0) {
  1428. if(dz->param[PLS_CNT] < 1.0) {
  1429. sprintf(errstr,"Non-zero Partials-count (%lf) cannot be less than 1.\n",dz->param[PLS_CNT]);
  1430. return(DATA_ERROR);
  1431. }
  1432. dz->counted = 1;
  1433. }
  1434. } else if(dz->mode > 0) {
  1435. mininsams = dz->insams[0];
  1436. for(n= 1;n<dz->infilecnt;n++)
  1437. mininsams = min(mininsams,dz->insams[n]);
  1438. if(dz->brksize[PLS_PSCAT]) {
  1439. if((exit_status = get_maxvalue_in_brktable(&maxscat,PLS_PSCAT,dz))<0)
  1440. return exit_status;
  1441. } else
  1442. maxscat = dz->param[PLS_PSCAT];
  1443. if(dz->brksize[PLS_BEND]) {
  1444. if((exit_status = get_maxvalue_in_brktable(&maxbend,PLS_BEND,dz))<0)
  1445. return exit_status;
  1446. } else
  1447. maxbend = dz->param[PLS_BEND];
  1448. maxtranspos = maxscat + maxbend;
  1449. maxtranspos = pow(2.0,maxtranspos/SEMITONES_PER_OCTAVE);
  1450. minoutsams = (int)floor((double)mininsams/maxtranspos); // min no of outsamples at max transposition
  1451. if(minoutsams <= maxpacket) {
  1452. sprintf(errstr,"COMBO OF TRANSPOSITION, GLISS AND SCATTER MAKE SRC POSSIBLY TOO SHORT FOR MAX PACKET SIZE.\n");
  1453. return DATA_ERROR;
  1454. }
  1455. }
  1456. maxpacket += 40; // SAFETY
  1457. seccnt = maxpacket/F_SECSIZE;
  1458. if(seccnt * F_SECSIZE < maxpacket)
  1459. seccnt++;
  1460. maxpacket = seccnt * F_SECSIZE;
  1461. if(dz->process == PULSER3) {
  1462. insams = maxpacket;
  1463. dz->srcsamps = insams;
  1464. } else {
  1465. insams = dz->insams[0];
  1466. if(dz->process == PULSER2) {
  1467. for(n=1;n<dz->infilecnt;n++)
  1468. insams = max(insams,dz->insams[n]);
  1469. }
  1470. }
  1471. insams++; // wraparound point
  1472. big_buffer_size = insams + (insams + maxpacket) + (maxpacket * 2);
  1473. dz->buflen = maxpacket; // | insams | insams +mxpk mxpk mxpk
  1474. obuflen = dz->buflen; // |-----------|-----------i----|----|----|
  1475. if(ochancnt > 1) { // | INBUF PKTBUF OBUF OVFLW
  1476. big_buffer_size += (dz->buflen * (ochancnt - 1) * 2); // FOR 4chan-out add to obuf | i----i----i----|
  1477. obuflen *= ochancnt; // and to ovflw i----i----i----|
  1478. } // = (obufcnt - 1) for both OBUF and OVFLW = (ochancnt - 1) * 2
  1479. if(big_buffer_size <= 0 || obuflen <= 0) {
  1480. sprintf(errstr, "INSUFFICIENT MEMORY to create sound buffers for stereo work.\n");
  1481. return(MEMORY_ERROR);
  1482. }
  1483. if((dz->bigbuf = (float *)Malloc(big_buffer_size * sizeof(float)))==NULL) {
  1484. sprintf(errstr, "INSUFFICIENT MEMORY to create sound buffers.\n");
  1485. return(MEMORY_ERROR);
  1486. }
  1487. dz->sbufptr[0] = dz->sampbuf[0] = dz->bigbuf; // INPUT BUFFER
  1488. dz->sbufptr[1] = dz->sampbuf[1] = dz->sampbuf[0] + insams; // PACKET BUFFER
  1489. dz->sbufptr[2] = dz->sampbuf[2] = dz->sampbuf[1] + insams + maxpacket; // OUTPUT BUFFER
  1490. dz->sbufptr[3] = dz->sampbuf[3] = dz->sampbuf[2] + obuflen; // OVERFLOW BUFFER
  1491. memset((char *)dz->sampbuf[0],0,(size_t)(insams * sizeof(float)));
  1492. memset((char *)dz->sampbuf[1],0,(size_t)((insams + maxpacket) * sizeof(float)));
  1493. memset((char *)dz->sampbuf[2],0,(size_t)(obuflen * sizeof(float)));
  1494. memset((char *)dz->sampbuf[3],0,(size_t)(obuflen * sizeof(float)));
  1495. return(FINISHED);
  1496. }
  1497. /****************************** PULSER *************************/
  1498. //#define ACCEPTABLE_MAXLEVEL 0.9
  1499. #define ACCEPTABLE_MAXLEVEL 0.75
  1500. int pulser(int ochancnt,dataptr dz)
  1501. { int exit_status, passno, permcnt = 0, k, thisprocess = dz->process, splineread = 0, chan = 0;
  1502. double time, srate = (double)dz->infile->srate, maxsamp = 0.0, normaliser = 1.0, rr, frq = 0.0, upfrq, timerscale;
  1503. int secondderivtab = 0;
  1504. int packetsize, obufpos, bufstep, lastwrite, riserange, susrange, decayrange, rise, sustain, decay, n, srcsize = 0, temp;
  1505. int obuflen = dz->buflen;
  1506. float *buf = dz->sampbuf[0], *obuf = dz->sampbuf[2], *ovflow = dz->sampbuf[3];
  1507. int *perm;
  1508. if(ochancnt > 1)
  1509. obuflen = dz->buflen * ochancnt;
  1510. if((dz->process == PULSER3 || dz->mode == 0) && dz->brksize[PLS_PITCH] > 0) { // Set up cubic spline array for pitch interp, wherever needed
  1511. splineread = 1;
  1512. if(dz->process == PULSER3) {
  1513. if(dz->mode > 0)
  1514. secondderivtab = 5;
  1515. else
  1516. secondderivtab = 4;
  1517. } // else its in parray 0
  1518. if((dz->parray[secondderivtab] = (double *)malloc(dz->brksize[PLS_PITCH] * sizeof(double)))==NULL) {
  1519. sprintf(errstr,"INSUFFICIENT MEMORY to store second derivs for cubic spline.\n");
  1520. return(MEMORY_ERROR);
  1521. }
  1522. if((exit_status = spline(secondderivtab,dz)) < 0)
  1523. return exit_status;
  1524. }
  1525. if(dz->process == PULSER3)
  1526. srate = 44100.0;
  1527. else
  1528. srate = (double)dz->infile->srate;
  1529. if((perm = (int *)malloc(sizeof(int) * dz->infilecnt))==NULL) {
  1530. sprintf(errstr,"INSUFFICIENT MEMORY establishing file permutations buffer.\n");
  1531. return(MEMORY_ERROR);
  1532. }
  1533. dz->tempsize = (int)round(dz->param[PLS_DUR] * srate) * ochancnt;
  1534. timerscale = (double)(PBAR_LENGTH - 1)/(double)dz->tempsize;
  1535. riserange = dz->iparam[PLS_MAXRISE] - dz->iparam[PLS_MINRISE];
  1536. if(dz->brksize[PLS_MAXSUS])
  1537. dz->iparam[PLS_MAXSUS] = (int)round(dz->param[PLS_MAXSUS] * srate);
  1538. if(dz->brksize[PLS_MINSUS])
  1539. dz->iparam[PLS_MINSUS] = (int)round(dz->param[PLS_MINSUS] * srate);
  1540. susrange = dz->iparam[PLS_MAXSUS] - dz->iparam[PLS_MINSUS];
  1541. if(susrange < 0.0) {
  1542. susrange = -susrange;
  1543. temp = dz->iparam[PLS_MAXSUS];
  1544. dz->iparam[PLS_MAXSUS] = dz->iparam[PLS_MINSUS];
  1545. dz->iparam[PLS_MINSUS] = temp;
  1546. }
  1547. decayrange = dz->iparam[PLS_MAXDECAY] - dz->iparam[PLS_MINDECAY];
  1548. if(dz->process == PULSER) {
  1549. if((dz->ssampsread = fgetfbufEx(buf, dz->insams[0],dz->ifd[0],0)) < 0) {
  1550. sprintf(errstr,"Can't read samples from input file.\n");
  1551. return(SYSTEM_ERROR);
  1552. }
  1553. srcsize = dz->insams[0];
  1554. buf[srcsize] = buf[srcsize-1]; // wraparound point
  1555. }
  1556. for(passno = 0;passno < 2;passno++) {
  1557. dz->total_samps_written = 0;
  1558. if(sloom) {
  1559. fprintf(stdout,"TIME: 0\n");
  1560. fflush(stdout);
  1561. }
  1562. if(passno == 0)
  1563. print_outmessage_flush("Initial pass, Assessing level.\n");
  1564. else
  1565. print_outmessage_flush("Creating sound.\n");
  1566. memset((char *)obuf,0,obuflen * sizeof(float));
  1567. memset((char *)ovflow,0,obuflen * sizeof(float));
  1568. time = 0.0;
  1569. obufpos = 0;
  1570. lastwrite = 0;
  1571. srand((int)dz->iparam[PLS_SEED]); // Restart SAME random sequence
  1572. // initrand48();
  1573. while(time < dz->param[PLS_DUR]) {
  1574. if(dz->process == PULSER2) {
  1575. if(dz->vflag[0])
  1576. k = (int)floor(drand48() * dz->infilecnt);
  1577. else {
  1578. if(permcnt % dz->infilecnt == 0) {
  1579. rndintperm(perm,dz->infilecnt);
  1580. permcnt = 0;
  1581. }
  1582. k = perm[permcnt];
  1583. permcnt++;
  1584. }
  1585. sndseekEx(dz->ifd[k],0,0);
  1586. if((dz->ssampsread = fgetfbufEx(buf, dz->insams[k],dz->ifd[k],0)) < 0) {
  1587. sprintf(errstr,"Can't (re)read samples from file %d.\n",k+1);
  1588. return(SYSTEM_ERROR);
  1589. }
  1590. srcsize = dz->insams[k];
  1591. buf[srcsize] = buf[srcsize-1];
  1592. }
  1593. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1594. return(exit_status);
  1595. if(dz->iparray != NULL) {
  1596. if((chan = get_chan_to_use(time,dz)) < 0) {
  1597. sprintf(errstr,"FAILED TO FIND CHANNEL TO USE\n");
  1598. return(PROGRAM_ERROR);
  1599. }
  1600. }
  1601. if(splineread)
  1602. dz->param[PLS_PITCH] = splint(secondderivtab,time,dz);
  1603. rise = (int)round(drand48() * riserange);
  1604. rise += dz->iparam[PLS_MINRISE];
  1605. rise = min(rise,dz->iparam[PLS_MAXRISE]);
  1606. sustain = (int)round(drand48() * susrange);
  1607. sustain += dz->iparam[PLS_MINSUS];
  1608. sustain = min(sustain,dz->iparam[PLS_MAXSUS]);
  1609. decay = (int)round(drand48() * decayrange);
  1610. decay += dz->iparam[PLS_MINDECAY];
  1611. decay = min(decay,dz->iparam[PLS_MAXDECAY]);
  1612. if(dz->process == PULSER3) {
  1613. frq = miditohz(dz->param[PLS_PITCH]); // Use input frq to generate packet
  1614. synthesize_src(frq,srate,time,dz);
  1615. frq = 1.0; // Use scatter and bend values to transpose it
  1616. } else {
  1617. if(dz->mode == 0)
  1618. frq = miditohz(dz->param[PLS_PITCH]);
  1619. else
  1620. frq = 1.0; // Frq == transposition in this case
  1621. }
  1622. if(dz->param[PLS_PSCAT] > 0.0) {
  1623. rr = (drand48() * 2.0) - 1.0; // +- 1 semitone
  1624. rr *= dz->param[PLS_PSCAT]; // +- PLS_PSCAT semitones
  1625. rr = pow(2.0,rr/SEMITONES_PER_OCTAVE);
  1626. frq *= rr;
  1627. }
  1628. if(dz->param[PLS_BEND] > 0.0) {
  1629. rr = pow(2.0,dz->param[PLS_BEND]/SEMITONES_PER_OCTAVE);
  1630. upfrq = frq * rr;
  1631. } else
  1632. upfrq = frq;
  1633. if((exit_status = generate_packet(&packetsize,frq,upfrq,rise,sustain,decay,srcsize,srate,dz))<0)
  1634. return(exit_status);
  1635. if((exit_status = output_packet(obufpos,packetsize,chan,&lastwrite,ochancnt,dz))<0)
  1636. return(exit_status);
  1637. bufstep = (int)round(dz->param[PLS_SPEED] * srate);
  1638. if(dz->param[PLS_SCAT] > 0.0) {
  1639. rr = (drand48() * 2.0) - 1.0; // Range -1 to +1
  1640. rr /= 2.0; // Range -1/2 to +1/2
  1641. rr *= dz->param[PLS_SCAT]; // Range = rand fraction of -1/2 to +1/2
  1642. bufstep = (int)round((double)bufstep * (1.0 + rr));
  1643. }
  1644. if(ochancnt > 1)
  1645. obufpos += bufstep * ochancnt; // Advance to write-position for next packet.
  1646. else
  1647. obufpos += bufstep; // Advance to write-position for next packet.
  1648. while(obufpos >= obuflen) { // If this is beyond output buffer end, we can write the output buffer
  1649. // And if there's a leap of silence to next output event,
  1650. if(passno == 0) { // loop keeps outputting (possibly empty) buffers until new output time is reached
  1651. for(n=0;n<obuflen;n++)
  1652. maxsamp = max(maxsamp,fabs(obuf[n]));
  1653. if(sloom)
  1654. showpulsertime(thisprocess,obuflen,timerscale,dz);
  1655. } else {
  1656. for(n=0;n<obuflen;n++)
  1657. obuf[n] = (float)(obuf[n] * normaliser);
  1658. if(sloom)
  1659. dz->process = DISTORT_PULSED;
  1660. if((exit_status = write_samps(obuf,obuflen,dz))<0)
  1661. return(exit_status);
  1662. if(sloom)
  1663. dz->process = thisprocess;
  1664. }
  1665. memcpy((char *)obuf,(char *)ovflow,obuflen * sizeof(float)); // Copy back overflow buffer
  1666. memset((char *)ovflow,0,obuflen * sizeof(float)); // Clean overflow buffer
  1667. obufpos -= obuflen;
  1668. lastwrite -= obuflen;
  1669. lastwrite = max(0,lastwrite);
  1670. }
  1671. time += (double)bufstep/srate;
  1672. }
  1673. if(passno == 0) { // loop keeps outputting (possibly empty) buffers until new output time is reached
  1674. for(n=0;n<lastwrite;n++)
  1675. maxsamp = max(maxsamp,fabs(obuf[n]));
  1676. if(maxsamp > ACCEPTABLE_MAXLEVEL)
  1677. normaliser = ACCEPTABLE_MAXLEVEL/maxsamp;
  1678. if(sloom)
  1679. showpulsertime(thisprocess,lastwrite,timerscale,dz);
  1680. } else {
  1681. if(lastwrite > 0) {
  1682. for(n=0;n<lastwrite;n++)
  1683. obuf[n] = (float)(obuf[n] * normaliser);
  1684. if(sloom)
  1685. dz->process = DISTORT_PULSED;
  1686. if((exit_status = write_samps(obuf,lastwrite,dz))<0)
  1687. return(exit_status);
  1688. if(sloom)
  1689. dz->process = thisprocess;
  1690. }
  1691. }
  1692. }
  1693. return FINISHED;
  1694. }
  1695. /**************************** OUTPUT_PACKET *****************************/
  1696. int output_packet(int obufpos,int packetsize,int chan,int *lastwrite,int ochancnt,dataptr dz)
  1697. {
  1698. int n, obufpos1, obufpos2;
  1699. int lhs = 0;
  1700. float *pbuf = dz->sampbuf[1], *obuf = dz->sampbuf[2];
  1701. double leftej = 0, range = 0, pos = 0, leftgain = 0, rightgain = 0;
  1702. if(ochancnt == 2) {
  1703. leftej = -dz->param[PLS_WIDTH];
  1704. range = dz->param[PLS_WIDTH] * 2.0;
  1705. pos = (drand48() * range) + leftej; // In range -1 to +1
  1706. pancalc(pos,&leftgain,&rightgain);
  1707. for(n=0;n<packetsize;n++) {
  1708. obuf[obufpos] = (float)(obuf[obufpos] + (pbuf[n] * leftgain));
  1709. obufpos++;
  1710. obuf[obufpos] = (float)(obuf[obufpos] + (pbuf[n] * rightgain));
  1711. obufpos++;
  1712. } // <- - - 2 - - ->
  1713. } else if(ochancnt == 8) { // 3 1/2 4 1/2 5
  1714. // e.g for centring on lspkr 4 | way | way |
  1715. if(dz->param[PLS_WIDTH] > 0.0) { // | |<- - - 2 - - ->|
  1716. leftej = -dz->param[PLS_WIDTH]; // Total range (4~5) = 2 and | # |-------#-------|
  1717. range = dz->param[PLS_WIDTH] * 2.0; // Range reduced to 1-to-width*2 then | # |-------#- |
  1718. pos = (drand48() * range) + leftej; // centred on central lspkr(4) (pos=0) | # ----|---- # |
  1719. // So range now -width to +width. | #xxx----|----xxx# |
  1720. pos /= 2.0; // Convert from range btwn 1/2ways to | e.g.-1/3| +1/3 |
  1721. // range btwn central & adjacent lspkr |xxxxxxxxxxx----|-----xxxxxxxxxx|
  1722. if(pos < 0.0) { // | -1/6| +1/6 |
  1723. lhs = 1; // vals at LHS convert to to range 3~4 | | |
  1724. pos = 1.0 - pos; // | 5/6| |
  1725. } else { // vals at RHS convert to to range 4~5 | | -1/6 |
  1726. lhs = 0;
  1727. pos = -pos;
  1728. }
  1729. pancalc(pos,&leftgain,&rightgain);
  1730. obufpos += chan;
  1731. if(lhs) {
  1732. obufpos1 = obufpos - 1;
  1733. if(obufpos1 < 0)
  1734. obufpos1 += 8;
  1735. obufpos2 = obufpos;
  1736. } else {
  1737. obufpos2 = obufpos + 1;
  1738. if(obufpos2 >= 8)
  1739. obufpos2 = 0;
  1740. obufpos1 = obufpos;
  1741. }
  1742. for(n=0;n<packetsize;n++) {
  1743. obuf[obufpos1] = (float)(obuf[obufpos1] + (pbuf[n] * leftgain));
  1744. obuf[obufpos2] = (float)(obuf[obufpos2] + (pbuf[n] * rightgain));
  1745. obufpos1 += 8;
  1746. obufpos2 += 8;
  1747. obufpos += 8;
  1748. }
  1749. obufpos -= chan;
  1750. } else {
  1751. // + + + +
  1752. obufpos += chan; // obp sch obp+8 sch obp+16 sch obp+8n sch
  1753. for(n=0;n<packetsize;n++) { // |_______|_______|_______|_______|_______|_______|.......|
  1754. obuf[obufpos] = (float)(obuf[obufpos] + pbuf[n]); // 0 0 0 0 X 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 X 0 0 0 0 last
  1755. obufpos += 8; // | 1st | 2nd | e.g.last ptr
  1756. } // | write | write | write ^ advance
  1757. obufpos -= chan; // | | | | returns
  1758. } // |_<<<_ to
  1759. } else {
  1760. for(n=0;n<packetsize;n++) {
  1761. obuf[obufpos] = (float)(obuf[obufpos] + pbuf[n]);
  1762. obufpos++;
  1763. }
  1764. }
  1765. if(obufpos > *lastwrite) // Keep record of maximumn output sample position in buffer
  1766. *lastwrite = obufpos;
  1767. return FINISHED;
  1768. }
  1769. /********************** GENERATE_PACKET ********************************/
  1770. int generate_packet(int *packetsize,double frq,double upfrq,int rise,int sustain,int decay,int srcsize,double srate,dataptr dz)
  1771. {
  1772. int delaytype = 0;
  1773. int n, m, k = 0, delay, writemax = 0, cyclecnt, updelay, thisdelay;
  1774. double maxsamp = 0.0, normaliser = 1.0, env, rr, amp, delstep, del;
  1775. int maxrange, pakrange, rndrange, srclo, srchi;
  1776. double srcpos, diff, istep, frac, frqstep;
  1777. float *pbuf = dz->sampbuf[1], *ibuf = dz->sampbuf[0];
  1778. memset((char *)pbuf,0,(dz->ssampsread + dz->buflen) * sizeof(float));
  1779. *packetsize = rise + sustain + decay;
  1780. if(dz->process == PULSER3)
  1781. delaytype = 0;
  1782. else {
  1783. switch(dz->mode) {
  1784. case(0): delaytype = 1; break;
  1785. case(1):
  1786. case(2): delaytype = 0; break;
  1787. }
  1788. }
  1789. if(delaytype) {
  1790. delay = (int)round(srate/frq);
  1791. updelay = (int)round(srate/upfrq);
  1792. delstep = (double)(delay - updelay)/((double)*packetsize/(double)updelay); // Approx only
  1793. n = 0;
  1794. cyclecnt = 0;
  1795. del = (double)delay;
  1796. thisdelay = delay;
  1797. while(n < *packetsize) {
  1798. if(dz->param[PLS_ASCAT] > 0) {
  1799. if(cyclecnt % 2 == 0) {
  1800. for(m = 0,k = n;m<dz->ssampsread;m++,k++)
  1801. pbuf[k] = (float)(pbuf[k] + ibuf[m]);
  1802. } else {
  1803. amp = drand48() * dz->param[PLS_ASCAT];
  1804. amp = 1.0 - amp;
  1805. for(m = 0,k = n;m<dz->ssampsread;m++,k++)
  1806. pbuf[k] = (float)(pbuf[k] + (ibuf[m] * amp));
  1807. }
  1808. } else {
  1809. for(m = 0,k = n;m<dz->ssampsread;m++,k++)
  1810. pbuf[k] = (float)(pbuf[k] + ibuf[m]);
  1811. }
  1812. n += thisdelay;
  1813. del -= delstep;
  1814. thisdelay = (int)round(del);
  1815. cyclecnt++;
  1816. }
  1817. writemax = k;
  1818. } else {
  1819. frqstep = (upfrq - frq)/(double)(*packetsize);
  1820. k = 0;
  1821. if(dz->process != PULSER3 && dz->mode == 2) {
  1822. maxrange = (int)floor((double)srcsize/upfrq); // No of possible steps in src, at given frq : approx, use maxfrq (worst case)
  1823. pakrange = (int)ceil((double)(*packetsize)/upfrq); // No of steps in src to make packet, at given frq
  1824. rndrange = maxrange - pakrange; // Available range of possible start-positions in src
  1825. srcpos = drand48() * (double)rndrange;
  1826. } else
  1827. srcpos = 0.0;
  1828. while(k < *packetsize) {
  1829. srclo = (int)floor(srcpos);
  1830. srchi = (int)ceil(srcpos);
  1831. diff = srcpos - (double)srclo;
  1832. istep = ibuf[srchi] - ibuf[srclo];
  1833. frac = istep * diff;
  1834. pbuf[k] = (float)(ibuf[srclo] + frac);
  1835. srcpos += frq;
  1836. frq += frqstep;
  1837. k++;
  1838. }
  1839. }
  1840. // Create attack and decay envelopes of packet
  1841. if(dz->param[PLS_EXP] != 1.0) {
  1842. for(n=0;n < rise;n++) {
  1843. env = (double)n/(double)rise;
  1844. env = pow(env,dz->param[PLS_EXP]);
  1845. pbuf[n] = (float)(pbuf[n] * env);
  1846. }
  1847. } else {
  1848. for(n=0;n < rise;n++) {
  1849. env = (double)n/(double)rise;
  1850. pbuf[n] = (float)(pbuf[n] * env);
  1851. }
  1852. }
  1853. if(dz->param[PLS_EXP2] != 1.0) {
  1854. for(n=(*packetsize)-1,m=0;m < decay;n--,m++) {
  1855. env = (double)m/(double)decay;
  1856. env = pow(env,dz->param[PLS_EXP2]);
  1857. pbuf[n] = (float)(pbuf[n] * env);
  1858. }
  1859. } else {
  1860. for(n=(*packetsize)-1,m=0;m < decay;n--,m++) {
  1861. env = (double)m/(double)decay;
  1862. pbuf[n] = (float)(pbuf[n] * env);
  1863. }
  1864. }
  1865. if(dz->process == PULSER3 || dz->mode == 0) {
  1866. for(n= *packetsize;n < writemax;n++) // SAFETY : Zero rest of packet, beyond env end
  1867. pbuf[n] = 0.0f;
  1868. }
  1869. for(n=0;n < *packetsize;n++)
  1870. maxsamp = max(maxsamp,fabs(pbuf[n]));
  1871. normaliser = ACCEPTABLE_MAXLEVEL/maxsamp; // Normalise packet loudness
  1872. if(dz->param[PLS_ASCAT] > 0.0) { // If amplitude jittered
  1873. rr = drand48() * dz->param[PLS_ASCAT]; // Get random amplitude reduction
  1874. rr = 1.0 - rr; // NB rr 0 = no-reduction, rr 1 = max reduxtion
  1875. normaliser *= rr;
  1876. }
  1877. for(n=0;n < *packetsize;n++)
  1878. pbuf[n] = (float)(pbuf[n] * normaliser);
  1879. return FINISHED;
  1880. }
  1881. /*********************** RNDINTPERM ************************/
  1882. void rndintperm(int *perm,int cnt)
  1883. {
  1884. int n,t,k;
  1885. memset((char *)perm,0,cnt * sizeof(int));
  1886. for(n=0;n<cnt;n++) {
  1887. t = (int)(drand48() * (double)(n+1)); /* TRUNCATE */
  1888. if(t==n) {
  1889. for(k=n;k>0;k--)
  1890. perm[k] = perm[k-1];
  1891. perm[0] = n;
  1892. } else {
  1893. for(k=n;k>t;k--)
  1894. perm[k] = perm[k-1];
  1895. perm[t] = n;
  1896. }
  1897. }
  1898. }
  1899. /*********************** SHOWPULSERTIME ************************/
  1900. void showpulsertime(int thisprocess,int samps_processed,double timerscale,dataptr dz)
  1901. {
  1902. dz->total_samps_written += samps_processed;
  1903. dz->process = DISTORT_PULSED;
  1904. fprintf(stdout,"TIME: %lf\n",min((double)(PBAR_LENGTH-1),(double)dz->total_samps_written * timerscale));
  1905. fflush(stdout);
  1906. dz->process = thisprocess;
  1907. }
  1908. /******************************** SYNTHESIZE_SRC ********************************/
  1909. int synthesize_src(double frq,double srate,double time,dataptr dz)
  1910. {
  1911. int n,i,j, *dataindex, *datasize, isfrac = 0, partialscnt, thispartialscnt, nextpartialscnt, nextlopar;
  1912. int loindex, hiindex;
  1913. double loval, hival, valdiff, timefrac, val, level, onehzincr, parfrac = 0.0,/* nexttime,*/ partialdiff, leveldiff;
  1914. float *ibuf = dz->sampbuf[0];
  1915. double *partials = dz->parray[0], *levels = dz->parray[1];
  1916. double *sintab = dz->parray[2], *sinptr = dz->parray[3], *datatime, *thispartials = dz->parray[6], *thislevels = dz->parray[7];
  1917. int sampcnt = 0, lopar;
  1918. if(dz->mode == 0) {
  1919. lopar = 0; // Fixed set of partials
  1920. partialscnt = dz->itemcnt;
  1921. for(n=0;n < partialscnt;n++) {
  1922. thispartials[n] = partials[n];
  1923. thislevels[n] = levels[n];
  1924. }
  1925. } else {
  1926. datatime = dz->parray[4]; // Timed sets of partials
  1927. dataindex = dz->iparray[0];
  1928. datasize = dz->iparray[1];
  1929. if(dz->mode == 1) { // Get partials at given time
  1930. n = 0;
  1931. while(time >= datatime[n]) {
  1932. n++;
  1933. if(n == dz->itemcnt)
  1934. break;
  1935. }
  1936. n--;
  1937. lopar = dataindex[n];
  1938. partialscnt = datasize[n];
  1939. if(n == dz->itemcnt - 1) { // Use final partials set
  1940. for(n=0,i = lopar;n < partialscnt;n++,i++) {
  1941. thispartials[n] = partials[i];
  1942. thislevels[n] = levels[i];
  1943. }
  1944. } else { // Interpolate partials
  1945. thispartialscnt = partialscnt;
  1946. // nexttime = datatime[n+1];
  1947. timefrac = (time - datatime[n])/(datatime[n+1] - datatime[n]);
  1948. nextlopar = dataindex[n+1];
  1949. nextpartialscnt = datasize[n+1];
  1950. partialscnt = max(thispartialscnt,nextpartialscnt);
  1951. for(n=0,i = lopar, j = nextlopar;n < partialscnt;n++,i++,j++) {
  1952. if(n < thispartialscnt && n < nextpartialscnt) { // Both spectra have this partial
  1953. partialdiff = partials[j] - partials[i]; // interp
  1954. partialdiff *= timefrac;
  1955. thispartials[n] = partials[i] + partialdiff;
  1956. leveldiff = levels[j] - levels[i];
  1957. leveldiff *= timefrac;
  1958. thislevels[n] = levels[i] + leveldiff;
  1959. } else if(n > thispartialscnt) { // More partials in next spectrum
  1960. thispartials[n] = partials[j]; // New partial rises to towards full level
  1961. thislevels[n] = levels[j] * timefrac;
  1962. } else { // Less partials in next spectrum
  1963. thispartials[n] = partials[i]; // Current partial level sinks towards zero
  1964. thislevels[n] = levels[i] * (1.0 - timefrac);
  1965. }
  1966. }
  1967. }
  1968. } else { // Get partials at random
  1969. n = (int)floor(drand48() * (double)dz->itemcnt);
  1970. lopar = dataindex[n];
  1971. partialscnt = datasize[n];
  1972. for(n=0,i = lopar;n < partialscnt;n++,i++) {
  1973. thispartials[n] = partials[i];
  1974. thislevels[n] = levels[i];
  1975. }
  1976. }
  1977. }
  1978. onehzincr = (double)SYNTH_TABSIZE/srate;
  1979. memset((char *)ibuf,0,dz->srcsamps * sizeof(float));
  1980. for(n=0;n<partialscnt;n++) // Zero sine-table pointers for all partials
  1981. sinptr[n] = 0.0;
  1982. if(dz->counted) { // If we are counting how many partials to use
  1983. partialscnt = min(partialscnt,(int)floor(dz->param[PLS_CNT])); // Find number of full-level partials
  1984. if((parfrac = dz->param[PLS_CNT] - partialscnt) > 0.0) // And get level of any attenuated partial
  1985. isfrac = 1;
  1986. }
  1987. while(sampcnt < dz->srcsamps) {
  1988. for(n=0;n < partialscnt;n++) {
  1989. loindex = (int)floor(sinptr[n]); // Read from sintable, using partial-increment
  1990. hiindex = loindex + 1;
  1991. loval = sintab[loindex];
  1992. hival = sintab[hiindex];
  1993. valdiff = hival - loval;
  1994. timefrac = sinptr[n] - (double)loindex;
  1995. val = loval + (valdiff * timefrac);
  1996. level = thislevels[n]; // Read corresponding level
  1997. val *= level;
  1998. ibuf[sampcnt] = (float)(ibuf[sampcnt] + val);
  1999. incr_sinptr(n,onehzincr,frq,dz); // Track (modify if ness) the partial-incr value for this partial
  2000. }
  2001. if(isfrac) {
  2002. loindex = (int)floor(sinptr[n]);
  2003. hiindex = loindex + 1;
  2004. loval = sintab[loindex];
  2005. hival = sintab[hiindex];
  2006. valdiff = hival - loval;
  2007. timefrac = sinptr[n] - (double)loindex;
  2008. val = loval + (valdiff * timefrac);
  2009. level = thislevels[n];
  2010. val *= level * parfrac; // Scale by fractional partial level
  2011. ibuf[sampcnt] = (float)(ibuf[sampcnt] + val);
  2012. incr_sinptr(n,onehzincr,frq,dz); // Track (modify if ness) the partial-incr value for this partial
  2013. }
  2014. sampcnt++;
  2015. }
  2016. return FINISHED;
  2017. }
  2018. /**************************** INCR_SINPTR ****************************/
  2019. void incr_sinptr(int n,double onehzincr,double frq,dataptr dz)
  2020. {
  2021. double *sinptr = dz->parray[3], *partials = dz->parray[6];
  2022. double thisincr = partials[n] * onehzincr;
  2023. thisincr *= frq;
  2024. sinptr[n] += thisincr;
  2025. if(sinptr[n] >= SYNTH_TABSIZE)
  2026. sinptr[n] -= (double)SYNTH_TABSIZE;
  2027. }
  2028. /**************************** HANDLE_THE_SPECIAL_DATA ****************************/
  2029. int handle_the_special_data(char *str,dataptr dz)
  2030. {
  2031. double dummy = 0.0, lasttime = 0.0, *datatime;
  2032. FILE *fp;
  2033. int cnt = 0, linecnt, datacnt, thisdatacnt, *dataindex, *datasize;
  2034. char temp[8000], *p;
  2035. if((fp = fopen(str,"r"))==NULL) {
  2036. sprintf(errstr,"Cannot open file %s to read times.\n",str);
  2037. return(DATA_ERROR);
  2038. }
  2039. switch(dz->process) {
  2040. case(PULSER3):
  2041. linecnt = 0;
  2042. if(dz->mode == 0) { // Read partial-no level pairs
  2043. while(fgets(temp,8000,fp)!=NULL) {
  2044. p = temp;
  2045. while(isspace(*p))
  2046. p++;
  2047. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2048. continue;
  2049. cnt = 0;
  2050. while(get_float_from_within_string(&p,&dummy)) {
  2051. if(cnt==0) {
  2052. if(dummy < 1.0 || dummy > 64.0) {
  2053. sprintf(errstr,"Partial numbers must be >= 1.0 and no more than 64.0\n");
  2054. return(DATA_ERROR);
  2055. }
  2056. } else {
  2057. if(dummy < -1.0 || dummy > 1.0) {
  2058. sprintf(errstr,"Partial levels must lie between -1.0 and 1.0\n");
  2059. return(DATA_ERROR);
  2060. }
  2061. }
  2062. cnt++;
  2063. }
  2064. if(!EVEN(cnt)) {
  2065. sprintf(errstr,"Invalid number of entries (%d) on line %d in file %s\n",cnt,linecnt+1,str);
  2066. return(DATA_ERROR);
  2067. }
  2068. linecnt++;
  2069. }
  2070. if(linecnt == 0) {
  2071. sprintf(errstr,"No data found in partials data file.\n");
  2072. return(DATA_ERROR);
  2073. }
  2074. if((dz->parray[0] = (double *)malloc(linecnt * sizeof(double)))==NULL) {
  2075. sprintf(errstr,"INSUFFICIENT MEMORY to store partial number data.\n");
  2076. return(MEMORY_ERROR);
  2077. }
  2078. if((dz->parray[1] = (double *)malloc(linecnt * sizeof(double)))==NULL) {
  2079. sprintf(errstr,"INSUFFICIENT MEMORY to store partial level data.\n");
  2080. return(MEMORY_ERROR);
  2081. }
  2082. fseek(fp,0,0);
  2083. dz->itemcnt = 0;
  2084. while(fgets(temp,8000,fp)!=NULL) {
  2085. p = temp;
  2086. while(isspace(*p))
  2087. p++;
  2088. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2089. continue;
  2090. cnt = 0;
  2091. while(get_float_from_within_string(&p,&dummy)) {
  2092. switch(cnt) {
  2093. case(0):
  2094. dz->parray[0][dz->itemcnt] = dummy;
  2095. break;
  2096. case(1):
  2097. dz->parray[1][dz->itemcnt] = dummy;
  2098. dz->itemcnt++;
  2099. break;
  2100. }
  2101. cnt++;
  2102. }
  2103. }
  2104. } else { // Read time partial-no level [partial-no2 level2 ...] lines
  2105. while(fgets(temp,8000,fp)!=NULL) { // Count (non-empty) data-lines
  2106. p = temp;
  2107. while(isspace(*p))
  2108. p++;
  2109. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2110. continue;
  2111. linecnt++;
  2112. }
  2113. if(linecnt < 2) {
  2114. sprintf(errstr,"File %s must have more than one line of data.\n",str);
  2115. return(MEMORY_ERROR);
  2116. }
  2117. if((dz->parray[4] = (double *)malloc(linecnt * sizeof(double)))==NULL) { // Store times
  2118. sprintf(errstr,"INSUFFICIENT MEMORY to store partial times.\n");
  2119. return(MEMORY_ERROR);
  2120. }
  2121. if((dz->iparray[0] = (int *)malloc(linecnt * sizeof(int)))==NULL) { // Store array index to partial data
  2122. sprintf(errstr,"INSUFFICIENT MEMORY to store index to partials.\n");
  2123. return(MEMORY_ERROR);
  2124. }
  2125. if((dz->iparray[1] = (int *)malloc(linecnt * sizeof(int)))==NULL) { // Store array index to partial count
  2126. sprintf(errstr,"INSUFFICIENT MEMORY to store sizes of spectra.\n");
  2127. return(MEMORY_ERROR);
  2128. }
  2129. dz->itemcnt = linecnt;
  2130. datatime = dz->parray[4];
  2131. dataindex = dz->iparray[0];
  2132. datasize = dz->iparray[1];
  2133. fseek(fp,0,0);
  2134. linecnt = 0;
  2135. datacnt = 0;
  2136. while(fgets(temp,8000,fp)!=NULL) { // Check data validity, store times and count data entries
  2137. p = temp;
  2138. while(isspace(*p))
  2139. p++;
  2140. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2141. continue;
  2142. cnt = 0;
  2143. while(get_float_from_within_string(&p,&dummy)) {
  2144. switch(cnt) {
  2145. case(0):
  2146. if(linecnt == 0) {
  2147. if(dummy != 0) {
  2148. sprintf(errstr,"First time in partials data (%lf) must be zero.\n",dummy);
  2149. return(DATA_ERROR);
  2150. } else
  2151. lasttime = dummy;
  2152. } else {
  2153. if(dummy <= lasttime) {
  2154. sprintf(errstr,"Times do not advance at line %d in partials data.\n",linecnt+1);
  2155. return(DATA_ERROR);
  2156. }
  2157. }
  2158. datatime[linecnt] = dummy;
  2159. break;
  2160. default:
  2161. if(ODD(cnt)) { // ODD entries, partial numbers
  2162. if(dummy < 1.0 || dummy > 64.0) {
  2163. sprintf(errstr,"Invalid partial (%lf) (Range 1 - 64) on line %d.\n",dummy,linecnt+1);
  2164. return(DATA_ERROR);
  2165. }
  2166. } else { // EVEN values are levels
  2167. if(dummy < -1.0 || dummy > 1.0) {
  2168. sprintf(errstr,"Invalid partial level (%lf) (Range -1 to +1) on line %d.\n",dummy,linecnt+1);
  2169. return(DATA_ERROR);
  2170. }
  2171. datacnt++; // Count the pairs-of-data (but NOT the time entries)
  2172. }
  2173. break;
  2174. }
  2175. cnt++;
  2176. }
  2177. if(cnt < 3 || EVEN(cnt)) {
  2178. sprintf(errstr,"Invalid number of entries (%d) on line %d\n",cnt,linecnt+1);
  2179. return(DATA_ERROR);
  2180. }
  2181. linecnt++;
  2182. }
  2183. if((dz->parray[0] = (double *)malloc(datacnt * sizeof(double)))==NULL) {
  2184. sprintf(errstr,"INSUFFICIENT MEMORY to store partial number data.\n");
  2185. return(MEMORY_ERROR);
  2186. }
  2187. if((dz->parray[1] = (double *)malloc(datacnt * sizeof(double)))==NULL) {
  2188. sprintf(errstr,"INSUFFICIENT MEMORY to store partial level data.\n");
  2189. return(MEMORY_ERROR);
  2190. }
  2191. datacnt = 0;
  2192. linecnt = 0;
  2193. fseek(fp,0,0);
  2194. while(fgets(temp,8000,fp)!=NULL) { // store data and store counts of each spectra's partials
  2195. p = temp;
  2196. while(isspace(*p))
  2197. p++;
  2198. if(*p == ';' || *p == ENDOFSTR)
  2199. continue;
  2200. cnt = 0;
  2201. dataindex[linecnt] = datacnt; // Store index in data-storage where this line's data begins
  2202. thisdatacnt = 0;
  2203. while(get_float_from_within_string(&p,&dummy)) {
  2204. if(cnt > 0) {
  2205. if(ODD(cnt)) // ODD entries, partial numbers
  2206. dz->parray[0][datacnt] = dummy;
  2207. else { // EVEN values are levels
  2208. dz->parray[1][datacnt] = dummy;
  2209. datacnt++;
  2210. thisdatacnt++; // Count the pno-level pairs
  2211. }
  2212. }
  2213. cnt++;
  2214. }
  2215. datasize[linecnt] = thisdatacnt; // Store size of this spectrum data in data-storage-array
  2216. linecnt++;
  2217. }
  2218. }
  2219. break;
  2220. case(PULSER):
  2221. case(PULSER2):
  2222. linecnt = 0;
  2223. while(fgets(temp,8000,fp)!=NULL) {
  2224. p = temp;
  2225. while(isspace(*p))
  2226. p++;
  2227. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2228. continue;
  2229. p = temp;
  2230. cnt = 0;
  2231. while(get_float_from_within_string(&p,&dummy)) {
  2232. if(cnt == 0) {
  2233. if(linecnt == 0) {
  2234. if(dummy != 0) {
  2235. sprintf(errstr,"First time in spatialisation data (%lf) must be zero.\n",dummy);
  2236. return(DATA_ERROR);
  2237. }
  2238. } else {
  2239. if(dummy <= lasttime) {
  2240. sprintf(errstr,"Times do not advance at line %d in spatialisation data.\n",linecnt+1);
  2241. return(DATA_ERROR);
  2242. }
  2243. }
  2244. lasttime = dummy;
  2245. } else {
  2246. if((int)round(dummy) != dummy) {
  2247. sprintf(errstr,"Non-integer channel spec (%lf) in spatialisation data line %d.\n",dummy,linecnt+1);
  2248. return(DATA_ERROR);
  2249. }
  2250. if(dummy < 1 || dummy > 8) {
  2251. sprintf(errstr,"Invalid channel spec (%ld) in spatialisation data line %d.\n",round(dummy),linecnt+1);
  2252. return(DATA_ERROR);
  2253. }
  2254. }
  2255. cnt++;
  2256. }
  2257. if(cnt < 2) {
  2258. sprintf(errstr,"No spatialisation data on line %d.\n",linecnt + 1);
  2259. return(DATA_ERROR);
  2260. }
  2261. if(cnt > 9) {
  2262. sprintf(errstr,"Too many spatialisation values on line %d.\n",linecnt + 1);
  2263. return(DATA_ERROR);
  2264. }
  2265. linecnt++;
  2266. }
  2267. if(linecnt == 0) {
  2268. sprintf(errstr,"No data found in Chans-to-use data file.\n");
  2269. return(DATA_ERROR);
  2270. }
  2271. if((dz->fptr = (float **)malloc(sizeof(float *)))==NULL) {
  2272. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use time data.\n");
  2273. return(MEMORY_ERROR);
  2274. }
  2275. if((dz->fptr[0] = (float *)malloc(linecnt * sizeof(float)))==NULL) {
  2276. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use time data %d.\n",cnt+1);
  2277. return(MEMORY_ERROR);
  2278. }
  2279. if((dz->iparray = (int **)malloc(2 * sizeof(int *)))==NULL) {
  2280. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data.\n");
  2281. return(MEMORY_ERROR);
  2282. }
  2283. if((dz->iparray[0] = (int *)malloc(linecnt * sizeof(int)))==NULL) {
  2284. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data %d.\n",cnt+1);
  2285. return(MEMORY_ERROR);
  2286. }
  2287. if((dz->iparray[1] = (int *)malloc(linecnt * sizeof(int)))==NULL) {
  2288. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data %d.\n",cnt+1);
  2289. return(MEMORY_ERROR);
  2290. }
  2291. fseek(fp,0,0);
  2292. dz->itemcnt = linecnt;
  2293. linecnt = 0;
  2294. while(fgets(temp,8000,fp)!=NULL) {
  2295. p = temp;
  2296. while(isspace(*p))
  2297. p++;
  2298. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2299. continue;
  2300. store_chans_to_use_data(temp,linecnt,dz);
  2301. linecnt++;
  2302. }
  2303. break;
  2304. }
  2305. if(fclose(fp)<0) {
  2306. fprintf(stdout,"WARNING: Failed to close input textfile %s.\n",str);
  2307. fflush(stdout);
  2308. }
  2309. return(FINISHED);
  2310. }
  2311. /*************************************** SPLINT *******************************
  2312. *
  2313. * Do cubic spline, using 2nd derivatives table.
  2314. */
  2315. double splint(int k,double time,dataptr dz)
  2316. {
  2317. double *frqtab = dz->brk[PLS_PITCH];
  2318. double *secondderiv = dz->parray[k];
  2319. int arraysize = dz->brksize[PLS_PITCH];
  2320. int hitim, lotim, hival, loval; // time and value indeces into brkpoint array
  2321. int hideriv, loderiv; // upper and lower indices into 2nd derivatives array
  2322. double timestep, hitimefrac, lotimefrac, val1, val2, val3;
  2323. if(time <= frqtab[0])
  2324. return frqtab[1];
  2325. hideriv = 0;
  2326. hitim = 0;
  2327. while(time > frqtab[hitim]) {
  2328. hitim+=2;
  2329. hideriv++;
  2330. if(hideriv >= arraysize)
  2331. return frqtab[(arraysize * 2)-1]; // last value in table
  2332. }
  2333. loderiv = hideriv - 1;
  2334. lotim = hitim - 2;
  2335. loval = lotim+1;
  2336. hival = hitim+1;
  2337. timestep = frqtab[hitim] - frqtab[lotim];
  2338. hitimefrac = (frqtab[hitim] - time)/timestep;
  2339. lotimefrac = (time - frqtab[lotim])/timestep;
  2340. val1 = hitimefrac * frqtab[loval];
  2341. val1 += lotimefrac * frqtab[hival];
  2342. val2 = (hitimefrac * hitimefrac * hitimefrac) - hitimefrac;
  2343. val2 *= secondderiv[loderiv];
  2344. val3 = (lotimefrac * lotimefrac * lotimefrac) - lotimefrac;
  2345. val3 *= secondderiv[hideriv];
  2346. val2 += val3;
  2347. val2 *= (timestep * timestep)/6.0;
  2348. val1 += val2;
  2349. return val1;
  2350. }
  2351. /*************************************** SPLINE *******************************
  2352. *
  2353. * Establish 2nd dervatives table for cubic spline calculations.
  2354. */
  2355. int spline(int secondderivtab,dataptr dz)
  2356. {
  2357. double firstderivatzero = 0.0, firstderivatend = 0.0, qn, un, val1, val2; // firstderiveatend is a guess
  2358. double *frqtab = dz->brk[PLS_PITCH];
  2359. int arraysize = dz->brksize[PLS_PITCH];
  2360. double *secondderiv = dz->parray[secondderivtab], *u;
  2361. int n, t, v, tt, vv, k;
  2362. double thistimestep, thisfrqstep, nexttimestep,nextfrqstep,bigtimestep, lasttime, lastval,sig,p;
  2363. if((u = (double *)malloc(arraysize * sizeof(double)))==NULL) {
  2364. sprintf(errstr,"INSUFFICIENT MEMORY for calculating spline derivatives.\n");
  2365. return(MEMORY_ERROR);
  2366. }
  2367. secondderiv[0] = -0.5;
  2368. thistimestep = frqtab[2] - frqtab[0];
  2369. thisfrqstep = frqtab[3] - frqtab[1];
  2370. val1 = 3.0/thistimestep;
  2371. val2 = (thisfrqstep/thistimestep) - firstderivatzero;
  2372. u[0] = val1 * val2;
  2373. lasttime = frqtab[0];
  2374. lastval = frqtab[1];
  2375. for(n = 1,t = 2, v = 3, tt = 4, vv = 5; n < arraysize - 1;n++,t+=2,v+=2,tt+=2,vv +=2) { // t indexes current times in brktable, v indexes current values
  2376. thisfrqstep = frqtab[v] - lastval; // tt indexes NEXT time, vv indexes NEXT value
  2377. nextfrqstep = frqtab[vv] - frqtab[v];
  2378. thistimestep = frqtab[t] - lasttime;
  2379. nexttimestep = frqtab[tt] - frqtab[t];
  2380. bigtimestep = frqtab[tt] - lasttime;
  2381. sig = thistimestep/bigtimestep;
  2382. p = (sig * secondderiv[n-1]) + 2.0;
  2383. secondderiv[n] = (sig - 1.0)/p;
  2384. u[n] = (nextfrqstep/nexttimestep) - (thisfrqstep/thistimestep);
  2385. u[n] = (6.0 * u[n])/bigtimestep;
  2386. u[n] -= sig * u[n-1];
  2387. u[n] /= p;
  2388. lasttime = frqtab[t];
  2389. lastval = frqtab[v];
  2390. }
  2391. qn = 0.5;
  2392. thisfrqstep = frqtab[v] - lastval;
  2393. thistimestep = frqtab[t] - lasttime;
  2394. val1 = 3.0/thistimestep;
  2395. val2 = firstderivatend - (thisfrqstep/thistimestep);
  2396. un = val1 * val2;
  2397. val1 = un - (qn * u[n-1]);
  2398. val2 = (qn * secondderiv[n-1]) + 1.0;
  2399. secondderiv[n] = val1/val2;
  2400. for(k = n-1;k >= 0;k--)
  2401. secondderiv[k] = (secondderiv[k] * secondderiv[k+1]) + u[k];
  2402. return FINISHED;
  2403. }
  2404. /************************************ PANCALC *******************************/
  2405. void pancalc(double position,double *leftgain,double *rightgain)
  2406. {
  2407. int signal_to_left;
  2408. double temp;
  2409. double relpos;
  2410. double reldist, invsquare;
  2411. if(position < 0.0)
  2412. signal_to_left = 1; /* signal on left */
  2413. else
  2414. signal_to_left = 0;
  2415. if(position < 0)
  2416. relpos = -position;
  2417. else
  2418. relpos = position;
  2419. if(relpos <= 1.0){ /* between the speakers */
  2420. temp = 1.0 + (relpos * relpos);
  2421. reldist = ROOT_2 / sqrt(temp);
  2422. temp = (position + 1.0) / 2.0;
  2423. *rightgain = temp * reldist;
  2424. *leftgain = (1.0 - temp ) * reldist;
  2425. } else { /* outside the speakers */
  2426. temp = (relpos * relpos) + 1.0;
  2427. reldist = sqrt(temp) / ROOT_2; /* relative distance to source */
  2428. invsquare = 1.0 / (reldist * reldist);
  2429. if(signal_to_left){
  2430. *leftgain = invsquare;
  2431. *rightgain = 0.0;
  2432. } else { /* SIGNAL_TO_RIGHT */
  2433. *rightgain = invsquare;
  2434. *leftgain = 0;
  2435. }
  2436. }
  2437. }
  2438. /************************************ STORE_CHANS_TO_USE_DATA *******************************/
  2439. int store_chans_to_use_data(char *temp,int linecnt,dataptr dz)
  2440. {
  2441. char *p = temp;
  2442. double dummy;
  2443. int test = 0, cnt = 0, val;
  2444. while(get_float_from_within_string(&p,&dummy)) {
  2445. if(cnt == 0) // Stores time
  2446. dz->fptr[0][linecnt] = (float)dummy;
  2447. else {
  2448. val = (int)round(dummy);
  2449. switch(val) {
  2450. case(1): test = test | 1; break;
  2451. case(2): test = test | 2; break;
  2452. case(3): test = test | 4; break;
  2453. case(4): test = test | 8; break;
  2454. case(5): test = test | 16; break;
  2455. case(6): test = test | 32; break;
  2456. case(7): test = test | 64; break;
  2457. case(8): test = test | 128; break;
  2458. }
  2459. }
  2460. cnt++;
  2461. }
  2462. dz->iparray[0][linecnt] = test; // Stores flag indicating lspkrs to use
  2463. dz->iparray[1][linecnt] = cnt-1; // Stores number of lspkrs to use
  2464. return 1;
  2465. }
  2466. /************************************ GET_CHAN_TO_USE *******************************/
  2467. int get_chan_to_use(double time,dataptr dz)
  2468. {
  2469. int n = 0, k, j;
  2470. int this_chan = 0, usable_chans;
  2471. int how_many_usable_chans, this_usable_chan_to_use, which_of_usable_chans = 0;
  2472. while(n < dz->itemcnt) { // Find array at specified time
  2473. if(time < dz->fptr[0][n])
  2474. break;
  2475. n++;
  2476. }
  2477. n--;
  2478. how_many_usable_chans = dz->iparray[1][n];
  2479. this_usable_chan_to_use = (int)ceil(drand48() * how_many_usable_chans);
  2480. usable_chans = dz->iparray[0][n];
  2481. k = 1; // k = 1 2 4 8 16 32 64 128 = numeric val of bits to mark
  2482. j = 1; // j = 1 2 3 4 5 6 7 8 = bits to mark
  2483. while(k < 129) {
  2484. if(usable_chans & k) {
  2485. this_chan = j;
  2486. which_of_usable_chans++;
  2487. if(which_of_usable_chans == this_usable_chan_to_use)
  2488. break;
  2489. }
  2490. k *= 2;
  2491. j++;
  2492. } // Chan info stored as 1-8
  2493. return (this_chan - 1); // chans are assigend as offsets relative to a base
  2494. } // So chan 1 = base+0 : chan2 = base+1 : etc.
  2495. /************************************* CHANNELSTRING ************************
  2496. *
  2497. * We begin with iparray = NULL.
  2498. * If a zero is found, stores nothing but returns 1 (so iparray remains NULL : -> output mono-or-stereo).
  2499. * If valid filetype found, returns 0, causing fileread, and iparray creation -> output 8-chan
  2500. * If valid channel-string found, stores in iparray and returns 1. -> output 8-chan
  2501. * IF an invalid filetype or an invalid string found, returns a DATA_ERROR..
  2502. */
  2503. int get_channel_string(char *str,dataptr dz)
  2504. {
  2505. int len, n, m, k = 0, test = 0, cnt = 0;
  2506. char *p, *true_string_start, q, temp[2000],j[8];
  2507. strcpy(temp,str);
  2508. p = temp;
  2509. p += strlen(temp);
  2510. p -= 4;
  2511. if(p > temp) { // Look for a valid file extension
  2512. if(!strcmp(p,".txt") || !strcmp(p,".brk"))
  2513. return 0; // Found a valid filetype
  2514. else if(!strcmp(p,".wav") || !strcmp(p,".ana") || !strcmp(p,".frq") || !strcmp(p,".trn") || !strcmp(p,".for") \
  2515. || !strcmp(p,".evl") || !strcmp(p,".txt") || !strcmp(p,".spe") || !strcmp(p,".spk") || !strcmp(p,".skk") \
  2516. || !strcmp(p,".rmi") || !strcmp(p,".mid")) {
  2517. sprintf(errstr,"INVALID FILETYPE FOR SPACEDATA\n");
  2518. return DATA_ERROR; // Found an invalid filetype
  2519. }
  2520. }
  2521. p = temp;
  2522. p++; // Find 1st char in input string
  2523. q = *p;
  2524. *p = ENDOFSTR;
  2525. p--;
  2526. if(!strcmp(p,"@")) { // if sloom, strip sloom's number-marker "@"
  2527. str++;
  2528. k = 1; // mark that string is shortened
  2529. }
  2530. if(!strcmp(str,"0")) // str is "0" : INDICATES A MONO OUTPUT, return
  2531. return 1;
  2532. len = strlen(str);
  2533. if(len > 8) {
  2534. sprintf(errstr,"SPACEDATA : INVALID FILENAME : INVALID STRING - TOO int FOR CHANNEL-NUMBER STRING\n");
  2535. return DATA_ERROR;
  2536. }
  2537. p++;
  2538. *p = q; // Replace the previously overwritten character in copy of input string
  2539. if(k==0) // If no "@" character has been removed, go back to start
  2540. p--;
  2541. true_string_start = p;
  2542. n = 0;
  2543. k = 1 + INT_TO_ASCII;
  2544. m = 8 + INT_TO_ASCII;
  2545. while(*p != ENDOFSTR) {
  2546. if(*p < k || *p > m) { // Check for only values 1-8: store valid vals found
  2547. sprintf(errstr,"SPACEDATA : INVALID FILENAME : INVALID STRING (%s) - CONTAINS CHARACTER (%c) OTHER THAN 1-8\n",true_string_start,*p);
  2548. return DATA_ERROR;
  2549. }
  2550. j[n] = *p;
  2551. p++;
  2552. n++;
  2553. }
  2554. if(n > 1) { // Look for duplicates amongst values found
  2555. for(m = 0;m < n-1;m++) {
  2556. for(k = m+1;k < n;k++) {
  2557. if(j[m] == j[k]) {
  2558. sprintf(errstr,"SPACEDATA : INVALID STRING (%s) - REPEATED NUMBER (%c)\n",true_string_start,j[m]);
  2559. return DATA_ERROR;
  2560. }
  2561. }
  2562. }
  2563. }
  2564. if((dz->fptr = (float **)malloc(sizeof(float *)))==NULL) {
  2565. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use time data.\n");
  2566. return(MEMORY_ERROR);
  2567. }
  2568. if((dz->fptr[0] = (float *)malloc(sizeof(float)))==NULL) {
  2569. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use time data.\n");
  2570. return(MEMORY_ERROR);
  2571. }
  2572. if((dz->iparray = (int **)malloc(2 * sizeof(int *)))==NULL) {
  2573. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data.\n");
  2574. return(MEMORY_ERROR);
  2575. }
  2576. if((dz->iparray[0] = (int *)malloc(sizeof(int)))==NULL) {
  2577. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data.\n");
  2578. return(MEMORY_ERROR);
  2579. }
  2580. if((dz->iparray[1] = (int *)malloc(sizeof(int)))==NULL) {
  2581. sprintf(errstr,"INSUFFICIENT MEMORY to store Chans-to-use data.\n");
  2582. return(MEMORY_ERROR);
  2583. }
  2584. p = true_string_start;
  2585. while(cnt < len) { // Store channels-used-info as bitflag
  2586. k = *p - INT_TO_ASCII;
  2587. switch(k) {
  2588. case(1): test = test | 1; break;
  2589. case(2): test = test | 2; break;
  2590. case(3): test = test | 4; break;
  2591. case(4): test = test | 8; break;
  2592. case(5): test = test | 16; break;
  2593. case(6): test = test | 32; break;
  2594. case(7): test = test | 64; break;
  2595. case(8): test = test | 128; break;
  2596. }
  2597. cnt++;
  2598. p++;
  2599. }
  2600. dz->iparray[0][0] = test;
  2601. dz->iparray[1][0] = len;
  2602. dz->fptr[0][0] = 0.0;
  2603. dz->itemcnt = 1;
  2604. return 1;
  2605. }