scramble.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802
  1. // _cdprogs\scramble scramble 5 alan_bellydancefc.wav test.wav cuts.txt
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <structures.h>
  5. #include <tkglobals.h>
  6. #include <pnames.h>
  7. #include <filetype.h>
  8. #include <processno.h>
  9. #include <modeno.h>
  10. #include <logic.h>
  11. #include <globcon.h>
  12. #include <cdpmain.h>
  13. #include <math.h>
  14. #include <mixxcon.h>
  15. #include <osbind.h>
  16. #include <standalone.h>
  17. #include <science.h>
  18. #include <ctype.h>
  19. #include <sfsys.h>
  20. #include <string.h>
  21. #include <srates.h>
  22. #ifdef unix
  23. #define round(x) lround((x))
  24. #endif
  25. char errstr[2400];
  26. int anal_infiles = 1;
  27. int sloom = 0;
  28. int sloombatch = 0;
  29. const char* cdp_version = "6.1.0";
  30. //CDP LIB REPLACEMENTS
  31. static int setup_scramble_application(dataptr dz);
  32. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  33. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  34. static int setup_scramble_param_ranges_and_defaults(dataptr dz);
  35. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  36. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  37. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  38. static int establish_application(dataptr dz);
  39. static int initialise_vflags(dataptr dz);
  40. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  41. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  42. static int mark_parameter_types(dataptr dz,aplptr ap);
  43. static int assign_file_data_storage(int infilecnt,dataptr dz);
  44. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  45. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  46. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  47. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  48. static int scramble(dataptr dz);
  49. static void rndpermm(int permlen,int *permm);
  50. static void insert(int m,int t,int permlen,int *permm);
  51. static void prefix(int m,int permlen,int *permm);
  52. static void shuflup(int k,int permlen, int *permm);
  53. static int write_waveset(int *obufpos,int *lastbuf,int ibufstart,int len,double amp,double incr,dataptr dz);
  54. static int handle_the_special_data(char *str,dataptr dz);
  55. static int get_levels(int *wset_store,int wcnt,double *level,dataptr dz);
  56. /**************************************** MAIN *********************************************/
  57. int main(int argc,char *argv[])
  58. {
  59. int exit_status;
  60. dataptr dz = NULL;
  61. char **cmdline;
  62. int cmdlinecnt;
  63. int n;
  64. aplptr ap;
  65. int is_launched = FALSE;
  66. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  67. fprintf(stdout,"%s\n",cdp_version);
  68. fflush(stdout);
  69. return 0;
  70. }
  71. /* CHECK FOR SOUNDLOOM */
  72. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  73. sloom = 0;
  74. sloombatch = 1;
  75. }
  76. if(sflinit("cdp")){
  77. sfperror("cdp: initialisation\n");
  78. return(FAILED);
  79. }
  80. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  81. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  82. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  83. return(FAILED);
  84. }
  85. if(!sloom) {
  86. if(argc == 1) {
  87. usage1();
  88. return(FAILED);
  89. } else if(argc == 2) {
  90. usage2(argv[1]);
  91. return(FAILED);
  92. }
  93. }
  94. if(!sloom) {
  95. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  96. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  97. return(FAILED);
  98. }
  99. cmdline = argv;
  100. cmdlinecnt = argc;
  101. if((get_the_process_no(argv[0],dz))<0)
  102. return(FAILED);
  103. cmdline++;
  104. cmdlinecnt--;
  105. dz->maxmode = 14;
  106. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  107. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  108. return(exit_status);
  109. }
  110. cmdline++;
  111. cmdlinecnt--;
  112. // setup_particular_application =
  113. if((exit_status = setup_scramble_application(dz))<0) {
  114. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  115. return(FAILED);
  116. }
  117. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  118. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  119. return(FAILED);
  120. }
  121. } else {
  122. //parse_TK_data() =
  123. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  124. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  125. return(exit_status);
  126. }
  127. }
  128. ap = dz->application;
  129. // parse_infile_and_hone_type() =
  130. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  131. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. // setup_param_ranges_and_defaults() =
  135. if((exit_status = setup_scramble_param_ranges_and_defaults(dz))<0) {
  136. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  137. return(FAILED);
  138. }
  139. // open_first_infile CDP LIB
  140. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  141. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  142. return(FAILED);
  143. }
  144. cmdlinecnt--;
  145. cmdline++;
  146. // handle_extra_infiles() : redundant
  147. // handle_outfile() =
  148. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. // handle_formants() redundant
  153. // handle_formant_quiksearch() redundant
  154. // handle_special_data ....
  155. switch(dz->mode) {
  156. case(4): case(5): case(6): case(7):
  157. case(10): case(11): case(12): case(13):
  158. if((exit_status = handle_the_special_data(cmdline[0],dz))<0) {
  159. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  160. return(FAILED);
  161. }
  162. cmdlinecnt--;
  163. cmdline++;
  164. break;
  165. }
  166. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  167. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  168. return(FAILED);
  169. }
  170. // check_param_validity_and_consistency() redundant
  171. is_launched = TRUE;
  172. dz->bufcnt = 3;
  173. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  174. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  175. return(MEMORY_ERROR);
  176. }
  177. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  178. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  179. return(MEMORY_ERROR);
  180. }
  181. for(n = 0;n <dz->bufcnt; n++)
  182. dz->sampbuf[n] = dz->sbufptr[n] = (float *)0;
  183. dz->sampbuf[n] = (float *)0;
  184. if((exit_status = create_sndbufs(dz))<0) { // CDP LIB
  185. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  186. return(FAILED);
  187. }
  188. //param_preprocess() redundant
  189. //spec_process_file =
  190. if((exit_status = scramble(dz))<0) {
  191. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  192. return(FAILED);
  193. }
  194. if((exit_status = complete_output(dz))<0) { // CDP LIB
  195. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  196. return(FAILED);
  197. }
  198. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  199. free(dz);
  200. return(SUCCEEDED);
  201. }
  202. /**********************************************
  203. REPLACED CDP LIB FUNCTIONS
  204. **********************************************/
  205. /****************************** SET_PARAM_DATA *********************************/
  206. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  207. {
  208. ap->special_data = (char)special_data;
  209. ap->param_cnt = (char)paramcnt;
  210. ap->max_param_cnt = (char)maxparamcnt;
  211. if(ap->max_param_cnt>0) {
  212. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  213. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  214. return(MEMORY_ERROR);
  215. }
  216. strcpy(ap->param_list,paramlist);
  217. }
  218. return(FINISHED);
  219. }
  220. /****************************** SET_VFLGS *********************************/
  221. int set_vflgs
  222. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  223. {
  224. ap->option_cnt = (char) optcnt; /*RWD added cast */
  225. if(optcnt) {
  226. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  227. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  228. return(MEMORY_ERROR);
  229. }
  230. strcpy(ap->option_list,optlist);
  231. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  232. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  233. return(MEMORY_ERROR);
  234. }
  235. strcpy(ap->option_flags,optflags);
  236. }
  237. ap->vflag_cnt = (char) vflagcnt;
  238. ap->variant_param_cnt = (char) vparamcnt;
  239. if(vflagcnt) {
  240. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  241. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  242. return(MEMORY_ERROR);
  243. }
  244. strcpy(ap->variant_list,varlist);
  245. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  246. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  247. return(MEMORY_ERROR);
  248. }
  249. strcpy(ap->variant_flags,varflags);
  250. }
  251. return(FINISHED);
  252. }
  253. /***************************** APPLICATION_INIT **************************/
  254. int application_init(dataptr dz)
  255. {
  256. int exit_status;
  257. int storage_cnt;
  258. int tipc, brkcnt;
  259. aplptr ap = dz->application;
  260. if(ap->vflag_cnt>0)
  261. initialise_vflags(dz);
  262. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  263. ap->total_input_param_cnt = (char)tipc;
  264. if(tipc>0) {
  265. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  266. return(exit_status);
  267. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  268. return(exit_status);
  269. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  270. return(exit_status);
  271. }
  272. brkcnt = tipc;
  273. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  274. if(brkcnt>0) {
  275. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  276. return(exit_status);
  277. }
  278. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  279. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  280. return(exit_status);
  281. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  282. return(exit_status);
  283. }
  284. if((exit_status = mark_parameter_types(dz,ap))<0)
  285. return(exit_status);
  286. // establish_infile_constants() replaced by
  287. dz->infilecnt = 1;
  288. //establish_bufptrs_and_extra_buffers():
  289. return(FINISHED);
  290. }
  291. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  292. /* RWD mallo changed to calloc; helps debug verison run as release! */
  293. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  294. {
  295. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  296. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  297. return(MEMORY_ERROR);
  298. }
  299. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  300. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  301. return(MEMORY_ERROR);
  302. }
  303. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  304. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  305. return(MEMORY_ERROR);
  306. }
  307. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  308. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  309. return(MEMORY_ERROR);
  310. }
  311. return(FINISHED);
  312. }
  313. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  314. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  315. {
  316. int n;
  317. for(n=0;n<storage_cnt;n++) {
  318. dz->is_int[n] = (char)0;
  319. dz->no_brk[n] = (char)0;
  320. }
  321. return(FINISHED);
  322. }
  323. /***************************** MARK_PARAMETER_TYPES **************************/
  324. int mark_parameter_types(dataptr dz,aplptr ap)
  325. {
  326. int n, m; /* PARAMS */
  327. for(n=0;n<ap->max_param_cnt;n++) {
  328. switch(ap->param_list[n]) {
  329. case('0'): break; /* dz->is_active[n] = 0 is default */
  330. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  331. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  332. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  333. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  334. default:
  335. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  336. return(PROGRAM_ERROR);
  337. }
  338. } /* OPTIONS */
  339. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  340. switch(ap->option_list[n]) {
  341. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  342. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  343. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  344. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  345. default:
  346. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  347. return(PROGRAM_ERROR);
  348. }
  349. } /* VARIANTS */
  350. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  351. switch(ap->variant_list[n]) {
  352. case('0'): break;
  353. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  354. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  355. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  356. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  357. default:
  358. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  359. return(PROGRAM_ERROR);
  360. }
  361. } /* INTERNAL */
  362. for(n=0,
  363. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  364. switch(ap->internal_param_list[n]) {
  365. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  366. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  367. case('d'): dz->no_brk[m] = (char)1; break;
  368. default:
  369. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  370. return(PROGRAM_ERROR);
  371. }
  372. }
  373. return(FINISHED);
  374. }
  375. /************************ HANDLE_THE_OUTFILE *********************/
  376. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  377. {
  378. int exit_status;
  379. char *filename = (*cmdline)[0];
  380. if(filename[0]=='-' && filename[1]=='f') {
  381. dz->floatsam_output = 1;
  382. dz->true_outfile_stype = SAMP_FLOAT;
  383. filename+= 2;
  384. }
  385. if(!sloom) {
  386. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  387. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  388. return(DATA_ERROR);
  389. }
  390. }
  391. strcpy(dz->outfilename,filename);
  392. if((exit_status = create_sized_outfile(filename,dz))<0)
  393. return(exit_status);
  394. (*cmdline)++;
  395. (*cmdlinecnt)--;
  396. return(FINISHED);
  397. }
  398. /***************************** ESTABLISH_APPLICATION **************************/
  399. int establish_application(dataptr dz)
  400. {
  401. aplptr ap;
  402. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  403. sprintf(errstr,"establish_application()\n");
  404. return(MEMORY_ERROR);
  405. }
  406. ap = dz->application;
  407. memset((char *)ap,0,sizeof(struct applic));
  408. return(FINISHED);
  409. }
  410. /************************* INITIALISE_VFLAGS *************************/
  411. int initialise_vflags(dataptr dz)
  412. {
  413. int n;
  414. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  415. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  416. return(MEMORY_ERROR);
  417. }
  418. for(n=0;n<dz->application->vflag_cnt;n++)
  419. dz->vflag[n] = FALSE;
  420. return FINISHED;
  421. }
  422. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  423. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  424. {
  425. int n;
  426. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  427. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  428. return(MEMORY_ERROR);
  429. }
  430. for(n=0;n<tipc;n++)
  431. ap->default_val[n] = 0.0;
  432. return(FINISHED);
  433. }
  434. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  435. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  436. {
  437. int n;
  438. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  439. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  440. return(MEMORY_ERROR);
  441. }
  442. for(n=0;n<tipc;n++)
  443. dz->is_active[n] = (char)0;
  444. return(FINISHED);
  445. }
  446. /************************* SETUP_SCRAMBLE_APPLICATION *******************/
  447. int setup_scramble_application(dataptr dz)
  448. {
  449. int exit_status;
  450. aplptr ap;
  451. if((exit_status = establish_application(dz))<0) // GLOBAL
  452. return(FAILED);
  453. ap = dz->application;
  454. // SEE parstruct FOR EXPLANATION of next 2 functions
  455. switch(dz->mode) {
  456. case(0): // fall thro
  457. case(1): exit_status = set_param_data(ap,0 ,2,2,"di"); break;
  458. case(2): // fall thro
  459. case(3): // fall thro
  460. case(8): // fall thro
  461. case(9): exit_status = set_param_data(ap,0 ,2,1,"0i"); break;
  462. default: exit_status = set_param_data(ap,VERGEDATA,2,1,"0i"); break;
  463. }
  464. if((exit_status)<0)
  465. return(FAILED);
  466. if((exit_status = set_vflgs(ap,"cta",3,"iDD","",0,0,""))<0)
  467. return(FAILED);
  468. // set_legal_infile_structure -->
  469. dz->has_otherfile = FALSE;
  470. // assign_process_logic -->
  471. dz->input_data_type = SNDFILES_ONLY;
  472. dz->process_type = UNEQUAL_SNDFILE;
  473. dz->outfiletype = SNDFILE_OUT;
  474. return application_init(dz); //GLOBAL
  475. }
  476. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  477. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  478. {
  479. int exit_status;
  480. infileptr infile_info;
  481. if(!sloom) {
  482. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  483. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  484. return(MEMORY_ERROR);
  485. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  486. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  487. return(PROGRAM_ERROR);
  488. } else if(infile_info->filetype != SNDFILE) {
  489. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  490. return(DATA_ERROR);
  491. } else if(infile_info->channels != 1) {
  492. sprintf(errstr,"File %s is not of correct type (must be mono)\n",cmdline[0]);
  493. return(DATA_ERROR);
  494. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  495. sprintf(errstr,"Failed to copy file parsing information\n");
  496. return(PROGRAM_ERROR);
  497. }
  498. free(infile_info);
  499. }
  500. return(FINISHED);
  501. }
  502. /************************* SETUP_SCRAMBLE_PARAM_RANGES_AND_DEFAULTS *******************/
  503. int setup_scramble_param_ranges_and_defaults(dataptr dz)
  504. {
  505. int exit_status;
  506. aplptr ap = dz->application;
  507. // set_param_ranges()
  508. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  509. // NB total_input_param_cnt is > 0 !!!
  510. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  511. return(FAILED);
  512. // get_param_ranges()
  513. if(dz->mode <= 1) {
  514. ap->lo[SCR_DUR] = 1.0;
  515. ap->hi[SCR_DUR] = 7200.0;
  516. ap->default_val[SCR_DUR] = 20.0;
  517. }
  518. ap->lo[SCR_SEED] = 0;
  519. ap->hi[SCR_SEED] = 256;
  520. ap->default_val[SCR_SEED] = 1;
  521. ap->lo[SCR_CNT] = 1.0;
  522. ap->hi[SCR_CNT] = 256.0;
  523. ap->default_val[SCR_CNT] = 1.0;
  524. ap->lo[SCR_TRNS] = 0.0;
  525. ap->hi[SCR_TRNS] = 12.0;
  526. ap->default_val[SCR_TRNS] = 0.0;
  527. ap->lo[SCR_ATTEN] = .0;
  528. ap->hi[SCR_ATTEN] = 1.0;
  529. ap->default_val[SCR_ATTEN] = 0.0;
  530. dz->maxmode = 14;
  531. if(!sloom)
  532. put_default_vals_in_all_params(dz);
  533. return(FINISHED);
  534. }
  535. /********************************* PARSE_SLOOM_DATA *********************************/
  536. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  537. {
  538. int exit_status;
  539. int cnt = 1, infilecnt;
  540. int filesize, insams, inbrksize;
  541. double dummy;
  542. int true_cnt = 0;
  543. aplptr ap;
  544. while(cnt<=PRE_CMDLINE_DATACNT) {
  545. if(cnt > argc) {
  546. sprintf(errstr,"Insufficient data sent from TK\n");
  547. return(DATA_ERROR);
  548. }
  549. switch(cnt) {
  550. case(1):
  551. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  552. sprintf(errstr,"Cannot read process no. sent from TK\n");
  553. return(DATA_ERROR);
  554. }
  555. break;
  556. case(2):
  557. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  558. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  559. return(DATA_ERROR);
  560. }
  561. if(dz->mode > 0)
  562. dz->mode--;
  563. //setup_particular_application() =
  564. if((exit_status = setup_scramble_application(dz))<0)
  565. return(exit_status);
  566. ap = dz->application;
  567. break;
  568. case(3):
  569. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  570. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  571. return(DATA_ERROR);
  572. }
  573. if(infilecnt < 1) {
  574. true_cnt = cnt + 1;
  575. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  576. }
  577. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  578. return(exit_status);
  579. break;
  580. case(INPUT_FILETYPE+4):
  581. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  582. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  583. return(DATA_ERROR);
  584. }
  585. break;
  586. case(INPUT_FILESIZE+4):
  587. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  588. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  589. return(DATA_ERROR);
  590. }
  591. dz->insams[0] = filesize;
  592. break;
  593. case(INPUT_INSAMS+4):
  594. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  595. sprintf(errstr,"Cannot read insams sent from TK\n");
  596. return(DATA_ERROR);
  597. }
  598. dz->insams[0] = insams;
  599. break;
  600. case(INPUT_SRATE+4):
  601. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  602. sprintf(errstr,"Cannot read srate sent from TK\n");
  603. return(DATA_ERROR);
  604. }
  605. break;
  606. case(INPUT_CHANNELS+4):
  607. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  608. sprintf(errstr,"Cannot read channels sent from TK\n");
  609. return(DATA_ERROR);
  610. }
  611. break;
  612. case(INPUT_STYPE+4):
  613. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  614. sprintf(errstr,"Cannot read stype sent from TK\n");
  615. return(DATA_ERROR);
  616. }
  617. break;
  618. case(INPUT_ORIGSTYPE+4):
  619. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  620. sprintf(errstr,"Cannot read origstype sent from TK\n");
  621. return(DATA_ERROR);
  622. }
  623. break;
  624. case(INPUT_ORIGRATE+4):
  625. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  626. sprintf(errstr,"Cannot read origrate sent from TK\n");
  627. return(DATA_ERROR);
  628. }
  629. break;
  630. case(INPUT_MLEN+4):
  631. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  632. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  633. return(DATA_ERROR);
  634. }
  635. break;
  636. case(INPUT_DFAC+4):
  637. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  638. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  639. return(DATA_ERROR);
  640. }
  641. break;
  642. case(INPUT_ORIGCHANS+4):
  643. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  644. sprintf(errstr,"Cannot read origchans sent from TK\n");
  645. return(DATA_ERROR);
  646. }
  647. break;
  648. case(INPUT_SPECENVCNT+4):
  649. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  650. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  651. return(DATA_ERROR);
  652. }
  653. dz->specenvcnt = dz->infile->specenvcnt;
  654. break;
  655. case(INPUT_WANTED+4):
  656. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  657. sprintf(errstr,"Cannot read wanted sent from TK\n");
  658. return(DATA_ERROR);
  659. }
  660. break;
  661. case(INPUT_WLENGTH+4):
  662. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  663. sprintf(errstr,"Cannot read wlength sent from TK\n");
  664. return(DATA_ERROR);
  665. }
  666. break;
  667. case(INPUT_OUT_CHANS+4):
  668. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  669. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  670. return(DATA_ERROR);
  671. }
  672. break;
  673. /* RWD these chanegs to samps - tk will have to deal with that! */
  674. case(INPUT_DESCRIPTOR_BYTES+4):
  675. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  676. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  677. return(DATA_ERROR);
  678. }
  679. break;
  680. case(INPUT_IS_TRANSPOS+4):
  681. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  682. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  683. return(DATA_ERROR);
  684. }
  685. break;
  686. case(INPUT_COULD_BE_TRANSPOS+4):
  687. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  688. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  689. return(DATA_ERROR);
  690. }
  691. break;
  692. case(INPUT_COULD_BE_PITCH+4):
  693. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  694. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  695. return(DATA_ERROR);
  696. }
  697. break;
  698. case(INPUT_DIFFERENT_SRATES+4):
  699. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  700. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  701. return(DATA_ERROR);
  702. }
  703. break;
  704. case(INPUT_DUPLICATE_SNDS+4):
  705. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  706. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  707. return(DATA_ERROR);
  708. }
  709. break;
  710. case(INPUT_BRKSIZE+4):
  711. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  712. sprintf(errstr,"Cannot read brksize sent from TK\n");
  713. return(DATA_ERROR);
  714. }
  715. if(inbrksize > 0) {
  716. switch(dz->input_data_type) {
  717. case(WORDLIST_ONLY):
  718. break;
  719. case(PITCH_AND_PITCH):
  720. case(PITCH_AND_TRANSPOS):
  721. case(TRANSPOS_AND_TRANSPOS):
  722. dz->tempsize = inbrksize;
  723. break;
  724. case(BRKFILES_ONLY):
  725. case(UNRANGED_BRKFILE_ONLY):
  726. case(DB_BRKFILES_ONLY):
  727. case(ALL_FILES):
  728. case(ANY_NUMBER_OF_ANY_FILES):
  729. if(dz->extrabrkno < 0) {
  730. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  731. return(DATA_ERROR);
  732. }
  733. if(dz->brksize == NULL) {
  734. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  735. return(PROGRAM_ERROR);
  736. }
  737. dz->brksize[dz->extrabrkno] = inbrksize;
  738. break;
  739. default:
  740. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  741. dz->input_data_type);
  742. return(PROGRAM_ERROR);
  743. }
  744. break;
  745. }
  746. break;
  747. case(INPUT_NUMSIZE+4):
  748. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  749. sprintf(errstr,"Cannot read numsize sent from TK\n");
  750. return(DATA_ERROR);
  751. }
  752. break;
  753. case(INPUT_LINECNT+4):
  754. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  755. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  756. return(DATA_ERROR);
  757. }
  758. break;
  759. case(INPUT_ALL_WORDS+4):
  760. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  761. sprintf(errstr,"Cannot read all_words sent from TK\n");
  762. return(DATA_ERROR);
  763. }
  764. break;
  765. case(INPUT_ARATE+4):
  766. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  767. sprintf(errstr,"Cannot read arate sent from TK\n");
  768. return(DATA_ERROR);
  769. }
  770. break;
  771. case(INPUT_FRAMETIME+4):
  772. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  773. sprintf(errstr,"Cannot read frametime sent from TK\n");
  774. return(DATA_ERROR);
  775. }
  776. dz->frametime = (float)dummy;
  777. break;
  778. case(INPUT_WINDOW_SIZE+4):
  779. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  780. sprintf(errstr,"Cannot read window_size sent from TK\n");
  781. return(DATA_ERROR);
  782. }
  783. break;
  784. case(INPUT_NYQUIST+4):
  785. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  786. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  787. return(DATA_ERROR);
  788. }
  789. break;
  790. case(INPUT_DURATION+4):
  791. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  792. sprintf(errstr,"Cannot read duration sent from TK\n");
  793. return(DATA_ERROR);
  794. }
  795. break;
  796. case(INPUT_MINBRK+4):
  797. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  798. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  799. return(DATA_ERROR);
  800. }
  801. break;
  802. case(INPUT_MAXBRK+4):
  803. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  804. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  805. return(DATA_ERROR);
  806. }
  807. break;
  808. case(INPUT_MINNUM+4):
  809. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  810. sprintf(errstr,"Cannot read minnum sent from TK\n");
  811. return(DATA_ERROR);
  812. }
  813. break;
  814. case(INPUT_MAXNUM+4):
  815. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  816. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  817. return(DATA_ERROR);
  818. }
  819. break;
  820. default:
  821. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  822. return(PROGRAM_ERROR);
  823. }
  824. cnt++;
  825. }
  826. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  827. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  828. return(DATA_ERROR);
  829. }
  830. if(true_cnt)
  831. cnt = true_cnt;
  832. *cmdlinecnt = 0;
  833. while(cnt < argc) {
  834. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  835. return(exit_status);
  836. cnt++;
  837. }
  838. return(FINISHED);
  839. }
  840. /********************************* GET_TK_CMDLINE_WORD *********************************/
  841. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  842. {
  843. if(*cmdlinecnt==0) {
  844. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  845. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  846. return(MEMORY_ERROR);
  847. }
  848. } else {
  849. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  850. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  851. return(MEMORY_ERROR);
  852. }
  853. }
  854. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  855. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  856. return(MEMORY_ERROR);
  857. }
  858. strcpy((*cmdline)[*cmdlinecnt],q);
  859. (*cmdlinecnt)++;
  860. return(FINISHED);
  861. }
  862. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  863. int assign_file_data_storage(int infilecnt,dataptr dz)
  864. {
  865. int exit_status;
  866. int no_sndfile_system_files = FALSE;
  867. dz->infilecnt = infilecnt;
  868. if((exit_status = allocate_filespace(dz))<0)
  869. return(exit_status);
  870. if(no_sndfile_system_files)
  871. dz->infilecnt = 0;
  872. return(FINISHED);
  873. }
  874. /************************* redundant functions: to ensure libs compile OK *******************/
  875. int assign_process_logic(dataptr dz)
  876. {
  877. return(FINISHED);
  878. }
  879. void set_legal_infile_structure(dataptr dz)
  880. {}
  881. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  882. {
  883. return(FINISHED);
  884. }
  885. int setup_internal_arrays_and_array_pointers(dataptr dz)
  886. {
  887. return(FINISHED);
  888. }
  889. int establish_bufptrs_and_extra_buffers(dataptr dz)
  890. {
  891. return(FINISHED);
  892. }
  893. int read_special_data(char *str,dataptr dz)
  894. {
  895. return(FINISHED);
  896. }
  897. int inner_loop
  898. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  899. {
  900. return(FINISHED);
  901. }
  902. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  903. {
  904. return(FINISHED);
  905. }
  906. /******************************** USAGE1 ********************************/
  907. int usage1(void)
  908. {
  909. usage2("scramble");
  910. return(USAGE_ONLY);
  911. }
  912. /********************************************************************************************/
  913. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  914. {
  915. if(!strcmp(prog_identifier_from_cmdline,"scramble")) dz->process = SCRUNCH;
  916. else {
  917. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  918. return(USAGE_ONLY);
  919. }
  920. return(FINISHED);
  921. }
  922. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  923. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  924. {
  925. int n;
  926. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  927. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  928. return(MEMORY_ERROR);
  929. }
  930. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  931. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  932. return(MEMORY_ERROR);
  933. }
  934. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  935. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  936. return(MEMORY_ERROR);
  937. }
  938. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  939. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  940. return(MEMORY_ERROR);
  941. }
  942. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  943. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  944. return(MEMORY_ERROR);
  945. }
  946. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  947. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  948. return(MEMORY_ERROR);
  949. }
  950. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  951. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  952. return(MEMORY_ERROR);
  953. }
  954. for(n=0;n<brkcnt;n++) {
  955. dz->brk[n] = NULL;
  956. dz->brkptr[n] = NULL;
  957. dz->brkinit[n] = 0;
  958. dz->brksize[n] = 0;
  959. }
  960. return(FINISHED);
  961. }
  962. /******************************** USAGE2 ********************************/
  963. int usage2(char *str)
  964. {
  965. if(!strcmp(str,"scramble")) {
  966. fprintf(stderr,
  967. "USAGE:\n"
  968. "scramble scramble 1-2 infile outfile dur seed [-ccnt] [-ttrns] [-aatten]\n"
  969. "scramble scramble 3-4 infile outfile seed [-ccnt] [-ttrns] [-aatten]\n"
  970. "scramble scramble 5-8 infile outfile cuts seed [-ccnt] [-ttrns] [-aatten]\n"
  971. "scramble scramble 9-10 infile outfile seed [-ccnt] [-ttrns] [-aatten]\n"
  972. "scramble scramble 11-14 infile outfile cuts seed [-ccnt] [-ttrns] [-aatten]\n"
  973. "\n"
  974. "Scramble order of waveset in src.\n"
  975. "\n"
  976. "DUR Duration of output file.\n"
  977. "SEED Random seed (0-256). Same seed with same rand-params gives same output.\n"
  978. "CNT Number of wavesets in waveset-groups to be scrambled. (Range 1 to 256)\n"
  979. "TRNS Range of any random transposition of wavesets (semitones) (Range 0 to 12).\n"
  980. "ATTEN Range of any random attenuation of wavesets (Range 0 to 1).\n"
  981. "CUTS Textfile of (increasing) times in src: process in each separate segment.\n"
  982. "\n"
  983. "\"TRNS\" and \"ATTEN\" can vary through (output) time.\n"
  984. "\n"
  985. "Reassembly is ....\n"
  986. "Mode 1: in random order.\n"
  987. "Mode 2: in permuted random order (all wavesets used before any reused).\n"
  988. "Mode 3: in order of increasing size (falling pitch).\n"
  989. "Mode 4: in order of decreasing size (rising pitch).\n"
  990. "Mode 5: in order of increasing size, in each segment.\n"
  991. "Mode 6: in order of decreasing size, in each segment.\n"
  992. "Mode 7: in order of increasing then decreasing size.\n"
  993. "Mode 8: in order of decreasing then increasing size.\n"
  994. "Mode 9: in order of increasing level.\n"
  995. "Mode 10: in order of decreasing level.\n"
  996. "Mode 11: in order of increasing level, in each segment.\n"
  997. "Mode 12: in order of decreasing level, in each segment.\n"
  998. "Mode 13: in order of increasing then decreasing level.\n"
  999. "Mode 14: in order of decreasing then increasing level.\n"
  1000. "\n");
  1001. } else
  1002. fprintf(stdout,"Unknown option '%s'\n",str);
  1003. return(USAGE_ONLY);
  1004. }
  1005. int usage3(char *str1,char *str2)
  1006. {
  1007. fprintf(stderr,"Insufficient parameters on command line.\n");
  1008. return(USAGE_ONLY);
  1009. }
  1010. /******************************** SCRAMBLE ********************************/
  1011. int scramble(dataptr dz)
  1012. {
  1013. int exit_status, phase, phasecnt, do_swap, gpcnt, increase = 0, *permm;
  1014. int n, segcnt, k, kend = 0, kstart = 0, beyond, j, outsamps, wcnt, s, e, ss, ee, lastbuf_start, coasting, coasting_start = 0, coasting_end;
  1015. int len, lena, lenb, cnt, ibufstart, obufpos, thisbuf, lastbuf, smpsout, temps, tempe, smp_segend, *wset_store;
  1016. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[2];
  1017. double amp, incr, time, leva, levb, srate = (double)dz->infile->srate;
  1018. double *segtime = NULL, *level = NULL;
  1019. srand(dz->iparam[SCR_SEED]);
  1020. switch(dz->mode) {
  1021. case(4): case(5): case(6): case(7):
  1022. case(10): case(11): case(12): case(13):
  1023. segtime = dz->parray[0];
  1024. break;
  1025. }
  1026. outsamps = (int)round(dz->param[0] * srate);
  1027. fprintf(stdout,"INFO: Counting wavesets.\n");
  1028. fflush(stdout);
  1029. dz->total_samps_read = 0;
  1030. n = 0;
  1031. wcnt = 0;
  1032. phase = 0;
  1033. phasecnt = 0;
  1034. gpcnt = dz->iparam[SCR_CNT] * 2;
  1035. dz->total_samps_read = 0;
  1036. do {
  1037. lastbuf_start = dz->total_samps_read;
  1038. if((exit_status = read_samps(ibuf,dz))<0)
  1039. return exit_status;
  1040. n = 0;
  1041. while(n < dz->ssampsread) {
  1042. if(ibuf[n] == 0.0)
  1043. ;
  1044. else {
  1045. switch(phase) {
  1046. case(0):
  1047. if(ibuf[n] > 0.0)
  1048. phase = 1;
  1049. else
  1050. phase = -1;
  1051. wcnt++;
  1052. break;
  1053. case(1):
  1054. if(ibuf[n] < 0.0) {
  1055. if(++phasecnt >= gpcnt) {
  1056. wcnt++;
  1057. phasecnt = 0;
  1058. }
  1059. phase = -1;
  1060. }
  1061. break;
  1062. case(-1):
  1063. if(ibuf[n] > 0.0) {
  1064. if(++phasecnt >= gpcnt) {
  1065. wcnt++;
  1066. phasecnt = 0;
  1067. }
  1068. phase = 1;
  1069. }
  1070. break;
  1071. }
  1072. }
  1073. n++;
  1074. }
  1075. } while(dz->ssampsread > 0);
  1076. if((dz->lparray = (int **)malloc(sizeof(int *)))==NULL) {
  1077. sprintf(errstr,"INSUFFICIENT MEMORY to create data storage.\n");
  1078. return(MEMORY_ERROR);
  1079. }
  1080. if((dz->lparray[0] = (int *)malloc((wcnt * 2) * sizeof(int)))==NULL) {
  1081. sprintf(errstr,"INSUFFICIENT MEMORY to store waveset coordinates.\n");
  1082. return(MEMORY_ERROR);
  1083. }
  1084. wset_store = dz->lparray[0];
  1085. if((permm = (int *)malloc(wcnt * sizeof(int)))==NULL) {
  1086. sprintf(errstr,"Insufficient memory to create segment-order permutation store.\n");
  1087. return(MEMORY_ERROR);
  1088. }
  1089. if(dz->mode >= 8) {
  1090. if((level = (double *)malloc(wcnt * sizeof(double)))==NULL) {
  1091. sprintf(errstr,"Insufficient memory to create segment-levels store.\n");
  1092. return(MEMORY_ERROR);
  1093. }
  1094. }
  1095. fprintf(stdout,"INFO: Storing waveset coordinates.\n");
  1096. fflush(stdout);
  1097. dz->total_samps_read = 0;
  1098. n = 0;
  1099. phase = 0;
  1100. phasecnt = 0;
  1101. k = 0;
  1102. sndseekEx(dz->ifd[0],0,0);
  1103. dz->total_samps_read = 0;
  1104. do {
  1105. lastbuf_start = dz->total_samps_read;
  1106. if((exit_status = read_samps(ibuf,dz))<0)
  1107. return exit_status;
  1108. n = 0;
  1109. while(n < dz->ssampsread) {
  1110. if(ibuf[n] == 0.0)
  1111. ;
  1112. else {
  1113. switch(phase) {
  1114. case(0):
  1115. if(ibuf[n] > 0.0)
  1116. phase = 1;
  1117. else
  1118. phase = -1;
  1119. wset_store[k++] = n + lastbuf_start;
  1120. wset_store[k++] = n + lastbuf_start;
  1121. break;
  1122. case(1):
  1123. if(ibuf[n] < 0.0) {
  1124. if(++phasecnt >= gpcnt) {
  1125. wset_store[k++] = n + lastbuf_start;
  1126. wset_store[k++] = n + lastbuf_start;
  1127. phasecnt = 0;
  1128. }
  1129. phase = -1;
  1130. }
  1131. break;
  1132. case(-1):
  1133. if(ibuf[n] > 0.0) {
  1134. if(++phasecnt >= gpcnt) {
  1135. wset_store[k++] = n + lastbuf_start;
  1136. wset_store[k++] = n + lastbuf_start;
  1137. phasecnt = 0;
  1138. }
  1139. phase = 1;
  1140. }
  1141. break;
  1142. }
  1143. }
  1144. n++;
  1145. }
  1146. } while(dz->ssampsread > 0);
  1147. for(k = 1; k < wcnt * 2; k++) // Lose duplication of first waveset start
  1148. wset_store[k-1] = wset_store[k]; // Duplication of end wavset end will be ignored
  1149. wcnt--;
  1150. fprintf(stdout,"INFO: Trimming waveset coordinates.\n");
  1151. fflush(stdout);
  1152. dz->total_samps_read = 0;
  1153. n = 0;
  1154. coasting = 0;
  1155. k = 0;
  1156. sndseekEx(dz->ifd[0],0,0);
  1157. dz->total_samps_read = 0;
  1158. do {
  1159. lastbuf_start = dz->total_samps_read;
  1160. if((exit_status = read_samps(ibuf,dz))<0)
  1161. return exit_status;
  1162. n = 0;
  1163. while(n < dz->ssampsread) {
  1164. if(ibuf[n] == 0.0) {
  1165. if(!coasting) // Count any blocks of zero-signal
  1166. coasting_start = n + lastbuf_start;
  1167. coasting++;
  1168. n++;
  1169. } else if(coasting) { // If there is zero signal at end of waveset
  1170. coasting_end = n + lastbuf_start; // Snip it off the waveset
  1171. for(k=2;k<wcnt;k+=2) {
  1172. if(wset_store[k] == coasting_end)
  1173. wset_store[k-1] = coasting_start;
  1174. else if(wset_store[k] > coasting_end)
  1175. break;
  1176. }
  1177. coasting = 0;
  1178. }
  1179. n++;
  1180. }
  1181. } while(dz->ssampsread > 0);
  1182. if(dz->mode >= 8) {
  1183. if((exit_status = get_levels(wset_store,wcnt,level,dz))<0)
  1184. return exit_status;
  1185. }
  1186. dz->total_samps_read = 0;
  1187. cnt = 0;
  1188. obufpos = 0;
  1189. lastbuf = -1;
  1190. sndseekEx(dz->ifd[0],0,0);
  1191. switch(dz->mode) {
  1192. case(1):
  1193. rndpermm(wcnt,permm);
  1194. // fall thro
  1195. case(0):
  1196. fprintf(stdout,"INFO: Generating output sound.\n");
  1197. fflush(stdout);
  1198. while((smpsout = dz->total_samps_written + obufpos) < outsamps) {
  1199. time = (int)round(smpsout * srate);
  1200. if(dz->mode == 1) {
  1201. k = permm[cnt];
  1202. if(++cnt >= wcnt) {
  1203. rndpermm(wcnt,permm);
  1204. cnt = 0;
  1205. }
  1206. } else
  1207. k = (int)floor(drand48() * wcnt);
  1208. s = k*2;
  1209. e = s+1;
  1210. len = wset_store[e] - wset_store[s];
  1211. thisbuf = wset_store[s]/dz->buflen;
  1212. if(thisbuf != lastbuf) {
  1213. sndseekEx(dz->ifd[0],thisbuf * dz->buflen,0);
  1214. n = 0;
  1215. dz->buflen *= 2;
  1216. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  1217. if((exit_status = read_samps(ibuf,dz))<0) // Read a double buff
  1218. return exit_status;
  1219. dz->buflen /= 2;
  1220. lastbuf = thisbuf;
  1221. }
  1222. ibufstart = wset_store[s] - (thisbuf * dz->buflen);
  1223. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1224. return exit_status;
  1225. if(dz->param[SCR_ATTEN] > 0.0)
  1226. amp = 1.0 - (drand48() * dz->param[SCR_ATTEN]);
  1227. else
  1228. amp = 1.0;
  1229. if(dz->param[SCR_TRNS] > 0.0) {
  1230. incr = (drand48() * 2.0) - 1.0;
  1231. incr *= dz->param[SCR_TRNS];
  1232. incr = pow(2.0,incr/SEMITONES_PER_OCTAVE);
  1233. } else
  1234. incr = 1.0;
  1235. if((exit_status = write_waveset(&obufpos,&thisbuf,ibufstart,len,amp,incr,dz))<0)
  1236. return exit_status;
  1237. }
  1238. break;
  1239. case(2):
  1240. case(3):
  1241. case(8):
  1242. case(9):
  1243. fprintf(stdout,"INFO: Sorting wavesets.\n");
  1244. fflush(stdout);
  1245. switch(dz->mode) {
  1246. case(2):
  1247. case(3):
  1248. for(k=0,s=0,e=1; k < wcnt-1; k++,s+=2,e+=2) { // Sort wavesets for size
  1249. lena = wset_store[e] - wset_store[s];
  1250. for(j=k+1,ss = s+2,ee=e+2; j < wcnt; j++,ss+=2,ee+=2) {
  1251. lenb = wset_store[ee] - wset_store[ss];
  1252. do_swap = 0;
  1253. if(dz->mode == 2) {
  1254. if(lenb < lena)
  1255. do_swap = 1;
  1256. } else {
  1257. if(lenb > lena)
  1258. do_swap = 1;
  1259. }
  1260. if(do_swap) {
  1261. temps = wset_store[s];
  1262. tempe = wset_store[e];
  1263. wset_store[s] = wset_store[ss];
  1264. wset_store[e] = wset_store[ee];
  1265. wset_store[ss] = temps;
  1266. wset_store[ee] = tempe;
  1267. lena = lenb;
  1268. }
  1269. }
  1270. }
  1271. break;
  1272. default:
  1273. for(k=0,s=0,e=1; k < wcnt-1; k++,s+=2,e+=2) { // Sort wavesets for level
  1274. leva = level[k];
  1275. for(j=k+1,ss = s+2,ee=e+2; j < wcnt; j++,ss+=2,ee+=2) {
  1276. levb = level[j];
  1277. do_swap = 0;
  1278. if(dz->mode == 8) {
  1279. if(levb < leva)
  1280. do_swap = 1;
  1281. } else {
  1282. if(levb > leva)
  1283. do_swap = 1;
  1284. }
  1285. if(do_swap) {
  1286. temps = wset_store[s];
  1287. tempe = wset_store[e];
  1288. wset_store[s] = wset_store[ss];
  1289. wset_store[e] = wset_store[ee];
  1290. wset_store[ss] = temps;
  1291. wset_store[ee] = tempe;
  1292. level[k] = levb;
  1293. level[j] = leva;
  1294. leva = levb;
  1295. }
  1296. }
  1297. }
  1298. break;
  1299. }
  1300. fprintf(stdout,"INFO: Generating output sound.\n");
  1301. fflush(stdout);
  1302. obufpos = 0;
  1303. for(k=0,s=0,e=1;k < wcnt;k++,s+=2,e+=2) {
  1304. smpsout = dz->total_samps_written + obufpos;
  1305. time = (int)round(smpsout * srate);
  1306. len = wset_store[e] - wset_store[s];
  1307. thisbuf = wset_store[s]/dz->buflen;
  1308. if(thisbuf != lastbuf) {
  1309. sndseekEx(dz->ifd[0],thisbuf * dz->buflen,0);
  1310. dz->buflen *= 2;
  1311. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  1312. if((exit_status = read_samps(ibuf,dz))<0) // Read a double buff
  1313. return exit_status;
  1314. dz->buflen /= 2;
  1315. lastbuf = thisbuf;
  1316. }
  1317. ibufstart = wset_store[s] - (thisbuf * dz->buflen);
  1318. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1319. return exit_status;
  1320. if(dz->param[SCR_ATTEN] > 0.0)
  1321. amp = 1.0 - (drand48() * dz->param[SCR_ATTEN]);
  1322. else
  1323. amp = 1.0;
  1324. if(dz->param[SCR_TRNS] > 0.0) {
  1325. incr = (drand48() * 2.0) - 1.0;
  1326. incr *= dz->param[SCR_TRNS];
  1327. incr = pow(2.0,incr/SEMITONES_PER_OCTAVE);
  1328. } else
  1329. incr = 1.0;
  1330. if((exit_status = write_waveset(&obufpos,&lastbuf,ibufstart,len,amp,incr,dz))<0)
  1331. return exit_status;
  1332. }
  1333. break;
  1334. default:
  1335. switch(dz->mode) {
  1336. case(4): // fall thro // Sort for increase in waveset size
  1337. case(6): // fall thro // Initially sort for increase in waveset size
  1338. case(10): // fall thro // Sort for increase in waveset level
  1339. case(12): increase = 1; break; // Initially sort for increase in waveset level
  1340. case(5): // fall thro // Sort for decrease in waveset size
  1341. case(7): // fall thro // Initially sort for decrease in waveset size
  1342. case(11): // fall thro // Sort for decrease in waveset level
  1343. case(13): increase = -1; break; // Initially sort for decrease in waveset level
  1344. }
  1345. obufpos = 0;
  1346. kstart = 0;
  1347. for(segcnt = 0;segcnt < dz->itemcnt; segcnt++) { // For each specified segment
  1348. smp_segend = (int)round(segtime[segcnt] * srate);
  1349. fprintf(stdout,"INFO: Choosing wavesets for segment %d.\n",segcnt+1);
  1350. fflush(stdout); // Select wavesets to use
  1351. kend = -1;
  1352. for(k=kstart,s=kstart*2; k < wcnt; k++,s+=2) {
  1353. if((beyond = wset_store[s] - smp_segend) >= 0) { // Find waveset starting at or beyond segtime
  1354. kend = k;
  1355. if(k > 0 && (smp_segend - wset_store[s-2]) < beyond) {
  1356. if(kend-1 > kstart) // If previous seg-start is nearer to desired seg-cut time, use that
  1357. kend--;
  1358. }
  1359. break;
  1360. }
  1361. }
  1362. if(kend < 0)
  1363. kend = wcnt-1;
  1364. fprintf(stdout,"INFO: Sorting wavesets in segment %d.\n",segcnt+1);
  1365. fflush(stdout);
  1366. switch(dz->mode) {
  1367. case(4): case(5): case(6): case(7): // Sort wavesets for size
  1368. for(k=kstart,s=kstart*2,e=(kstart*2)+1; k < kend-1; k++,s+=2,e+=2) {
  1369. lena = wset_store[e] - wset_store[s];
  1370. for(j=k+1,ss = s+2,ee=e+2; j < kend; j++,ss+=2,ee+=2) {
  1371. lenb = wset_store[ee] - wset_store[ss];
  1372. do_swap = 0;
  1373. if(increase > 0) {
  1374. if(lenb < lena)
  1375. do_swap = 1;
  1376. } else {
  1377. if(lenb > lena)
  1378. do_swap = 1;
  1379. }
  1380. if(do_swap) {
  1381. temps = wset_store[s];
  1382. tempe = wset_store[e];
  1383. wset_store[s] = wset_store[ss];
  1384. wset_store[e] = wset_store[ee];
  1385. wset_store[ss] = temps;
  1386. wset_store[ee] = tempe;
  1387. lena = lenb;
  1388. }
  1389. }
  1390. }
  1391. break;
  1392. default: // Sort wavesets for level
  1393. for(k=kstart,s=kstart*2,e=(kstart*2)+1; k < kend-1; k++,s+=2,e+=2) {
  1394. leva = level[k];
  1395. for(j=k+1,ss = s+2,ee=e+2; j < kend; j++,ss+=2,ee+=2) {
  1396. levb = level[j];
  1397. do_swap = 0;
  1398. if(increase > 0) {
  1399. if(levb < leva)
  1400. do_swap = 1;
  1401. } else {
  1402. if(levb > leva)
  1403. do_swap = 1;
  1404. }
  1405. if(do_swap) {
  1406. temps = wset_store[s];
  1407. tempe = wset_store[e];
  1408. wset_store[s] = wset_store[ss];
  1409. wset_store[e] = wset_store[ee];
  1410. wset_store[ss] = temps;
  1411. wset_store[ee] = tempe;
  1412. level[k] = levb;
  1413. level[j] = leva;
  1414. leva = levb;
  1415. }
  1416. }
  1417. }
  1418. break;
  1419. }
  1420. fprintf(stdout,"INFO: Generating output sound for segment %d.\n",segcnt+1);
  1421. fflush(stdout);
  1422. for(k=kstart,s=kstart*2,e=(kstart*2)+1;k < kend;k++,s+=2,e+=2) {
  1423. smpsout = dz->total_samps_written + obufpos;
  1424. time = (int)round(smpsout * srate);
  1425. len = wset_store[e] - wset_store[s];
  1426. thisbuf = wset_store[s]/dz->buflen;
  1427. if(thisbuf != lastbuf) {
  1428. sndseekEx(dz->ifd[0],thisbuf * dz->buflen,0);
  1429. dz->buflen *= 2;
  1430. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  1431. if((exit_status = read_samps(ibuf,dz))<0) // Read a double buff
  1432. return exit_status;
  1433. dz->buflen /= 2;
  1434. lastbuf = thisbuf;
  1435. }
  1436. ibufstart = wset_store[s] - (thisbuf * dz->buflen);
  1437. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1438. return exit_status;
  1439. if(dz->param[SCR_ATTEN] > 0.0)
  1440. amp = 1.0 - (drand48() * dz->param[SCR_ATTEN]);
  1441. else
  1442. amp = 1.0;
  1443. if(dz->param[SCR_TRNS] > 0.0) {
  1444. incr = (drand48() * 2.0) - 1.0;
  1445. incr *= dz->param[SCR_TRNS];
  1446. incr = pow(2.0,incr/SEMITONES_PER_OCTAVE);
  1447. } else
  1448. incr = 1.0;
  1449. if((exit_status = write_waveset(&obufpos,&lastbuf,ibufstart,len,amp,incr,dz))<0)
  1450. return exit_status;
  1451. }
  1452. kstart = kend;
  1453. if(kstart == wcnt - 1) // No more segments
  1454. break;
  1455. switch(dz->mode) {
  1456. case(6): // fall thro
  1457. case(7): // fall thro
  1458. case(12): // fall thro
  1459. case(13): increase = -increase; break;
  1460. }
  1461. }
  1462. break;
  1463. }
  1464. if(obufpos > 0) {
  1465. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1466. return(exit_status);
  1467. }
  1468. return FINISHED;
  1469. }
  1470. /****************************** GET_MODE *********************************/
  1471. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1472. {
  1473. char temp[200], *p;
  1474. if(sscanf(str,"%s",temp)!=1) {
  1475. sprintf(errstr,"Cannot read mode of program.\n");
  1476. return(USAGE_ONLY);
  1477. }
  1478. p = temp + strlen(temp) - 1;
  1479. while(p >= temp) {
  1480. if(!isdigit(*p)) {
  1481. fprintf(stderr,"Invalid mode of program entered.\n");
  1482. return(USAGE_ONLY);
  1483. }
  1484. p--;
  1485. }
  1486. if(sscanf(str,"%d",&dz->mode)!=1) {
  1487. fprintf(stderr,"Cannot read mode of program.\n");
  1488. return(USAGE_ONLY);
  1489. }
  1490. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1491. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1492. return(USAGE_ONLY);
  1493. }
  1494. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1495. return(FINISHED);
  1496. }
  1497. /*************************** RNDPERMM ********************************/
  1498. void rndpermm(int permlen,int *permm)
  1499. {
  1500. int n, t;
  1501. for(n=0;n<permlen;n++) { /* 1 */
  1502. t = (int)(drand48() * (double)(n+1)); /* 2 */
  1503. if(t==n)
  1504. prefix(n,permlen,permm);
  1505. else
  1506. insert(n,t,permlen,permm);
  1507. }
  1508. }
  1509. /***************************** INSERT **********************************
  1510. *
  1511. * Insert the value m AFTER the T-th element in permm[pindex].
  1512. */
  1513. void insert(int m,int t,int permlen,int *permm)
  1514. {
  1515. shuflup(t+1,permlen,permm);
  1516. permm[t+1] = m;
  1517. }
  1518. /***************************** PREFIX ************************************
  1519. *
  1520. * Insert the value m at start of the permutation permm[pindex].
  1521. */
  1522. void prefix(int m,int permlen,int *permm)
  1523. {
  1524. shuflup(0,permlen,permm);
  1525. permm[0] = m;
  1526. }
  1527. /****************************** SHUFLUP ***********************************
  1528. *
  1529. * move set members in permm[pindex] upwards, starting from element k.
  1530. */
  1531. void shuflup(int k,int permlen, int *permm)
  1532. {
  1533. int n, *i;
  1534. int z = permlen - 1;
  1535. i = permm + z;
  1536. for(n = z;n > k;n--) {
  1537. *i = *(i-1);
  1538. i--;
  1539. }
  1540. }
  1541. /****************************** WRITE_WAVESET ***********************************/
  1542. int write_waveset(int *obufpos,int *lastbuf,int ibufstart,int len,double amp,double incr,dataptr dz)
  1543. {
  1544. int exit_status;
  1545. float *ibuf = dz->sampbuf[0], *ovflwbuf = dz->sampbuf[1], *obuf = dz->sampbuf[2];
  1546. double d, dibufpos, frac, diff, val;
  1547. int ibufpos;
  1548. d = 0.0;
  1549. dibufpos = (double)ibufstart;
  1550. while(d < len) {
  1551. ibufpos = (int)floor(dibufpos);
  1552. if(ibufpos >= dz->buflen) {
  1553. memcpy((char *)ibuf,(char *)ovflwbuf,dz->buflen * sizeof(float));
  1554. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  1555. if((dz->ssampsread = fgetfbufEx(ovflwbuf,dz->buflen,dz->ifd[0],0)) < 0) {
  1556. sprintf(errstr,"Can't read samples from input soundfile.\n");
  1557. return(SYSTEM_ERROR);
  1558. }
  1559. ibufpos -= dz->buflen;
  1560. dibufpos -= (double)dz->buflen;
  1561. (*lastbuf)++;
  1562. }
  1563. frac = dibufpos - (double)ibufpos;
  1564. val = ibuf[ibufpos];
  1565. diff = ibuf[ibufpos+1] - val;
  1566. val += frac * diff;
  1567. obuf[(*obufpos)++] = (float)(val * amp);
  1568. if(*obufpos >= dz->buflen) {
  1569. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1570. return(exit_status);
  1571. *obufpos = 0;
  1572. }
  1573. d += incr;
  1574. dibufpos += incr;
  1575. }
  1576. return FINISHED;
  1577. }
  1578. /**************************** HANDLE_THE_SPECIAL_DATA ****************************/
  1579. int handle_the_special_data(char *str,dataptr dz)
  1580. {
  1581. int done = 0;
  1582. double dummy = 0.0, lasttime;
  1583. FILE *fp;
  1584. int cnt = 0, linecnt;
  1585. char temp[800], *p;
  1586. if((fp = fopen(str,"r"))==NULL) {
  1587. sprintf(errstr,"Cannot open file %s to read times.\n",str);
  1588. return(DATA_ERROR);
  1589. }
  1590. linecnt = 0;
  1591. lasttime = -1.0;
  1592. while(fgets(temp,200,fp)!=NULL) {
  1593. p = temp;
  1594. while(isspace(*p))
  1595. p++;
  1596. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  1597. continue;
  1598. while(get_float_from_within_string(&p,&dummy)) {
  1599. if(cnt == 0) {
  1600. if(dummy <= 0.0) {
  1601. sprintf(errstr,"Invalid time (%lf) on line %d in file %s. Must be greater than zero.\n",dummy,linecnt+1,str);
  1602. return(DATA_ERROR);
  1603. }
  1604. } else if(dummy <= lasttime) {
  1605. sprintf(errstr,"Times (%lf & %lf) do not advance in at line %d in file %s.\n",lasttime, dummy,linecnt,str);
  1606. return(DATA_ERROR);
  1607. } else if(dummy >= dz->duration) {
  1608. fprintf(stdout,"WARNING: Time (%lf) too near or beyond end of source-file, at line %d in file %s.\n",dummy,linecnt+1,str);
  1609. fprintf(stdout,"WARNING: Ignoring data at and after this time.\n");
  1610. fflush(stdout);
  1611. done = 1;
  1612. break;
  1613. }
  1614. lasttime = dummy;
  1615. cnt++;
  1616. }
  1617. if(done)
  1618. break;
  1619. linecnt++;
  1620. }
  1621. if(cnt == 0) {
  1622. sprintf(errstr,"No valid data found in file %s.\n",str);
  1623. return(DATA_ERROR);
  1624. }
  1625. if(!flteq(lasttime,dz->duration))
  1626. cnt++;
  1627. dz->itemcnt = cnt;
  1628. if((dz->parray = (double **)malloc(sizeof(double *)))==NULL) {
  1629. sprintf(errstr,"INSUFFICIENT MEMORY to create slice-time-data storage. (1)\n");
  1630. return(MEMORY_ERROR);
  1631. }
  1632. if((dz->parray[0] = (double *)malloc(dz->itemcnt * sizeof(double)))==NULL) {
  1633. sprintf(errstr,"INSUFFICIENT MEMORY to create slice-time-data storage. (2)\n");
  1634. return(MEMORY_ERROR);
  1635. }
  1636. fseek(fp,0,0);
  1637. cnt = 0;
  1638. done = 0;
  1639. while(fgets(temp,200,fp)!=NULL) {
  1640. p = temp;
  1641. while(isspace(*p))
  1642. p++;
  1643. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  1644. continue;
  1645. while(get_float_from_within_string(&p,&dummy)) {
  1646. dz->parray[0][cnt] = dummy;
  1647. if(++cnt >= dz->itemcnt) {
  1648. done = 1;
  1649. break;
  1650. }
  1651. }
  1652. if(done)
  1653. break;
  1654. }
  1655. if(!flteq(lasttime,dz->duration))
  1656. dz->parray[0][cnt] = dz->duration;
  1657. fclose(fp);
  1658. return FINISHED;
  1659. }
  1660. /******************************************** GET_LEVELS *****************************/
  1661. int get_levels(int *wset_store,int wcnt,double *level,dataptr dz)
  1662. {
  1663. int exit_status;
  1664. float *ibuf = dz->sampbuf[0];
  1665. double maxsamp, val;
  1666. int n, s, e, k, last_samps_read, startsamp, endsamp;
  1667. last_samps_read = 0;
  1668. dz->total_samps_read = 0;
  1669. sndseekEx(dz->ifd[0],0,0);
  1670. if((exit_status = read_samps(ibuf,dz))<0)
  1671. return exit_status;
  1672. for(n=0,s=0,e=1;n < wcnt;n++,s+=2,e+=2) {
  1673. while((startsamp = wset_store[s] - last_samps_read) >= dz->buflen) {
  1674. last_samps_read = dz->total_samps_read;
  1675. if((exit_status = read_samps(ibuf,dz))<0)
  1676. return exit_status;
  1677. }
  1678. endsamp = wset_store[e] - last_samps_read;
  1679. maxsamp = 0.0;
  1680. for(k=startsamp;k < endsamp;k++) {
  1681. if(k >= dz->buflen) {
  1682. last_samps_read = dz->total_samps_read;
  1683. if((exit_status = read_samps(ibuf,dz))<0)
  1684. return exit_status;
  1685. endsamp -= dz->buflen;
  1686. k = 0;
  1687. }
  1688. val = fabs(ibuf[k]);
  1689. if(val > maxsamp)
  1690. maxsamp = val;
  1691. }
  1692. level[n] = maxsamp;
  1693. }
  1694. return FINISHED;
  1695. }