{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.State.Filter.Recursive.MovingAverage (
sumsStaticInt,
modulatedFrac,
) where
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.State.Filter.Recursive.Integration as Integration
import qualified Synthesizer.State.Filter.Delay as Delay
import qualified Algebra.Module as Module
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE sumsStaticInt #-}
sumsStaticInt :: (Additive.C v) => Int -> Sig.T v -> Sig.T v
sumsStaticInt :: forall v. C v => Int -> T v -> T v
sumsStaticInt Int
n T v
xs =
T v -> T v
forall v. C v => T v -> T v
Integration.run (T v
xs T v -> T v -> T v
forall a. C a => a -> a -> a
- Int -> T v -> T v
forall v. C v => Int -> T v -> T v
Delay.staticPos Int
n T v
xs)
{-# INLINE sumFromToFrac #-}
sumFromToFrac :: (RealField.C a, Module.C a v) => a -> a -> Sig.T v -> v
sumFromToFrac :: forall a v. (C a, C a v) => a -> a -> T v -> v
sumFromToFrac a
from a
to T v
xs =
let (Int
fromInt, a
fromFrac) = a -> (Int, a)
forall b. C b => a -> (b, a)
forall a b. (C a, C b) => a -> (b, a)
splitFraction a
from
(Int
toInt, a
toFrac) = a -> (Int, a)
forall b. C b => a -> (b, a)
forall a b. (C a, C b) => a -> (b, a)
splitFraction a
to
in case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
fromInt Int
toInt of
Ordering
EQ -> (a
toa -> a -> a
forall a. C a => a -> a -> a
-a
from) a -> v -> v
forall a v. C a v => a -> v -> v
*> Int -> T v -> v
forall a. Int -> T a -> a
Sig.index Int
fromInt T v
xs
Ordering
LT ->
T v -> v
forall a. C a => T a -> a
Sig.sum (T v -> v) -> T v -> v
forall a b. (a -> b) -> a -> b
$
((v -> v) -> v -> v) -> T (v -> v) -> T v -> T v
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith (v -> v) -> v -> v
forall a. a -> a
id
(((a
1a -> a -> a
forall a. C a => a -> a -> a
-a
fromFrac) a -> v -> v
forall a v. C a v => a -> v -> v
*>) (v -> v) -> T (v -> v) -> T (v -> v)
forall a. a -> T a -> T a
`Sig.cons`
Int -> (v -> v) -> T (v -> v)
forall a. Int -> a -> T a
Sig.replicate (Int
toIntInt -> Int -> Int
forall a. C a => a -> a -> a
-Int
fromIntInt -> Int -> Int
forall a. C a => a -> a -> a
-Int
1) v -> v
forall a. a -> a
id T (v -> v) -> T (v -> v) -> T (v -> v)
forall a. T a -> T a -> T a
`Sig.append`
(v -> v) -> T (v -> v)
forall a. a -> T a
Sig.singleton (a
toFrac a -> v -> v
forall a v. C a v => a -> v -> v
*>)) (T v -> T v) -> T v -> T v
forall a b. (a -> b) -> a -> b
$
Int -> T v -> T v
forall a. Int -> T a -> T a
Sig.drop Int
fromInt T v
xs
Ordering
GT ->
v -> v
forall a. C a => a -> a
negate (v -> v) -> v -> v
forall a b. (a -> b) -> a -> b
$ T v -> v
forall a. C a => T a -> a
Sig.sum (T v -> v) -> T v -> v
forall a b. (a -> b) -> a -> b
$
((v -> v) -> v -> v) -> T (v -> v) -> T v -> T v
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith (v -> v) -> v -> v
forall a. a -> a
id
(((a
1a -> a -> a
forall a. C a => a -> a -> a
-a
toFrac) a -> v -> v
forall a v. C a v => a -> v -> v
*>) (v -> v) -> T (v -> v) -> T (v -> v)
forall a. a -> T a -> T a
`Sig.cons`
Int -> (v -> v) -> T (v -> v)
forall a. Int -> a -> T a
Sig.replicate (Int
fromIntInt -> Int -> Int
forall a. C a => a -> a -> a
-Int
toIntInt -> Int -> Int
forall a. C a => a -> a -> a
-Int
1) v -> v
forall a. a -> a
id T (v -> v) -> T (v -> v) -> T (v -> v)
forall a. T a -> T a -> T a
`Sig.append`
(v -> v) -> T (v -> v)
forall a. a -> T a
Sig.singleton (a
fromFrac a -> v -> v
forall a v. C a v => a -> v -> v
*>)) (T v -> T v) -> T v -> T v
forall a b. (a -> b) -> a -> b
$
Int -> T v -> T v
forall a. Int -> T a -> T a
Sig.drop Int
toInt T v
xs
{-# INLINE sumDiffsModulated #-}
sumDiffsModulated :: (RealField.C a, Module.C a v) =>
a -> Sig.T a -> Sig.T v -> Sig.T v
sumDiffsModulated :: forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d T a
ds =
T v -> T v
forall y. T y -> T y
Sig.init (T v -> T v) -> (T v -> T v) -> T v -> T v
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((a, a) -> T v -> v) -> T (a, a) -> T v -> T v
forall y0 y1 y2. (y0 -> T y1 -> y2) -> T y0 -> T y1 -> T y2
Sig.zipWithTails ((a -> a -> T v -> v) -> (a, a) -> T v -> v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> a -> T v -> v
forall a v. (C a, C a v) => a -> a -> T v -> v
sumFromToFrac)
(T a -> T a -> T (a, a)
forall a b. T a -> T b -> T (a, b)
Sig.zip (a -> T a -> T a
forall a. a -> T a -> T a
Sig.cons (a
da -> a -> a
forall a. C a => a -> a -> a
+a
1) T a
ds) ((a -> a) -> T a -> T a
forall a b. (a -> b) -> T a -> T b
Sig.map (a
1a -> a -> a
forall a. C a => a -> a -> a
+) T a
ds)) (T v -> T v) -> (T v -> T v) -> T v -> T v
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
v -> T v -> T v
forall a. a -> T a -> T a
Sig.cons v
forall a. C a => a
zero
{-# INLINE sumsModulatedHalf #-}
sumsModulatedHalf :: (RealField.C a, Module.C a v) =>
Int -> Sig.T a -> Sig.T v -> Sig.T v
sumsModulatedHalf :: forall a v. (C a, C a v) => Int -> T a -> T v -> T v
sumsModulatedHalf Int
maxDInt T a
ds T v
xs =
let maxD :: a
maxD = Int -> a
forall a b. (C a, C b) => a -> b
fromIntegral Int
maxDInt
d0 :: a
d0 = a
maxDa -> a -> a
forall a. C a => a -> a -> a
+a
0.5
delXs :: T v
delXs = Int -> T v -> T v
forall v. C v => Int -> T v -> T v
Delay.staticPos Int
maxDInt T v
xs
posXs :: T v
posXs = a -> T a -> T v -> T v
forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d0 ((a -> a) -> T a -> T a
forall a b. (a -> b) -> T a -> T b
Sig.map (a
d0a -> a -> a
forall a. C a => a -> a -> a
+) T a
ds) T v
delXs
negXs :: T v
negXs = a -> T a -> T v -> T v
forall a v. (C a, C a v) => a -> T a -> T v -> T v
sumDiffsModulated a
d0 ((a -> a) -> T a -> T a
forall a b. (a -> b) -> T a -> T b
Sig.map (a
d0a -> a -> a
forall a. C a => a -> a -> a
-) T a
ds) T v
delXs
in T v -> T v
forall v. C v => T v -> T v
Integration.run (T v
posXs T v -> T v -> T v
forall a. C a => a -> a -> a
- T v
negXs)
{-# INLINE modulatedFrac #-}
modulatedFrac :: (RealField.C a, Module.C a v) =>
Int -> Sig.T a -> Sig.T v -> Sig.T v
modulatedFrac :: forall a v. (C a, C a v) => Int -> T a -> T v -> T v
modulatedFrac Int
maxDInt T a
ds T v
xs =
(a -> v -> v) -> T a -> T v -> T v
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith (\a
d v
y -> a -> a
forall a. C a => a -> a
recip (a
2a -> a -> a
forall a. C a => a -> a -> a
*a
d) a -> v -> v
forall a v. C a v => a -> v -> v
*> v
y) T a
ds (T v -> T v) -> T v -> T v
forall a b. (a -> b) -> a -> b
$
Int -> T a -> T v -> T v
forall a v. (C a, C a v) => Int -> T a -> T v -> T v
sumsModulatedHalf Int
maxDInt T a
ds T v
xs