changeset 7:c5dc45708e74

Finish initial set of functions in primitive-array backed matrix; use in audiofile
author Chris Cannam
date Wed, 12 Dec 2012 17:12:34 +0000
parents 0718b9253e59
children dc72a1d15901
files audiofile.yeti floatrix.yeti
diffstat 2 files changed, 30 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/audiofile.yeti	Wed Dec 12 15:55:08 2012 +0000
+++ b/audiofile.yeti	Wed Dec 12 17:12:34 2012 +0000
@@ -9,7 +9,7 @@
 
 import java.nio: ByteBuffer, ByteOrder;
 
-mat = load matrix;
+mat = load floatrix;
 
 open name is string -> 'a = 
    (f = new File(name);
@@ -20,43 +20,43 @@
 close { stream is ~AudioInputStream } =
     stream#close();
 
-decode8u bytes floats n is ~byte[] -> ~float[] -> number -> () =
+decode8u bytes doubles n is ~byte[] -> ~double[] -> number -> () =
    (for [0..n-1] do i:
-       floats[i] := (bytes[i] / 128.0) - 1.0;
+       doubles[i] := (bytes[i] / 128.0) - 1.0;
     done
    );
 
-decode16s bytes floats n is ~byte[] -> ~float[] -> number -> () =
+decode16s bytes doubles n is ~byte[] -> ~double[] -> number -> () =
    (bb = ByteBuffer#wrap(bytes, 0, n * 2);
     bb#order(ByteOrder#LITTLE_ENDIAN);
     for [0..n-1] do i:
-       floats[i] := bb#getShort(i*2) / 32768.0;
+       doubles[i] := bb#getShort(i*2) / 32768.0;
     done
    );
 
-decode32f bytes floats n is ~byte[] -> ~float[] -> number -> () =
+decode32f bytes doubles n is ~byte[] -> ~double[] -> number -> () =
    (bb = ByteBuffer#wrap(bytes, 0, n * 4);
     bb#order(ByteOrder#LITTLE_ENDIAN);
     for [0..n-1] do i:
-       floats[i] := bb#getFloat(i*4);
+       doubles[i] := bb#getFloat(i*4);
     done
    );
 
 decodeFail () = 
     throw new UnsupportedAudioFileException("File format not supported. Supported formats are 8-bit unsigned PCM, 16-bit signed little-endian PCM, or IEEE float");
 
-decode { format is ~AudioFormat } bytes floats n = 
+decode { format is ~AudioFormat } bytes doubles n = 
    (if format#isBigEndian() then
         decodeFail()
     else
         enc = format#getEncoding();
         bits = format#getSampleSizeInBits();
         if bits == 32 then
-            decode32f bytes floats n;
+            decode32f bytes doubles n;
         elif bits == 16 and enc == AudioFormat$Encoding#PCM_SIGNED then
-            decode16s bytes floats n;
+            decode16s bytes doubles n;
         elif bits == 8 and enc == AudioFormat$Encoding#PCM_UNSIGNED then
-            decode8u bytes floats n;
+            decode8u bytes doubles n;
         else
             decodeFail();
         fi
@@ -68,17 +68,19 @@
     bytes = new byte[nframes * channels * bytesPerSample];
     bytesRead = stream#read(bytes);
     n = bytesRead / bytesPerSample;
-    floats = new float[n];
-    decode { format } bytes floats n;
-    floats;
+    doubles = new double[n];
+    decode { format } bytes doubles n;
+    doubles;
    );
 
 read { format is ~AudioFormat, stream is ~AudioInputStream } n =
-   (floats = readInterleaved { format, stream } n;
+   (doubles = readInterleaved { format, stream } n;
     channels = format#getChannels();
-    mat.deinterleaved channels (array floats); //!!! want to pass just floats
+    mat.deinterleaved channels doubles;
    );
 
+//!!! these need to reset first (and there needs to be a reset function!)
+
 readAllInterleaved { format is ~AudioFormat, stream is ~AudioInputStream } =
    readInterleaved { format, stream } stream#getFrameLength();
 
--- a/floatrix.yeti	Wed Dec 12 15:55:08 2012 +0000
+++ b/floatrix.yeti	Wed Dec 12 17:12:34 2012 +0000
@@ -36,25 +36,25 @@
 transposed m is array<~double[]> -> array<~double[]> = 
     generateMatrix do row col: m[col][row] done (cols m) (rows m);
         
+interleaved m = 
+   ({ cols, rows } = dimensions m;
+    v = zeros (cols * rows);
+    for [0..rows-1] do row:
+        for [0..cols-1] do col:
+            v[col * rows + row] := m[row][col];
+        done;
+    done;
+    v);
 
-
-/*
-
-interleaved m = array(concat(transposed m));
-
-deinterleaved rows v =
+deinterleaved rows v is number -> ~double[] -> 'a =
     generateMatrix do row col:
         v[rows * col + row]
-    done rows (length v / rows);
-*/
+    done rows (length (arrayWrap v) / rows);
 
 {
 zeros, ones,
 generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix,
 width, cols, height, rows, dimensions,
-transposed,
-/*
-interleaved, deinterleaved,
-*/
+transposed, interleaved, deinterleaved,
 }