mchanrev.c 134 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378
  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 <ctype.h>
  37. #include <sfsys.h>
  38. #include <string.h>
  39. #include <srates.h>
  40. #include <modicon.h>
  41. #include <arrays.h>
  42. #if defined unix || defined __GNUC__
  43. #define round(x) lround((x))
  44. #endif
  45. #ifndef HUGE
  46. #define HUGE 3.40282347e+38F
  47. #endif
  48. char errstr[2400];
  49. int anal_infiles = 1;
  50. int sloom = 0;
  51. int sloombatch = 0;
  52. const char* cdp_version = "7.1.0";
  53. //CDP LIB REPLACEMENTS
  54. static int multichan_stadium_pconsistency(dataptr dz);
  55. static int setup_gate_application(dataptr dz);
  56. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  57. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  58. static int setup_gate_param_ranges_and_defaults(dataptr dz);
  59. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  60. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  61. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  62. static int establish_application(dataptr dz);
  63. static int initialise_vflags(dataptr dz);
  64. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  65. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  66. static int mark_parameter_types(dataptr dz,aplptr ap);
  67. static int assign_file_data_storage(int infilecnt,dataptr dz);
  68. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  69. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  70. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  71. static double dbtolevel(double val);
  72. static int do_multichan_stadium(dataptr dz);
  73. static int setup_multichan_stadium(dataptr dz);
  74. static int generate_delays(dataptr dz);
  75. int stad_ovflwsz, stad_maxdelay;
  76. #define ROOT2 (1.4142136)
  77. /**************************************** MAIN *********************************************/
  78. int main(int argc,char *argv[])
  79. {
  80. int exit_status;
  81. dataptr dz = NULL;
  82. char **cmdline;
  83. int cmdlinecnt;
  84. //aplptr ap;
  85. int is_launched = FALSE;
  86. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  87. fprintf(stdout,"%s\n",cdp_version);
  88. fflush(stdout);
  89. return 0;
  90. }
  91. /* CHECK FOR SOUNDLOOM */
  92. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  93. sloom = 0;
  94. sloombatch = 1;
  95. }
  96. if(sflinit("cdp")){
  97. sfperror("cdp: initialisation\n");
  98. return(FAILED);
  99. }
  100. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  101. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  102. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  103. return(FAILED);
  104. }
  105. if(!sloom) {
  106. if(argc == 1) {
  107. usage1();
  108. return(FAILED);
  109. } else if(argc == 2) {
  110. usage2(argv[1]);
  111. return(FAILED);
  112. }
  113. }
  114. if(!sloom) {
  115. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  116. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  117. return(FAILED);
  118. }
  119. cmdline = argv;
  120. cmdlinecnt = argc;
  121. if((get_the_process_no(argv[0],dz))<0)
  122. return(FAILED);
  123. cmdline++;
  124. cmdlinecnt--;
  125. // setup_particular_application =
  126. if((exit_status = setup_gate_application(dz))<0) {
  127. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  128. return(FAILED);
  129. }
  130. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  131. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. } else {
  135. //parse_TK_data() =
  136. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  137. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  138. return(exit_status);
  139. }
  140. }
  141. //ap = dz->application;
  142. // parse_infile_and_hone_type() =
  143. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  144. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  145. return(FAILED);
  146. }
  147. // setup_param_ranges_and_defaults() =
  148. if((exit_status = setup_gate_param_ranges_and_defaults(dz))<0) {
  149. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. // open_first_infile CDP LIB
  153. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  154. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  155. return(FAILED);
  156. }
  157. cmdlinecnt--;
  158. cmdline++;
  159. // handle_extra_infiles() : redundant
  160. // handle_outfile() =
  161. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  162. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  163. return(FAILED);
  164. }
  165. // handle_formants() redundant
  166. // handle_formant_quiksearch() redundant
  167. // handle_special_data() redundant
  168. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  169. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  170. return(FAILED);
  171. }
  172. // check_param_validity_and_consistency....
  173. if((exit_status = multichan_stadium_pconsistency(dz))<0) {
  174. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  175. return(FAILED);
  176. }
  177. is_launched = TRUE;
  178. dz->bufcnt = 4;
  179. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  180. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  181. return(MEMORY_ERROR);
  182. }
  183. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  184. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  185. return(MEMORY_ERROR);
  186. }
  187. if((exit_status = create_stadium_buffers(dz))<0) {
  188. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  189. return(FAILED);
  190. }
  191. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0) // CDP LIB
  192. return(exit_status);
  193. //param_preprocess() redundant
  194. //spec_process_file =
  195. if((exit_status = do_multichan_stadium(dz))<0) {
  196. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  197. return(FAILED);
  198. }
  199. if((exit_status = complete_output(dz))<0) { // CDP LIB
  200. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  201. return(FAILED);
  202. }
  203. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  204. free(dz);
  205. return(SUCCEEDED);
  206. }
  207. /**********************************************
  208. REPLACED CDP LIB FUNCTIONS
  209. **********************************************/
  210. /****************************** SET_PARAM_DATA *********************************/
  211. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  212. {
  213. ap->special_data = (char)special_data;
  214. ap->param_cnt = (char)paramcnt;
  215. ap->max_param_cnt = (char)maxparamcnt;
  216. if(ap->max_param_cnt>0) {
  217. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  218. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  219. return(MEMORY_ERROR);
  220. }
  221. strcpy(ap->param_list,paramlist);
  222. }
  223. return(FINISHED);
  224. }
  225. /****************************** SET_VFLGS *********************************/
  226. int set_vflgs
  227. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  228. {
  229. ap->option_cnt = (char) optcnt; /*RWD added cast */
  230. if(optcnt) {
  231. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  232. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  233. return(MEMORY_ERROR);
  234. }
  235. strcpy(ap->option_list,optlist);
  236. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  237. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  238. return(MEMORY_ERROR);
  239. }
  240. strcpy(ap->option_flags,optflags);
  241. }
  242. ap->vflag_cnt = (char) vflagcnt;
  243. ap->variant_param_cnt = (char) vparamcnt;
  244. if(vflagcnt) {
  245. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  246. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  247. return(MEMORY_ERROR);
  248. }
  249. strcpy(ap->variant_list,varlist);
  250. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  251. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  252. return(MEMORY_ERROR);
  253. }
  254. strcpy(ap->variant_flags,varflags);
  255. }
  256. return(FINISHED);
  257. }
  258. /***************************** APPLICATION_INIT **************************/
  259. int application_init(dataptr dz)
  260. {
  261. int exit_status;
  262. int storage_cnt;
  263. int tipc, brkcnt;
  264. aplptr ap = dz->application;
  265. if(ap->vflag_cnt>0)
  266. initialise_vflags(dz);
  267. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  268. ap->total_input_param_cnt = (char)tipc;
  269. if(tipc>0) {
  270. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  271. return(exit_status);
  272. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  273. return(exit_status);
  274. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  275. return(exit_status);
  276. }
  277. brkcnt = tipc;
  278. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  279. if(brkcnt>0) {
  280. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  281. return(exit_status);
  282. }
  283. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  284. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  285. return(exit_status);
  286. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  287. return(exit_status);
  288. }
  289. if((exit_status = mark_parameter_types(dz,ap))<0)
  290. return(exit_status);
  291. // establish_infile_constants() replaced by
  292. dz->infilecnt = 1;
  293. //establish_bufptrs_and_extra_buffers():
  294. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
  295. return(exit_status);
  296. return(FINISHED);
  297. }
  298. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  299. /* RWD mallo changed to calloc; helps debug verison run as release! */
  300. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  301. {
  302. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  303. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  304. return(MEMORY_ERROR);
  305. }
  306. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  307. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  308. return(MEMORY_ERROR);
  309. }
  310. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  311. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  312. return(MEMORY_ERROR);
  313. }
  314. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  315. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  316. return(MEMORY_ERROR);
  317. }
  318. return(FINISHED);
  319. }
  320. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  321. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  322. {
  323. int n;
  324. for(n=0;n<storage_cnt;n++) {
  325. dz->is_int[n] = (char)0;
  326. dz->no_brk[n] = (char)0;
  327. }
  328. return(FINISHED);
  329. }
  330. /***************************** MARK_PARAMETER_TYPES **************************/
  331. int mark_parameter_types(dataptr dz,aplptr ap)
  332. {
  333. int n, m; /* PARAMS */
  334. for(n=0;n<ap->max_param_cnt;n++) {
  335. switch(ap->param_list[n]) {
  336. case('0'): break; /* dz->is_active[n] = 0 is default */
  337. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  338. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  339. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  340. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  341. default:
  342. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  343. return(PROGRAM_ERROR);
  344. }
  345. } /* OPTIONS */
  346. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  347. switch(ap->option_list[n]) {
  348. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  349. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  350. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  351. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  352. default:
  353. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  354. return(PROGRAM_ERROR);
  355. }
  356. } /* VARIANTS */
  357. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  358. switch(ap->variant_list[n]) {
  359. case('0'): break;
  360. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  361. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  362. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  363. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  364. default:
  365. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  366. return(PROGRAM_ERROR);
  367. }
  368. } /* INTERNAL */
  369. for(n=0,
  370. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  371. switch(ap->internal_param_list[n]) {
  372. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  373. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  374. case('d'): dz->no_brk[m] = (char)1; break;
  375. default:
  376. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  377. return(PROGRAM_ERROR);
  378. }
  379. }
  380. return(FINISHED);
  381. }
  382. /************************ HANDLE_THE_OUTFILE *********************/
  383. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  384. {
  385. char *filename = (*cmdline)[0];
  386. if(filename[0]=='-' && filename[1]=='f') {
  387. dz->floatsam_output = 1;
  388. dz->true_outfile_stype = SAMP_FLOAT;
  389. filename+= 2;
  390. }
  391. if(!sloom) {
  392. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  393. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  394. return(DATA_ERROR);
  395. }
  396. }
  397. strcpy(dz->outfilename,filename);
  398. // dont open outfile yet
  399. (*cmdline)++;
  400. (*cmdlinecnt)--;
  401. return(FINISHED);
  402. }
  403. /***************************** ESTABLISH_APPLICATION **************************/
  404. int establish_application(dataptr dz)
  405. {
  406. aplptr ap;
  407. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  408. sprintf(errstr,"establish_application()\n");
  409. return(MEMORY_ERROR);
  410. }
  411. ap = dz->application;
  412. memset((char *)ap,0,sizeof(struct applic));
  413. return(FINISHED);
  414. }
  415. /************************* INITIALISE_VFLAGS *************************/
  416. int initialise_vflags(dataptr dz)
  417. {
  418. int n;
  419. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  420. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  421. return(MEMORY_ERROR);
  422. }
  423. for(n=0;n<dz->application->vflag_cnt;n++)
  424. dz->vflag[n] = FALSE;
  425. return FINISHED;
  426. }
  427. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  428. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  429. {
  430. int n;
  431. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  432. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  433. return(MEMORY_ERROR);
  434. }
  435. for(n=0;n<tipc;n++)
  436. ap->default_val[n] = 0.0;
  437. return(FINISHED);
  438. }
  439. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  440. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  441. {
  442. int n;
  443. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  444. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  445. return(MEMORY_ERROR);
  446. }
  447. for(n=0;n<tipc;n++)
  448. dz->is_active[n] = (char)0;
  449. return(FINISHED);
  450. }
  451. /************************* SETUP_GATE_APPLICATION *******************/
  452. int setup_gate_application(dataptr dz)
  453. {
  454. int exit_status;
  455. aplptr ap;
  456. if((exit_status = establish_application(dz))<0) // GLOBAL
  457. return(FAILED);
  458. ap = dz->application;
  459. // SEE parstruct FOR EXPLANATION of next 2 functions
  460. if((exit_status = set_param_data(ap,0 ,7,7,"dddiidd"))<0)
  461. return(FAILED);
  462. if((exit_status = set_vflgs(ap,"",0,"","",0,0,""))<0)
  463. return(FAILED);
  464. // set_legal_infile_structure -->
  465. dz->has_otherfile = FALSE;
  466. // assign_process_logic -->
  467. dz->input_data_type = SNDFILES_ONLY;
  468. dz->process_type = UNEQUAL_SNDFILE;
  469. dz->outfiletype = SNDFILE_OUT;
  470. return application_init(dz); //GLOBAL
  471. }
  472. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  473. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  474. {
  475. int exit_status;
  476. infileptr infile_info;
  477. if(!sloom) {
  478. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  479. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  480. return(MEMORY_ERROR);
  481. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  482. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  483. return(PROGRAM_ERROR);
  484. } else if(infile_info->filetype != SNDFILE) {
  485. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  486. return(DATA_ERROR);
  487. } else if(infile_info->channels != 1) {
  488. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  489. return(DATA_ERROR);
  490. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  491. sprintf(errstr,"Failed to copy file parsing information\n");
  492. return(PROGRAM_ERROR);
  493. }
  494. free(infile_info);
  495. }
  496. return(FINISHED);
  497. }
  498. /************************* SETUP_GATE_PARAM_RANGES_AND_DEFAULTS *******************/
  499. int setup_gate_param_ranges_and_defaults(dataptr dz)
  500. {
  501. int exit_status;
  502. double srate = (double)dz->infile->srate;
  503. aplptr ap = dz->application;
  504. // set_param_ranges()
  505. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  506. // NB total_input_param_cnt is > 0 !!!
  507. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  508. return(FAILED);
  509. // get_param_ranges()
  510. ap->lo[STAD_PREGAIN] = 1.0/(double)MAXSHORT;
  511. ap->hi[STAD_PREGAIN] = 1.0;
  512. ap->default_val[STAD_PREGAIN] = STAD_PREGAIN_DFLT;
  513. ap->lo[STAD_ROLLOFF] = 1.0/(double)MAXSHORT;
  514. ap->hi[STAD_ROLLOFF] = 1.0;
  515. ap->default_val[STAD_ROLLOFF] = 1.0;
  516. ap->lo[STAD_SIZE] = (DFLT_STAD_DELTIME * 2.0)/srate;
  517. ap->hi[STAD_SIZE] = MAX_STAD_DELAY; /* arbitrary */
  518. ap->default_val[STAD_SIZE] = 1.0;
  519. ap->lo[STAD_ECHOCNT] = (double)2;
  520. ap->hi[STAD_ECHOCNT] = (double)MAX_ECHOCNT;
  521. ap->default_val[STAD_ECHOCNT] = REASONABLE_ECHOCNT;
  522. ap->lo[REV_OCHANS] = (double)2; // Output chans
  523. ap->hi[REV_OCHANS] = (double)16;
  524. ap->default_val[REV_OCHANS] = 2;
  525. ap->lo[REV_CENTRE] = (double)0; // Location of reverbd source
  526. ap->hi[REV_CENTRE] = (double)16;
  527. ap->default_val[REV_CENTRE] = 1;
  528. ap->lo[REV_SPREAD] = (double)2; // Spatial spread of echoes
  529. ap->hi[REV_SPREAD] = (double)16;
  530. ap->default_val[REV_SPREAD] = 2;
  531. dz->maxmode = 0;
  532. if(!sloom)
  533. put_default_vals_in_all_params(dz);
  534. return(FINISHED);
  535. }
  536. /********************************* PARSE_SLOOM_DATA *********************************/
  537. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  538. {
  539. int exit_status;
  540. int cnt = 1, infilecnt;
  541. int filesize, insams, inbrksize;
  542. double dummy;
  543. int true_cnt = 0;
  544. //aplptr ap;
  545. while(cnt<=PRE_CMDLINE_DATACNT) {
  546. if(cnt > argc) {
  547. sprintf(errstr,"Insufficient data sent from TK\n");
  548. return(DATA_ERROR);
  549. }
  550. switch(cnt) {
  551. case(1):
  552. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  553. sprintf(errstr,"Cannot read process no. sent from TK\n");
  554. return(DATA_ERROR);
  555. }
  556. break;
  557. case(2):
  558. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  559. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  560. return(DATA_ERROR);
  561. }
  562. if(dz->mode > 0)
  563. dz->mode--;
  564. //setup_particular_application() =
  565. if((exit_status = setup_gate_application(dz))<0)
  566. return(exit_status);
  567. //ap = dz->application;
  568. break;
  569. case(3):
  570. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  571. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  572. return(DATA_ERROR);
  573. }
  574. if(infilecnt < 1) {
  575. true_cnt = cnt + 1;
  576. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  577. }
  578. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  579. return(exit_status);
  580. break;
  581. case(INPUT_FILETYPE+4):
  582. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  583. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  584. return(DATA_ERROR);
  585. }
  586. break;
  587. case(INPUT_FILESIZE+4):
  588. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  589. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  590. return(DATA_ERROR);
  591. }
  592. dz->insams[0] = filesize;
  593. break;
  594. case(INPUT_INSAMS+4):
  595. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  596. sprintf(errstr,"Cannot read insams sent from TK\n");
  597. return(DATA_ERROR);
  598. }
  599. dz->insams[0] = insams;
  600. break;
  601. case(INPUT_SRATE+4):
  602. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  603. sprintf(errstr,"Cannot read srate sent from TK\n");
  604. return(DATA_ERROR);
  605. }
  606. break;
  607. case(INPUT_CHANNELS+4):
  608. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  609. sprintf(errstr,"Cannot read channels sent from TK\n");
  610. return(DATA_ERROR);
  611. }
  612. break;
  613. case(INPUT_STYPE+4):
  614. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  615. sprintf(errstr,"Cannot read stype sent from TK\n");
  616. return(DATA_ERROR);
  617. }
  618. break;
  619. case(INPUT_ORIGSTYPE+4):
  620. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  621. sprintf(errstr,"Cannot read origstype sent from TK\n");
  622. return(DATA_ERROR);
  623. }
  624. break;
  625. case(INPUT_ORIGRATE+4):
  626. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  627. sprintf(errstr,"Cannot read origrate sent from TK\n");
  628. return(DATA_ERROR);
  629. }
  630. break;
  631. case(INPUT_MLEN+4):
  632. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  633. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  634. return(DATA_ERROR);
  635. }
  636. break;
  637. case(INPUT_DFAC+4):
  638. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  639. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  640. return(DATA_ERROR);
  641. }
  642. break;
  643. case(INPUT_ORIGCHANS+4):
  644. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  645. sprintf(errstr,"Cannot read origchans sent from TK\n");
  646. return(DATA_ERROR);
  647. }
  648. break;
  649. case(INPUT_SPECENVCNT+4):
  650. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  651. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  652. return(DATA_ERROR);
  653. }
  654. dz->specenvcnt = dz->infile->specenvcnt;
  655. break;
  656. case(INPUT_WANTED+4):
  657. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  658. sprintf(errstr,"Cannot read wanted sent from TK\n");
  659. return(DATA_ERROR);
  660. }
  661. break;
  662. case(INPUT_WLENGTH+4):
  663. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  664. sprintf(errstr,"Cannot read wlength sent from TK\n");
  665. return(DATA_ERROR);
  666. }
  667. break;
  668. case(INPUT_OUT_CHANS+4):
  669. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  670. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  671. return(DATA_ERROR);
  672. }
  673. break;
  674. /* RWD these chanegs to samps - tk will have to deal with that! */
  675. case(INPUT_DESCRIPTOR_BYTES+4):
  676. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  677. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  678. return(DATA_ERROR);
  679. }
  680. break;
  681. case(INPUT_IS_TRANSPOS+4):
  682. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  683. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  684. return(DATA_ERROR);
  685. }
  686. break;
  687. case(INPUT_COULD_BE_TRANSPOS+4):
  688. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  689. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  690. return(DATA_ERROR);
  691. }
  692. break;
  693. case(INPUT_COULD_BE_PITCH+4):
  694. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  695. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  696. return(DATA_ERROR);
  697. }
  698. break;
  699. case(INPUT_DIFFERENT_SRATES+4):
  700. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  701. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  702. return(DATA_ERROR);
  703. }
  704. break;
  705. case(INPUT_DUPLICATE_SNDS+4):
  706. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  707. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  708. return(DATA_ERROR);
  709. }
  710. break;
  711. case(INPUT_BRKSIZE+4):
  712. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  713. sprintf(errstr,"Cannot read brksize sent from TK\n");
  714. return(DATA_ERROR);
  715. }
  716. if(inbrksize > 0) {
  717. switch(dz->input_data_type) {
  718. case(WORDLIST_ONLY):
  719. break;
  720. case(PITCH_AND_PITCH):
  721. case(PITCH_AND_TRANSPOS):
  722. case(TRANSPOS_AND_TRANSPOS):
  723. dz->tempsize = inbrksize;
  724. break;
  725. case(BRKFILES_ONLY):
  726. case(UNRANGED_BRKFILE_ONLY):
  727. case(DB_BRKFILES_ONLY):
  728. case(ALL_FILES):
  729. case(ANY_NUMBER_OF_ANY_FILES):
  730. if(dz->extrabrkno < 0) {
  731. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  732. return(DATA_ERROR);
  733. }
  734. if(dz->brksize == NULL) {
  735. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  736. return(PROGRAM_ERROR);
  737. }
  738. dz->brksize[dz->extrabrkno] = inbrksize;
  739. break;
  740. default:
  741. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  742. dz->input_data_type);
  743. return(PROGRAM_ERROR);
  744. }
  745. break;
  746. }
  747. break;
  748. case(INPUT_NUMSIZE+4):
  749. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  750. sprintf(errstr,"Cannot read numsize sent from TK\n");
  751. return(DATA_ERROR);
  752. }
  753. break;
  754. case(INPUT_LINECNT+4):
  755. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  756. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  757. return(DATA_ERROR);
  758. }
  759. break;
  760. case(INPUT_ALL_WORDS+4):
  761. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  762. sprintf(errstr,"Cannot read all_words sent from TK\n");
  763. return(DATA_ERROR);
  764. }
  765. break;
  766. case(INPUT_ARATE+4):
  767. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  768. sprintf(errstr,"Cannot read arate sent from TK\n");
  769. return(DATA_ERROR);
  770. }
  771. break;
  772. case(INPUT_FRAMETIME+4):
  773. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  774. sprintf(errstr,"Cannot read frametime sent from TK\n");
  775. return(DATA_ERROR);
  776. }
  777. dz->frametime = (float)dummy;
  778. break;
  779. case(INPUT_WINDOW_SIZE+4):
  780. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  781. sprintf(errstr,"Cannot read window_size sent from TK\n");
  782. return(DATA_ERROR);
  783. }
  784. break;
  785. case(INPUT_NYQUIST+4):
  786. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  787. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  788. return(DATA_ERROR);
  789. }
  790. break;
  791. case(INPUT_DURATION+4):
  792. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  793. sprintf(errstr,"Cannot read duration sent from TK\n");
  794. return(DATA_ERROR);
  795. }
  796. break;
  797. case(INPUT_MINBRK+4):
  798. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  799. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  800. return(DATA_ERROR);
  801. }
  802. break;
  803. case(INPUT_MAXBRK+4):
  804. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  805. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  806. return(DATA_ERROR);
  807. }
  808. break;
  809. case(INPUT_MINNUM+4):
  810. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  811. sprintf(errstr,"Cannot read minnum sent from TK\n");
  812. return(DATA_ERROR);
  813. }
  814. break;
  815. case(INPUT_MAXNUM+4):
  816. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  817. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  818. return(DATA_ERROR);
  819. }
  820. break;
  821. default:
  822. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  823. return(PROGRAM_ERROR);
  824. }
  825. cnt++;
  826. }
  827. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  828. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  829. return(DATA_ERROR);
  830. }
  831. if(true_cnt)
  832. cnt = true_cnt;
  833. *cmdlinecnt = 0;
  834. while(cnt < argc) {
  835. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  836. return(exit_status);
  837. cnt++;
  838. }
  839. return(FINISHED);
  840. }
  841. /********************************* GET_TK_CMDLINE_WORD *********************************/
  842. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  843. {
  844. if(*cmdlinecnt==0) {
  845. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  846. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  847. return(MEMORY_ERROR);
  848. }
  849. } else {
  850. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  851. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  852. return(MEMORY_ERROR);
  853. }
  854. }
  855. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  856. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  857. return(MEMORY_ERROR);
  858. }
  859. strcpy((*cmdline)[*cmdlinecnt],q);
  860. (*cmdlinecnt)++;
  861. return(FINISHED);
  862. }
  863. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  864. int assign_file_data_storage(int infilecnt,dataptr dz)
  865. {
  866. int exit_status;
  867. int no_sndfile_system_files = FALSE;
  868. dz->infilecnt = infilecnt;
  869. if((exit_status = allocate_filespace(dz))<0)
  870. return(exit_status);
  871. if(no_sndfile_system_files)
  872. dz->infilecnt = 0;
  873. return(FINISHED);
  874. }
  875. /************************* redundant functions: to ensure libs compile OK *******************/
  876. int assign_process_logic(dataptr dz)
  877. {
  878. return(FINISHED);
  879. }
  880. void set_legal_infile_structure(dataptr dz)
  881. {}
  882. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  883. {
  884. return(FINISHED);
  885. }
  886. int establish_bufptrs_and_extra_buffers(dataptr dz)
  887. {
  888. return(FINISHED);
  889. }
  890. int read_special_data(char *str,dataptr dz)
  891. {
  892. return(FINISHED);
  893. }
  894. int inner_loop
  895. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  896. {
  897. return(FINISHED);
  898. }
  899. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  900. {
  901. return(FINISHED);
  902. }
  903. /******************************** USAGE1 ********************************/
  904. int usage1(void)
  905. {
  906. usage2("mchanrev");
  907. return(USAGE_ONLY);
  908. }
  909. /**************************** CHECK_GATE_PARAM_VALIDITY_AND_CONSISTENCY *****************************/
  910. int check_gate_param_validity_and_consistency(dataptr dz)
  911. {
  912. double minlevel = 1.0/(double)dz->infile->srate;
  913. dz->param[0] = dbtolevel(dz->param[0]);
  914. if(dz->param[0] <= minlevel) {
  915. sprintf(errstr,"Gate level is effectively zero: no effect on input sound.\n");
  916. return(DATA_ERROR);
  917. }
  918. dz->iparam[1] = (int)round(dz->param[1] * (double)(dz->infile->srate * dz->infile->channels));
  919. return FINISHED;
  920. }
  921. /******************************** DBTOLEVEL ***********************/
  922. double dbtolevel(double val)
  923. {
  924. int isneg = 0;
  925. if(flteq(val,0.0))
  926. return(1.0);
  927. if(val < 0.0) {
  928. val = -val;
  929. isneg = 1;
  930. }
  931. val /= 20.0;
  932. val = pow(10.0,val);
  933. if(isneg)
  934. val = 1.0/val;
  935. return(val);
  936. }
  937. /********************************************************************************************/
  938. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  939. {
  940. if(!strcmp(prog_identifier_from_cmdline,"mchanrev")) dz->process = MCHANREV;
  941. else {
  942. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  943. return(USAGE_ONLY);
  944. }
  945. return(FINISHED);
  946. }
  947. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  948. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  949. {
  950. int n;
  951. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  952. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  953. return(MEMORY_ERROR);
  954. }
  955. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  956. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  957. return(MEMORY_ERROR);
  958. }
  959. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  960. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  961. return(MEMORY_ERROR);
  962. }
  963. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  964. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  965. return(MEMORY_ERROR);
  966. }
  967. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  968. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  969. return(MEMORY_ERROR);
  970. }
  971. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  972. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  973. return(MEMORY_ERROR);
  974. }
  975. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  976. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  977. return(MEMORY_ERROR);
  978. }
  979. for(n=0;n<brkcnt;n++) {
  980. dz->brk[n] = NULL;
  981. dz->brkptr[n] = NULL;
  982. dz->brkinit[n] = 0;
  983. dz->brksize[n] = 0;
  984. }
  985. return(FINISHED);
  986. }
  987. /******************************** USAGE2 ********************************/
  988. int usage2(char *str)
  989. {
  990. if(!strcmp(str,"mchanrev")) {
  991. fprintf(stdout,
  992. "CREATE MULTICHANNEL ECHOS OR REVERB\n"
  993. "\n"
  994. "USAGE: mchanrev mchanrev infile outfile gain roll_off size count\n"
  995. " outchans centre spread\n"
  996. "\n"
  997. "GAIN to apply to input signal: Default is %lf\n"
  998. "SIZE multiplies average time between echoes: (Default time 0.1 secs).\n"
  999. "ROLL_OFF rate of loss of level across stadium (default 1)\n"
  1000. "COUNT number of stadium echoes: Default (max) is %d\n"
  1001. "OUTCHANS number of output channels\n"
  1002. "CENTRE centre position of reverbd image, amongst outchans.\n"
  1003. " With N-chan output, range is 1-N. Can be a fractional value. \n"
  1004. " Values below 1 lie between outchan 1 and outchan N.\n"
  1005. "SPREAD Number of output channels over which echoes are spread,\n"
  1006. " (Can be a fractional value).\n",STAD_PREGAIN_DFLT,MAX_ECHOCNT);
  1007. } else
  1008. fprintf(stdout,"Unknown option '%s'\n",str);
  1009. return(USAGE_ONLY);
  1010. }
  1011. int usage3(char *str1,char *str2)
  1012. {
  1013. fprintf(stderr,"Insufficient parameters on command line.\n");
  1014. return(USAGE_ONLY);
  1015. }
  1016. /************************** MULTICHAN_STADIUM_PCONSISTENCY ****************************/
  1017. int multichan_stadium_pconsistency(dataptr dz)
  1018. {
  1019. int exit_status, n;
  1020. int eccnt = dz->iparam[STAD_ECHOCNT];
  1021. double *gain;
  1022. dz->itemcnt = dz->infile->channels; /* store input channelcnt */
  1023. dz->outfile->channels = dz->iparam[REV_OCHANS];
  1024. if(dz->param[REV_CENTRE] > dz->iparam[REV_OCHANS]) {
  1025. sprintf(errstr,"Reverberation Centre is not amongst output channels.\n");
  1026. return(DATA_ERROR);
  1027. }
  1028. if(dz->param[REV_SPREAD] > dz->iparam[REV_OCHANS]) {
  1029. sprintf(errstr,"Reverberation Spread is greater than number of output channels.\n");
  1030. return(DATA_ERROR);
  1031. }
  1032. dz->infile->channels = dz->iparam[REV_OCHANS]; /* for output!! */
  1033. if((exit_status = setup_multichan_stadium(dz))<0)
  1034. return(exit_status);
  1035. gain = dz->parray[STAD_GAIN];
  1036. if((exit_status = generate_delays(dz))<0)
  1037. return(exit_status);
  1038. stad_maxdelay = dz->lparray[STAD_DELAY][dz->iparam[STAD_ECHOCNT]];
  1039. if(dz->param[STAD_ROLLOFF]<1.0) {
  1040. for(n=0;n<=eccnt;n++)
  1041. gain[n] = pow(gain[n],dz->param[STAD_ROLLOFF]);
  1042. }
  1043. for(n=0;n<=eccnt;n++)
  1044. gain[n] *= dz->param[STAD_PREGAIN];
  1045. return(FINISHED);
  1046. }
  1047. /*************************** SETUP_MULTICHAN_STADIUM ***************************/
  1048. int setup_multichan_stadium(dataptr dz)
  1049. {
  1050. //TW UPDATE TO 100 possible echoes
  1051. // double *tdelay, *gain, *pan;
  1052. double *tdelay, *gain, *pan, top, bot, interval;
  1053. int n;
  1054. if((dz->parray[STAD_TDELAY] = malloc((MAX_ECHOCNT+1) * sizeof(double)))==NULL
  1055. || (dz->parray[STAD_GAIN] = malloc((MAX_ECHOCNT+1) * sizeof(double)))==NULL
  1056. || (dz->parray[STAD_PAN] = malloc((MAX_ECHOCNT+1) * sizeof(double)))==NULL) {
  1057. sprintf(errstr,"Insufficient memory for stadium arrays.\n");
  1058. return(MEMORY_ERROR);
  1059. }
  1060. tdelay = dz->parray[STAD_TDELAY];
  1061. gain = dz->parray[STAD_GAIN];
  1062. pan = dz->parray[STAD_PAN];
  1063. //TW UPDATE TO 10 possible echoes
  1064. if(dz->iparam[STAD_ECHOCNT] <= REASONABLE_ECHOCNT) {
  1065. tdelay[0] = 0.000000; gain[1] = 1.000000; pan[1] = 0;
  1066. tdelay[1] = 0.131832; gain[1] = 0.354813; pan[1] = -1;
  1067. tdelay[2] = 0.215038; gain[2] = 0.354813; pan[2] = 1;
  1068. tdelay[3] = 0.322274; gain[3] = 0.251189; pan[3] = .5;
  1069. tdelay[4] = 0.414122; gain[4] = 0.251189; pan[4] = -.5;
  1070. tdelay[5] = 0.504488; gain[5] = 0.125893; pan[5] = 0;
  1071. tdelay[6] = 0.637713; gain[6] = 0.125893; pan[6] = .7;
  1072. tdelay[7] = 0.730468; gain[7] = 0.063096; pan[7] = -.7;
  1073. tdelay[8] = 0.808751; gain[8] = 0.063096; pan[8] = .3;
  1074. tdelay[9] = 0.910460; gain[9] = 0.031623; pan[9] = -.3;
  1075. tdelay[10] = 1.027041; gain[10] = 0.031623; pan[10] = .15;
  1076. tdelay[11] = 1.132028; gain[11] = 0.012589; pan[11] = -.15;
  1077. tdelay[12] = 1.244272; gain[12] = 0.012589; pan[12] = .85;
  1078. tdelay[13] = 1.336923; gain[13] = 0.005012; pan[13] = -.85;
  1079. tdelay[14] = 1.427700; gain[14] = 0.005012; pan[14] = .4;
  1080. tdelay[15] = 1.528503; gain[15] = 0.002512; pan[15] = -.4;
  1081. tdelay[16] = 1.618661; gain[16] = 0.002512; pan[16] = .6;
  1082. tdelay[17] = 1.715413; gain[17] = 0.002512; pan[17] = -.6;
  1083. tdelay[18] = 1.814730; gain[18] = 0.002512; pan[18] = .225;
  1084. tdelay[19] = 1.914843; gain[19] = 0.002512; pan[19] = -.225;
  1085. tdelay[20] = 2.000258; gain[20] = 0.002512; pan[20] = .775;
  1086. tdelay[21] = 2.135363; gain[21] = 0.002512; pan[21] = -.775;
  1087. tdelay[22] = 2.230554; gain[22] = 0.002512; pan[22] = .125;
  1088. tdelay[23] = 2.310554; gain[23] = 0.002512; pan[23] = -.125;
  1089. } else {
  1090. top = log(1.0);
  1091. bot = log(.0001);
  1092. interval = (top - bot)/(dz->iparam[STAD_ECHOCNT]);
  1093. gain[0] = 1.0;
  1094. for(n=1;n<(dz->iparam[STAD_ECHOCNT]);n++) {
  1095. top -= interval;
  1096. gain[n] = exp(top);
  1097. }
  1098. gain[n] = .0001;
  1099. for(n=0;n<=dz->iparam[STAD_ECHOCNT];n++) {
  1100. switch(n) {
  1101. case(0): tdelay[0] = 0.000000; pan[1] = 0; break;
  1102. case(1): tdelay[1] = 0.131832; pan[1] = -1; break;
  1103. case(2): tdelay[2] = 0.215038; pan[2] = 1; break;
  1104. case(3): tdelay[3] = 0.322274; pan[3] = .5; break;
  1105. case(4): tdelay[4] = 0.414122; pan[4] = -.5; break;
  1106. case(5): tdelay[5] = 0.504488; pan[5] = 0; break;
  1107. case(6): tdelay[6] = 0.637713; pan[6] = .7; break;
  1108. case(7): tdelay[7] = 0.730468; pan[7] = -.7; break;
  1109. case(8): tdelay[8] = 0.808751; pan[8] = .3; break;
  1110. case(9): tdelay[9] = 0.910460; pan[9] = -.3; break;
  1111. case(10): tdelay[10] = 1.027041; pan[10] = .15; break;
  1112. case(11): tdelay[11] = 1.132028; pan[11] = -.15; break;
  1113. case(12): tdelay[12] = 1.244272; pan[12] = .85; break;
  1114. case(13): tdelay[13] = 1.336923; pan[13] = -.85; break;
  1115. case(14): tdelay[14] = 1.427700; pan[14] = .4; break;
  1116. case(15): tdelay[15] = 1.528503; pan[15] = -.4; break;
  1117. case(16): tdelay[16] = 1.618661; pan[16] = .6; break;
  1118. case(17): tdelay[17] = 1.715413; pan[17] = -.6; break;
  1119. case(18): tdelay[18] = 1.814730; pan[18] = .225; break;
  1120. case(19): tdelay[19] = 1.914843; pan[19] = -.225; break;
  1121. case(20): tdelay[20] = 2.000258; pan[20] = .775; break;
  1122. case(21): tdelay[21] = 2.135363; pan[21] = -.775; break;
  1123. case(22): tdelay[22] = 2.230554; pan[22] = .125; break;
  1124. case(23): tdelay[23] = 2.290000; pan[23] = -.125; break;
  1125. case(24): tdelay[24] = 2.372498; pan[24] = -.65; break;
  1126. case(25): tdelay[25] = 2.445365; pan[25] = .65; break;
  1127. case(26): tdelay[26] = 2.571897; pan[26] = .35; break;
  1128. case(27): tdelay[27] = 2.627656; pan[27] = -.35; break;
  1129. case(28): tdelay[28] = 2.695809; pan[28] = -.1; break;
  1130. case(29): tdelay[29] = 2.758350; pan[29] = .1; break;
  1131. case(30): tdelay[30] = 2.880984; pan[30] = -.8; break;
  1132. case(31): tdelay[31] = 2.975910; pan[31] = .8; break;
  1133. case(32): tdelay[32] = 3.043894; pan[32] = -.55; break;
  1134. case(33): tdelay[33] = 3.143261; pan[33] = .55; break;
  1135. case(34): tdelay[34] = 3.268126; pan[34] = -.25; break;
  1136. case(35): tdelay[35] = 3.366093; pan[35] = .25; break;
  1137. case(36): tdelay[36] = 3.480461; pan[36] = -.45; break;
  1138. case(37): tdelay[37] = 3.577198; pan[37] = .45; break;
  1139. case(38): tdelay[38] = 3.666871; pan[38] = .05; break;
  1140. case(39): tdelay[39] = 3.779061; pan[39] = -.9; break;
  1141. case(40): tdelay[40] = 3.852884; pan[40] = -.05; break;
  1142. case(41): tdelay[41] = 3.966519; pan[41] = .9; break;
  1143. case(42): tdelay[42] = 4.043514; pan[42] = -.425; break;
  1144. case(43): tdelay[43] = 4.147562; pan[43] = .425; break;
  1145. case(44): tdelay[44] = 4.241538; pan[44] = .75; break;
  1146. case(45): tdelay[45] = 4.358808; pan[45] = -.75; break;
  1147. case(46): tdelay[46] = 4.470554; pan[46] = .275; break;
  1148. case(47): tdelay[47] = 4.540000; pan[47] = -.275; break;
  1149. case(48): tdelay[48] = 4.612729; pan[48] = -.625; break;
  1150. case(49): tdelay[49] = 4.693888; pan[49] = .625; break;
  1151. case(50): tdelay[50] = 4.750479; pan[50] = .375; break;
  1152. case(51): tdelay[51] = 4.834122; pan[51] = -.375; break;
  1153. case(52): tdelay[52] = 4.894456; pan[52] = -.116; break;
  1154. case(53): tdelay[53] = 4.978112; pan[53] = .116; break;
  1155. case(54): tdelay[54] = 5.107199; pan[54] = -.825; break;
  1156. case(55): tdelay[55] = 5.217554; pan[55] = .825; break;
  1157. case(56): tdelay[56] = 5.282567; pan[56] = -.535; break;
  1158. case(57): tdelay[57] = 5.387678; pan[57] = .535; break;
  1159. case(58): tdelay[58] = 5.493642; pan[58] = -.265; break;
  1160. case(59): tdelay[59] = 5.610009; pan[59] = .265; break;
  1161. case(60): tdelay[60] = 5.720302; pan[60] = -.475; break;
  1162. case(61): tdelay[61] = 5.818331; pan[61] = .475; break;
  1163. case(62): tdelay[62] = 5.911186; pan[62] = .11; break;
  1164. case(63): tdelay[63] = 6.013019; pan[63] = -.77; break;
  1165. case(64): tdelay[64] = 6.089382; pan[64] = -.11; break;
  1166. case(65): tdelay[65] = 6.192071; pan[65] = .77; break;
  1167. case(66): tdelay[66] = 6.288516; pan[66] = -.475; break;
  1168. case(67): tdelay[67] = 6.403337; pan[67] = .475; break;
  1169. case(68): tdelay[68] = 6.474009; pan[68] = .725; break;
  1170. case(69): tdelay[69] = 6.613701; pan[69] = -.725; break;
  1171. case(70): tdelay[70] = 6.710554; pan[70] = .235; break;
  1172. case(71): tdelay[71] = 6.800000; pan[71] = -.235; break;
  1173. case(72): tdelay[72] = 6.933349; pan[72] = -.685; break;
  1174. case(73): tdelay[73] = 7.032532; pan[73] = .685; break;
  1175. case(74): tdelay[74] = 7.122216; pan[74] = .315; break;
  1176. case(75): tdelay[75] = 7.194122; pan[75] = -.315; break;
  1177. case(76): tdelay[76] = 7.265021; pan[76] = -.136; break;
  1178. case(77): tdelay[77] = 7.358764; pan[77] = .136; break;
  1179. case(78): tdelay[78] = 7.445276; pan[78] = -.635; break;
  1180. case(79): tdelay[79] = 7.539293; pan[79] = .635; break;
  1181. case(80): tdelay[80] = 7.609978; pan[80] = -.435; break;
  1182. case(81): tdelay[81] = 7.710640; pan[81] = .435; break;
  1183. case(82): tdelay[82] = 7.831968; pan[82] = -.765; break;
  1184. case(83): tdelay[83] = 7.933759; pan[83] = .765; break;
  1185. case(84): tdelay[84] = 8.031102; pan[84] = -.575; break;
  1186. case(85): tdelay[85] = 8.120963; pan[85] = .575; break;
  1187. case(86): tdelay[86] = 8.230907; pan[86] = .215; break;
  1188. case(87): tdelay[87] = 8.322181; pan[87] = -.692; break;
  1189. case(88): tdelay[88] = 8.426997; pan[88] = -.215; break;
  1190. case(89): tdelay[89] = 8.531689; pan[89] = .692; break;
  1191. case(90): tdelay[90] = 8.607012; pan[90] = -.435; break;
  1192. case(91): tdelay[91] = 8.715148; pan[91] = .435; break;
  1193. case(92): tdelay[92] = 8.803142; pan[92] = .675; break;
  1194. case(93): tdelay[93] = 8.951037; pan[93] = -.675; break;
  1195. case(94): tdelay[94] = 9.018695; pan[94] = .265; break;
  1196. case(95): tdelay[95] = 9.107151; pan[95] = -.265; break;
  1197. case(96): tdelay[96] = 9.240962; pan[96] = -.555; break;
  1198. case(97): tdelay[97] = 9.312251; pan[97] = .555; break;
  1199. case(98): tdelay[98] = 9.422676; pan[98] = .333; break;
  1200. case(99): tdelay[99] = 9.514122; pan[99] = -.333; break;
  1201. case(100): tdelay[100] = 9.637713; pan[100] = 0.0; break;
  1202. case(101): tdelay[101] = 9.730468; pan[101] = -1; break;
  1203. case(102): tdelay[102] = 9.808751; pan[102] = 1; break;
  1204. case(103): tdelay[103] = 9.910460; pan[103] = .5; break;
  1205. case(104): tdelay[104] = 10.027041; pan[104] = -.5; break;
  1206. case(105): tdelay[105] = 10.132028; pan[105] = 0; break;
  1207. case(106): tdelay[106] = 10.244272; pan[106] = .7; break;
  1208. case(107): tdelay[107] = 10.336923; pan[107] = -.7; break;
  1209. case(108): tdelay[108] = 10.427700; pan[108] = .3; break;
  1210. case(109): tdelay[109] = 10.528503; pan[109] = -.3; break;
  1211. case(110): tdelay[110] = 10.618661; pan[110] = .15; break;
  1212. case(111): tdelay[111] = 10.715413; pan[111] = -.15; break;
  1213. case(112): tdelay[112] = 10.814730; pan[112] = .85; break;
  1214. case(113): tdelay[113] = 10.914843; pan[113] = -.85; break;
  1215. case(114): tdelay[114] = 11.000258; pan[114] = .4; break;
  1216. case(115): tdelay[115] = 11.135363; pan[115] = -.4; break;
  1217. case(116): tdelay[116] = 11.230554; pan[116] = .6; break;
  1218. case(117): tdelay[117] = 11.290000; pan[117] = -.6; break;
  1219. case(118): tdelay[118] = 11.372498; pan[118] = .225; break;
  1220. case(119): tdelay[119] = 11.445365; pan[119] = -.225; break;
  1221. case(120): tdelay[120] = 11.571897; pan[120] = .775; break;
  1222. case(121): tdelay[121] = 11.627656; pan[121] = -.775; break;
  1223. case(122): tdelay[122] = 11.695809; pan[122] = .125; break;
  1224. case(123): tdelay[123] = 11.758350; pan[123] = -.125; break;
  1225. case(124): tdelay[124] = 11.880984; pan[124] = -.65; break;
  1226. case(125): tdelay[125] = 11.975910; pan[125] = .65; break;
  1227. case(126): tdelay[126] = 12.043894; pan[126] = .35; break;
  1228. case(127): tdelay[127] = 12.143261; pan[127] = -.35; break;
  1229. case(128): tdelay[128] = 12.268126; pan[128] = -.1; break;
  1230. case(129): tdelay[129] = 12.366093; pan[129] = .1; break;
  1231. case(130): tdelay[130] = 12.480461; pan[130] = -.8; break;
  1232. case(131): tdelay[131] = 12.577198; pan[131] = .8; break;
  1233. case(132): tdelay[132] = 12.666871; pan[132] = -.55; break;
  1234. case(133): tdelay[133] = 12.779061; pan[133] = .55; break;
  1235. case(134): tdelay[134] = 12.852884; pan[134] = -.25; break;
  1236. case(135): tdelay[135] = 12.966519; pan[135] = .25; break;
  1237. case(136): tdelay[136] = 13.043514; pan[136] = -.45; break;
  1238. case(137): tdelay[137] = 13.147562; pan[137] = .45; break;
  1239. case(138): tdelay[138] = 13.241538; pan[138] = .05; break;
  1240. case(139): tdelay[139] = 13.358808; pan[139] = -.9; break;
  1241. case(140): tdelay[140] = 13.470554; pan[140] = -.05; break;
  1242. case(141): tdelay[141] = 13.540000; pan[141] = .9; break;
  1243. case(142): tdelay[142] = 13.612729; pan[142] = -.425; break;
  1244. case(143): tdelay[143] = 13.693888; pan[143] = .425; break;
  1245. case(144): tdelay[144] = 13.750479; pan[144] = .75; break;
  1246. case(145): tdelay[145] = 13.834122; pan[145] = -.75; break;
  1247. case(146): tdelay[146] = 13.894456; pan[146] = .275; break;
  1248. case(147): tdelay[147] = 13.978112; pan[147] = -.275; break;
  1249. case(148): tdelay[148] = 14.107199; pan[148] = -.625; break;
  1250. case(149): tdelay[149] = 14.217554; pan[149] = .625; break;
  1251. case(150): tdelay[150] = 14.282567; pan[150] = .375; break;
  1252. case(151): tdelay[151] = 14.387678; pan[151] = -.375; break;
  1253. case(152): tdelay[152] = 14.493642; pan[152] = -.116; break;
  1254. case(153): tdelay[153] = 14.610009; pan[153] = .116; break;
  1255. case(154): tdelay[154] = 14.720302; pan[154] = -.825; break;
  1256. case(155): tdelay[155] = 14.818331; pan[155] = .825; break;
  1257. case(156): tdelay[156] = 14.911186; pan[156] = -.535; break;
  1258. case(157): tdelay[157] = 15.013019; pan[157] = .535; break;
  1259. case(158): tdelay[158] = 15.089382; pan[158] = -.265; break;
  1260. case(159): tdelay[159] = 15.192071; pan[159] = .265; break;
  1261. case(160): tdelay[160] = 15.288516; pan[160] = -.475; break;
  1262. case(161): tdelay[161] = 15.403337; pan[161] = .475; break;
  1263. case(162): tdelay[162] = 15.474009; pan[162] = .11; break;
  1264. case(163): tdelay[163] = 15.613701; pan[163] = -.77; break;
  1265. case(164): tdelay[164] = 15.710554; pan[164] = -.11; break;
  1266. case(165): tdelay[165] = 15.800000; pan[165] = .77; break;
  1267. case(166): tdelay[166] = 15.933349; pan[166] = -.475; break;
  1268. case(167): tdelay[167] = 16.032532; pan[167] = .475; break;
  1269. case(168): tdelay[168] = 16.122216; pan[168] = .725; break;
  1270. case(169): tdelay[169] = 16.194122; pan[169] = -.725; break;
  1271. case(170): tdelay[170] = 16.265021; pan[170] = .235; break;
  1272. case(171): tdelay[171] = 16.358764; pan[171] = -.235; break;
  1273. case(172): tdelay[172] = 16.445276; pan[172] = -.685; break;
  1274. case(173): tdelay[173] = 16.539293; pan[173] = .685; break;
  1275. case(174): tdelay[174] = 16.609978; pan[174] = .315; break;
  1276. case(175): tdelay[175] = 16.710640; pan[175] = -.315; break;
  1277. case(176): tdelay[176] = 16.831968; pan[176] = -.136; break;
  1278. case(177): tdelay[177] = 16.933759; pan[177] = .136; break;
  1279. case(178): tdelay[178] = 17.031102; pan[178] = -.635; break;
  1280. case(179): tdelay[179] = 17.120963; pan[179] = .635; break;
  1281. case(180): tdelay[180] = 17.230907; pan[180] = -.435; break;
  1282. case(181): tdelay[181] = 17.322181; pan[181] = .435; break;
  1283. case(182): tdelay[182] = 17.426997; pan[182] = -.765; break;
  1284. case(183): tdelay[183] = 17.531689; pan[183] = .765; break;
  1285. case(184): tdelay[184] = 17.607012; pan[184] = -.575; break;
  1286. case(185): tdelay[185] = 17.715148; pan[185] = .575; break;
  1287. case(186): tdelay[186] = 17.803142; pan[186] = .215; break;
  1288. case(187): tdelay[187] = 17.951037; pan[187] = -.692; break;
  1289. case(188): tdelay[188] = 18.018695; pan[188] = -.215; break;
  1290. case(189): tdelay[189] = 18.107151; pan[189] = .692; break;
  1291. case(190): tdelay[190] = 18.240962; pan[190] = -.435; break;
  1292. case(191): tdelay[191] = 18.312251; pan[191] = .435; break;
  1293. case(192): tdelay[192] = 18.422676; pan[192] = .675; break;
  1294. case(193): tdelay[193] = 18.514122; pan[193] = -.675; break;
  1295. case(194): tdelay[194] = 18.637713; pan[194] = .265; break;
  1296. case(195): tdelay[195] = 18.730468; pan[195] = -.265; break;
  1297. case(196): tdelay[196] = 18.808751; pan[196] = -.555; break;
  1298. case(197): tdelay[197] = 18.910460; pan[197] = .555; break;
  1299. case(198): tdelay[198] = 19.000000; pan[198] = .333; break;
  1300. case(199): tdelay[199] = 19.131832; pan[199] = -.333; break;
  1301. case(200): tdelay[200] = 19.215038; pan[200] = 0.0; break;
  1302. case(201): tdelay[201] = 19.322274; pan[201] = -1; break;
  1303. case(202): tdelay[202] = 19.414122; pan[202] = 1; break;
  1304. case(203): tdelay[203] = 19.504488; pan[203] = .5; break;
  1305. case(204): tdelay[204] = 19.637713; pan[204] = -.5; break;
  1306. case(205): tdelay[205] = 19.730468; pan[205] = 0; break;
  1307. case(206): tdelay[206] = 19.808751; pan[206] = .7; break;
  1308. case(207): tdelay[207] = 19.910460; pan[207] = -.7; break;
  1309. case(208): tdelay[208] = 20.027041; pan[208] = .3; break;
  1310. case(209): tdelay[209] = 20.132028; pan[209] = -.3; break;
  1311. case(210): tdelay[210] = 20.244272; pan[210] = .15; break;
  1312. case(211): tdelay[211] = 20.336923; pan[211] = -.15; break;
  1313. case(212): tdelay[212] = 20.427700; pan[212] = .85; break;
  1314. case(213): tdelay[213] = 20.528503; pan[213] = -.85; break;
  1315. case(214): tdelay[214] = 20.618661; pan[214] = .4; break;
  1316. case(215): tdelay[215] = 20.715413; pan[215] = -.4; break;
  1317. case(216): tdelay[216] = 20.814730; pan[216] = .6; break;
  1318. case(217): tdelay[217] = 20.914843; pan[217] = -.6; break;
  1319. case(218): tdelay[218] = 21.000258; pan[218] = .225; break;
  1320. case(219): tdelay[219] = 21.135363; pan[219] = -.225; break;
  1321. case(220): tdelay[220] = 21.230554; pan[220] = .775; break;
  1322. case(221): tdelay[221] = 21.290000; pan[221] = -.775; break;
  1323. case(222): tdelay[222] = 21.372498; pan[222] = .125; break;
  1324. case(223): tdelay[223] = 21.445365; pan[223] = -.125; break;
  1325. case(224): tdelay[224] = 21.571897; pan[224] = -.65; break;
  1326. case(225): tdelay[225] = 21.627656; pan[225] = .65; break;
  1327. case(226): tdelay[226] = 21.695809; pan[226] = .35; break;
  1328. case(227): tdelay[227] = 21.758350; pan[227] = -.35; break;
  1329. case(228): tdelay[228] = 21.880984; pan[228] = -.1; break;
  1330. case(229): tdelay[229] = 21.975910; pan[229] = .1; break;
  1331. case(230): tdelay[230] = 22.043894; pan[230] = -.8; break;
  1332. case(231): tdelay[231] = 22.143261; pan[231] = .8; break;
  1333. case(232): tdelay[232] = 22.268126; pan[232] = -.55; break;
  1334. case(233): tdelay[233] = 22.366093; pan[233] = .55; break;
  1335. case(234): tdelay[234] = 22.480461; pan[234] = -.25; break;
  1336. case(235): tdelay[235] = 22.577198; pan[235] = .25; break;
  1337. case(236): tdelay[236] = 22.666871; pan[236] = -.45; break;
  1338. case(237): tdelay[237] = 22.779061; pan[237] = .45; break;
  1339. case(238): tdelay[238] = 22.852884; pan[238] = .05; break;
  1340. case(239): tdelay[239] = 22.966519; pan[239] = -.9; break;
  1341. case(240): tdelay[240] = 23.043514; pan[240] = -.05; break;
  1342. case(241): tdelay[241] = 23.147562; pan[241] = .9; break;
  1343. case(242): tdelay[242] = 23.241538; pan[242] = -.425; break;
  1344. case(243): tdelay[243] = 23.358808; pan[243] = .425; break;
  1345. case(244): tdelay[244] = 23.470554; pan[244] = .75; break;
  1346. case(245): tdelay[245] = 23.540000; pan[245] = -.75; break;
  1347. case(246): tdelay[246] = 23.612729; pan[246] = .275; break;
  1348. case(247): tdelay[247] = 23.693888; pan[247] = -.275; break;
  1349. case(248): tdelay[248] = 23.750479; pan[248] = -.625; break;
  1350. case(249): tdelay[249] = 23.834122; pan[249] = .625; break;
  1351. case(250): tdelay[250] = 23.894456; pan[250] = .375; break;
  1352. case(251): tdelay[251] = 23.978112; pan[251] = -.375; break;
  1353. case(252): tdelay[252] = 24.107199; pan[252] = -.116; break;
  1354. case(253): tdelay[253] = 24.217554; pan[253] = .116; break;
  1355. case(254): tdelay[254] = 24.282567; pan[254] = -.825; break;
  1356. case(255): tdelay[255] = 24.387678; pan[255] = .825; break;
  1357. case(256): tdelay[256] = 24.493642; pan[256] = -.535; break;
  1358. case(257): tdelay[257] = 24.610009; pan[257] = .535; break;
  1359. case(258): tdelay[258] = 24.720302; pan[258] = -.265; break;
  1360. case(259): tdelay[259] = 24.818331; pan[259] = .265; break;
  1361. case(260): tdelay[260] = 24.911186; pan[260] = -.475; break;
  1362. case(261): tdelay[261] = 25.013019; pan[261] = .475; break;
  1363. case(262): tdelay[262] = 25.089382; pan[262] = .11; break;
  1364. case(263): tdelay[263] = 25.192071; pan[263] = -.77; break;
  1365. case(264): tdelay[264] = 25.288516; pan[264] = -.11; break;
  1366. case(265): tdelay[265] = 25.403337; pan[265] = .77; break;
  1367. case(266): tdelay[266] = 25.474009; pan[266] = -.475; break;
  1368. case(267): tdelay[267] = 25.613701; pan[267] = .475; break;
  1369. case(268): tdelay[268] = 25.710554; pan[268] = .725; break;
  1370. case(269): tdelay[269] = 25.800000; pan[269] = -.725; break;
  1371. case(270): tdelay[270] = 25.933349; pan[270] = .235; break;
  1372. case(271): tdelay[271] = 26.032532; pan[271] = -.235; break;
  1373. case(272): tdelay[272] = 26.122216; pan[272] = -.685; break;
  1374. case(273): tdelay[273] = 26.194122; pan[273] = .685; break;
  1375. case(274): tdelay[274] = 26.265021; pan[274] = .315; break;
  1376. case(275): tdelay[275] = 26.358764; pan[275] = -.315; break;
  1377. case(276): tdelay[276] = 26.445276; pan[276] = -.136; break;
  1378. case(277): tdelay[277] = 26.539293; pan[277] = .136; break;
  1379. case(278): tdelay[278] = 26.609978; pan[278] = -.635; break;
  1380. case(279): tdelay[279] = 26.710640; pan[279] = .635; break;
  1381. case(280): tdelay[280] = 26.831968; pan[280] = -.435; break;
  1382. case(281): tdelay[281] = 26.933759; pan[281] = .435; break;
  1383. case(282): tdelay[282] = 27.031102; pan[282] = -.765; break;
  1384. case(283): tdelay[283] = 27.120963; pan[283] = .765; break;
  1385. case(284): tdelay[284] = 27.230907; pan[284] = -.575; break;
  1386. case(285): tdelay[285] = 27.322181; pan[285] = .575; break;
  1387. case(286): tdelay[286] = 27.426997; pan[286] = .215; break;
  1388. case(287): tdelay[287] = 27.531689; pan[287] = -.692; break;
  1389. case(288): tdelay[288] = 27.607012; pan[288] = -.215; break;
  1390. case(289): tdelay[289] = 27.715148; pan[289] = .692; break;
  1391. case(290): tdelay[290] = 27.803142; pan[290] = -.435; break;
  1392. case(291): tdelay[291] = 27.951037; pan[291] = .435; break;
  1393. case(292): tdelay[292] = 28.018695; pan[292] = .675; break;
  1394. case(293): tdelay[293] = 28.107151; pan[293] = -.675; break;
  1395. case(294): tdelay[294] = 28.240962; pan[294] = .265; break;
  1396. case(295): tdelay[295] = 28.312251; pan[295] = -.265; break;
  1397. case(296): tdelay[296] = 28.422676; pan[296] = -.555; break;
  1398. case(297): tdelay[297] = 28.514122; pan[297] = -.333; break;
  1399. case(298): tdelay[298] = 28.637713; pan[298] = 0.0; break;
  1400. case(299): tdelay[299] = 28.730468; pan[299] = -1; break;
  1401. case(300): tdelay[300] = 28.808751; pan[300] = 1; break;
  1402. case(301): tdelay[301] = 28.910460; pan[301] = .5; break;
  1403. case(302): tdelay[302] = 29.027041; pan[302] = -.5; break;
  1404. case(303): tdelay[303] = 29.132028; pan[303] = 0; break;
  1405. case(304): tdelay[304] = 29.244272; pan[304] = .7; break;
  1406. case(305): tdelay[305] = 29.336923; pan[305] = -.7; break;
  1407. case(306): tdelay[306] = 29.427700; pan[306] = .3; break;
  1408. case(307): tdelay[307] = 29.528503; pan[307] = -.3; break;
  1409. case(308): tdelay[308] = 29.618661; pan[308] = .15; break;
  1410. case(309): tdelay[309] = 29.715413; pan[309] = -.15; break;
  1411. case(310): tdelay[310] = 29.814730; pan[310] = .85; break;
  1412. case(311): tdelay[311] = 29.914843; pan[311] = -.85; break;
  1413. case(312): tdelay[312] = 30.000258; pan[312] = .4; break;
  1414. case(313): tdelay[313] = 30.135363; pan[313] = -.4; break;
  1415. case(314): tdelay[314] = 30.230554; pan[314] = .6; break;
  1416. case(315): tdelay[315] = 30.290000; pan[315] = -.6; break;
  1417. case(316): tdelay[316] = 30.372498; pan[316] = .225; break;
  1418. case(317): tdelay[317] = 30.445365; pan[317] = -.225; break;
  1419. case(318): tdelay[318] = 30.571897; pan[318] = .775; break;
  1420. case(319): tdelay[319] = 30.627656; pan[319] = -.775; break;
  1421. case(320): tdelay[320] = 30.695809; pan[320] = .125; break;
  1422. case(321): tdelay[321] = 30.758350; pan[321] = -.125; break;
  1423. case(322): tdelay[322] = 30.880984; pan[322] = -.65; break;
  1424. case(323): tdelay[323] = 30.975910; pan[323] = .65; break;
  1425. case(324): tdelay[324] = 31.043894; pan[324] = .35; break;
  1426. case(325): tdelay[325] = 31.143261; pan[325] = -.35; break;
  1427. case(326): tdelay[326] = 31.268126; pan[326] = -.1; break;
  1428. case(327): tdelay[327] = 31.366093; pan[327] = .1; break;
  1429. case(328): tdelay[328] = 31.480461; pan[328] = -.8; break;
  1430. case(329): tdelay[329] = 31.577198; pan[329] = .8; break;
  1431. case(330): tdelay[330] = 31.666871; pan[330] = -.55; break;
  1432. case(331): tdelay[331] = 31.779061; pan[331] = .55; break;
  1433. case(332): tdelay[332] = 31.852884; pan[332] = -.25; break;
  1434. case(333): tdelay[333] = 31.966519; pan[333] = .25; break;
  1435. case(334): tdelay[334] = 32.043514; pan[334] = -.45; break;
  1436. case(335): tdelay[335] = 32.147562; pan[335] = .45; break;
  1437. case(336): tdelay[336] = 32.241538; pan[336] = .05; break;
  1438. case(337): tdelay[337] = 32.358808; pan[337] = -.9; break;
  1439. case(338): tdelay[338] = 32.470554; pan[338] = -.05; break;
  1440. case(339): tdelay[339] = 32.540000; pan[339] = .9; break;
  1441. case(340): tdelay[340] = 32.612729; pan[340] = -.425; break;
  1442. case(341): tdelay[341] = 32.693888; pan[341] = .425; break;
  1443. case(342): tdelay[342] = 32.750479; pan[342] = .75; break;
  1444. case(343): tdelay[343] = 32.834122; pan[343] = -.75; break;
  1445. case(344): tdelay[344] = 32.894456; pan[344] = .275; break;
  1446. case(345): tdelay[345] = 32.978112; pan[345] = -.275; break;
  1447. case(346): tdelay[346] = 33.107199; pan[346] = -.625; break;
  1448. case(347): tdelay[347] = 33.217554; pan[347] = .625; break;
  1449. case(348): tdelay[348] = 33.282567; pan[348] = .375; break;
  1450. case(349): tdelay[349] = 33.387678; pan[349] = -.375; break;
  1451. case(350): tdelay[350] = 33.493642; pan[350] = -.116; break;
  1452. case(351): tdelay[351] = 33.610009; pan[351] = .116; break;
  1453. case(352): tdelay[352] = 33.720302; pan[352] = -.825; break;
  1454. case(353): tdelay[353] = 33.818331; pan[353] = .825; break;
  1455. case(354): tdelay[354] = 33.911186; pan[354] = -.535; break;
  1456. case(355): tdelay[355] = 34.013019; pan[355] = .535; break;
  1457. case(356): tdelay[356] = 34.089382; pan[356] = -.265; break;
  1458. case(357): tdelay[357] = 34.192071; pan[357] = .265; break;
  1459. case(358): tdelay[358] = 34.288516; pan[358] = -.475; break;
  1460. case(359): tdelay[359] = 34.403337; pan[359] = .475; break;
  1461. case(360): tdelay[360] = 34.474009; pan[360] = .11; break;
  1462. case(361): tdelay[361] = 34.613701; pan[361] = -.77; break;
  1463. case(362): tdelay[362] = 34.710554; pan[362] = -.11; break;
  1464. case(363): tdelay[363] = 34.800000; pan[363] = .77; break;
  1465. case(364): tdelay[364] = 34.933349; pan[364] = -.475; break;
  1466. case(365): tdelay[365] = 35.032532; pan[365] = .475; break;
  1467. case(366): tdelay[366] = 35.122216; pan[366] = .725; break;
  1468. case(367): tdelay[367] = 35.194122; pan[367] = -.725; break;
  1469. case(368): tdelay[368] = 35.265021; pan[368] = .235; break;
  1470. case(369): tdelay[369] = 35.358764; pan[369] = -.235; break;
  1471. case(370): tdelay[370] = 35.445276; pan[370] = -.685; break;
  1472. case(371): tdelay[371] = 35.539293; pan[371] = .685; break;
  1473. case(372): tdelay[372] = 35.609978; pan[372] = .315; break;
  1474. case(373): tdelay[373] = 35.710640; pan[373] = -.315; break;
  1475. case(374): tdelay[374] = 35.831968; pan[374] = -.136; break;
  1476. case(375): tdelay[375] = 35.933759; pan[375] = .136; break;
  1477. case(376): tdelay[376] = 36.031102; pan[376] = -.635; break;
  1478. case(377): tdelay[377] = 36.120963; pan[377] = .635; break;
  1479. case(378): tdelay[378] = 36.230907; pan[378] = -.435; break;
  1480. case(379): tdelay[379] = 36.322181; pan[379] = .435; break;
  1481. case(380): tdelay[380] = 36.426997; pan[380] = -.765; break;
  1482. case(381): tdelay[381] = 36.531689; pan[381] = .765; break;
  1483. case(382): tdelay[382] = 36.607012; pan[382] = -.575; break;
  1484. case(383): tdelay[383] = 36.715148; pan[383] = .575; break;
  1485. case(384): tdelay[384] = 36.803142; pan[384] = .215; break;
  1486. case(385): tdelay[385] = 36.951037; pan[385] = -.692; break;
  1487. case(386): tdelay[386] = 37.088695; pan[386] = -.215; break;
  1488. case(387): tdelay[387] = 37.240962; pan[387] = .692; break;
  1489. case(388): tdelay[388] = 37.312251; pan[388] = -.435; break;
  1490. case(389): tdelay[389] = 37.422676; pan[389] = .435; break;
  1491. case(390): tdelay[390] = 37.514122; pan[390] = .675; break;
  1492. case(391): tdelay[391] = 37.637713; pan[391] = -.675; break;
  1493. case(392): tdelay[392] = 37.730468; pan[392] = .265; break;
  1494. case(393): tdelay[393] = 37.808751; pan[393] = -.265; break;
  1495. case(394): tdelay[394] = 37.910460; pan[394] = -.555; break;
  1496. case(395): tdelay[395] = 38.000000; pan[395] = .555; break;
  1497. case(396): tdelay[396] = 38.131832; pan[396] = .333; break;
  1498. case(397): tdelay[397] = 38.215038; pan[397] = -.333; break;
  1499. case(398): tdelay[398] = 38.322274; pan[398] = 0.0; break;
  1500. case(399): tdelay[399] = 38.414122; pan[399] = -1; break;
  1501. case(400): tdelay[400] = 38.504488; pan[400] = 1; break;
  1502. case(401): tdelay[401] = 38.637713; pan[401] = .5; break;
  1503. case(402): tdelay[402] = 38.730468; pan[402] = -.5; break;
  1504. case(403): tdelay[403] = 38.808751; pan[403] = 0; break;
  1505. case(404): tdelay[404] = 38.910460; pan[404] = .7; break;
  1506. case(405): tdelay[405] = 39.027041; pan[405] = -.7; break;
  1507. case(406): tdelay[406] = 39.132028; pan[406] = .3; break;
  1508. case(407): tdelay[407] = 39.244272; pan[407] = -.3; break;
  1509. case(408): tdelay[408] = 39.336923; pan[408] = .15; break;
  1510. case(409): tdelay[409] = 39.427700; pan[409] = -.15; break;
  1511. case(410): tdelay[410] = 39.528503; pan[410] = .85; break;
  1512. case(411): tdelay[411] = 39.618661; pan[411] = -.85; break;
  1513. case(412): tdelay[412] = 39.715413; pan[412] = .4; break;
  1514. case(413): tdelay[413] = 39.814730; pan[413] = -.4; break;
  1515. case(414): tdelay[414] = 39.914843; pan[414] = .6; break;
  1516. case(415): tdelay[415] = 40.000258; pan[415] = -.6; break;
  1517. case(416): tdelay[416] = 40.135363; pan[416] = .225; break;
  1518. case(417): tdelay[417] = 40.230554; pan[417] = -.225; break;
  1519. case(418): tdelay[418] = 40.290000; pan[418] = .775; break;
  1520. case(419): tdelay[419] = 40.372498; pan[419] = -.775; break;
  1521. case(420): tdelay[420] = 40.445365; pan[420] = .125; break;
  1522. case(421): tdelay[421] = 40.571897; pan[421] = -.125; break;
  1523. case(422): tdelay[422] = 40.627656; pan[422] = -.65; break;
  1524. case(423): tdelay[423] = 40.695809; pan[423] = .65; break;
  1525. case(424): tdelay[424] = 40.758350; pan[424] = .35; break;
  1526. case(425): tdelay[425] = 40.880984; pan[425] = -.35; break;
  1527. case(426): tdelay[426] = 40.975910; pan[426] = -.1; break;
  1528. case(427): tdelay[427] = 41.043894; pan[427] = .1; break;
  1529. case(428): tdelay[428] = 41.143261; pan[428] = -.8; break;
  1530. case(429): tdelay[429] = 41.268126; pan[429] = .8; break;
  1531. case(430): tdelay[430] = 41.366093; pan[430] = -.55; break;
  1532. case(431): tdelay[431] = 41.480461; pan[431] = .55; break;
  1533. case(432): tdelay[432] = 41.577198; pan[432] = -.25; break;
  1534. case(433): tdelay[433] = 41.666871; pan[433] = .25; break;
  1535. case(434): tdelay[434] = 41.779061; pan[434] = -.45; break;
  1536. case(435): tdelay[435] = 41.852884; pan[435] = .45; break;
  1537. case(436): tdelay[436] = 41.966519; pan[436] = .05; break;
  1538. case(437): tdelay[437] = 42.043514; pan[437] = -.9; break;
  1539. case(438): tdelay[438] = 42.147562; pan[438] = -.05; break;
  1540. case(439): tdelay[439] = 42.241538; pan[439] = .9; break;
  1541. case(440): tdelay[440] = 42.358808; pan[440] = -.425; break;
  1542. case(441): tdelay[441] = 42.470554; pan[441] = .425; break;
  1543. case(442): tdelay[442] = 42.540000; pan[442] = .75; break;
  1544. case(443): tdelay[443] = 42.612729; pan[443] = -.75; break;
  1545. case(444): tdelay[444] = 42.693888; pan[444] = .275; break;
  1546. case(445): tdelay[445] = 42.750479; pan[445] = -.275; break;
  1547. case(446): tdelay[446] = 42.834122; pan[446] = -.625; break;
  1548. case(447): tdelay[447] = 42.894456; pan[447] = .625; break;
  1549. case(448): tdelay[448] = 42.978112; pan[448] = .375; break;
  1550. case(449): tdelay[449] = 43.107199; pan[449] = -.375; break;
  1551. case(450): tdelay[450] = 43.217554; pan[450] = -.116; break;
  1552. case(451): tdelay[451] = 43.282567; pan[451] = .116; break;
  1553. case(452): tdelay[452] = 43.387678; pan[452] = -.825; break;
  1554. case(453): tdelay[453] = 43.493642; pan[453] = .825; break;
  1555. case(454): tdelay[454] = 43.610009; pan[454] = -.535; break;
  1556. case(455): tdelay[455] = 43.720302; pan[455] = .535; break;
  1557. case(456): tdelay[456] = 43.818331; pan[456] = -.265; break;
  1558. case(457): tdelay[457] = 43.911186; pan[457] = .265; break;
  1559. case(458): tdelay[458] = 44.013019; pan[458] = -.475; break;
  1560. case(459): tdelay[459] = 44.089382; pan[459] = .475; break;
  1561. case(460): tdelay[460] = 44.192071; pan[460] = .11; break;
  1562. case(461): tdelay[461] = 44.288516; pan[461] = -.77; break;
  1563. case(462): tdelay[462] = 44.403337; pan[462] = -.11; break;
  1564. case(463): tdelay[463] = 44.474009; pan[463] = .77; break;
  1565. case(464): tdelay[464] = 44.613701; pan[464] = -.475; break;
  1566. case(465): tdelay[465] = 44.710554; pan[465] = .475; break;
  1567. case(466): tdelay[466] = 44.800000; pan[466] = .725; break;
  1568. case(467): tdelay[467] = 44.933349; pan[467] = -.725; break;
  1569. case(468): tdelay[468] = 45.032532; pan[468] = .235; break;
  1570. case(469): tdelay[469] = 45.122216; pan[469] = -.235; break;
  1571. case(470): tdelay[470] = 45.194122; pan[470] = -.685; break;
  1572. case(471): tdelay[471] = 45.265021; pan[471] = .685; break;
  1573. case(472): tdelay[472] = 45.358764; pan[472] = .315; break;
  1574. case(473): tdelay[473] = 45.445276; pan[473] = -.315; break;
  1575. case(474): tdelay[474] = 45.539293; pan[474] = -.136; break;
  1576. case(475): tdelay[475] = 45.609978; pan[475] = .136; break;
  1577. case(476): tdelay[476] = 45.710640; pan[476] = -.635; break;
  1578. case(477): tdelay[477] = 45.831968; pan[477] = .635; break;
  1579. case(478): tdelay[478] = 45.933759; pan[478] = -.435; break;
  1580. case(479): tdelay[479] = 46.031102; pan[479] = .435; break;
  1581. case(480): tdelay[480] = 46.120963; pan[480] = -.765; break;
  1582. case(481): tdelay[481] = 46.230907; pan[481] = .765; break;
  1583. case(482): tdelay[482] = 46.322181; pan[482] = -.575; break;
  1584. case(483): tdelay[483] = 46.426997; pan[483] = .575; break;
  1585. case(484): tdelay[484] = 46.531689; pan[484] = .215; break;
  1586. case(485): tdelay[485] = 46.607012; pan[485] = -.692; break;
  1587. case(486): tdelay[486] = 46.715148; pan[486] = -.215; break;
  1588. case(487): tdelay[487] = 46.803142; pan[487] = .692; break;
  1589. case(488): tdelay[488] = 46.951037; pan[488] = -.435; break;
  1590. case(489): tdelay[489] = 47.018695; pan[489] = .435; break;
  1591. case(490): tdelay[490] = 47.107151; pan[490] = .675; break;
  1592. case(491): tdelay[491] = 47.240962; pan[491] = -.675; break;
  1593. case(492): tdelay[492] = 47.312251; pan[492] = .265; break;
  1594. case(493): tdelay[493] = 47.422676; pan[493] = -.265; break;
  1595. case(494): tdelay[494] = 47.514122; pan[494] = -.555; break;
  1596. case(495): tdelay[495] = 47.637713; pan[495] = .555; break;
  1597. case(496): tdelay[496] = 47.730468; pan[496] = .333; break;
  1598. case(497): tdelay[497] = 47.808751; pan[497] = -.333; break;
  1599. case(498): tdelay[498] = 47.910460; pan[498] = 0.0; break;
  1600. case(499): tdelay[499] = 48.027041; pan[499] = -1; break;
  1601. case(500): tdelay[500] = 48.132028; pan[500] = 1; break;
  1602. case(501): tdelay[501] = 48.244272; pan[501] = .5; break;
  1603. case(502): tdelay[502] = 48.336923; pan[502] = -.5; break;
  1604. case(503): tdelay[503] = 48.427700; pan[503] = 0; break;
  1605. case(504): tdelay[504] = 48.528503; pan[504] = .7; break;
  1606. case(505): tdelay[505] = 48.618661; pan[505] = -.7; break;
  1607. case(506): tdelay[506] = 48.715413; pan[506] = .3; break;
  1608. case(507): tdelay[507] = 48.814730; pan[507] = -.3; break;
  1609. case(508): tdelay[508] = 48.914843; pan[508] = .15; break;
  1610. case(509): tdelay[509] = 49.000258; pan[509] = -.15; break;
  1611. case(510): tdelay[510] = 49.135363; pan[510] = .85; break;
  1612. case(511): tdelay[511] = 49.230554; pan[511] = -.85; break;
  1613. case(512): tdelay[512] = 49.290000; pan[512] = .4; break;
  1614. case(513): tdelay[513] = 49.372498; pan[513] = -.4; break;
  1615. case(514): tdelay[514] = 49.445365; pan[514] = .6; break;
  1616. case(515): tdelay[515] = 49.571897; pan[515] = -.6; break;
  1617. case(516): tdelay[516] = 49.627656; pan[516] = .225; break;
  1618. case(517): tdelay[517] = 49.695809; pan[517] = -.225; break;
  1619. case(518): tdelay[518] = 49.758350; pan[518] = .775; break;
  1620. case(519): tdelay[519] = 49.880984; pan[519] = -.775; break;
  1621. case(520): tdelay[520] = 49.975910; pan[520] = .125; break;
  1622. case(521): tdelay[521] = 50.043894; pan[521] = -.125; break;
  1623. case(522): tdelay[522] = 50.143261; pan[522] = -.65; break;
  1624. case(523): tdelay[523] = 50.268126; pan[523] = .65; break;
  1625. case(524): tdelay[524] = 50.366093; pan[524] = .35; break;
  1626. case(525): tdelay[525] = 50.480461; pan[525] = -.35; break;
  1627. case(526): tdelay[526] = 50.577198; pan[526] = -.1; break;
  1628. case(527): tdelay[527] = 50.666871; pan[527] = .1; break;
  1629. case(528): tdelay[528] = 50.779061; pan[528] = -.8; break;
  1630. case(529): tdelay[529] = 50.852884; pan[529] = .8; break;
  1631. case(530): tdelay[530] = 50.966519; pan[530] = -.55; break;
  1632. case(531): tdelay[531] = 51.043514; pan[531] = .55; break;
  1633. case(532): tdelay[532] = 51.147562; pan[532] = -.25; break;
  1634. case(533): tdelay[533] = 51.241538; pan[533] = .25; break;
  1635. case(534): tdelay[534] = 51.358808; pan[534] = -.45; break;
  1636. case(535): tdelay[535] = 51.470554; pan[535] = .45; break;
  1637. case(536): tdelay[536] = 51.540000; pan[536] = .05; break;
  1638. case(537): tdelay[537] = 51.612729; pan[537] = -.9; break;
  1639. case(538): tdelay[538] = 51.693888; pan[538] = -.05; break;
  1640. case(539): tdelay[539] = 51.750479; pan[539] = .9; break;
  1641. case(540): tdelay[540] = 51.834122; pan[540] = -.425; break;
  1642. case(541): tdelay[541] = 51.894456; pan[541] = .425; break;
  1643. case(542): tdelay[542] = 51.978112; pan[542] = .75; break;
  1644. case(543): tdelay[543] = 52.107199; pan[543] = -.75; break;
  1645. case(544): tdelay[544] = 52.217554; pan[544] = .275; break;
  1646. case(545): tdelay[545] = 52.282567; pan[545] = -.275; break;
  1647. case(546): tdelay[546] = 52.387678; pan[546] = -.625; break;
  1648. case(547): tdelay[547] = 52.493642; pan[547] = .625; break;
  1649. case(548): tdelay[548] = 52.610009; pan[548] = .375; break;
  1650. case(549): tdelay[549] = 52.720302; pan[549] = -.375; break;
  1651. case(550): tdelay[550] = 52.818331; pan[550] = -.116; break;
  1652. case(551): tdelay[551] = 52.911186; pan[551] = .116; break;
  1653. case(552): tdelay[552] = 53.013019; pan[552] = -.825; break;
  1654. case(553): tdelay[553] = 53.089382; pan[553] = .825; break;
  1655. case(554): tdelay[554] = 53.192071; pan[554] = -.535; break;
  1656. case(555): tdelay[555] = 53.288516; pan[555] = .535; break;
  1657. case(556): tdelay[556] = 53.403337; pan[556] = -.265; break;
  1658. case(557): tdelay[557] = 53.474009; pan[557] = .265; break;
  1659. case(558): tdelay[558] = 53.613701; pan[558] = -.475; break;
  1660. case(559): tdelay[559] = 53.710554; pan[559] = .475; break;
  1661. case(560): tdelay[560] = 53.800000; pan[560] = .11; break;
  1662. case(561): tdelay[561] = 53.933349; pan[561] = -.77; break;
  1663. case(562): tdelay[562] = 54.032532; pan[562] = -.11; break;
  1664. case(563): tdelay[563] = 54.122216; pan[563] = .77; break;
  1665. case(564): tdelay[564] = 54.194122; pan[564] = -.475; break;
  1666. case(565): tdelay[565] = 54.265021; pan[565] = .475; break;
  1667. case(566): tdelay[566] = 54.358764; pan[566] = .725; break;
  1668. case(567): tdelay[567] = 54.445276; pan[567] = -.725; break;
  1669. case(568): tdelay[568] = 54.539293; pan[568] = .235; break;
  1670. case(569): tdelay[569] = 54.609978; pan[569] = -.235; break;
  1671. case(570): tdelay[570] = 54.710640; pan[570] = -.685; break;
  1672. case(571): tdelay[571] = 54.831968; pan[571] = .685; break;
  1673. case(572): tdelay[572] = 54.933759; pan[572] = .315; break;
  1674. case(573): tdelay[573] = 55.031102; pan[573] = -.315; break;
  1675. case(574): tdelay[574] = 55.120963; pan[574] = -.136; break;
  1676. case(575): tdelay[575] = 55.230907; pan[575] = .136; break;
  1677. case(576): tdelay[576] = 55.322181; pan[576] = -.635; break;
  1678. case(577): tdelay[577] = 55.426997; pan[577] = .635; break;
  1679. case(578): tdelay[578] = 55.531689; pan[578] = -.435; break;
  1680. case(579): tdelay[579] = 55.607012; pan[579] = .435; break;
  1681. case(580): tdelay[580] = 55.715148; pan[580] = -.765; break;
  1682. case(581): tdelay[581] = 55.803142; pan[581] = .765; break;
  1683. case(582): tdelay[582] = 55.951037; pan[582] = -.575; break;
  1684. case(583): tdelay[583] = 56.018695; pan[583] = .575; break;
  1685. case(584): tdelay[584] = 56.107151; pan[584] = .215; break;
  1686. case(585): tdelay[585] = 56.240962; pan[585] = -.692; break;
  1687. case(586): tdelay[586] = 56.312251; pan[586] = -.215; break;
  1688. case(587): tdelay[587] = 56.422676; pan[587] = .692; break;
  1689. case(588): tdelay[588] = 56.514122; pan[588] = -.435; break;
  1690. case(589): tdelay[589] = 56.637713; pan[589] = .435; break;
  1691. case(590): tdelay[590] = 56.730468; pan[590] = .675; break;
  1692. case(591): tdelay[591] = 56.808751; pan[591] = -.675; break;
  1693. case(592): tdelay[592] = 56.910460; pan[592] = .265; break;
  1694. case(593): tdelay[593] = 57.027041; pan[593] = -.265; break;
  1695. case(594): tdelay[594] = 57.132028; pan[594] = -.555; break;
  1696. case(595): tdelay[595] = 57.244272; pan[595] = .555; break;
  1697. case(596): tdelay[596] = 57.336923; pan[596] = .333; break;
  1698. case(597): tdelay[597] = 57.427700; pan[597] = -.333; break;
  1699. case(598): tdelay[598] = 57.528503; pan[598] = 0.0; break;
  1700. case(599): tdelay[599] = 57.618661; pan[599] = -1; break;
  1701. case(600): tdelay[600] = 57.715413; pan[600] = 1; break;
  1702. case(601): tdelay[601] = 57.814730; pan[601] = .5; break;
  1703. case(602): tdelay[602] = 57.914843; pan[602] = -.5; break;
  1704. case(603): tdelay[603] = 58.000258; pan[603] = 0; break;
  1705. case(604): tdelay[604] = 58.135363; pan[604] = .7; break;
  1706. case(605): tdelay[605] = 58.230554; pan[605] = -.7; break;
  1707. case(606): tdelay[606] = 58.290000; pan[606] = .3; break;
  1708. case(607): tdelay[607] = 58.372498; pan[607] = -.3; break;
  1709. case(608): tdelay[608] = 58.445365; pan[608] = .15; break;
  1710. case(609): tdelay[609] = 58.571897; pan[609] = -.15; break;
  1711. case(610): tdelay[610] = 58.627656; pan[610] = .85; break;
  1712. case(611): tdelay[611] = 58.695809; pan[611] = -.85; break;
  1713. case(612): tdelay[612] = 58.758350; pan[612] = .4; break;
  1714. case(613): tdelay[613] = 58.880984; pan[613] = -.4; break;
  1715. case(614): tdelay[614] = 58.975910; pan[614] = .6; break;
  1716. case(615): tdelay[615] = 59.043894; pan[615] = -.6; break;
  1717. case(616): tdelay[616] = 59.143261; pan[616] = .225; break;
  1718. case(617): tdelay[617] = 59.268126; pan[617] = -.225; break;
  1719. case(618): tdelay[618] = 59.366093; pan[618] = .775; break;
  1720. case(619): tdelay[619] = 59.480461; pan[619] = -.775; break;
  1721. case(620): tdelay[620] = 59.577198; pan[620] = .125; break;
  1722. case(621): tdelay[621] = 59.666871; pan[621] = -.125; break;
  1723. case(622): tdelay[622] = 59.779061; pan[622] = -.65; break;
  1724. case(623): tdelay[623] = 59.852884; pan[623] = .65; break;
  1725. case(624): tdelay[624] = 59.966519; pan[624] = .35; break;
  1726. case(625): tdelay[625] = 60.043514; pan[625] = -.35; break;
  1727. case(626): tdelay[626] = 60.147562; pan[626] = -.1; break;
  1728. case(627): tdelay[627] = 60.241538; pan[627] = .1; break;
  1729. case(628): tdelay[628] = 60.358808; pan[628] = -.8; break;
  1730. case(629): tdelay[629] = 60.470554; pan[629] = .8; break;
  1731. case(630): tdelay[630] = 60.540000; pan[630] = -.55; break;
  1732. case(631): tdelay[631] = 60.612729; pan[631] = .55; break;
  1733. case(632): tdelay[632] = 60.693888; pan[632] = -.25; break;
  1734. case(633): tdelay[633] = 60.750479; pan[633] = .25; break;
  1735. case(634): tdelay[634] = 60.834122; pan[634] = -.45; break;
  1736. case(635): tdelay[635] = 60.894456; pan[635] = .45; break;
  1737. case(636): tdelay[636] = 60.978112; pan[636] = .05; break;
  1738. case(637): tdelay[637] = 61.107199; pan[637] = -.9; break;
  1739. case(638): tdelay[638] = 61.217554; pan[638] = -.05; break;
  1740. case(639): tdelay[639] = 61.282567; pan[639] = .9; break;
  1741. case(640): tdelay[640] = 61.387678; pan[640] = -.425; break;
  1742. case(641): tdelay[641] = 61.493642; pan[641] = .425; break;
  1743. case(642): tdelay[642] = 61.610009; pan[642] = .75; break;
  1744. case(643): tdelay[643] = 61.720302; pan[643] = -.75; break;
  1745. case(644): tdelay[644] = 61.818331; pan[644] = .275; break;
  1746. case(645): tdelay[645] = 61.911186; pan[645] = -.275; break;
  1747. case(646): tdelay[646] = 62.013019; pan[646] = -.625; break;
  1748. case(647): tdelay[647] = 62.089382; pan[647] = .625; break;
  1749. case(648): tdelay[648] = 62.192071; pan[648] = .375; break;
  1750. case(649): tdelay[649] = 62.288516; pan[649] = -.375; break;
  1751. case(650): tdelay[650] = 62.403337; pan[650] = -.116; break;
  1752. case(651): tdelay[651] = 62.474009; pan[651] = .116; break;
  1753. case(652): tdelay[652] = 62.613701; pan[652] = -.825; break;
  1754. case(653): tdelay[653] = 62.710554; pan[653] = .825; break;
  1755. case(654): tdelay[654] = 62.800000; pan[654] = -.535; break;
  1756. case(655): tdelay[655] = 62.933349; pan[655] = .535; break;
  1757. case(656): tdelay[656] = 63.032532; pan[656] = -.265; break;
  1758. case(657): tdelay[657] = 63.122216; pan[657] = .265; break;
  1759. case(658): tdelay[658] = 63.194122; pan[658] = -.475; break;
  1760. case(659): tdelay[659] = 63.265021; pan[659] = .475; break;
  1761. case(660): tdelay[660] = 63.358764; pan[660] = .11; break;
  1762. case(661): tdelay[661] = 63.445276; pan[661] = -.77; break;
  1763. case(662): tdelay[662] = 63.539293; pan[662] = -.11; break;
  1764. case(663): tdelay[663] = 63.609978; pan[663] = .77; break;
  1765. case(664): tdelay[664] = 63.710640; pan[664] = -.475; break;
  1766. case(665): tdelay[665] = 63.831968; pan[665] = .475; break;
  1767. case(666): tdelay[666] = 63.933759; pan[666] = .725; break;
  1768. case(667): tdelay[667] = 64.031102; pan[667] = -.725; break;
  1769. case(668): tdelay[668] = 64.120963; pan[668] = .235; break;
  1770. case(669): tdelay[669] = 64.230907; pan[669] = -.235; break;
  1771. case(670): tdelay[670] = 64.322181; pan[670] = -.685; break;
  1772. case(671): tdelay[671] = 64.426997; pan[671] = .685; break;
  1773. case(672): tdelay[672] = 64.531689; pan[672] = .315; break;
  1774. case(673): tdelay[673] = 64.607012; pan[673] = -.315; break;
  1775. case(674): tdelay[674] = 64.715148; pan[674] = -.136; break;
  1776. case(675): tdelay[675] = 64.803142; pan[675] = .136; break;
  1777. case(676): tdelay[676] = 64.951037; pan[676] = -.635; break;
  1778. case(677): tdelay[677] = 65.018695; pan[677] = .635; break;
  1779. case(678): tdelay[678] = 65.107151; pan[678] = -.435; break;
  1780. case(679): tdelay[679] = 65.240962; pan[679] = .435; break;
  1781. case(680): tdelay[680] = 65.312251; pan[680] = -.765; break;
  1782. case(681): tdelay[681] = 65.422676; pan[681] = .765; break;
  1783. case(682): tdelay[682] = 65.514122; pan[682] = -.575; break;
  1784. case(683): tdelay[683] = 65.637713; pan[683] = .575; break;
  1785. case(684): tdelay[684] = 65.730468; pan[684] = .215; break;
  1786. case(685): tdelay[685] = 65.808751; pan[685] = -.692; break;
  1787. case(686): tdelay[686] = 65.910460; pan[686] = -.215; break;
  1788. case(687): tdelay[687] = 66.000000; pan[687] = .692; break;
  1789. case(688): tdelay[688] = 66.131832; pan[688] = -.435; break;
  1790. case(689): tdelay[689] = 66.215038; pan[689] = .435; break;
  1791. case(690): tdelay[690] = 66.322274; pan[690] = .675; break;
  1792. case(691): tdelay[691] = 66.414122; pan[691] = -.675; break;
  1793. case(692): tdelay[692] = 66.504488; pan[692] = .265; break;
  1794. case(693): tdelay[693] = 66.637713; pan[693] = -.265; break;
  1795. case(694): tdelay[694] = 66.730468; pan[694] = -.555; break;
  1796. case(695): tdelay[695] = 66.808751; pan[695] = .555; break;
  1797. case(696): tdelay[696] = 66.910460; pan[696] = .333; break;
  1798. case(697): tdelay[697] = 67.027041; pan[697] = -.333; break;
  1799. case(698): tdelay[698] = 67.132028; pan[698] = 0.0; break;
  1800. case(699): tdelay[699] = 67.244272; pan[699] = -1; break;
  1801. case(700): tdelay[700] = 67.336923; pan[700] = 1; break;
  1802. case(701): tdelay[701] = 67.427700; pan[701] = .5; break;
  1803. case(702): tdelay[702] = 67.528503; pan[702] = -.5; break;
  1804. case(703): tdelay[703] = 67.618661; pan[703] = 0; break;
  1805. case(704): tdelay[704] = 67.715413; pan[704] = .7; break;
  1806. case(705): tdelay[705] = 67.814730; pan[705] = -.7; break;
  1807. case(706): tdelay[706] = 67.914843; pan[706] = .3; break;
  1808. case(707): tdelay[707] = 68.000258; pan[707] = -.3; break;
  1809. case(708): tdelay[708] = 68.135363; pan[708] = .15; break;
  1810. case(709): tdelay[709] = 68.230554; pan[709] = -.15; break;
  1811. case(710): tdelay[710] = 68.290000; pan[710] = .85; break;
  1812. case(711): tdelay[711] = 68.372498; pan[711] = -.85; break;
  1813. case(712): tdelay[712] = 68.445365; pan[712] = .4; break;
  1814. case(713): tdelay[713] = 68.571897; pan[713] = -.4; break;
  1815. case(714): tdelay[714] = 68.627656; pan[714] = .6; break;
  1816. case(715): tdelay[715] = 68.695809; pan[715] = -.6; break;
  1817. case(716): tdelay[716] = 68.758350; pan[716] = .225; break;
  1818. case(717): tdelay[717] = 68.880984; pan[717] = -.225; break;
  1819. case(718): tdelay[718] = 68.975910; pan[718] = .775; break;
  1820. case(719): tdelay[719] = 69.043894; pan[719] = -.775; break;
  1821. case(720): tdelay[720] = 69.143261; pan[720] = .125; break;
  1822. case(721): tdelay[721] = 69.268126; pan[721] = -.125; break;
  1823. case(722): tdelay[722] = 69.366093; pan[722] = -.65; break;
  1824. case(723): tdelay[723] = 69.480461; pan[723] = .65; break;
  1825. case(724): tdelay[724] = 69.577198; pan[724] = .35; break;
  1826. case(725): tdelay[725] = 69.666871; pan[725] = -.35; break;
  1827. case(726): tdelay[726] = 69.779061; pan[726] = -.1; break;
  1828. case(727): tdelay[727] = 69.852884; pan[727] = .1; break;
  1829. case(728): tdelay[728] = 69.966519; pan[728] = -.8; break;
  1830. case(729): tdelay[729] = 70.043514; pan[729] = .8; break;
  1831. case(730): tdelay[730] = 70.147562; pan[730] = -.55; break;
  1832. case(731): tdelay[731] = 70.241538; pan[731] = .55; break;
  1833. case(732): tdelay[732] = 70.358808; pan[732] = -.25; break;
  1834. case(733): tdelay[733] = 70.470554; pan[733] = .25; break;
  1835. case(734): tdelay[734] = 70.540000; pan[734] = -.45; break;
  1836. case(735): tdelay[735] = 70.612775; pan[735] = .45; break;
  1837. case(736): tdelay[736] = 70.697583; pan[736] = .05; break;
  1838. case(737): tdelay[737] = 70.750379; pan[737] = -.9; break;
  1839. case(738): tdelay[738] = 70.834122; pan[738] = -.05; break;
  1840. case(739): tdelay[739] = 70.894456; pan[739] = .9; break;
  1841. case(740): tdelay[740] = 70.978112; pan[740] = -.425; break;
  1842. case(741): tdelay[741] = 71.107199; pan[741] = .425; break;
  1843. case(742): tdelay[742] = 71.217554; pan[742] = .75; break;
  1844. case(743): tdelay[743] = 71.282567; pan[743] = -.75; break;
  1845. case(744): tdelay[744] = 71.387678; pan[744] = .275; break;
  1846. case(745): tdelay[745] = 71.493642; pan[745] = -.275; break;
  1847. case(746): tdelay[746] = 71.610009; pan[746] = -.625; break;
  1848. case(747): tdelay[747] = 71.720302; pan[747] = .625; break;
  1849. case(748): tdelay[748] = 71.818331; pan[748] = .375; break;
  1850. case(749): tdelay[749] = 71.911186; pan[749] = -.375; break;
  1851. case(750): tdelay[750] = 72.013019; pan[750] = -.116; break;
  1852. case(751): tdelay[751] = 72.089382; pan[751] = .116; break;
  1853. case(752): tdelay[752] = 72.192071; pan[752] = -.825; break;
  1854. case(753): tdelay[753] = 72.288516; pan[753] = .825; break;
  1855. case(754): tdelay[754] = 72.403337; pan[754] = -.535; break;
  1856. case(755): tdelay[755] = 72.474009; pan[755] = .535; break;
  1857. case(756): tdelay[756] = 72.613701; pan[756] = -.265; break;
  1858. case(757): tdelay[757] = 72.710554; pan[757] = .265; break;
  1859. case(758): tdelay[758] = 72.800000; pan[758] = -.475; break;
  1860. case(759): tdelay[759] = 72.933349; pan[759] = .475; break;
  1861. case(760): tdelay[760] = 73.032532; pan[760] = .11; break;
  1862. case(761): tdelay[761] = 73.122216; pan[761] = -.77; break;
  1863. case(762): tdelay[762] = 73.194122; pan[762] = -.11; break;
  1864. case(763): tdelay[763] = 73.265021; pan[763] = .77; break;
  1865. case(764): tdelay[764] = 73.358764; pan[764] = -.475; break;
  1866. case(765): tdelay[765] = 73.445276; pan[765] = .475; break;
  1867. case(766): tdelay[766] = 73.539293; pan[766] = .725; break;
  1868. case(767): tdelay[767] = 73.609978; pan[767] = -.725; break;
  1869. case(768): tdelay[768] = 73.710640; pan[768] = .235; break;
  1870. case(769): tdelay[769] = 73.831968; pan[769] = -.235; break;
  1871. case(770): tdelay[770] = 73.933759; pan[770] = -.685; break;
  1872. case(771): tdelay[771] = 74.031102; pan[771] = .685; break;
  1873. case(772): tdelay[772] = 74.120963; pan[772] = .315; break;
  1874. case(773): tdelay[773] = 74.230907; pan[773] = -.315; break;
  1875. case(774): tdelay[774] = 74.322181; pan[774] = -.136; break;
  1876. case(775): tdelay[775] = 74.426997; pan[775] = .136; break;
  1877. case(776): tdelay[776] = 74.531689; pan[776] = -.635; break;
  1878. case(777): tdelay[777] = 74.607012; pan[777] = .635; break;
  1879. case(778): tdelay[778] = 74.715148; pan[778] = -.435; break;
  1880. case(779): tdelay[779] = 74.803142; pan[779] = .435; break;
  1881. case(780): tdelay[780] = 74.951037; pan[780] = -.765; break;
  1882. case(781): tdelay[781] = 75.018695; pan[781] = .765; break;
  1883. case(782): tdelay[782] = 75.107151; pan[782] = -.575; break;
  1884. case(783): tdelay[783] = 75.240962; pan[783] = .575; break;
  1885. case(784): tdelay[784] = 75.312251; pan[784] = .215; break;
  1886. case(785): tdelay[785] = 75.422676; pan[785] = -.692; break;
  1887. case(786): tdelay[786] = 75.514122; pan[786] = -.435; break;
  1888. case(787): tdelay[787] = 75.637713; pan[787] = .435; break;
  1889. case(788): tdelay[788] = 75.730468; pan[788] = .675; break;
  1890. case(789): tdelay[789] = 75.808751; pan[789] = -.675; break;
  1891. case(790): tdelay[790] = 75.910460; pan[790] = .265; break;
  1892. case(791): tdelay[791] = 76.027041; pan[791] = -.265; break;
  1893. case(792): tdelay[792] = 76.132028; pan[792] = -.555; break;
  1894. case(793): tdelay[793] = 76.244272; pan[793] = .555; break;
  1895. case(794): tdelay[794] = 76.336923; pan[794] = .333; break;
  1896. case(795): tdelay[795] = 76.427700; pan[795] = -.333; break;
  1897. case(796): tdelay[796] = 76.528503; pan[796] = 0.0; break;
  1898. case(797): tdelay[797] = 76.618661; pan[797] = -1; break;
  1899. case(798): tdelay[798] = 76.715413; pan[798] = 1; break;
  1900. case(799): tdelay[799] = 76.814730; pan[799] = .5; break;
  1901. case(800): tdelay[800] = 76.914843; pan[800] = -.5; break;
  1902. case(801): tdelay[801] = 77.000258; pan[801] = 0; break;
  1903. case(802): tdelay[802] = 77.135363; pan[802] = .7; break;
  1904. case(803): tdelay[803] = 77.230554; pan[803] = -.7; break;
  1905. case(804): tdelay[804] = 77.290000; pan[804] = .3; break;
  1906. case(805): tdelay[805] = 77.372498; pan[805] = -.3; break;
  1907. case(806): tdelay[806] = 77.445365; pan[806] = .15; break;
  1908. case(807): tdelay[807] = 77.571897; pan[807] = -.15; break;
  1909. case(808): tdelay[808] = 77.627656; pan[808] = .85; break;
  1910. case(809): tdelay[809] = 77.695809; pan[809] = -.85; break;
  1911. case(810): tdelay[810] = 77.758350; pan[810] = .4; break;
  1912. case(811): tdelay[811] = 77.880984; pan[811] = -.4; break;
  1913. case(812): tdelay[812] = 77.975910; pan[812] = .6; break;
  1914. case(813): tdelay[813] = 78.043894; pan[813] = -.6; break;
  1915. case(814): tdelay[814] = 78.143261; pan[814] = .225; break;
  1916. case(815): tdelay[815] = 78.268126; pan[815] = -.225; break;
  1917. case(816): tdelay[816] = 78.366093; pan[816] = .775; break;
  1918. case(817): tdelay[817] = 78.480461; pan[817] = -.775; break;
  1919. case(818): tdelay[818] = 78.577198; pan[818] = .125; break;
  1920. case(819): tdelay[819] = 78.666871; pan[819] = -.125; break;
  1921. case(820): tdelay[820] = 78.779061; pan[820] = -.65; break;
  1922. case(821): tdelay[821] = 78.852884; pan[821] = .65; break;
  1923. case(822): tdelay[822] = 78.966519; pan[822] = .35; break;
  1924. case(823): tdelay[823] = 79.043514; pan[823] = -.35; break;
  1925. case(824): tdelay[824] = 79.147562; pan[824] = -.1; break;
  1926. case(825): tdelay[825] = 79.241538; pan[825] = .1; break;
  1927. case(826): tdelay[826] = 79.358808; pan[826] = -.8; break;
  1928. case(827): tdelay[827] = 79.470554; pan[827] = .8; break;
  1929. case(828): tdelay[828] = 79.540000; pan[828] = -.55; break;
  1930. case(829): tdelay[829] = 79.612729; pan[829] = .55; break;
  1931. case(830): tdelay[830] = 79.693888; pan[830] = -.25; break;
  1932. case(831): tdelay[831] = 79.750479; pan[831] = .25; break;
  1933. case(832): tdelay[832] = 79.834122; pan[832] = -.45; break;
  1934. case(833): tdelay[833] = 79.894456; pan[833] = .45; break;
  1935. case(834): tdelay[834] = 79.978112; pan[834] = .05; break;
  1936. case(835): tdelay[835] = 80.107199; pan[835] = -.9; break;
  1937. case(836): tdelay[836] = 80.217554; pan[836] = -.05; break;
  1938. case(837): tdelay[837] = 80.282567; pan[837] = .9; break;
  1939. case(838): tdelay[838] = 80.387678; pan[838] = -.425; break;
  1940. case(839): tdelay[839] = 80.493642; pan[839] = .425; break;
  1941. case(840): tdelay[840] = 80.610009; pan[840] = .75; break;
  1942. case(841): tdelay[841] = 80.720302; pan[841] = -.75; break;
  1943. case(842): tdelay[842] = 80.818331; pan[842] = .275; break;
  1944. case(843): tdelay[843] = 80.911186; pan[843] = -.275; break;
  1945. case(844): tdelay[844] = 81.013019; pan[844] = -.625; break;
  1946. case(845): tdelay[845] = 81.089382; pan[845] = .625; break;
  1947. case(846): tdelay[846] = 81.192071; pan[846] = .375; break;
  1948. case(847): tdelay[847] = 81.288516; pan[847] = -.375; break;
  1949. case(848): tdelay[848] = 81.403337; pan[848] = -.116; break;
  1950. case(849): tdelay[849] = 81.474009; pan[849] = .116; break;
  1951. case(850): tdelay[850] = 81.613701; pan[850] = -.825; break;
  1952. case(851): tdelay[851] = 81.710554; pan[851] = .825; break;
  1953. case(852): tdelay[852] = 81.800000; pan[852] = -.535; break;
  1954. case(853): tdelay[853] = 81.933349; pan[853] = .535; break;
  1955. case(854): tdelay[854] = 82.032532; pan[854] = -.265; break;
  1956. case(855): tdelay[855] = 82.122216; pan[855] = .265; break;
  1957. case(856): tdelay[856] = 82.194122; pan[856] = -.475; break;
  1958. case(857): tdelay[857] = 82.265021; pan[857] = .475; break;
  1959. case(858): tdelay[858] = 82.358764; pan[858] = .11; break;
  1960. case(859): tdelay[859] = 82.445276; pan[859] = -.77; break;
  1961. case(860): tdelay[860] = 82.539293; pan[860] = -.11; break;
  1962. case(861): tdelay[861] = 82.609978; pan[861] = .77; break;
  1963. case(862): tdelay[862] = 82.710640; pan[862] = -.475; break;
  1964. case(863): tdelay[863] = 82.831968; pan[863] = .475; break;
  1965. case(864): tdelay[864] = 82.933759; pan[864] = .725; break;
  1966. case(865): tdelay[865] = 83.031102; pan[865] = -.725; break;
  1967. case(866): tdelay[866] = 83.120963; pan[866] = .235; break;
  1968. case(867): tdelay[867] = 83.230907; pan[867] = -.235; break;
  1969. case(868): tdelay[868] = 83.322181; pan[868] = -.685; break;
  1970. case(869): tdelay[869] = 83.426997; pan[869] = .685; break;
  1971. case(870): tdelay[870] = 83.531689; pan[870] = .315; break;
  1972. case(871): tdelay[871] = 83.607012; pan[871] = -.315; break;
  1973. case(872): tdelay[872] = 83.715148; pan[872] = -.136; break;
  1974. case(873): tdelay[873] = 83.803142; pan[873] = .136; break;
  1975. case(874): tdelay[874] = 83.951037; pan[874] = -.635; break;
  1976. case(875): tdelay[875] = 84.018695; pan[875] = .635; break;
  1977. case(876): tdelay[876] = 84.160962; pan[876] = -.435; break;
  1978. case(877): tdelay[877] = 84.312251; pan[877] = .435; break;
  1979. case(878): tdelay[878] = 84.422676; pan[878] = -.765; break;
  1980. case(879): tdelay[879] = 84.514122; pan[879] = .765; break;
  1981. case(880): tdelay[880] = 84.637713; pan[880] = -.575; break;
  1982. case(881): tdelay[881] = 84.730468; pan[881] = .575; break;
  1983. case(882): tdelay[882] = 84.808751; pan[882] = .215; break;
  1984. case(883): tdelay[883] = 84.910460; pan[883] = -.692; break;
  1985. case(884): tdelay[884] = 85.000000; pan[884] = -.215; break;
  1986. case(885): tdelay[885] = 85.131832; pan[885] = .692; break;
  1987. case(886): tdelay[886] = 85.215038; pan[886] = -.435; break;
  1988. case(887): tdelay[887] = 85.322274; pan[887] = .435; break;
  1989. case(888): tdelay[888] = 85.414122; pan[888] = .675; break;
  1990. case(889): tdelay[889] = 85.504488; pan[889] = -.675; break;
  1991. case(890): tdelay[890] = 85.637713; pan[890] = .265; break;
  1992. case(891): tdelay[891] = 85.730468; pan[891] = -.265; break;
  1993. case(892): tdelay[892] = 85.808751; pan[892] = -.555; break;
  1994. case(893): tdelay[893] = 85.910460; pan[893] = .555; break;
  1995. case(894): tdelay[894] = 86.027041; pan[894] = .333; break;
  1996. case(895): tdelay[895] = 86.132028; pan[895] = -.333; break;
  1997. case(896): tdelay[896] = 86.244272; pan[896] = 0.0; break;
  1998. case(897): tdelay[897] = 86.336923; pan[897] = -1; break;
  1999. case(898): tdelay[898] = 86.427700; pan[898] = 1; break;
  2000. case(899): tdelay[899] = 86.528503; pan[899] = .5; break;
  2001. case(900): tdelay[900] = 86.618661; pan[900] = -.5; break;
  2002. case(901): tdelay[901] = 86.715413; pan[901] = 0; break;
  2003. case(902): tdelay[902] = 86.814730; pan[902] = .7; break;
  2004. case(903): tdelay[903] = 86.914843; pan[903] = -.7; break;
  2005. case(904): tdelay[904] = 87.000258; pan[904] = .3; break;
  2006. case(905): tdelay[905] = 87.135363; pan[905] = -.3; break;
  2007. case(906): tdelay[906] = 87.230554; pan[906] = .15; break;
  2008. case(907): tdelay[907] = 87.290000; pan[907] = -.15; break;
  2009. case(908): tdelay[908] = 87.372498; pan[908] = .85; break;
  2010. case(909): tdelay[909] = 87.445365; pan[909] = -.85; break;
  2011. case(910): tdelay[910] = 87.571897; pan[910] = .4; break;
  2012. case(911): tdelay[911] = 87.627656; pan[911] = -.4; break;
  2013. case(912): tdelay[912] = 87.695809; pan[912] = .6; break;
  2014. case(913): tdelay[913] = 87.758350; pan[913] = -.6; break;
  2015. case(914): tdelay[914] = 87.880984; pan[914] = .225; break;
  2016. case(915): tdelay[915] = 87.975910; pan[915] = -.225; break;
  2017. case(916): tdelay[916] = 88.043894; pan[916] = .775; break;
  2018. case(917): tdelay[917] = 88.143261; pan[917] = -.775; break;
  2019. case(918): tdelay[918] = 88.268126; pan[918] = .125; break;
  2020. case(919): tdelay[919] = 88.366093; pan[919] = -.125; break;
  2021. case(920): tdelay[920] = 88.480461; pan[920] = -.65; break;
  2022. case(921): tdelay[921] = 88.577198; pan[921] = .65; break;
  2023. case(922): tdelay[922] = 88.666871; pan[922] = .35; break;
  2024. case(923): tdelay[923] = 88.779061; pan[923] = -.35; break;
  2025. case(924): tdelay[924] = 88.852884; pan[924] = -.1; break;
  2026. case(925): tdelay[925] = 88.966519; pan[925] = .1; break;
  2027. case(926): tdelay[926] = 89.043514; pan[926] = -.8; break;
  2028. case(927): tdelay[927] = 89.147562; pan[927] = .8; break;
  2029. case(928): tdelay[928] = 89.241538; pan[928] = -.55; break;
  2030. case(929): tdelay[929] = 89.358808; pan[929] = .55; break;
  2031. case(930): tdelay[930] = 89.470554; pan[930] = -.25; break;
  2032. case(931): tdelay[931] = 89.540000; pan[931] = .25; break;
  2033. case(932): tdelay[932] = 89.612729; pan[932] = -.45; break;
  2034. case(933): tdelay[933] = 89.693888; pan[933] = .45; break;
  2035. case(934): tdelay[934] = 89.750479; pan[934] = .05; break;
  2036. case(935): tdelay[935] = 89.834122; pan[935] = -.9; break;
  2037. case(936): tdelay[936] = 89.894456; pan[936] = -.05; break;
  2038. case(937): tdelay[937] = 89.978112; pan[937] = .9; break;
  2039. case(938): tdelay[938] = 90.107199; pan[938] = -.425; break;
  2040. case(939): tdelay[939] = 90.217554; pan[939] = .425; break;
  2041. case(940): tdelay[940] = 90.282567; pan[940] = .75; break;
  2042. case(941): tdelay[941] = 90.387678; pan[941] = -.75; break;
  2043. case(942): tdelay[942] = 90.493642; pan[942] = .275; break;
  2044. case(943): tdelay[943] = 90.610009; pan[943] = -.275; break;
  2045. case(944): tdelay[944] = 90.720302; pan[944] = -.625; break;
  2046. case(945): tdelay[945] = 90.818331; pan[945] = .625; break;
  2047. case(946): tdelay[946] = 90.911186; pan[946] = .375; break;
  2048. case(947): tdelay[947] = 91.013019; pan[947] = -.375; break;
  2049. case(948): tdelay[948] = 91.089382; pan[948] = -.116; break;
  2050. case(949): tdelay[949] = 91.192071; pan[949] = .116; break;
  2051. case(950): tdelay[950] = 91.288516; pan[950] = -.825; break;
  2052. case(951): tdelay[951] = 91.403337; pan[951] = .825; break;
  2053. case(952): tdelay[952] = 91.474009; pan[952] = -.535; break;
  2054. case(953): tdelay[953] = 91.613701; pan[953] = .535; break;
  2055. case(954): tdelay[954] = 91.710554; pan[954] = -.265; break;
  2056. case(955): tdelay[955] = 91.800000; pan[955] = .265; break;
  2057. case(956): tdelay[956] = 91.933349; pan[956] = -.475; break;
  2058. case(957): tdelay[957] = 92.032532; pan[957] = .475; break;
  2059. case(958): tdelay[958] = 92.122216; pan[958] = .11; break;
  2060. case(959): tdelay[959] = 92.194122; pan[959] = -.77; break;
  2061. case(960): tdelay[960] = 92.265021; pan[960] = -.11; break;
  2062. case(961): tdelay[961] = 92.358764; pan[961] = .77; break;
  2063. case(962): tdelay[962] = 92.445276; pan[962] = -.475; break;
  2064. case(963): tdelay[963] = 92.539293; pan[963] = .475; break;
  2065. case(964): tdelay[964] = 92.609978; pan[964] = .725; break;
  2066. case(965): tdelay[965] = 92.710640; pan[965] = -.725; break;
  2067. case(966): tdelay[966] = 92.831968; pan[966] = .235; break;
  2068. case(967): tdelay[967] = 92.933759; pan[967] = -.235; break;
  2069. case(968): tdelay[968] = 93.031102; pan[968] = -.685; break;
  2070. case(969): tdelay[969] = 93.120963; pan[969] = .685; break;
  2071. case(970): tdelay[970] = 93.230907; pan[970] = .315; break;
  2072. case(971): tdelay[971] = 93.322181; pan[971] = -.315; break;
  2073. case(972): tdelay[972] = 93.426997; pan[972] = -.136; break;
  2074. case(973): tdelay[973] = 93.531689; pan[973] = .136; break;
  2075. case(974): tdelay[974] = 93.607012; pan[974] = -.635; break;
  2076. case(975): tdelay[975] = 93.715148; pan[975] = .635; break;
  2077. case(976): tdelay[976] = 93.803142; pan[976] = -.435; break;
  2078. case(977): tdelay[977] = 93.951037; pan[977] = .435; break;
  2079. case(978): tdelay[978] = 94.018695; pan[978] = -.765; break;
  2080. case(979): tdelay[979] = 94.107151; pan[979] = .765; break;
  2081. case(980): tdelay[980] = 94.240962; pan[980] = -.575; break;
  2082. case(981): tdelay[981] = 94.312251; pan[981] = .575; break;
  2083. case(982): tdelay[982] = 94.422676; pan[982] = .215; break;
  2084. case(983): tdelay[983] = 94.514122; pan[983] = -.692; break;
  2085. case(984): tdelay[984] = 94.637713; pan[984] = -.215; break;
  2086. case(985): tdelay[985] = 94.730468; pan[985] = .692; break;
  2087. case(986): tdelay[986] = 94.808751; pan[986] = -.435; break;
  2088. case(987): tdelay[987] = 94.933759; pan[987] = .435; break;
  2089. case(988): tdelay[988] = 95.013019; pan[988] = .675; break;
  2090. case(989): tdelay[989] = 95.107151; pan[989] = -.675; break;
  2091. case(990): tdelay[990] = 95.240962; pan[990] = .265; break;
  2092. case(991): tdelay[991] = 95.312251; pan[991] = -.265; break;
  2093. case(992): tdelay[992] = 95.422676; pan[992] = -.555; break;
  2094. case(993): tdelay[993] = 95.514122; pan[993] = .555; break;
  2095. case(994): tdelay[994] = 95.637713; pan[994] = .333; break;
  2096. case(995): tdelay[995] = 95.730468; pan[995] = -.333; break;
  2097. case(996): tdelay[996] = 95.831968; pan[996] = 0.0; break;
  2098. case(997): tdelay[997] = 95.933759; pan[997] = -1; break;
  2099. case(998): tdelay[998] = 96.000000; pan[998] = 1; break;
  2100. case(999): tdelay[999] = 96.103567; pan[999] = .475; break;
  2101. case(1000): tdelay[1000]= 96.187341; pan[1000]= -.475; break;
  2102. }
  2103. }
  2104. }
  2105. return(FINISHED);
  2106. }
  2107. /************************** GENERATE_DELAYS ****************************/
  2108. int generate_delays(dataptr dz)
  2109. {
  2110. int n;
  2111. int eccnt = dz->iparam[STAD_ECHOCNT];
  2112. int *delay;
  2113. double *tdelay = dz->parray[STAD_TDELAY];
  2114. double sr = (double)dz->infile->srate;
  2115. /*RWD Jan 2009 - trap files with more than 2 chans! */
  2116. if(dz->itemcnt > 2){
  2117. sprintf(errstr,"File has more than two channels.\n");
  2118. return GOAL_FAILED;
  2119. }
  2120. if((dz->lparray[STAD_DELAY] = malloc((MAX_ECHOCNT+1) * sizeof(int)))==NULL) {
  2121. sprintf(errstr,"Insufficient memory for stadium arrays.\n");
  2122. return(MEMORY_ERROR);
  2123. }
  2124. delay = dz->lparray[STAD_DELAY];
  2125. for(n=0;n<=eccnt;n++) {
  2126. if((delay[n] = (int)round(tdelay[n] * sr * dz->param[STAD_SIZE]) * dz->outfile->channels)<0) {
  2127. sprintf(errstr,"Delay time too long.\n");
  2128. return(GOAL_FAILED);
  2129. }
  2130. }
  2131. return(FINISHED);
  2132. }
  2133. /******************************** CREATE_STADIUM_BUFFERS **********************************/
  2134. //#define IBUF (0) /* RWD 12/20: in standalone.h */
  2135. //#define OBUF (1)
  2136. #define OBUFEND (2)
  2137. #define PADSTRT (3)
  2138. int create_stadium_buffers(dataptr dz)
  2139. {
  2140. size_t bigbufsize;
  2141. int bufwanted;
  2142. int obuflen;
  2143. int cnt;
  2144. float *ibufend;
  2145. int overflowlen;
  2146. overflowlen = stad_maxdelay * dz->outfile->channels;
  2147. stad_ovflwsz = overflowlen * sizeof(float) ;
  2148. cnt = dz->itemcnt + dz->outfile->channels;
  2149. bigbufsize = (size_t) Malloc(-1); // grab biggest buffer available
  2150. dz->buflen = (int)(bigbufsize/sizeof(float));
  2151. dz->buflen /= cnt; // divide it into 'cnt' equal parts (and lose the rest)
  2152. for(;;) {
  2153. bufwanted = ((dz->buflen * cnt) + overflowlen) * sizeof(float);
  2154. if((dz->bigbuf = (float *) malloc(bufwanted))==NULL){
  2155. dz->buflen--; // if not enough memory once overflow is added
  2156. if(dz->buflen < 1) { // gradually reduce size of buffer until we have enough memory
  2157. sprintf(errstr,"Unable to acquire %d samps for delay and sound buffers.\n",bufwanted);
  2158. return MEMORY_ERROR;
  2159. }
  2160. } else
  2161. break;
  2162. }
  2163. obuflen = dz->buflen * dz->outfile->channels;
  2164. dz->sampbuf[IBUF] = dz->bigbuf;
  2165. ibufend = dz->sampbuf[IBUF] + (dz->buflen * dz->itemcnt);
  2166. dz->sampbuf[OBUF] = ibufend;
  2167. dz->sampbuf[OBUFEND] = dz->sampbuf[OBUF] + obuflen;
  2168. dz->sampbuf[PADSTRT] = dz->sampbuf[OBUF] + overflowlen;
  2169. memset((char *)dz->bigbuf,0,(dz->buflen * sizeof(float) * (dz->itemcnt + dz->outfile->channels)) + stad_ovflwsz);
  2170. return(FINISHED);
  2171. }
  2172. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  2173. int setup_internal_arrays_and_array_pointers(dataptr dz)
  2174. {
  2175. int n;
  2176. dz->array_cnt=3;
  2177. dz->iarray_cnt=0;
  2178. dz->larray_cnt=1;
  2179. dz->ptr_cnt = 0;
  2180. dz->fptr_cnt = 0;
  2181. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  2182. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  2183. return(PROGRAM_ERROR);
  2184. }
  2185. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  2186. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  2187. return(MEMORY_ERROR);
  2188. }
  2189. for(n=0;n<dz->array_cnt;n++)
  2190. dz->parray[n] = NULL;
  2191. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  2192. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  2193. return(MEMORY_ERROR);
  2194. }
  2195. for(n=0;n<dz->larray_cnt;n++)
  2196. dz->lparray[n] = NULL;
  2197. return(FINISHED);
  2198. }
  2199. /******************************** DO_MULTICHAN_STADIUM **********************************/
  2200. int do_multichan_stadium(dataptr dz)
  2201. {
  2202. int exit_status;
  2203. int n, m, k, inchans = dz->itemcnt, outchans = dz->iparam[REV_OCHANS], lchan, rchan; /* stores channel-cnt of infile */
  2204. int icnt, ocnt, sampcnt = 0, samps_to_write, samps_left = 0, maxwrite;
  2205. int *delay = dz->lparray[STAD_DELAY];
  2206. double gainl, gainr;
  2207. int obuflen = dz->buflen * outchans;
  2208. float *ibuf = dz->sampbuf[IBUF], *obuf = dz->sampbuf[OBUF];
  2209. int eccnt = dz->iparam[STAD_ECHOCNT];
  2210. double spread = dz->param[REV_SPREAD], centre, multichan_position;
  2211. double stereoposition, prtsc; // position_relative_to_stereo_centre
  2212. double holecompensate;
  2213. double *gain = dz->parray[STAD_GAIN];
  2214. double *pan = dz->parray[STAD_PAN];
  2215. double doutchans = (double)outchans;
  2216. centre = dz->param[REV_CENTRE] - 1.0; /* outchans counted from zero */
  2217. while((dz->ssampsread = fgetfbufEx(ibuf,(dz->buflen * inchans),dz->ifd[0],0)) > 0) {
  2218. if(inchans > 1) {
  2219. dz->ssampsread /= inchans;
  2220. for(n = 0,m=0;n < dz->ssampsread; n++,m+=inchans) {
  2221. ibuf[n] = ibuf[m];
  2222. for(k = 1; k <inchans; k++)
  2223. ibuf[n] = (float)(ibuf[n] + ibuf[m+k]);
  2224. ibuf[n] = (float)(ibuf[n]/(double)inchans);
  2225. }
  2226. }
  2227. for(n=0;n<=eccnt;n++) {
  2228. multichan_position = (pan[n]/2.0) * spread;
  2229. multichan_position += centre;
  2230. if(multichan_position < 0.0)
  2231. multichan_position += doutchans;
  2232. else if(multichan_position >= doutchans)
  2233. multichan_position -= doutchans;
  2234. lchan = (int)floor(multichan_position);
  2235. rchan = lchan + 1;
  2236. if(rchan >= outchans)
  2237. rchan -= outchans;
  2238. stereoposition = multichan_position - (double)lchan;
  2239. gainr = stereoposition;
  2240. gainl = 1.0 - stereoposition;
  2241. prtsc = fabs(stereoposition - 0.5) * 2.0; // position_relative_to_stereo_centre
  2242. holecompensate = 1.0 + (prtsc * prtsc);
  2243. holecompensate = ROOT2 / sqrt(holecompensate); // varies between 1 and (1/sqrt2)
  2244. gainr *= (gain[n] * holecompensate);
  2245. gainl *= (gain[n] * holecompensate);
  2246. for(icnt=0,ocnt=0;icnt<dz->ssampsread;icnt++,ocnt+=outchans) {
  2247. sampcnt = ocnt + delay[n];
  2248. obuf[sampcnt+lchan] = (float)(obuf[sampcnt+lchan] + (ibuf[icnt] * gainl));
  2249. obuf[sampcnt+rchan] = (float)(obuf[sampcnt+rchan] + (ibuf[icnt] * gainr));
  2250. }
  2251. }
  2252. maxwrite = sampcnt + outchans;
  2253. if((samps_to_write = min(obuflen,maxwrite))>0) {
  2254. if((exit_status = write_samps(obuf,samps_to_write,dz))<0)
  2255. return(exit_status);
  2256. }
  2257. samps_left = maxwrite - obuflen;
  2258. memcpy((char *)obuf,(char *)dz->sampbuf[OBUFEND],stad_ovflwsz);
  2259. memset((char *)dz->sampbuf[PADSTRT],0,obuflen * sizeof(float));
  2260. }
  2261. if(dz->ssampsread < 0) {
  2262. sprintf(errstr,"Sound read error.\n");
  2263. return(SYSTEM_ERROR);
  2264. }
  2265. if(samps_left > 0)
  2266. return write_samps(obuf,samps_left,dz);
  2267. return(FINISHED);
  2268. }