| 1 |
(* a raw sound is an array of int values *) |
|---|
| 2 |
type raw_sound = FB.buffer;; |
|---|
| 3 |
|
|---|
| 4 |
(* but sounds have a start, a rendered start, and a rendered length *) |
|---|
| 5 |
type sound = Remix.remix -> Time.time -> Time.extent -> raw_sound;; |
|---|
| 6 |
|
|---|
| 7 |
let silence r e (s,l) = |
|---|
| 8 |
let length = Time.time_to_raw_time r l in |
|---|
| 9 |
FB.create length (Remix.channels r);; |
|---|
| 10 |
|
|---|
| 11 |
(* note: length applies to raw sounds *) |
|---|
| 12 |
let length = FB.length;; |
|---|
| 13 |
|
|---|
| 14 |
let size = FB.size;; |
|---|
| 15 |
|
|---|
| 16 |
(* note: ignore start time when writing raw sounds *) |
|---|
| 17 |
let write_raw_sound r out snd = |
|---|
| 18 |
IO.nwrite out "RIFF"; |
|---|
| 19 |
IO.write_i32 out ((size snd) * 2 + 36); |
|---|
| 20 |
IO.nwrite out "WAVE"; |
|---|
| 21 |
IO.nwrite out "fmt "; (* format chunk *) |
|---|
| 22 |
IO.write_i32 out 16; |
|---|
| 23 |
IO.write_i16 out 1; (* no compression *) |
|---|
| 24 |
IO.write_i16 out (Remix.channels r); |
|---|
| 25 |
IO.write_i32 out (Remix.samplerate r); |
|---|
| 26 |
IO.write_i32 out ((Remix.samplerate r) * (Remix.channels r) * 2); |
|---|
| 27 |
IO.write_i16 out ((Remix.channels r) * 2); (* bytes per frame *) |
|---|
| 28 |
IO.write_i16 out 16; (* bits per sample - always 16 *) |
|---|
| 29 |
IO.nwrite out "data"; (* data chunk *) |
|---|
| 30 |
IO.write_i32 out ((size snd) * 2); |
|---|
| 31 |
for i = 0 to (size snd - 1) do IO.write_i16 out (FB.short_at snd i) done;; |
|---|
| 32 |
|
|---|
| 33 |
let write output remix snd start render_extent = |
|---|
| 34 |
let raw_sound = snd remix start render_extent in |
|---|
| 35 |
write_raw_sound remix output raw_sound;; |
|---|
| 36 |
|
|---|
| 37 |
let preview remix sound start (rstart,rlength) = |
|---|
| 38 |
let raw_start = Time.time_to_raw_time remix rstart in |
|---|
| 39 |
let raw_inc = Time.time_to_raw_time remix (Time.Seconds 0.2) in |
|---|
| 40 |
let dev = Oss.sound_open () in |
|---|
| 41 |
Oss.sound_set_parms dev (Remix.channels remix) (Remix.samplerate remix); |
|---|
| 42 |
let t = ref raw_start in |
|---|
| 43 |
let cond = |
|---|
| 44 |
( |
|---|
| 45 |
if rlength = Time.Forever |
|---|
| 46 |
then (fun a -> true) |
|---|
| 47 |
else ( |
|---|
| 48 |
let raw_length = Time.time_to_raw_time remix rlength in |
|---|
| 49 |
fun a -> a < raw_length |
|---|
| 50 |
) |
|---|
| 51 |
) in |
|---|
| 52 |
while cond !t do ( |
|---|
| 53 |
Oss.sound_write dev |
|---|
| 54 |
(sound remix start (Time.Samples !t, Time.Samples raw_inc)); |
|---|
| 55 |
t := !t + raw_inc) done; |
|---|
| 56 |
Oss.sound_close dev;; |
|---|
| 57 |
|
|---|
| 58 |
let raw_preview remix sound = |
|---|
| 59 |
let dev = Oss.sound_open () in |
|---|
| 60 |
Oss.sound_set_parms dev (Remix.channels remix) (Remix.samplerate remix); |
|---|
| 61 |
Oss.sound_write dev sound; |
|---|
| 62 |
Oss.sound_close dev;; |
|---|