{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Synthesizer.Plain.Filter.Recursive.FirstOrderComplex (
Parameter,
parameter,
parameterFromPeakWidth,
parameterFromPeakToDCRatio,
step,
modifierInit,
modifier,
causal,
runInit,
run,
) where
import Synthesizer.Plain.Filter.Recursive (Pole(..))
import qualified Synthesizer.Plain.Signal as Sig
import qualified Synthesizer.Plain.Modifier as Modifier
import qualified Synthesizer.Causal.Process as Causal
import qualified Synthesizer.Interpolation.Class as Interpol
import qualified Synthesizer.Basic.ComplexModule as CM
import qualified Number.Complex as Complex
import qualified Algebra.Module as Module
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Algebraic as Algebraic
import qualified Algebra.Ring as Ring
import Control.Monad.Trans.State (State, state, )
import NumericPrelude.Numeric
import NumericPrelude.Base
data Parameter a =
Parameter {forall a. Parameter a -> T a
c, forall a. Parameter a -> T a
amp :: !(Complex.T a)}
deriving Int -> Parameter a -> ShowS
forall a. Show a => Int -> Parameter a -> ShowS
forall a. Show a => [Parameter a] -> ShowS
forall a. Show a => Parameter a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Parameter a] -> ShowS
$cshowList :: forall a. Show a => [Parameter a] -> ShowS
show :: Parameter a -> String
$cshow :: forall a. Show a => Parameter a -> String
showsPrec :: Int -> Parameter a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Parameter a -> ShowS
Show
instance Interpol.C a v => Interpol.C a (Parameter v) where
{-# INLINE scaleAndAccumulate #-}
scaleAndAccumulate :: (a, Parameter v) -> (Parameter v, Parameter v -> Parameter v)
scaleAndAccumulate = forall a x y v.
(C a x, C a y) =>
(x -> y -> v) -> (v -> x) -> (v -> y) -> (a, v) -> (v, v -> v)
Interpol.makeMac2 forall a. T a -> T a -> Parameter a
Parameter forall a. Parameter a -> T a
c forall a. Parameter a -> T a
amp
{-# INLINE parameter #-}
parameter :: Trans.C a => Pole a -> Parameter a
parameter :: forall a. C a => Pole a -> Parameter a
parameter (Pole a
resonance a
frequency) =
let cisw :: T a
cisw = forall a. C a => a -> T a
Complex.cis (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
frequency)
k :: a
k = a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
recip a
resonance
kcisw :: T a
kcisw = forall a. C a => a -> T a -> T a
Complex.scale a
k T a
cisw
in forall a. T a -> T a -> Parameter a
Parameter T a
kcisw forall a. C a => a
one
{-# INLINE parameterFromPeakWidth #-}
parameterFromPeakWidth :: Trans.C a => a -> Pole a -> Parameter a
parameterFromPeakWidth :: forall a. C a => a -> Pole a -> Parameter a
parameterFromPeakWidth a
width (Pole a
resonance a
frequency) =
let cisw :: T a
cisw = forall a. C a => a -> T a
Complex.cis (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
frequency)
k :: a
k = forall a. C a => a -> a -> a
solveRatio a
resonance (forall a. C a => a -> a
cos (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
width))
kcisw :: T a
kcisw = forall a. C a => a -> T a -> T a
Complex.scale a
k T a
cisw
amp_ :: T a
amp_ = forall a. C a => a -> T a
Complex.fromReal ((a
1forall a. C a => a -> a -> a
-a
k)forall a. C a => a -> a -> a
*a
resonance)
in forall a. T a -> T a -> Parameter a
Parameter T a
kcisw T a
amp_
{-# INLINE parameterFromPeakToDCRatio #-}
parameterFromPeakToDCRatio :: Trans.C a => Pole a -> Parameter a
parameterFromPeakToDCRatio :: forall a. C a => Pole a -> Parameter a
parameterFromPeakToDCRatio (Pole a
resonance a
frequency) =
let cisw :: T a
cisw = forall a. C a => a -> T a
Complex.cis (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
frequency)
k :: a
k = forall a. C a => a -> a -> a
solveRatio a
resonance (forall a. T a -> a
Complex.real T a
cisw)
kcisw :: T a
kcisw = forall a. C a => a -> T a -> T a
Complex.scale a
k T a
cisw
amp_ :: T a
amp_ = forall a. C a => a
one forall a. C a => a -> a -> a
- T a
kcisw
in forall a. T a -> T a -> Parameter a
Parameter T a
kcisw T a
amp_
solveRatio :: (Algebraic.C a) =>
a -> a -> a
solveRatio :: forall a. C a => a -> a -> a
solveRatio a
resonance a
cosine =
let r2 :: a
r2 = a
resonanceforall a. C a => a -> Integer -> a
^Integer
2
p :: a
p = (a
r2 forall a. C a => a -> a -> a
- a
cosine) forall a. C a => a -> a -> a
/ (a
r2 forall a. C a => a -> a -> a
- a
1)
in forall a. C a => a -> a
recip forall a b. (a -> b) -> a -> b
$ a
p forall a. C a => a -> a -> a
+ forall a. C a => a -> a
sqrt (a
pforall a. C a => a -> Integer -> a
^Integer
2 forall a. C a => a -> a -> a
- a
1)
type Result = Complex.T
{-# INLINE step #-}
step :: (Module.C a v) =>
Parameter a -> v -> State (Complex.T v) (Result v)
step :: forall a v. C a v => Parameter a -> v -> State (T v) (T v)
step Parameter a
p v
u =
forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \T v
s ->
let y :: T v
y = forall a v. C a v => T a -> v -> T v
CM.scale (forall a. Parameter a -> T a
amp Parameter a
p) v
u forall a. C a => a -> a -> a
+ forall a v. C a v => T a -> T v -> T v
CM.mul (forall a. Parameter a -> T a
c Parameter a
p) T v
s
in (T v
y, T v
y)
{-# INLINE modifierInit #-}
modifierInit :: (Ring.C a, Module.C a v) =>
Modifier.Initialized (Complex.T v) (Complex.T v) (Parameter a) v (Result v)
modifierInit :: forall a v.
(C a, C a v) =>
Initialized (T v) (T v) (Parameter a) v (T v)
modifierInit =
forall s init ctrl a b.
(init -> s)
-> (ctrl -> a -> State s b) -> Initialized s init ctrl a b
Modifier.Initialized forall a. a -> a
id forall a v. C a v => Parameter a -> v -> State (T v) (T v)
step
{-# INLINE modifier #-}
modifier :: (Ring.C a, Module.C a v) =>
Modifier.Simple (Complex.T v) (Parameter a) v (Result v)
modifier :: forall a v. (C a, C a v) => Simple (T v) (Parameter a) v (T v)
modifier = forall s init ctrl a b.
ModifierInit s init ctrl a b -> init -> Modifier s ctrl a b
Sig.modifierInitialize forall a v.
(C a, C a v) =>
Initialized (T v) (T v) (Parameter a) v (T v)
modifierInit forall a. C a => a
zero
{-# INLINE causal #-}
causal ::
(Ring.C a, Module.C a v) =>
Causal.T (Parameter a, v) (Result v)
causal :: forall a v. (C a, C a v) => T (Parameter a, v) (Result v)
causal =
forall s ctrl a b. Simple s ctrl a b -> T (ctrl, a) b
Causal.fromSimpleModifier forall a v. (C a, C a v) => Simple (T v) (Parameter a) v (T v)
modifier
{-# INLINE runInit #-}
runInit :: (Ring.C a, Module.C a v) =>
Complex.T v -> Sig.T (Parameter a) -> Sig.T v -> Sig.T (Result v)
runInit :: forall a v.
(C a, C a v) =>
T v -> T (Parameter a) -> T v -> T (T v)
runInit = forall s init ctrl a b.
ModifierInit s init ctrl a b -> init -> T ctrl -> T a -> T b
Sig.modifyModulatedInit forall a v.
(C a, C a v) =>
Initialized (T v) (T v) (Parameter a) v (T v)
modifierInit
{-# INLINE run #-}
run :: (Ring.C a, Module.C a v) =>
Sig.T (Parameter a) -> Sig.T v -> Sig.T (Result v)
run :: forall a v. (C a, C a v) => T (Parameter a) -> T v -> T (Result v)
run = forall a v.
(C a, C a v) =>
T v -> T (Parameter a) -> T v -> T (T v)
runInit forall a. C a => a
zero