module Csound.Air.Wave (
osc, oscBy, saw, isaw, pulse, sqr, pw, tri, ramp, blosc,
unipolar, bipolar, on, uon, uosc, uoscBy, usaw, uisaw, upulse, usqr, upw, utri, uramp, ublosc,
rndh, urndh, rndi, urndi, white, pink,
fosc,
Lfo, lfo
) where
import Csound.Typed
import Csound.Typed.Opcode hiding (lfo)
import Csound.Tab(sine, sines4)
import Csound.SigSpace
osc :: Sig -> Sig
osc cps = oscil3 1 cps sine
oscBy :: Tab -> Sig -> Sig
oscBy tb cps = oscil3 1 cps tb
unipolar :: Sig -> Sig
unipolar a = 0.5 + 0.5 * a
bipolar :: Sig -> Sig
bipolar a = 2 * a 1
uosc :: Sig -> Sig
uosc = unipolar . osc
uoscBy :: Tab -> Sig -> Sig
uoscBy tb = unipolar . oscBy tb
usaw :: Sig -> Sig
usaw = unipolar . saw
uisaw :: Sig -> Sig
uisaw = unipolar . isaw
usqr :: Sig -> Sig
usqr = unipolar . sqr
utri :: Sig -> Sig
utri = unipolar . tri
upulse :: Sig -> Sig
upulse = unipolar . pulse
ublosc :: Tab -> Sig -> Sig
ublosc tb = unipolar . blosc tb
fosc :: Sig -> Sig -> Sig -> Sig -> Sig
fosc car mod ndx cps = foscili 1 cps car mod ndx sine
pw :: Sig -> Sig -> Sig
pw duty cps = vco2 1 cps `withD` 2 `withSig` duty
ramp :: Sig -> Sig -> Sig
ramp duty cps = vco2 1 cps `withD` 4 `withSig` (uon 0.01 0.99 $ duty)
upw :: Sig -> Sig -> Sig
upw duty cps = unipolar $ pw duty cps
uramp :: Sig -> Sig -> Sig
uramp duty cps = unipolar $ ramp duty cps
on :: SigSpace a => Sig -> Sig -> a -> a
on a b x = uon a b $ mapSig unipolar x
uon :: SigSpace a => Sig -> Sig -> a -> a
uon a b = mapSig (\x -> a + (b a) * x)
rndh :: Sig -> SE Sig
rndh = randh 1
rndi :: Sig -> SE Sig
rndi = randi 1
urndh :: Sig -> SE Sig
urndh = fmap unipolar . rndh
urndi :: Sig -> SE Sig
urndi = fmap unipolar . rndi
white :: SE Sig
white = noise 1 0
pink :: SE Sig
pink = pinkish 1
type Lfo = Sig
lfo :: (Sig -> Sig) -> Sig -> Sig -> Sig
lfo shape depth rate = depth * shape rate