root/ocaml-remix/trunk/layer.ml

Revision 529, 2.5 kB (checked in by shans, 1 year ago)

Replacing sound implementation - WAS ocaml int arrays, IS native float
arrays. This has not yet been completely been debugged!

Line 
1 (** a layer consists of a list of sounds with start times and lengths, and
2     a transparency list (nb: default transparency is 0.0) *)
3 type layer = {mutable la_notes:(Time.extent * Note.note) list;
4               mutable la_transparency:
5               (Time.extent * Transparency.transparency) list};;
6
7 exception OverlappingSounds;;
8
9 let empty () = {la_notes=[]; la_transparency=[]};;
10
11 let add_note layer plugin extent =
12   layer.la_notes <- (extent, plugin)::layer.la_notes;;
13
14 let add_transparency layer trans extent =
15   layer.la_transparency <- (extent, trans)::layer.la_transparency;;
16
17 let transparency_list layer = layer.la_transparency;;
18
19 let print layer =
20   let rec _print_sounds l = match l with
21     | ((start, length), sound)::t -> (
22             Printf.printf "\tplugin from %s len %s\n"
23                               (Time.to_string start) (Time.to_string length);
24             _print_sounds t)
25     | [] -> () in
26   let rec _print_transparencies t = match t with
27     | ((start, length), trans)::r -> (
28             Printf.printf "\ttrans from %s len %s\n"
29                               (Time.to_string start) (Time.to_string length);
30             _print_transparencies r)
31     | [] -> () in
32   Printf.printf "layer is:\n";
33   _print_sounds layer.la_notes;
34   _print_transparencies layer.la_transparency;;
35
36 (*
37  * for each sound:
38  *
39  * <-------sound-------->
40  *           <----------render-------->
41  * raw_start + raw_length > raw_render_start,
42  * raw_render_start + raw_render_length > raw_start
43  *
44  *                  <----------sound----->
45  * <----------render------------>
46  * still true
47  *
48  * <-----sound--->   <----render---->
49  * raw_start + raw_length > raw_render_start is FALSE
50  *
51  * <----render---->    <----sound--->
52  * raw_render_start + raw_render_length > raw_start is FALSE
53  *
54  * -------
55  *
56  * <------sound------->
57  *          <----render---->
58  *)
59 let to_note layer undersound remix _ render_extent =
60   let (raw_render_start, raw_render_length) =
61       Time.extent_to_raw_time remix render_extent in
62   let sound = FB.create raw_render_length (Remix.channels remix) in
63   let rec _layer_to_sound laylist = match laylist with
64     | []                    -> ()
65     | ((start,length),ss)::t   -> (
66         let (s, l) = Time.overlap remix render_extent (start, length) in
67         let (rs, rl) = Time.extent_to_raw_time remix (s, l) in
68         if rl > 0 then (
69           let raw_sound = (ss undersound) remix start (s, l) in
70           FB.blit raw_sound 0 sound (rs - raw_render_start) rl);
71         _layer_to_sound t) in
72   _layer_to_sound layer.la_notes;
73   sound;;
Note: See TracBrowser for help on using the browser.