rendered paste body
\ ==========================================================
\ DSP in Forth using the Floating Point Stack
\ ==========================================================
needs shorts.fs
\ ----------------------------------------------------------
44100 shorts allocate throw constant wave-sample
60e fconstant frequency
32767e fconstant amplitude
44100e fconstant sample-rate
fvariable angle
0e angle f!
\ ----------------------------------------------------------
: radians ( F: r -- r )
2e pi f* f* ;
: radian
1e radians ;
\ ---[ Used to increment the angle ]------------------------
: angle-difference ( F: -- r )
[ radian sample-rate f/ frequency f* ] fliteral ;
: angle++ ( -- )
angle f@ angle-difference f+ angle f! ;
\ ----------------------------------------------------------
: generate-point ( -- n )
angle f@ fsin amplitude f* f>d drop ;
\ ----------------------------------------------------------
: generate-wave ( array len -- )
0 do
generate-point
over w!
angle++ short+
loop drop ;
\ ----------------------------------------------------------
: wave.
0 do dup w@ cr w. short+ loop drop ;
\ ----------------------------------------------------------
wave-sample 44100 generate-wave
wave-sample 44100 wave.