Mercurial > hg > may
changeset 4:0009af03700e
Rename audio -> audiofile
author | Chris Cannam |
---|---|
date | Thu, 06 Dec 2012 22:19:46 +0000 |
parents | 29e39209360b |
children | b0f6d10dee56 |
files | audio.yeti audiofile.yeti |
diffstat | 2 files changed, 96 insertions(+), 96 deletions(-) [+] |
line wrap: on
line diff
--- a/audio.yeti Thu Dec 06 22:19:29 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ - -module audio; - -import javax.sound.sampled: - AudioSystem, AudioInputStream, AudioFormat, AudioFormat$Encoding, - UnsupportedAudioFileException; - -import java.io: File, IOException; - -import java.nio: ByteBuffer, ByteOrder; - -mat = load matrix; - -open name is string -> 'a = - (f = new File(name); - stream = AudioSystem#getAudioInputStream(f); - format = stream#getFormat(); - { stream, format } ); - -close { stream is ~AudioInputStream } = - stream#close(); - -decode8u bytes floats n is ~byte[] -> ~float[] -> number -> () = - (for [0..n-1] do i: - floats[i] := (bytes[i] / 128.0) - 1.0; - done - ); - -decode16s bytes floats n is ~byte[] -> ~float[] -> 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; - done - ); - -decode32f bytes floats n is ~byte[] -> ~float[] -> 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); - 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 = - (if format#isBigEndian() then - decodeFail() - else - enc = format#getEncoding(); - bits = format#getSampleSizeInBits(); - if bits == 32 then - decode32f bytes floats n; - elif bits == 16 and enc == AudioFormat$Encoding#PCM_SIGNED then - decode16s bytes floats n; - elif bits == 8 and enc == AudioFormat$Encoding#PCM_UNSIGNED then - decode8u bytes floats n; - else - decodeFail(); - fi - fi); - -readInterleaved { format is ~AudioFormat, stream is ~AudioInputStream } nframes = - (channels = format#getChannels(); - bytesPerSample = format#getSampleSizeInBits() / 8; - bytes = new byte[nframes * channels * bytesPerSample]; - bytesRead = stream#read(bytes); - n = bytesRead / bytesPerSample; - floats = new float[n]; - decode { format } bytes floats n; - floats; - ); - -read { format is ~AudioFormat, stream is ~AudioInputStream } n = - (floats = readInterleaved { format, stream } n; - channels = format#getChannels(); - mat.deinterleaved channels (array floats); //!!! want to pass just floats - ); - -readAllInterleaved { format is ~AudioFormat, stream is ~AudioInputStream } = - readInterleaved { format, stream } stream#getFrameLength(); - -readAll { format is ~AudioFormat, stream is ~AudioInputStream } = - read { format, stream } stream#getFrameLength(); - -{ - open, - read, - readAll, - readInterleaved, - readAllInterleaved, - close -} -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/audiofile.yeti Thu Dec 06 22:19:46 2012 +0000 @@ -0,0 +1,96 @@ + +module audio; + +import javax.sound.sampled: + AudioSystem, AudioInputStream, AudioFormat, AudioFormat$Encoding, + UnsupportedAudioFileException; + +import java.io: File, IOException; + +import java.nio: ByteBuffer, ByteOrder; + +mat = load matrix; + +open name is string -> 'a = + (f = new File(name); + stream = AudioSystem#getAudioInputStream(f); + format = stream#getFormat(); + { stream, format } ); + +close { stream is ~AudioInputStream } = + stream#close(); + +decode8u bytes floats n is ~byte[] -> ~float[] -> number -> () = + (for [0..n-1] do i: + floats[i] := (bytes[i] / 128.0) - 1.0; + done + ); + +decode16s bytes floats n is ~byte[] -> ~float[] -> 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; + done + ); + +decode32f bytes floats n is ~byte[] -> ~float[] -> 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); + 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 = + (if format#isBigEndian() then + decodeFail() + else + enc = format#getEncoding(); + bits = format#getSampleSizeInBits(); + if bits == 32 then + decode32f bytes floats n; + elif bits == 16 and enc == AudioFormat$Encoding#PCM_SIGNED then + decode16s bytes floats n; + elif bits == 8 and enc == AudioFormat$Encoding#PCM_UNSIGNED then + decode8u bytes floats n; + else + decodeFail(); + fi + fi); + +readInterleaved { format is ~AudioFormat, stream is ~AudioInputStream } nframes = + (channels = format#getChannels(); + bytesPerSample = format#getSampleSizeInBits() / 8; + bytes = new byte[nframes * channels * bytesPerSample]; + bytesRead = stream#read(bytes); + n = bytesRead / bytesPerSample; + floats = new float[n]; + decode { format } bytes floats n; + floats; + ); + +read { format is ~AudioFormat, stream is ~AudioInputStream } n = + (floats = readInterleaved { format, stream } n; + channels = format#getChannels(); + mat.deinterleaved channels (array floats); //!!! want to pass just floats + ); + +readAllInterleaved { format is ~AudioFormat, stream is ~AudioInputStream } = + readInterleaved { format, stream } stream#getFrameLength(); + +readAll { format is ~AudioFormat, stream is ~AudioInputStream } = + read { format, stream } stream#getFrameLength(); + +{ + open, + read, + readAll, + readInterleaved, + readAllInterleaved, + close +} +