| 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;; |
|---|