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