GENERIC: next-value ( generator -- value ) ! Sine generator TUPLE: sine-generator amplitude current delta ; : ( amplitude freq -- sine-generator ) 2 pi * swap / [ pi ] dip sine-generator boa ; M: sine-generator next-value [ current>> sin ] [ amplitude>> ] [ dup [ current>> ] [ delta>> ] bi + dup 2 pi * >= [ 2 pi * - ] when >>current drop ] tri * ; : sine-data ( samples sample-rate amplitude freq -- byte-array ) pick swap / [ drop 0 ] dip [ next-value nip ] curry map ;