X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/main.ml diff --git a/interpreter/main.ml b/interpreter/main.ml new file mode 100644 index 0000000..21c2a8e --- /dev/null +++ b/interpreter/main.ml @@ -0,0 +1,112 @@ +(** + Module: Interpreter + Description: Input wave -> interpretation -> output wave + @author WANG Haisheng + Created: 15/05/2013 Modified: 14/08/2013 +*) + +open Aux;; +open Process;; +open Faustio;; + +exception Missing_Expression;; + +let version = "Faustine: 0.0.1";; + +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 = 0xFFF } in + let _ = Gc.set { (Gc.get()) + with Gc.stack_limit = 0xFFFFF } in + let _ = Gc.set { (Gc.get()) + with Gc.allocation_policy = 1 } in + () ;; + +let path_dsp = ref "";; +let size_input = ref 0;; +let inputs = ref [];; +let time_max = ref 0xFFFF;; +let dir_output = ref "";; +let format_output = ref "wav";; +let basename_output = ref "output";; + +let option_usage = "usage: " ^ Sys.argv.(0) + ^ " [-d dsp_src] [-i input] [-t time] [--odir dir] [--oformat wav/csv] [--obasename name]";; + +let option_unknown = + fun x -> raise (Arg.Bad ("Bad argument : " ^ x)) + +let speclist = [ + ("-d", Arg.String (fun s -> path_dsp := s), ": set dsp source file"); + ("-i", Arg.String (fun s -> incr size_input; inputs := !inputs @ [s]), ": set input wave file"); + ("-t", Arg.Int (fun i -> time_max := i), ": set max output length"); + ("--odir", Arg.String (fun s -> dir_output := s), ": set output directory"); + ("--oformat", Arg.String (fun s -> format_output := s), ": set output format"); + ("--obasename", Arg.String (fun s -> basename_output := s), ": set output basename"); + ];; + + +let main () = + + let () = Arg.parse speclist option_unknown option_usage in + let _ = Sys.signal Sys.sigalrm Sys.Signal_ignore in + let _ = set_GC () in + let io = new iomanager in + let () = io#set !dir_output !format_output !basename_output in + + + let () = print_string(" Faustine -> Reading input ...") in + let tic0 = Sys.time () in + let input = io#read !inputs in + let toc0 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc0 -. tic0)) ^ "s.)") in + + + let () = print_string(" Faustine -> Preprocessing...") in + let tic1 = Sys.time () in + let faust_core = Preprocess.preprocess !path_dsp in + let toc1 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc1 -. tic1)) ^ "s.)") in + + + let () = print_string(" Faustine -> Constructing process...") in + let tic2 = Sys.time () in + let faust_exp = exp_of_string faust_core in + let proc = (new proc_factory)#make faust_exp in + let toc2 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc2 -. tic2)) ^ "s.)") in + + + let () = print_string(" Faustine -> Evaluating...") in + let tic3 = Sys.time () in + let output = proc#eval input in + let toc3 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc3 -. tic3)) ^ "s.)") in + + + let () = print_string(" Faustine -> Calculating...") in + let tic4 = Sys.time () in + let data = output#output !time_max in + let rates = output#frequency in + let toc4 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc4 -. tic4)) ^ "s.)") in + + + let () = print_string(" Faustine -> Writing output...") in + let tic5 = Sys.time () in + let output_paths = io#write rates data in + let toc5 = Sys.time () in + let () = print_endline(" Done. (duration: " ^ (string_of_float (toc5 -. tic5)) ^ "s.)") in + + let _ = Array.map print_endline + (Array.map decorate output_paths) in + ();; + +main();; +