view yetilab/stream/syntheticstream.yeti @ 173:2cb4c78d42db

Another test
author Chris Cannam
date Thu, 02 May 2013 17:38:23 +0100
parents 5a1db7299a08
children 7cfcc3a07177
line wrap: on
line source

module yetilab.stream.syntheticstream;

ch = load yetilab.stream.channels;
vec = load yetilab.block.fvector;
block = load yetilab.block.block;

load yetilab.stream.streamtype;

generated sampleRate generator =
   (// generator takes time in seconds as arg, returns number in -1,+1 range
    var position = 0;
    {
        get position () = position,
        get channels () = 1, 
        get sampleRate () = sampleRate,
        get available () = Infinite (),
        get finished? () = false,
        read count = ch.deinterleaved 1
           (result = vec.zeros count;
            for [0..count-1] do i:
                result[i] := generator ((position + i) / sampleRate)
            done;
            position := position + count;
            block.block result),
        close = \(),
    });

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

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

silent rate =
    generated rate \0;

precalculated rate data =
   (n = block.length data;
    var position = 0;
    {
        get position () = position,
        get channels () = 1,
        get sampleRate () = rate,
        get available () = Known (n - position),
        get finished? () = not (n > position),
        read count = ch.deinterleaved 1
           (rc = min count (n - position);
            result = block.rangeOf data position rc;
            position := position + rc;
            result),
        close = \(),
    });

{
    generated, 
    precalculated, 
    sinusoid, 
    whiteNoise, 
    silent,
} as {
    generated is number -> (number -> number) -> stream, 
    precalculated is number -> 'a -> stream, //!!! 'a is block 
    sinusoid is number -> number -> stream, 
    whiteNoise is number -> stream,
    silent is number -> stream,
}