Mercurial > hg > may
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, }