# HG changeset patch # User Chris Cannam # Date 1380296446 -3600 # Node ID 0321896e7bbd9fa4a9bc0721e3230357b1a1d486 # Parent 1184df2a65a5736aee98fed99c9770bca6e04d13 Add simple waveform generators (square, saw, triangle) diff -r 1184df2a65a5 -r 0321896e7bbd src/may/stream/waves.yeti --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/may/stream/waves.yeti Fri Sep 27 16:40:46 2013 +0100 @@ -0,0 +1,34 @@ + +// Simple (rather than efficient) definitions of bandlimited wave +// shapes + +module may.stream.waves; + +{ sinusoid } = load may.stream.syntheticstream; +{ sum, scaledBy } = load may.stream.manipulate; + +square rate freq = + sum + (map do n: + m = n*2 + 1; + scaledBy (1/m) + (sinusoid rate (m * freq)) + done [0 .. int (rate/4 / freq) - 1]); + +saw rate freq = + sum + (map do n: + scaledBy if n % 2 == 0 then -1/n else 1/n fi + (sinusoid rate (n * freq)) + done [1 .. int (rate/2 / freq)]); + +triangle rate freq = + sum + (map do n: + m = n*2 + 1; + scaledBy if n % 2 == 0 then -1/(m*m) else 1/(m*m) fi + (sinusoid rate (m * freq)) + done [0 .. int (rate/4 / freq) - 1]); + +{ square, saw, triangle } +