changeset 19:327dac3a8e1f

Tidy up streams a bit
author Chris Cannam
date Mon, 17 Dec 2012 16:00:12 +0000
parents 12c6f103ba8e
children 0b04bc5d2e53
files fvector.yeti stream.yeti syntheticstream.yeti
diffstat 3 files changed, 57 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/fvector.yeti	Mon Dec 17 14:45:55 2012 +0000
+++ b/fvector.yeti	Mon Dec 17 16:00:12 2012 +0000
@@ -12,11 +12,11 @@
     for [0..len-1] do i: v[i] := arr[i] done;
     v);
 
-arrayWrap a is ~double[] -> array<number> = array(a);
+listWrap a is ~double[] -> list<number> = list a;
 
-vectorLength v = length (arrayWrap v);
+vectorLength v = length (listWrap v);
 
-copyOfVector v is ~double[] -> ~double[] = Arrays#copyOf(v, length(arrayWrap v));
+copyOfVector v is ~double[] -> ~double[] = Arrays#copyOf(v, length(listWrap v));
 
 subVector v start len is ~double[] -> number -> number -> ~double[] = Arrays#copyOfRange(v, start, start + len);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stream.yeti	Mon Dec 17 16:00:12 2012 +0000
@@ -0,0 +1,37 @@
+
+module stream;
+
+vec = load fvector;
+
+monoStream box =
+   (readAll box = box.read (box.len - box.position);
+    {
+        get position () = box.position,
+        get channels () = 1,
+        get sampleRate () = box.rate,
+        get available () = box.len - box.position,
+        read = box.read,
+        readInterleaved = box.read,
+        readMono = box.read,
+        readAll = readAll box,
+        readAllInterleaved = readAll box,
+        readAllMono = readAll box,
+    });
+
+stream box = 
+   (readAll box = box.read (box.len - box.position);
+    {
+        get position () = box.position,
+        get channels () = box.channels,
+        get sampleRate () = box.rate,
+        get available () = box.len - box.position,
+        read = box.read,
+        readInterleaved = box.readInterleaved,
+        readMono = box.readMono,
+        readAll = box.read (box.len - box.position),
+        readAllInterleaved = box.readInterleaved (box.len - box.position),
+        readAllMono = box.readMono (box.len - box.position),
+    });
+
+{ monoStream, stream }
+
--- a/syntheticstream.yeti	Mon Dec 17 14:45:55 2012 +0000
+++ b/syntheticstream.yeti	Mon Dec 17 16:00:12 2012 +0000
@@ -1,58 +1,44 @@
 
 module syntheticstream;
 
+str = load stream;
 vec = load fvector;
 
-makeStreamFromMono rate s n =
-    {
-        get channels () = 1,
-        get sampleRate () = rate,
-        get available () = n - s.position,
-        get finished? () = n <= s.position,
-        read = s.readInterleaved,
-        readInterleaved = s.readInterleaved,
-        readMono = s.readInterleaved,
-        readAll () = s.readInterleaved (n - s.position),
-        readAllInterleaved () = s.readInterleaved (n - s.position),
-        readAllMono () = s.readInterleaved (n - s.position),
-        close = id,
-    };
-
-monoStream rate generator seconds =
-   (n = seconds * rate;
-    box = {
+generated rate generator seconds =
+    str.monoStream {
         var position = 0,
-        readInterleaved count = 
-           (rc = if position + count > n then n - position else count fi;
+        len = int(seconds * rate + 0.5),
+        rate,
+        read count = 
+           (rc = min count (len - position);
             result = vec.zeros rc;
             for [0..rc-1] do i:
                 result[i] := generator ((position + i) / rate)
             done;
             position := position + rc;
             result),
-    };
-    makeStreamFromMono rate box n);
+        };
 
 sinusoid rate freq =
-    monoStream rate (sin . (* (freq / (2*pi * rate))));
+    generated rate (sin . (* (freq / (2*pi * rate))));
 
 whiteNoise rate =
-    monoStream rate \((Math#random() * 2.0) - 1.0);
+    generated rate \((Math#random() * 2.0) - 1.0);
 
 precalculated rate data is number -> ~double[] -> 'a =
    (n = vec.vectorLength data;
-    box = {
+    str.monoStream {
         var position = 0,
-        readInterleaved count = 
-           (rc = if position + count > n then n - position else count fi;
+        len = n,
+        rate,
+        read count = 
+           (rc = min count (len - position);
             result = vec.subVector data position rc;
             position := position + rc;
             result),
-        get available () = n - position,
-    };
-    makeStreamFromMono rate box n);
+    });
 
 {
-    monoStream, sinusoid, whiteNoise, precalculated
+    generated, precalculated, sinusoid, whiteNoise,
 }