{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Plain.Filter.Delay.List (modulated, modulatedRev) where
import qualified Synthesizer.Plain.Interpolation as Interpolation
import Data.List(tails)
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
import NumericPrelude.Base
modulatedRevCore :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> [a] -> [v] -> [v]
modulatedRevCore :: forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulatedRevCore T a v
ip Int
size [a]
ts [v]
xs =
(a -> [v] -> v) -> [a] -> [[v]] -> [v]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
(\a
t [v]
x ->
let (Int
ti,a
tf) = a -> (Int, a)
forall b. C b => a -> (b, a)
forall a b. (C a, C b) => a -> (b, a)
splitFraction a
t
in T a v -> a -> [v] -> v
forall t y. T t y -> t -> T y -> y
Interpolation.func T a v
ip a
tf (Int -> [v] -> [v]
forall a. Int -> [a] -> [a]
drop Int
ti [v]
x))
[a]
ts (Int -> [[v]] -> [[v]]
forall a. Int -> [a] -> [a]
drop Int
size (([v] -> v -> [v]) -> [v] -> [v] -> [[v]]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl ((v -> [v] -> [v]) -> [v] -> v -> [v]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) [] [v]
xs))
modulatedRev :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> [a] -> [v] -> [v]
modulatedRev :: forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulatedRev T a v
ip Int
maxDelay [a]
ts [v]
xs =
let size :: Int
size = Int
maxDelay Int -> Int -> Int
forall a. C a => a -> a -> a
+ T a v -> Int
forall t y. T t y -> Int
Interpolation.number T a v
ip
in T a v -> Int -> [a] -> [v] -> [v]
forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulatedRevCore T a v
ip
(Int
size Int -> Int -> Int
forall a. C a => a -> a -> a
+ Int
1 Int -> Int -> Int
forall a. C a => a -> a -> a
+ T a v -> Int
forall t y. T t y -> Int
Interpolation.offset T a v
ip)
[a]
ts
(Int -> v -> [v]
forall a. Int -> a -> [a]
replicate Int
size v
forall a. C a => a
zero [v] -> [v] -> [v]
forall a. [a] -> [a] -> [a]
++ [v]
xs)
modulatedCore :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> [a] -> [v] -> [v]
modulatedCore :: forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulatedCore T a v
ip Int
size [a]
ts [v]
xs =
(a -> [v] -> v) -> [a] -> [[v]] -> [v]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
(\a
t [v]
x ->
let (Int
ti,a
tf) = a -> (Int, a)
forall b. C b => a -> (b, a)
forall a b. (C a, C b) => a -> (b, a)
splitFraction (-a
t)
in T a v -> a -> [v] -> v
forall t y. T t y -> t -> T y -> y
Interpolation.func T a v
ip a
tf (Int -> [v] -> [v]
forall a. Int -> [a] -> [a]
drop (Int
sizeInt -> Int -> Int
forall a. C a => a -> a -> a
+Int
ti) [v]
x))
[a]
ts ([v] -> [[v]]
forall a. [a] -> [[a]]
tails [v]
xs)
modulated :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> [a] -> [v] -> [v]
modulated :: forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulated T a v
ip Int
maxDelay [a]
ts [v]
xs =
let size :: Int
size = Int
maxDelay Int -> Int -> Int
forall a. C a => a -> a -> a
+ T a v -> Int
forall t y. T t y -> Int
Interpolation.number T a v
ip
in T a v -> Int -> [a] -> [v] -> [v]
forall a v. (C a, C v) => T a v -> Int -> [a] -> [v] -> [v]
modulatedCore T a v
ip
(Int
size Int -> Int -> Int
forall a. C a => a -> a -> a
- T a v -> Int
forall t y. T t y -> Int
Interpolation.offset T a v
ip)
[a]
ts
(Int -> v -> [v]
forall a. Int -> a -> [a]
replicate Int
size v
forall a. C a => a
zero [v] -> [v] -> [v]
forall a. [a] -> [a] -> [a]
++ [v]
xs)