{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Interpolation.Core (
linear,
cubic,
cubicAlt,
) where
import qualified Algebra.Module as Module
import qualified Algebra.Field as Field
import Synthesizer.Utility (affineComb, )
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE linear #-}
linear ::
(Module.C a v) =>
v -> v -> a -> v
linear :: forall a v. C a v => v -> v -> a -> v
linear v
x0 v
x1 a
phase = a -> (v, v) -> v
forall t y. C t y => t -> (y, y) -> y
affineComb a
phase (v
x0,v
x1)
{-# INLINE cubic #-}
cubic ::
(Module.C a v, Field.C a) =>
v -> v -> v -> v -> a -> v
cubic :: forall a v. (C a v, C a) => v -> v -> v -> v -> a -> v
cubic v
xm1 v
x0 v
x1 v
x2 a
t =
let lipm12 :: v
lipm12 = a -> (v, v) -> v
forall t y. C t y => t -> (y, y) -> y
affineComb a
t (v
xm1,v
x2)
lip01 :: v
lip01 = a -> (v, v) -> v
forall t y. C t y => t -> (y, y) -> y
affineComb a
t (v
x0, v
x1)
three :: a
three = a
3 a -> a -> a
forall a. a -> a -> a
`asTypeOf` a
t
in v
lip01 v -> v -> v
forall a. C a => a -> a -> a
+ (a
ta -> a -> a
forall a. C a => a -> a -> a
*(a
ta -> a -> a
forall a. C a => a -> a -> a
-a
1)a -> a -> a
forall a. C a => a -> a -> a
/a
2) a -> v -> v
forall a v. C a v => a -> v -> v
*>
(v
lipm12 v -> v -> v
forall a. C a => a -> a -> a
+ (v
x0v -> v -> v
forall a. C a => a -> a -> a
+v
x1) v -> v -> v
forall a. C a => a -> a -> a
- a
three a -> v -> v
forall a v. C a v => a -> v -> v
*> v
lip01)
{-# INLINE cubicAlt #-}
cubicAlt ::
(Module.C a v, Field.C a) =>
v -> v -> v -> v -> a -> v
cubicAlt :: forall a v. (C a v, C a) => v -> v -> v -> v -> a -> v
cubicAlt v
xm1 v
x0 v
x1 v
x2 a
t =
let half :: a
half = a
1a -> a -> a
forall a. C a => a -> a -> a
/a
2 a -> a -> a
forall a. a -> a -> a
`asTypeOf` a
t
in a -> v -> v -> v
forall t y. C t y => t -> y -> y -> y
cubicHalf a
t v
x0 (a
half a -> v -> v
forall a v. C a v => a -> v -> v
*> (v
x1v -> v -> v
forall a. C a => a -> a -> a
-v
xm1)) v -> v -> v
forall a. C a => a -> a -> a
+
a -> v -> v -> v
forall t y. C t y => t -> y -> y -> y
cubicHalf (a
1a -> a -> a
forall a. C a => a -> a -> a
-a
t) v
x1 (a
half a -> v -> v
forall a v. C a v => a -> v -> v
*> (v
x0v -> v -> v
forall a. C a => a -> a -> a
-v
x2))
{-# INLINE cubicHalf #-}
cubicHalf :: (Module.C t y) => t -> y -> y -> y
cubicHalf :: forall t y. C t y => t -> y -> y -> y
cubicHalf t
t y
x y
x' =
(t
tt -> t -> t
forall a. C a => a -> a -> a
-t
1)t -> Integer -> t
forall a. C a => a -> Integer -> a
^Integer
2 t -> y -> y
forall a v. C a v => a -> v -> v
*> ((t
1t -> t -> t
forall a. C a => a -> a -> a
+t
2t -> t -> t
forall a. C a => a -> a -> a
*t
t)t -> y -> y
forall a v. C a v => a -> v -> v
*>y
x y -> y -> y
forall a. C a => a -> a -> a
+ t
tt -> y -> y
forall a v. C a v => a -> v -> v
*>y
x')