(** Module: Interpreter Description: Input wave -> interpretation -> output wave @author WANG Haisheng Created: 15/05/2013 Modified: 14/08/2013 *) open Process;; open Faustio;; exception Missing_Expression;; let time_maximum = 0xFFF;; let set_GC () = let _ = Gc.set { (Gc.get()) with Gc.minor_heap_size = 0xFFFFFF } in let _ = Gc.set { (Gc.get()) with Gc.major_heap_increment = 0xFFFFFF } in let _ = Gc.set { (Gc.get()) with Gc.space_overhead = 100 } in let _ = Gc.set { (Gc.get()) with Gc.max_overhead = 0xFFFFF } in let _ = Gc.set { (Gc.get()) with Gc.stack_limit = 0xFFFFF } in let _ = Gc.set { (Gc.get()) with Gc.allocation_policy = 0 } in () ;; let has_dsp = ref false;; let path_dsp = ref "";; let num_inwav = ref 0;; let inwavs = ref [];; let num_incsv = ref 0;; let incsvs = ref [];; let outwav = ref false;; let outcsv = ref false;; let option_usage = "usage: " ^ Sys.argv.(0) ^ " [-ow] [-oc] [-d string] [-iw string] [-ic string]";; let option_unknown = fun x -> raise (Arg.Bad ("Bad argument : " ^ x)) let speclist = [ ("-ow", Arg.Unit (fun () -> outwav := true), ": output wave files"); ("-oc", Arg.Unit (fun () -> outcsv := true), ": output csv files"); ("-d", Arg.String (fun s -> has_dsp := true; path_dsp := s), ": set dsp source file"); ("-iw", Arg.String (fun s -> incr num_inwav; inwavs := !inwavs @ [s]), ": set input wave file"); ("-ic", Arg.String (fun s -> incr num_incsv; incsvs := !incsvs @ [s]), ": set input csv file"); ];; let main () = (* ignore system alarm clock *) let _ = Sys.signal Sys.sigalrm Sys.Signal_ignore in let _ = set_GC () in let () = Arg.parse speclist option_unknown option_usage in let wave = new waveio in let csv = new csvio in let input = wave#read (Array.of_list !inwavs) in let faust_core = Preprocess.preprocess !path_dsp in let faust_exp = exp_of_string faust_core in let proc = (new proc_factory)#make faust_exp in let output = proc#eval input in let data = output#output time_maximum in let rates = output#frequency in let output_wave_paths = wave#write rates data in let _ = csv#write rates data in let _ = Array.map print_endline output_wave_paths in ();; (* try (* preprocess *) let dsp_file_route_string = (io_macro_to_string Dsp_Route_string) ^ Sys.argv.(3) in let () = print_string(" Faustine -> Preprocessing...") in let tic = Sys.time () in let exp_string = Preprocess.preprocess(dsp_file_route_string) in let toc = Sys.time () in let () = print_endline(" Done. (duration: " ^ (string_of_float (toc -. tic)) ^ "s)") in (* parsing *) let exp_faust = exp_of_string exp_string in (* interpretation *) let (output_channel_list, output_rate_list, output_float_array_list) = interpreter exp_faust (input_rate_list, input_float_array_list) in (* make output wave files *) if option_out = "-wav" then write_output_wave output_channel_list output_rate_list output_float_array_list else if option_out = "-csv" then write_output_csv output_channel_list output_float_array_list else raise (Invalid_argument ("Unkown option: " ^ option_out)) with NotYetDone -> print_endline("Operation not yet programed..");; *) main();;