multiosc.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <structures.h>
  4. #include <tkglobals.h>
  5. #include <pnames.h>
  6. #include <filetype.h>
  7. #include <processno.h>
  8. #include <modeno.h>
  9. #include <logic.h>
  10. #include <globcon.h>
  11. #include <cdpmain.h>
  12. #include <math.h>
  13. #include <mixxcon.h>
  14. #include <osbind.h>
  15. #include <standalone.h>
  16. #include <science.h>
  17. #include <ctype.h>
  18. #include <sfsys.h>
  19. #include <string.h>
  20. #include <srates.h>
  21. #define ROOT2 (1.4142136)
  22. #define DOUBLE_OSC 0
  23. #define TRIPLE_OSC 1
  24. #define QUADRUPLE_OSC 2
  25. #define MOSCAMP 0.9 // Output level for sound output
  26. #ifdef unix
  27. #define round(x) lround((x))
  28. #endif
  29. char errstr[2400];
  30. int anal_infiles = 1;
  31. int sloom = 0;
  32. int sloombatch = 0;
  33. const char* cdp_version = "7.0.0";
  34. //CDP LIB REPLACEMENTS
  35. static int setup_multiosc_application(dataptr dz);
  36. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  37. static int setup_multiosc_param_ranges_and_defaults(dataptr dz);
  38. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  39. static int open_the_outfile(dataptr dz);
  40. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  41. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  42. static int establish_application(dataptr dz);
  43. static int initialise_vflags(dataptr dz);
  44. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  45. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  46. static int mark_parameter_types(dataptr dz,aplptr ap);
  47. static int assign_file_data_storage(int infilecnt,dataptr dz);
  48. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  49. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  50. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  51. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  52. static int multiosc_param_preprocess(dataptr dz);
  53. static int multiosc(dataptr dz);
  54. static double multioscillator(double onehzincr,double *tabpos,double *tabpos2,double *tabpos3,double *tabpos4,int oscilcnt,dataptr dz);
  55. static int create_multiosc_sndbufs(dataptr dz);
  56. static int setup_readtable(dataptr dz) ;
  57. static double read_wavetable(double tabpos,dataptr dz);
  58. /**************************************** MAIN *********************************************/
  59. int main(int argc,char *argv[])
  60. {
  61. int exit_status;
  62. dataptr dz = NULL;
  63. char **cmdline;
  64. int cmdlinecnt;
  65. aplptr ap;
  66. int is_launched = FALSE;
  67. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  68. fprintf(stdout,"%s\n",cdp_version);
  69. fflush(stdout);
  70. return 0;
  71. }
  72. /* CHECK FOR SOUNDLOOM */
  73. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  74. sloom = 0;
  75. sloombatch = 1;
  76. }
  77. if(sflinit("cdp")){
  78. sfperror("cdp: initialisation\n");
  79. return(FAILED);
  80. }
  81. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  82. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  83. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  84. return(FAILED);
  85. }
  86. if(!sloom) {
  87. if(argc == 1) {
  88. usage1();
  89. return(FAILED);
  90. } else if(argc == 2) {
  91. usage2(argv[1]);
  92. return(FAILED);
  93. }
  94. }
  95. if(!sloom) {
  96. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  97. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  98. return(FAILED);
  99. }
  100. cmdline = argv;
  101. cmdlinecnt = argc;
  102. if((get_the_process_no(argv[0],dz))<0)
  103. return(FAILED);
  104. cmdline++;
  105. cmdlinecnt--;
  106. dz->maxmode = 3;
  107. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  108. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  109. return(exit_status);
  110. }
  111. cmdline++;
  112. cmdlinecnt--;
  113. // setup_particular_application =
  114. if((exit_status = setup_multiosc_application(dz))<0) {
  115. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  116. return(FAILED);
  117. }
  118. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  119. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  120. return(FAILED);
  121. }
  122. } else {
  123. //parse_TK_data() =
  124. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  125. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  126. return(exit_status);
  127. }
  128. }
  129. ap = dz->application;
  130. dz->infile->channels = 1;
  131. // parse_infile_and_hone_type() =
  132. // setup_param_ranges_and_defaults() =
  133. if((exit_status = setup_multiosc_param_ranges_and_defaults(dz))<0) {
  134. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  135. return(FAILED);
  136. }
  137. // open_first_infile() : redundant
  138. // handle_extra_infiles() : redundant
  139. // handle_outfile() =
  140. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  141. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  142. return(FAILED);
  143. }
  144. // handle_formants() redundant
  145. // handle_formant_quiksearch() redundant
  146. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  147. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  148. return(FAILED);
  149. }
  150. // check_param_validity_and_consistency() redundant
  151. if((exit_status = open_the_outfile(dz))<0) {
  152. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  153. return(FAILED);
  154. }
  155. is_launched = TRUE;
  156. if((exit_status = create_multiosc_sndbufs(dz))<0) { // CDP LIB
  157. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  158. return(FAILED);
  159. }
  160. if((exit_status = multiosc_param_preprocess(dz))<0) {
  161. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  162. return(FAILED);
  163. }
  164. //spec_process_file =
  165. if((exit_status = multiosc(dz))<0) {
  166. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  167. return(FAILED);
  168. }
  169. if((exit_status = complete_output(dz))<0) { // CDP LIB
  170. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  171. return(FAILED);
  172. }
  173. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  174. free(dz);
  175. return(SUCCEEDED);
  176. }
  177. /**********************************************
  178. REPLACED CDP LIB FUNCTIONS
  179. **********************************************/
  180. /****************************** SET_PARAM_DATA *********************************/
  181. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  182. {
  183. ap->special_data = (char)special_data;
  184. ap->param_cnt = (char)paramcnt;
  185. ap->max_param_cnt = (char)maxparamcnt;
  186. if(ap->max_param_cnt>0) {
  187. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  188. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  189. return(MEMORY_ERROR);
  190. }
  191. strcpy(ap->param_list,paramlist);
  192. }
  193. return(FINISHED);
  194. }
  195. /****************************** SET_VFLGS *********************************/
  196. int set_vflgs
  197. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  198. {
  199. ap->option_cnt = (char) optcnt; /*RWD added cast */
  200. if(optcnt) {
  201. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  202. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  203. return(MEMORY_ERROR);
  204. }
  205. strcpy(ap->option_list,optlist);
  206. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  207. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  208. return(MEMORY_ERROR);
  209. }
  210. strcpy(ap->option_flags,optflags);
  211. }
  212. ap->vflag_cnt = (char) vflagcnt;
  213. ap->variant_param_cnt = (char) vparamcnt;
  214. if(vflagcnt) {
  215. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  216. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  217. return(MEMORY_ERROR);
  218. }
  219. strcpy(ap->variant_list,varlist);
  220. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  221. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  222. return(MEMORY_ERROR);
  223. }
  224. strcpy(ap->variant_flags,varflags);
  225. }
  226. return(FINISHED);
  227. }
  228. /***************************** APPLICATION_INIT **************************/
  229. int application_init(dataptr dz)
  230. {
  231. int exit_status;
  232. int storage_cnt;
  233. int tipc, brkcnt;
  234. aplptr ap = dz->application;
  235. if(ap->vflag_cnt>0)
  236. initialise_vflags(dz);
  237. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  238. ap->total_input_param_cnt = (char)tipc;
  239. if(tipc>0) {
  240. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  241. return(exit_status);
  242. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  243. return(exit_status);
  244. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  245. return(exit_status);
  246. }
  247. brkcnt = tipc;
  248. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  249. if(brkcnt>0) {
  250. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  251. return(exit_status);
  252. }
  253. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  254. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  255. return(exit_status);
  256. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  257. return(exit_status);
  258. }
  259. if((exit_status = mark_parameter_types(dz,ap))<0)
  260. return(exit_status);
  261. // establish_infile_constants() replaced by
  262. dz->infilecnt = 1;
  263. //establish_bufptrs_and_extra_buffers():
  264. return(FINISHED);
  265. }
  266. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  267. /* RWD mallo changed to calloc; helps debug verison run as release! */
  268. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  269. {
  270. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  271. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  272. return(MEMORY_ERROR);
  273. }
  274. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  275. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  276. return(MEMORY_ERROR);
  277. }
  278. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  279. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  280. return(MEMORY_ERROR);
  281. }
  282. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  283. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  284. return(MEMORY_ERROR);
  285. }
  286. return(FINISHED);
  287. }
  288. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  289. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  290. {
  291. int n;
  292. for(n=0;n<storage_cnt;n++) {
  293. dz->is_int[n] = (char)0;
  294. dz->no_brk[n] = (char)0;
  295. }
  296. return(FINISHED);
  297. }
  298. /***************************** MARK_PARAMETER_TYPES **************************/
  299. int mark_parameter_types(dataptr dz,aplptr ap)
  300. {
  301. int n, m; /* PARAMS */
  302. for(n=0;n<ap->max_param_cnt;n++) {
  303. switch(ap->param_list[n]) {
  304. case('0'): break; /* dz->is_active[n] = 0 is default */
  305. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  306. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  307. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  308. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  309. default:
  310. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  311. return(PROGRAM_ERROR);
  312. }
  313. } /* OPTIONS */
  314. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  315. switch(ap->option_list[n]) {
  316. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  317. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  318. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  319. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  320. default:
  321. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  322. return(PROGRAM_ERROR);
  323. }
  324. } /* VARIANTS */
  325. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  326. switch(ap->variant_list[n]) {
  327. case('0'): break;
  328. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  329. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  330. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  331. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  332. default:
  333. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  334. return(PROGRAM_ERROR);
  335. }
  336. } /* INTERNAL */
  337. for(n=0,
  338. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  339. switch(ap->internal_param_list[n]) {
  340. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  341. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  342. case('d'): dz->no_brk[m] = (char)1; break;
  343. default:
  344. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  345. return(PROGRAM_ERROR);
  346. }
  347. }
  348. return(FINISHED);
  349. }
  350. /************************ HANDLE_THE_OUTFILE *********************/
  351. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  352. {
  353. char *filename = (*cmdline)[0], *p;
  354. if(filename[0]=='-' && filename[1]=='f') {
  355. dz->floatsam_output = 1;
  356. dz->true_outfile_stype = SAMP_FLOAT;
  357. filename+= 2;
  358. }
  359. if(!sloom) {
  360. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  361. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  362. return(DATA_ERROR);
  363. }
  364. }
  365. p = filename; // Drop file extension
  366. while(*p != ENDOFSTR) {
  367. if(*p == '.') {
  368. *p = ENDOFSTR;
  369. break;
  370. }
  371. p++;
  372. }
  373. strcpy(dz->outfilename,filename);
  374. (*cmdline)++;
  375. (*cmdlinecnt)--;
  376. return(FINISHED);
  377. }
  378. /***************************** OPEN_THE_OUTFILE **************************/
  379. int open_the_outfile(dataptr dz)
  380. {
  381. int exit_status;
  382. dz->infile->channels = 1;
  383. dz->infile->srate = dz->iparam[MOSC_SRATE];
  384. dz->outfile->channels = 1;
  385. dz->outfile->srate = dz->iparam[MOSC_SRATE];
  386. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  387. return(exit_status);
  388. return(FINISHED);
  389. }
  390. /***************************** ESTABLISH_APPLICATION **************************/
  391. int establish_application(dataptr dz)
  392. {
  393. aplptr ap;
  394. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  395. sprintf(errstr,"establish_application()\n");
  396. return(MEMORY_ERROR);
  397. }
  398. ap = dz->application;
  399. memset((char *)ap,0,sizeof(struct applic));
  400. return(FINISHED);
  401. }
  402. /************************* INITIALISE_VFLAGS *************************/
  403. int initialise_vflags(dataptr dz)
  404. {
  405. int n;
  406. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  407. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  408. return(MEMORY_ERROR);
  409. }
  410. for(n=0;n<dz->application->vflag_cnt;n++)
  411. dz->vflag[n] = FALSE;
  412. return FINISHED;
  413. }
  414. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  415. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  416. {
  417. int n;
  418. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  419. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  420. return(MEMORY_ERROR);
  421. }
  422. for(n=0;n<tipc;n++)
  423. ap->default_val[n] = 0.0;
  424. return(FINISHED);
  425. }
  426. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  427. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  428. {
  429. int n;
  430. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  431. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  432. return(MEMORY_ERROR);
  433. }
  434. for(n=0;n<tipc;n++)
  435. dz->is_active[n] = (char)0;
  436. return(FINISHED);
  437. }
  438. /************************* SETUP_MULTIOSC_APPLICATION *******************/
  439. int setup_multiosc_application(dataptr dz)
  440. {
  441. int exit_status;
  442. aplptr ap;
  443. if((exit_status = establish_application(dz))<0) // GLOBAL
  444. return(FAILED);
  445. ap = dz->application;
  446. // SEE parstruct FOR EXPLANATION of next 2 functions
  447. switch(dz->mode) {
  448. case(0): exit_status = set_param_data(ap,0,10,6, "dDDD0000id"); break;
  449. case(1): exit_status = set_param_data(ap,0,10,8, "dDDDDD00id"); break;
  450. case(2): exit_status = set_param_data(ap,0,10,10,"dDDDDDDDid"); break;
  451. }
  452. if(exit_status <0)
  453. return(FAILED);
  454. if((exit_status = set_vflgs(ap,"",0,"","",0,0,""))<0)
  455. return(exit_status);
  456. // set_legal_infile_structure -->
  457. dz->has_otherfile = FALSE;
  458. // assign_process_logic -->
  459. dz->input_data_type = NO_FILE_AT_ALL;
  460. dz->process_type = UNEQUAL_SNDFILE;
  461. dz->outfiletype = SNDFILE_OUT;
  462. return application_init(dz); //GLOBAL
  463. }
  464. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  465. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  466. {
  467. int exit_status;
  468. infileptr infile_info;
  469. if(!sloom) {
  470. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  471. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  472. return(MEMORY_ERROR);
  473. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  474. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  475. return(PROGRAM_ERROR);
  476. } else if(infile_info->filetype != SNDFILE) {
  477. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  478. return(DATA_ERROR);
  479. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  480. sprintf(errstr,"Failed to copy file parsing information\n");
  481. return(PROGRAM_ERROR);
  482. }
  483. free(infile_info);
  484. }
  485. return(FINISHED);
  486. }
  487. /************************* SETUP_MULTIOSC_PARAM_RANGES_AND_DEFAULTS *******************/
  488. int setup_multiosc_param_ranges_and_defaults(dataptr dz)
  489. {
  490. int exit_status;
  491. aplptr ap = dz->application;
  492. // set_param_ranges()
  493. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  494. // NB total_input_param_cnt is > 0 !!!
  495. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  496. return(FAILED);
  497. // get_param_ranges()
  498. ap->lo[MOSC_DUR] = 0.0;
  499. ap->hi[MOSC_DUR] = 32767.0;
  500. ap->default_val[MOSC_DUR] = 1.0;
  501. ap->lo[MOSC_FRQ1] = .001;
  502. ap->hi[MOSC_FRQ1] = 10000;
  503. ap->default_val[MOSC_FRQ1] = 440;
  504. ap->lo[MOSC_FRQ2] = .001;
  505. ap->hi[MOSC_FRQ2] = 10000;
  506. ap->default_val[MOSC_FRQ2] = 440;
  507. ap->lo[MOSC_AMP2] = 0;
  508. ap->hi[MOSC_AMP2] = 1.0;
  509. ap->default_val[MOSC_AMP2] = 0;
  510. if(dz->mode >= TRIPLE_OSC) {
  511. ap->lo[MOSC_FRQ3] = .001;
  512. ap->hi[MOSC_FRQ3] = 10000;
  513. ap->default_val[MOSC_FRQ3] = 440;
  514. ap->lo[MOSC_AMP3] = 0;
  515. ap->hi[MOSC_AMP3] = 1.0;
  516. ap->default_val[MOSC_AMP3] = 0;
  517. }
  518. if(dz->mode == QUADRUPLE_OSC) {
  519. ap->lo[MOSC_FRQ4] = .001;
  520. ap->hi[MOSC_FRQ4] = 10000;
  521. ap->default_val[MOSC_FRQ4] = 440;
  522. ap->lo[MOSC_AMP4] = 0;
  523. ap->hi[MOSC_AMP4] = 1.0;
  524. ap->default_val[MOSC_AMP4] = 0;
  525. }
  526. ap->lo[MOSC_SRATE] = 16000;
  527. ap->hi[MOSC_SRATE] = 96000;
  528. ap->default_val[MOSC_SRATE] = 44100;
  529. ap->lo[MOSC_SPLEN] = 1;
  530. ap->hi[MOSC_SPLEN] = 50;
  531. ap->default_val[MOSC_SPLEN] = 50;
  532. dz->maxmode = 3;
  533. if(!sloom)
  534. put_default_vals_in_all_params(dz);
  535. return(FINISHED);
  536. }
  537. /********************************* PARSE_SLOOM_DATA *********************************/
  538. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  539. {
  540. int exit_status;
  541. int cnt = 1, infilecnt;
  542. int filesize, insams, inbrksize;
  543. double dummy;
  544. int true_cnt = 0;
  545. aplptr ap;
  546. while(cnt<=PRE_CMDLINE_DATACNT) {
  547. if(cnt > argc) {
  548. sprintf(errstr,"Insufficient data sent from TK\n");
  549. return(DATA_ERROR);
  550. }
  551. switch(cnt) {
  552. case(1):
  553. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  554. sprintf(errstr,"Cannot read process no. sent from TK\n");
  555. return(DATA_ERROR);
  556. }
  557. break;
  558. case(2):
  559. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  560. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  561. return(DATA_ERROR);
  562. }
  563. if(dz->mode > 0)
  564. dz->mode--;
  565. //setup_particular_application() =
  566. if((exit_status = setup_multiosc_application(dz))<0)
  567. return(exit_status);
  568. ap = dz->application;
  569. break;
  570. case(3):
  571. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  572. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  573. return(DATA_ERROR);
  574. }
  575. if(infilecnt < 1) {
  576. true_cnt = cnt + 1;
  577. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  578. }
  579. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  580. return(exit_status);
  581. break;
  582. case(INPUT_FILETYPE+4):
  583. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  584. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  585. return(DATA_ERROR);
  586. }
  587. break;
  588. case(INPUT_FILESIZE+4):
  589. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  590. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  591. return(DATA_ERROR);
  592. }
  593. dz->insams[0] = filesize;
  594. break;
  595. case(INPUT_INSAMS+4):
  596. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  597. sprintf(errstr,"Cannot read insams sent from TK\n");
  598. return(DATA_ERROR);
  599. }
  600. dz->insams[0] = insams;
  601. break;
  602. case(INPUT_SRATE+4):
  603. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  604. sprintf(errstr,"Cannot read srate sent from TK\n");
  605. return(DATA_ERROR);
  606. }
  607. break;
  608. case(INPUT_CHANNELS+4):
  609. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  610. sprintf(errstr,"Cannot read channels sent from TK\n");
  611. return(DATA_ERROR);
  612. }
  613. break;
  614. case(INPUT_STYPE+4):
  615. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  616. sprintf(errstr,"Cannot read stype sent from TK\n");
  617. return(DATA_ERROR);
  618. }
  619. break;
  620. case(INPUT_ORIGSTYPE+4):
  621. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  622. sprintf(errstr,"Cannot read origstype sent from TK\n");
  623. return(DATA_ERROR);
  624. }
  625. break;
  626. case(INPUT_ORIGRATE+4):
  627. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  628. sprintf(errstr,"Cannot read origrate sent from TK\n");
  629. return(DATA_ERROR);
  630. }
  631. break;
  632. case(INPUT_MLEN+4):
  633. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  634. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  635. return(DATA_ERROR);
  636. }
  637. break;
  638. case(INPUT_DFAC+4):
  639. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  640. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  641. return(DATA_ERROR);
  642. }
  643. break;
  644. case(INPUT_ORIGCHANS+4):
  645. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  646. sprintf(errstr,"Cannot read origchans sent from TK\n");
  647. return(DATA_ERROR);
  648. }
  649. break;
  650. case(INPUT_SPECENVCNT+4):
  651. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  652. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  653. return(DATA_ERROR);
  654. }
  655. dz->specenvcnt = dz->infile->specenvcnt;
  656. break;
  657. case(INPUT_WANTED+4):
  658. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  659. sprintf(errstr,"Cannot read wanted sent from TK\n");
  660. return(DATA_ERROR);
  661. }
  662. break;
  663. case(INPUT_WLENGTH+4):
  664. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  665. sprintf(errstr,"Cannot read wlength sent from TK\n");
  666. return(DATA_ERROR);
  667. }
  668. break;
  669. case(INPUT_OUT_CHANS+4):
  670. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  671. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  672. return(DATA_ERROR);
  673. }
  674. break;
  675. /* RWD these chanegs to samps - tk will have to deal with that! */
  676. case(INPUT_DESCRIPTOR_BYTES+4):
  677. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  678. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  679. return(DATA_ERROR);
  680. }
  681. break;
  682. case(INPUT_IS_TRANSPOS+4):
  683. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  684. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  685. return(DATA_ERROR);
  686. }
  687. break;
  688. case(INPUT_COULD_BE_TRANSPOS+4):
  689. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  690. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  691. return(DATA_ERROR);
  692. }
  693. break;
  694. case(INPUT_COULD_BE_PITCH+4):
  695. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  696. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  697. return(DATA_ERROR);
  698. }
  699. break;
  700. case(INPUT_DIFFERENT_SRATES+4):
  701. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  702. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  703. return(DATA_ERROR);
  704. }
  705. break;
  706. case(INPUT_DUPLICATE_SNDS+4):
  707. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  708. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  709. return(DATA_ERROR);
  710. }
  711. break;
  712. case(INPUT_BRKSIZE+4):
  713. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  714. sprintf(errstr,"Cannot read brksize sent from TK\n");
  715. return(DATA_ERROR);
  716. }
  717. if(inbrksize > 0) {
  718. switch(dz->input_data_type) {
  719. case(WORDLIST_ONLY):
  720. break;
  721. case(PITCH_AND_PITCH):
  722. case(PITCH_AND_TRANSPOS):
  723. case(TRANSPOS_AND_TRANSPOS):
  724. dz->tempsize = inbrksize;
  725. break;
  726. case(BRKFILES_ONLY):
  727. case(UNRANGED_BRKFILE_ONLY):
  728. case(DB_BRKFILES_ONLY):
  729. case(ALL_FILES):
  730. case(ANY_NUMBER_OF_ANY_FILES):
  731. if(dz->extrabrkno < 0) {
  732. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  733. return(DATA_ERROR);
  734. }
  735. if(dz->brksize == NULL) {
  736. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  737. return(PROGRAM_ERROR);
  738. }
  739. dz->brksize[dz->extrabrkno] = inbrksize;
  740. break;
  741. default:
  742. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  743. dz->input_data_type);
  744. return(PROGRAM_ERROR);
  745. }
  746. break;
  747. }
  748. break;
  749. case(INPUT_NUMSIZE+4):
  750. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  751. sprintf(errstr,"Cannot read numsize sent from TK\n");
  752. return(DATA_ERROR);
  753. }
  754. break;
  755. case(INPUT_LINECNT+4):
  756. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  757. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  758. return(DATA_ERROR);
  759. }
  760. break;
  761. case(INPUT_ALL_WORDS+4):
  762. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  763. sprintf(errstr,"Cannot read all_words sent from TK\n");
  764. return(DATA_ERROR);
  765. }
  766. break;
  767. case(INPUT_ARATE+4):
  768. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  769. sprintf(errstr,"Cannot read arate sent from TK\n");
  770. return(DATA_ERROR);
  771. }
  772. break;
  773. case(INPUT_FRAMETIME+4):
  774. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  775. sprintf(errstr,"Cannot read frametime sent from TK\n");
  776. return(DATA_ERROR);
  777. }
  778. dz->frametime = (float)dummy;
  779. break;
  780. case(INPUT_WINDOW_SIZE+4):
  781. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  782. sprintf(errstr,"Cannot read window_size sent from TK\n");
  783. return(DATA_ERROR);
  784. }
  785. break;
  786. case(INPUT_NYQUIST+4):
  787. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  788. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  789. return(DATA_ERROR);
  790. }
  791. break;
  792. case(INPUT_DURATION+4):
  793. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  794. sprintf(errstr,"Cannot read duration sent from TK\n");
  795. return(DATA_ERROR);
  796. }
  797. break;
  798. case(INPUT_MINBRK+4):
  799. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  800. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  801. return(DATA_ERROR);
  802. }
  803. break;
  804. case(INPUT_MAXBRK+4):
  805. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  806. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  807. return(DATA_ERROR);
  808. }
  809. break;
  810. case(INPUT_MINNUM+4):
  811. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  812. sprintf(errstr,"Cannot read minnum sent from TK\n");
  813. return(DATA_ERROR);
  814. }
  815. break;
  816. case(INPUT_MAXNUM+4):
  817. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  818. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  819. return(DATA_ERROR);
  820. }
  821. break;
  822. default:
  823. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  824. return(PROGRAM_ERROR);
  825. }
  826. cnt++;
  827. }
  828. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  829. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  830. return(DATA_ERROR);
  831. }
  832. if(true_cnt)
  833. cnt = true_cnt;
  834. *cmdlinecnt = 0;
  835. while(cnt < argc) {
  836. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  837. return(exit_status);
  838. cnt++;
  839. }
  840. return(FINISHED);
  841. }
  842. /********************************* GET_TK_CMDLINE_WORD *********************************/
  843. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  844. {
  845. if(*cmdlinecnt==0) {
  846. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  847. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  848. return(MEMORY_ERROR);
  849. }
  850. } else {
  851. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  852. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  853. return(MEMORY_ERROR);
  854. }
  855. }
  856. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  857. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  858. return(MEMORY_ERROR);
  859. }
  860. strcpy((*cmdline)[*cmdlinecnt],q);
  861. (*cmdlinecnt)++;
  862. return(FINISHED);
  863. }
  864. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  865. int assign_file_data_storage(int infilecnt,dataptr dz)
  866. {
  867. int exit_status;
  868. int no_sndfile_system_files = FALSE;
  869. dz->infilecnt = infilecnt;
  870. if((exit_status = allocate_filespace(dz))<0)
  871. return(exit_status);
  872. if(no_sndfile_system_files)
  873. dz->infilecnt = 0;
  874. return(FINISHED);
  875. }
  876. /************************* redundant functions: to ensure libs compile OK *******************/
  877. int assign_process_logic(dataptr dz)
  878. {
  879. return(FINISHED);
  880. }
  881. void set_legal_infile_structure(dataptr dz)
  882. {}
  883. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  884. {
  885. return(FINISHED);
  886. }
  887. int setup_internal_arrays_and_array_pointers(dataptr dz)
  888. {
  889. return(FINISHED);
  890. }
  891. int establish_bufptrs_and_extra_buffers(dataptr dz)
  892. {
  893. return(FINISHED);
  894. }
  895. int read_special_data(char *str,dataptr dz)
  896. {
  897. return(FINISHED);
  898. }
  899. int inner_loop
  900. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  901. {
  902. return(FINISHED);
  903. }
  904. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  905. {
  906. return(FINISHED);
  907. }
  908. /******************************** USAGE1 ********************************/
  909. int usage1(void)
  910. {
  911. usage2("multiosc");
  912. return(USAGE_ONLY);
  913. }
  914. /********************************************************************************************/
  915. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  916. {
  917. if(!strcmp(prog_identifier_from_cmdline,"multiosc")) dz->process = MULTIOSC;
  918. else {
  919. fprintf(stderr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  920. return(USAGE_ONLY);
  921. }
  922. return(FINISHED);
  923. }
  924. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  925. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  926. {
  927. int n;
  928. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  929. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  930. return(MEMORY_ERROR);
  931. }
  932. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  933. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  934. return(MEMORY_ERROR);
  935. }
  936. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  937. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  938. return(MEMORY_ERROR);
  939. }
  940. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  941. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  942. return(MEMORY_ERROR);
  943. }
  944. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  945. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  946. return(MEMORY_ERROR);
  947. }
  948. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  949. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  950. return(MEMORY_ERROR);
  951. }
  952. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  953. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  954. return(MEMORY_ERROR);
  955. }
  956. for(n=0;n<brkcnt;n++) {
  957. dz->brk[n] = NULL;
  958. dz->brkptr[n] = NULL;
  959. dz->brkinit[n] = 0;
  960. dz->brksize[n] = 0;
  961. }
  962. return(FINISHED);
  963. }
  964. /**************************** USAGE3 *************************/
  965. int usage3(char *str1,char *str2)
  966. {
  967. fprintf(stderr,"Insufficient parameters on command line.\n");
  968. return(USAGE_ONLY);
  969. }
  970. /**************************** MULTIOSC_PARAM_PREPROCESS *************************/
  971. int multiosc_param_preprocess (dataptr dz)
  972. {
  973. int exit_status;
  974. double srate;
  975. if(BAD_SR(dz->iparam[MOSC_SRATE])) {
  976. sprintf(errstr,"Invalid sample rate (%d) entered.\n",dz->iparam[MOSC_SRATE]);
  977. return(MEMORY_ERROR);
  978. }
  979. srate = (double)dz->iparam[MOSC_SRATE];
  980. dz->iparam[MOSC_DUR] = (int)round(dz->param[MOSC_DUR] * srate);
  981. dz->iparam[MOSC_SPLEN] = (int)round(dz->param[MOSC_SPLEN] * MS_TO_SECS * srate);
  982. if(dz->iparam[MOSC_SPLEN] * 2 >= dz->iparam[MOSC_DUR]) {
  983. sprintf(errstr,"Duration too short for dovetailing splices.\n");
  984. return(MEMORY_ERROR);
  985. }
  986. if((exit_status = setup_readtable(dz))<0)
  987. return(exit_status);
  988. return FINISHED;
  989. }
  990. /**************************** CREATE_MULTIOSC_SNDBUFS ****************************/
  991. int create_multiosc_sndbufs(dataptr dz)
  992. {
  993. int n;
  994. int bigbufsize;
  995. int framesize;
  996. framesize = F_SECSIZE;
  997. dz->bufcnt = 1;
  998. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  999. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  1000. return(MEMORY_ERROR);
  1001. }
  1002. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  1003. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  1004. return(MEMORY_ERROR);
  1005. }
  1006. bigbufsize = (int)Malloc(-1);
  1007. bigbufsize /= dz->bufcnt;
  1008. if(bigbufsize <=0)
  1009. bigbufsize = framesize * sizeof(float);
  1010. dz->buflen = bigbufsize / sizeof(float);
  1011. dz->buflen = (dz->buflen / framesize) * framesize;
  1012. bigbufsize = dz->buflen * sizeof(float);
  1013. if((dz->bigbuf = (float *)malloc(bigbufsize * dz->bufcnt)) == NULL) {
  1014. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1015. return(PROGRAM_ERROR);
  1016. }
  1017. for(n=0;n<dz->bufcnt;n++)
  1018. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1019. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1020. return(FINISHED);
  1021. }
  1022. /****************************** GET_THE_MODE_FROM_CMDLINE *********************************/
  1023. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1024. {
  1025. char temp[200], *p;
  1026. if(sscanf(str,"%s",temp)!=1) {
  1027. fprintf(stderr,"Cannot read mode of program.\n");
  1028. return(USAGE_ONLY);
  1029. }
  1030. p = temp + strlen(temp) - 1;
  1031. while(p >= temp) {
  1032. if(!isdigit(*p)) {
  1033. fprintf(stderr,"Invalid mode of program entered.\n");
  1034. return(USAGE_ONLY);
  1035. }
  1036. p--;
  1037. }
  1038. if(sscanf(str,"%d",&dz->mode)!=1) {
  1039. fprintf(stderr,"Cannot read mode of program.\n");
  1040. return(USAGE_ONLY);
  1041. }
  1042. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1043. fprintf(stderr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1044. return(USAGE_ONLY);
  1045. }
  1046. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1047. return(FINISHED);
  1048. }
  1049. /******************************** READ_WAVETABLE ********************************
  1050. *
  1051. * Wavefrom is in a table of size SYNTH_TABSIZE.
  1052. * This could be a sintable, or any regular (symmetrical waveform)
  1053. * Or, I guess, a short sample with some sort of symmetry so that when it phase-wraps
  1054. * it is continuous.
  1055. */
  1056. double read_wavetable(double tabpos,dataptr dz)
  1057. {
  1058. int loindex, hiindex;
  1059. double loval, hival, valdiff, timefrac, val, *sintab = dz->parray[0];
  1060. loindex = (int)floor(tabpos);
  1061. hiindex = loindex + 1;
  1062. loval = sintab[loindex];
  1063. hival = sintab[hiindex];
  1064. valdiff = hival - loval;
  1065. timefrac = tabpos - (double)loindex;
  1066. val = loval + (valdiff * timefrac);
  1067. return val;
  1068. }
  1069. /******************************** SETUP_READTABLE **************************/
  1070. int setup_readtable(dataptr dz)
  1071. {
  1072. double *sintab;
  1073. int n;
  1074. if((dz->parray = (double **)malloc(1 * sizeof(double **)))==NULL) { // sin table
  1075. sprintf(errstr,"INSUFFICIENT MEMORY for table arrays.\n");
  1076. return(MEMORY_ERROR);
  1077. }
  1078. if((dz->parray[0] = (double *)malloc((SYNTH_TABSIZE + 1) * sizeof(double)))==NULL) { // sin table
  1079. sprintf(errstr,"INSUFFICIENT MEMORY for wave table.\n");
  1080. return(MEMORY_ERROR);
  1081. }
  1082. sintab = dz->parray[0];
  1083. for(n=0;n<SYNTH_TABSIZE;n++)
  1084. sintab[n] = sin(PI * 2.0 * ((double)n/(double)SYNTH_TABSIZE));
  1085. sintab[n] = sintab[0]; /* wrap around point */
  1086. return FINISHED;
  1087. }
  1088. /******************************** USAGE2 ********************************/
  1089. int usage2(char *str)
  1090. {
  1091. if(!strcmp(str,"multiosc")) {
  1092. fprintf(stdout,
  1093. "USAGE:\n"
  1094. "multiosc multiosc 1 outfile dur frq1 frq2 amp2 srate dovesplice\n"
  1095. "multiosc multiosc 2 outfile dur frq1 frq2 amp2 frq3 amp3 srate dovesplice\n"
  1096. "multiosc multiosc 3 outfile dur frq1 frq2 amp2 frq3 amp3 frq4 amp4 srate dovesplice\n"
  1097. "\n"
  1098. "\n"
  1099. "MODE 1 Oscillation of oscillation.\n"
  1100. "MODE 2 Oscillation of oscillation of oscillation.\n"
  1101. "MODE 3 Oscillation of oscillation of oscillation of oscillation.\n"
  1102. "\n"
  1103. "DUR Duration of synthesized sound, or textfile output.\n"
  1104. "FRQ1 (Possibly time-varying) driving frequency of output.\n"
  1105. "FRQ2 etc Nested (possibly time-varying) oscillations of table read.\n"
  1106. "AMP2 etc Amplitude of suboscillations (Range 0 - 1).\n"
  1107. "SRATE Sample rate of synthesized sound.\n"
  1108. "DOVESPLICE Length of splice of start and end of output sound (mS).\n"
  1109. "\n");
  1110. } else
  1111. fprintf(stdout,"Unknown option '%s'\n",str);
  1112. return(USAGE_ONLY);
  1113. }
  1114. /*********************************************** MULTIOSC *****************************************/
  1115. int multiosc(dataptr dz)
  1116. {
  1117. int exit_status, oscilcnt = 0;
  1118. double time, val, srate, onehzincr, spliceincr = 0.0, upspliceval = 0.0, dnspliceval = 1.0;
  1119. int infade = 0, outfade = 0;
  1120. float *obuf = dz->sampbuf[0];
  1121. int obufpos = 0, outsamps = 0;
  1122. double tabpos = 0.0, tabpos2 = 0.0, tabpos3 = 0.0, tabpos4 = 0.0;
  1123. switch(dz->mode) {
  1124. case(QUADRUPLE_OSC): oscilcnt = 4; break;
  1125. case(TRIPLE_OSC): oscilcnt = 3; break;
  1126. case(DOUBLE_OSC): oscilcnt = 2; break;
  1127. }
  1128. srate = (double)dz->iparam[MOSC_SRATE];
  1129. infade = (int)floor(dz->param[MOSC_SPLEN] * MS_TO_SECS * srate);
  1130. outfade = dz->iparam[MOSC_DUR] - infade;
  1131. spliceincr = 1.0/infade;
  1132. upspliceval = 0.0;
  1133. dnspliceval = 1.0 - spliceincr;
  1134. onehzincr = (double)SYNTH_TABSIZE/srate;
  1135. time = 0.0;
  1136. while(outsamps < dz->iparam[MOSC_DUR]) {
  1137. if((exit_status = read_values_from_all_existing_brktables(time,dz))<0)
  1138. return exit_status;
  1139. switch(dz->mode) {
  1140. case(QUADRUPLE_OSC):
  1141. if(dz->brksize[MOSC_AMP4])
  1142. dz->param[MOSC_AMP4] *= (double)SYNTH_TABSIZE;
  1143. // fall thro
  1144. case(TRIPLE_OSC):
  1145. if(dz->brksize[MOSC_AMP3])
  1146. dz->param[MOSC_AMP3] *= (double)SYNTH_TABSIZE;
  1147. // fall thro
  1148. case(DOUBLE_OSC):
  1149. if(dz->brksize[MOSC_AMP2])
  1150. dz->param[MOSC_AMP2] *= (double)SYNTH_TABSIZE;
  1151. break;
  1152. }
  1153. val = multioscillator(onehzincr,&tabpos,&tabpos2,&tabpos3,&tabpos4,oscilcnt,dz);
  1154. obuf[obufpos++] = (float)(MOSCAMP * val);
  1155. if(obufpos >= dz->buflen) { // If sound-buffer full, write sound output
  1156. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  1157. return(exit_status);
  1158. obufpos = 0;
  1159. }
  1160. outsamps++;
  1161. time = (double)outsamps/srate;
  1162. }
  1163. if(obufpos > 0) {
  1164. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  1165. return(exit_status);
  1166. }
  1167. return FINISHED;
  1168. }
  1169. /*********************************************** MULTIOSCILLATOR *****************************************/
  1170. double multioscillator(double onehzincr,double *tabpos,double *tabpos2,double *tabpos3,double *tabpos4,int oscilcnt,dataptr dz)
  1171. {
  1172. double tabincr, val, outval;
  1173. outval = read_wavetable(*tabpos,dz);
  1174. tabincr = onehzincr * dz->param[MOSC_FRQ1];
  1175. *tabpos += tabincr;
  1176. tabincr = onehzincr * dz->param[MOSC_FRQ2];
  1177. *tabpos2 += tabincr;
  1178. if(oscilcnt > 2) {
  1179. tabincr = onehzincr * dz->param[MOSC_FRQ3];
  1180. *tabpos3 += tabincr;
  1181. if(oscilcnt > 3) {
  1182. tabincr = onehzincr * dz->param[MOSC_FRQ4];
  1183. *tabpos4 += tabincr;
  1184. while(*tabpos4 >= SYNTH_TABSIZE)
  1185. *tabpos4 -= SYNTH_TABSIZE;
  1186. val = read_wavetable(*tabpos4,dz);
  1187. *tabpos3 += val * dz->param[MOSC_AMP4] * SYNTH_TABSIZE; // Val 0-1 scaled up to some proportion of the SYNTH_TABSIZE
  1188. }
  1189. while(*tabpos3 >= SYNTH_TABSIZE)
  1190. *tabpos3 -= SYNTH_TABSIZE;
  1191. while(*tabpos3 < 0)
  1192. *tabpos3 += SYNTH_TABSIZE;
  1193. val = read_wavetable(*tabpos3,dz);
  1194. *tabpos2 += val * dz->param[MOSC_AMP3] * SYNTH_TABSIZE;
  1195. }
  1196. while(*tabpos2 >= SYNTH_TABSIZE)
  1197. *tabpos2 -= SYNTH_TABSIZE;
  1198. while(*tabpos2 < 0)
  1199. *tabpos2 += SYNTH_TABSIZE;
  1200. val = read_wavetable(*tabpos2,dz);
  1201. *tabpos += val * dz->param[MOSC_AMP2] * SYNTH_TABSIZE; // Val 0-1 scaled up to some proportion of the SYNTH_TABSIZE
  1202. while(*tabpos >= SYNTH_TABSIZE)
  1203. *tabpos -= SYNTH_TABSIZE;
  1204. while(*tabpos < 0)
  1205. *tabpos += SYNTH_TABSIZE;
  1206. return outval;
  1207. }