Rename interpretor to interpreter.
[Faustine.git] / interpreter / main.ml
diff --git a/interpreter/main.ml b/interpreter/main.ml
new file mode 100644 (file)
index 0000000..21c2a8e
--- /dev/null
@@ -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();;
+