view yetilab/stream/syntheticstream.yeti @ 101:2bc6534248fe

Tidier comments
author Chris Cannam
date Thu, 21 Mar 2013 21:53:13 +0000
parents d0abc9afe608
children ed7e1fb91745
line wrap: on
line source

module yetilab.stream.syntheticstream;

str = load yetilab.stream.stream;
vec = load yetilab.block.fvector;
block = load yetilab.block.block;

generated rate generator seconds =
    str.monoStream {
        var position = 0,
        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;
            block.block result),
        close = \(),
        };

sinusoid rate freq seconds =
    generated rate (sin . (* (freq / (2*pi * rate)))) seconds;

whiteNoise rate seconds =
    generated rate \((Math#random() * 2.0) - 1.0) seconds;

precalculated rate data is number -> ~double[] -> 'a =
   (n = vec.length data;
    str.monoStream {
        var position = 0,
        len = n,
        rate,
        read count = 
           (rc = min count (len - position);
            result = vec.rangeOf data position rc;
            position := position + rc;
            block.block result),
        close = \(),
    });

{
    generated, precalculated, sinusoid, whiteNoise,
}