{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Causal.Oscillator.Core where
import qualified Synthesizer.Basic.Phase as Phase
import qualified Synthesizer.Causal.Process as Causal
import qualified Synthesizer.State.Signal as Sig
import Control.Arrow ((^<<), (&&&), second, returnA, )
import qualified Algebra.RealRing as RealRing
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE static #-}
static :: RealRing.C a =>
Phase.T a -> a -> Sig.T (Phase.T a)
static :: forall a. C a => T a -> a -> T (T a)
static T a
phase a
freq =
forall a. (a -> a) -> a -> T a
Sig.iterate (forall a. C a => a -> T a -> T a
Phase.increment a
freq) T a
phase
{-# INLINE phaseMod #-}
phaseMod :: (RealRing.C a) =>
a -> Causal.T a (Phase.T a)
phaseMod :: forall a. C a => a -> T a (T a)
phaseMod a
freq =
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. C a => a -> T a -> T a
Phase.increment forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
forall (sig :: * -> *) a b. Read sig a => sig a -> T b (b, a)
Causal.feedSnd (forall a. C a => T a -> a -> T (T a)
static forall a. C a => a
zero a
freq)
{-# INLINE shapeMod #-}
shapeMod :: (RealRing.C a) =>
Phase.T a -> a -> Causal.T c (c, Phase.T a)
shapeMod :: forall a c. C a => T a -> a -> T c (c, T a)
shapeMod T a
phase a
freq =
forall (sig :: * -> *) a b. Read sig a => sig a -> T b (b, a)
Causal.feedSnd (forall a. C a => T a -> a -> T (T a)
static T a
phase a
freq)
{-# INLINE freqMod #-}
freqMod :: RealRing.C a =>
Phase.T a -> Causal.T a (Phase.T a)
freqMod :: forall a. C a => T a -> T a (T a)
freqMod =
forall acc x. (acc -> x -> acc) -> acc -> T x acc
Causal.scanL (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. C a => a -> T a -> T a
Phase.increment)
{-# INLINE freqModSync #-}
freqModSync :: RealRing.C a =>
Phase.T a -> Causal.T a (Phase.T a)
freqModSync :: forall a. C a => T a -> T a (T a)
freqModSync =
forall x acc y. (x -> acc -> Maybe (y, acc)) -> acc -> T x y
Causal.crochetL
(\a
f T a
p0 -> let p1 :: T a
p1 = forall a. C a => a -> T a -> T a
Phase.increment a
f T a
p0 in forall a. a -> Maybe a
Just (T a
p1,T a
p1))
{-# INLINE freqModAntiAlias #-}
freqModAntiAlias :: (RealRing.C a) =>
Phase.T a -> Causal.T a (a, Phase.T a)
freqModAntiAlias :: forall a. C a => T a -> T a (a, T a)
freqModAntiAlias T a
phase =
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& forall a. C a => T a -> T a (T a)
freqMod T a
phase
{-# INLINE phaseFreqMod #-}
phaseFreqMod :: (RealRing.C a) =>
Causal.T (a,a) (Phase.T a)
phaseFreqMod :: forall a. C a => T (a, a) (T a)
phaseFreqMod =
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. C a => a -> T a -> T a
Phase.increment forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (forall a. C a => T a -> T a (T a)
freqMod forall a. C a => a
zero)
{-# INLINE shapeFreqMod #-}
shapeFreqMod :: (RealRing.C a) =>
Phase.T a -> Causal.T (c,a) (c, Phase.T a)
shapeFreqMod :: forall a c. C a => T a -> T (c, a) (c, T a)
shapeFreqMod T a
phase =
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (forall a. C a => T a -> T a (T a)
freqMod T a
phase)