module Sound.SC3.Common.Math.Interpolate where
import Sound.SC3.Common.Math
type Interpolation_F t = t -> t -> t -> t
interpolate :: (Num t,Ord t) => Interpolation_F t -> (t,t) -> t -> t
interpolate :: Interpolation_F t -> (t, t) -> t -> t
interpolate Interpolation_F t
f (t
l,t
r) t
x = if t
x t -> t -> Bool
forall a. Ord a => a -> a -> Bool
< t
0 then t
l else if t
x t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> t
1 then t
r else Interpolation_F t
f t
l t
r t
x
step :: Interpolation_F t
step :: Interpolation_F t
step t
_ t
x1 t
_ = t
x1
linear :: Num t => Interpolation_F t
linear :: Interpolation_F t
linear t
x0 t
x1 t
t = t
t t -> t -> t
forall a. Num a => a -> a -> a
* (t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- t
x0) t -> t -> t
forall a. Num a => a -> a -> a
+ t
x0
exponential :: Floating t => Interpolation_F t
exponential :: Interpolation_F t
exponential t
x0 t
x1 t
t = t
x0 t -> t -> t
forall a. Num a => a -> a -> a
* ((t
x1 t -> t -> t
forall a. Fractional a => a -> a -> a
/ t
x0) t -> t -> t
forall a. Floating a => a -> a -> a
** t
t)
exponential_0 :: (Eq t,Floating t) => Interpolation_F t
exponential_0 :: Interpolation_F t
exponential_0 t
x0 t
x1 =
let epsilon :: t
epsilon = t
1e-6
x0' :: t
x0' = if t
x0 t -> t -> Bool
forall a. Eq a => a -> a -> Bool
== t
0 then t
epsilon t -> t -> t
forall a. Num a => a -> a -> a
* t -> t
forall a. Num a => a -> a
signum t
x1 else t
x0
in Interpolation_F t
forall t. Floating t => Interpolation_F t
exponential t
x0' t
x1
exponential_lin :: (Eq t,Floating t) => Interpolation_F t
exponential_lin :: Interpolation_F t
exponential_lin t
x0 t
x1 t
t = Interpolation_F t
forall t. Num t => Interpolation_F t
linear t
x0 t
x1 (Interpolation_F t
forall t. (Eq t, Floating t) => Interpolation_F t
exponential_0 t
0 t
1 t
t)
sine :: Floating t => Interpolation_F t
sine :: Interpolation_F t
sine t
x0 t
x1 t
t =
let t' :: t
t' = - t -> t
forall a. Floating a => a -> a
cos (t
forall a. Floating a => a
pi t -> t -> t
forall a. Num a => a -> a -> a
* t
t) t -> t -> t
forall a. Num a => a -> a -> a
* t
0.5 t -> t -> t
forall a. Num a => a -> a -> a
+ t
0.5
in Interpolation_F t
forall t. Num t => Interpolation_F t
linear t
x0 t
x1 t
t'
welch :: (Ord t, Floating t) => Interpolation_F t
welch :: Interpolation_F t
welch t
x0 t
x1 t
t =
if t
x0 t -> t -> Bool
forall a. Ord a => a -> a -> Bool
< t
x1
then t
x0 t -> t -> t
forall a. Num a => a -> a -> a
+ (t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- t
x0) t -> t -> t
forall a. Num a => a -> a -> a
* t -> t
forall a. Floating a => a -> a
sin (t
forall a. Floating a => a
half_pi t -> t -> t
forall a. Num a => a -> a -> a
* t
t)
else t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- (t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- t
x0) t -> t -> t
forall a. Num a => a -> a -> a
* t -> t
forall a. Floating a => a -> a
sin (t
forall a. Floating a => a
half_pi t -> t -> t
forall a. Num a => a -> a -> a
- (t
forall a. Floating a => a
half_pi t -> t -> t
forall a. Num a => a -> a -> a
* t
t))
curve :: (Ord t, Floating t) => t -> Interpolation_F t
curve :: t -> Interpolation_F t
curve t
c t
x0 t
x1 t
t =
if t -> t
forall a. Num a => a -> a
abs t
c t -> t -> Bool
forall a. Ord a => a -> a -> Bool
< t
0.0001
then Interpolation_F t
forall t. Num t => Interpolation_F t
linear t
x0 t
x1 t
t
else let d :: t
d = t
1 t -> t -> t
forall a. Num a => a -> a -> a
- t -> t
forall a. Floating a => a -> a
exp t
c
n :: t
n = t
1 t -> t -> t
forall a. Num a => a -> a -> a
- t -> t
forall a. Floating a => a -> a
exp (t
t t -> t -> t
forall a. Num a => a -> a -> a
* t
c)
in t
x0 t -> t -> t
forall a. Num a => a -> a -> a
+ (t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- t
x0) t -> t -> t
forall a. Num a => a -> a -> a
* (t
nt -> t -> t
forall a. Fractional a => a -> a -> a
/t
d)
squared :: Floating t => Interpolation_F t
squared :: Interpolation_F t
squared t
x0 t
x1 t
t =
let x0' :: t
x0' = t -> t
forall a. Floating a => a -> a
sqrt t
x0
x1' :: t
x1' = t -> t
forall a. Floating a => a -> a
sqrt t
x1
l :: t
l = Interpolation_F t
forall t. Num t => Interpolation_F t
linear t
x0' t
x1' t
t
in t
l t -> t -> t
forall a. Num a => a -> a -> a
* t
l
cubed :: Floating t => Interpolation_F t
cubed :: Interpolation_F t
cubed t
x0 t
x1 t
t =
let x0' :: t
x0' = t
x0 t -> t -> t
forall a. Floating a => a -> a -> a
** (t
1t -> t -> t
forall a. Fractional a => a -> a -> a
/t
3)
x1' :: t
x1' = t
x1 t -> t -> t
forall a. Floating a => a -> a -> a
** (t
1t -> t -> t
forall a. Fractional a => a -> a -> a
/t
3)
l :: t
l = Interpolation_F t
forall t. Num t => Interpolation_F t
linear t
x0' t
x1' t
t
in t
l t -> t -> t
forall a. Num a => a -> a -> a
* t
l t -> t -> t
forall a. Num a => a -> a -> a
* t
l
hold :: (Num t,Ord t) => Interpolation_F t
hold :: Interpolation_F t
hold t
x0 t
x1 t
t = if t
t t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>= t
1 then t
x1 else t
x0
fader :: (Num t,Ord t) => Interpolation_F t
fader :: Interpolation_F t
fader t
x0 t
x1 t
t =
let rng :: t
rng = t
x1 t -> t -> t
forall a. Num a => a -> a -> a
- t
x0
sqr :: a -> a
sqr a
i = a
i a -> a -> a
forall a. Num a => a -> a -> a
* a
i
in t -> t
forall a. Num a => a -> a
sqr (if t
rng t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> t
0 then t
t else t
1 t -> t -> t
forall a. Num a => a -> a -> a
- (t
1 t -> t -> t
forall a. Num a => a -> a -> a
- t
t)) t -> t -> t
forall a. Num a => a -> a -> a
* t
rng t -> t -> t
forall a. Num a => a -> a -> a
+ t
x0