{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Synthesizer.Basic.Wave (
T(Cons, decons),
fromFunction,
raise,
amplify,
distort,
overtone,
apply,
phaseOffset,
sine,
cosine,
helix,
fastSine2,
fastSine2Alt,
fastSine3,
fastSine3Alt,
fastSine4,
fastSine4Alt,
fastSine4LeastSquares,
fastSinePolynomials,
fastSines,
rationalHelix1,
rationalHelix1Alt,
rationalHelix,
saw,
sawCos,
sawComplex,
superSaw,
square,
squareCos,
squareComplex,
triangle,
truncOddCosine,
truncOddTriangle,
truncCosine,
truncTriangle,
powerNormed,
powerNormed2,
logitSaw,
logitSine,
sineSquare,
piecewiseParabolaSaw,
piecewiseSineSaw,
sineSawSmooth,
sineSawSharp,
sawGaussianHarmonics,
sawPike,
trianglePike,
trianglePikeShift,
squarePike,
squarePikeShift,
squareAsymmetric,
squareBalanced,
triangleAsymmetric,
trapezoid,
trapezoidAsymmetric,
trapezoidBalanced,
trapezoidSkew,
Harmonic(Harmonic, harmonicPhase, harmonicAmplitude),
harmonic,
composedHarmonics,
) where
import qualified Synthesizer.Basic.Phase as Phase
import qualified Synthesizer.Basic.Distortion as Distort
import qualified Algebra.RealTranscendental as RealTrans
import qualified Algebra.Transcendental as Trans
import qualified Algebra.ZeroTestable as ZeroTestable
import qualified Algebra.RealField as RealField
import qualified Algebra.Algebraic as Algebraic
import qualified Algebra.Module as Module
import qualified Algebra.Field as Field
import qualified Algebra.RealRing as RealRing
import qualified Algebra.Absolute as Absolute
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import qualified Algebra.ToInteger as ToInteger
import qualified MathObj.Polynomial as Poly
import qualified Number.Complex as Complex
import qualified Control.Applicative as App
import Data.Bool.HT (select, if', )
import NumericPrelude.Numeric
import NumericPrelude.Base
newtype T t y = Cons {forall t y. T t y -> T t -> y
decons :: Phase.T t -> y}
{-# INLINE fromFunction #-}
fromFunction :: (t -> y) -> (T t y)
fromFunction :: forall t y. (t -> y) -> T t y
fromFunction t -> y
wave = forall t y. (T t -> y) -> T t y
Cons (t -> y
wave forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. T a -> a
Phase.toRepresentative)
{-# INLINE raise #-}
raise :: (Additive.C y) => y -> T t y -> T t y
raise :: forall y t. C y => y -> T t y -> T t y
raise y
y = forall y z t. (y -> z) -> T t y -> T t z
distort (y
yforall a. C a => a -> a -> a
+)
{-# INLINE amplify #-}
amplify :: (Ring.C y) => y -> T t y -> T t y
amplify :: forall y t. C y => y -> T t y -> T t y
amplify y
k = forall y z t. (y -> z) -> T t y -> T t z
distort (y
kforall a. C a => a -> a -> a
*)
{-# INLINE distort #-}
distort :: (y -> z) -> T t y -> T t z
distort :: forall y z t. (y -> z) -> T t y -> T t z
distort y -> z
g (Cons T t -> y
f) = forall t y. (T t -> y) -> T t y
Cons (y -> z
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. T t -> y
f)
{-# INLINE overtone #-}
overtone :: (RealField.C t, ToInteger.C n) => n -> T t y -> T t y
overtone :: forall t n y. (C t, C n) => n -> T t y -> T t y
overtone n
n (Cons T t -> y
f) = forall t y. (T t -> y) -> T t y
Cons (T t -> y
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (C a, C b) => b -> T a -> T a
Phase.multiply n
n)
{-# INLINE apply #-}
apply :: T t y -> (Phase.T t -> y)
apply :: forall t y. T t y -> T t -> y
apply = forall t y. T t y -> T t -> y
decons
instance Additive.C y => Additive.C (T t y) where
{-# INLINE zero #-}
{-# INLINE (+) #-}
{-# INLINE (-) #-}
{-# INLINE negate #-}
zero :: T t y
zero = forall t y. (T t -> y) -> T t y
Cons (forall a b. a -> b -> a
const forall a. C a => a
zero)
+ :: T t y -> T t y -> T t y
(+) (Cons T t -> y
f) (Cons T t -> y
g) = forall t y. (T t -> y) -> T t y
Cons (\T t
t -> T t -> y
f T t
t forall a. C a => a -> a -> a
+ T t -> y
g T t
t)
(-) (Cons T t -> y
f) (Cons T t -> y
g) = forall t y. (T t -> y) -> T t y
Cons (\T t
t -> T t -> y
f T t
t forall a. C a => a -> a -> a
- T t -> y
g T t
t)
negate :: T t y -> T t y
negate = forall y z t. (y -> z) -> T t y -> T t z
distort forall a. C a => a -> a
negate
instance Module.C a y => Module.C a (T t y) where
{-# INLINE (*>) #-}
a
s *> :: a -> T t y -> T t y
*> T t y
w = forall y z t. (y -> z) -> T t y -> T t z
distort (a
sforall a v. C a v => a -> v -> v
*>) T t y
w
instance Functor (T t) where
{-# INLINE fmap #-}
fmap :: forall a b. (a -> b) -> T t a -> T t b
fmap = forall y z t. (y -> z) -> T t y -> T t z
distort
instance App.Applicative (T t) where
{-# INLINE pure #-}
pure :: forall a. a -> T t a
pure a
y = forall t y. (T t -> y) -> T t y
Cons (forall a b. a -> b -> a
const a
y)
{-# INLINE (<*>) #-}
Cons T t -> a -> b
f <*> :: forall a b. T t (a -> b) -> T t a -> T t b
<*> Cons T t -> a
y = forall t y. (T t -> y) -> T t y
Cons (\T t
t -> T t -> a -> b
f T t
t (T t -> a
y T t
t))
{-# INLINE phaseOffset #-}
phaseOffset :: (RealRing.C a) => T a b -> (a -> T a b)
phaseOffset :: forall a b. C a => T a b -> a -> T a b
phaseOffset (Cons T a -> b
wave) a
offset =
forall t y. (T t -> y) -> T t y
Cons (T a -> b
wave forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. C a => a -> T a -> T a
Phase.increment a
offset)
{-# INLINE sine #-}
sine :: Trans.C a => T a a
sine :: forall a. C a => T a a
sine = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> forall a. C a => a -> a
sin (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
x)
{-# INLINE cosine #-}
cosine :: Trans.C a => T a a
cosine :: forall a. C a => T a a
cosine = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> 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
x)
{-# INLINE helix #-}
helix :: Trans.C a => T a (Complex.T a)
helix :: forall a. C a => T a (T a)
helix = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> 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
x)
{-# INLINE fastSine2 #-}
fastSine2 :: (Ord a, Ring.C a) => T a a
fastSine2 :: forall a. (Ord a, C a) => T a a
fastSine2 = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
2forall a. C a => a -> a -> a
*a
xforall a. Ord a => a -> a -> Bool
<a
1
then -a
8forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
*(a
2forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1)
else a
8forall a. C a => a -> a -> a
*(a
2forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1)forall a. C a => a -> a -> a
*(a
xforall a. C a => a -> a -> a
-a
1)
{-# INLINE fastSine2Alt #-}
fastSine2Alt :: (RealRing.C a) => T a a
fastSine2Alt :: forall a. C a => T a a
fastSine2Alt =
forall y z t. (y -> z) -> T t y -> T t z
distort (\a
x -> a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-forall a. C a => a -> a
abs a
x)) forall a. C a => T a a
saw
{-# INLINE fastSine3 #-}
fastSine3 :: (Ord a, Ring.C a) => T a a
fastSine3 :: forall a. (Ord a, C a) => T a a
fastSine3 = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
forall a. Bool -> a -> a -> a
if' (a
4forall a. C a => a -> a -> a
*a
xforall a. Ord a => a -> a -> Bool
<a
1) (a
2forall a. C a => a -> a -> a
* a
x forall a. C a => a -> a -> a
*(a
3 forall a. C a => a -> a -> a
- (a
4forall a. C a => a -> a -> a
* a
x )forall a. C a => a -> Integer -> a
^Integer
2)) forall a b. (a -> b) -> a -> b
$
forall a. Bool -> a -> a -> a
if' (a
4forall a. C a => a -> a -> a
*a
xforall a. Ord a => a -> a -> Bool
>a
3) (a
2forall a. C a => a -> a -> a
*(a
xforall a. C a => a -> a -> a
-a
1)forall a. C a => a -> a -> a
*(a
3 forall a. C a => a -> a -> a
- (a
4forall a. C a => a -> a -> a
*(a
xforall a. C a => a -> a -> a
-a
1))forall a. C a => a -> Integer -> a
^Integer
2)) forall a b. (a -> b) -> a -> b
$
(a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
x) forall a. C a => a -> a -> a
* (a
3 forall a. C a => a -> a -> a
- (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
2)forall a. C a => a -> Integer -> a
^Integer
2)
{-# INLINE fastSine3Alt #-}
fastSine3Alt :: (RealRing.C a, Field.C a) => T a a
fastSine3Alt :: forall a. (C a, C a) => T a a
fastSine3Alt =
forall y z t. (y -> z) -> T t y -> T t z
distort (\a
x -> a
0.5forall a. C a => a -> a -> a
*a
x forall a. C a => a -> a -> a
* (a
3 forall a. C a => a -> a -> a
- a
xforall a. C a => a -> Integer -> a
^Integer
2)) forall a. (Ord a, C a) => T a a
triangle
{-# INLINE fastSine4 #-}
fastSine4 :: (Ord a, Field.C a) => T a a
fastSine4 :: forall a. (Ord a, C a) => T a a
fastSine4 = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
let x2 :: a
x2 = a
2forall a. C a => a -> a -> a
*a
x
in if a
x2forall a. Ord a => a -> a -> Bool
<a
1
then a
16forall a. C a => a -> a -> a
/a
5forall a. C a => a -> a -> a
*a
x2forall a. C a => a -> a -> a
*(a
x2forall a. C a => a -> a -> a
-a
1)forall a. C a => a -> a -> a
*(a
x2forall a. C a => a -> Integer -> a
^Integer
2forall a. C a => a -> a -> a
-a
x2forall a. C a => a -> a -> a
-a
1)
else a
16forall a. C a => a -> a -> a
/a
5forall a. C a => a -> a -> a
*(a
2forall a. C a => a -> a -> a
-a
x2)forall a. C a => a -> a -> a
*(a
x2forall a. C a => a -> a -> a
-a
1)forall a. C a => a -> a -> a
*(a
x2forall a. C a => a -> Integer -> a
^Integer
2forall a. C a => a -> a -> a
-a
3forall a. C a => a -> a -> a
*a
x2forall a. C a => a -> a -> a
+a
1)
{-# INLINE fastSine4Alt #-}
fastSine4Alt :: (RealRing.C a, Field.C a) => T a a
fastSine4Alt :: forall a. (C a, C a) => T a a
fastSine4Alt =
forall y z t. (y -> z) -> T t y -> T t z
distort
(\a
x ->
let ax :: a
ax = a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
abs a
x
in a
16forall a. C a => a -> a -> a
/a
5forall a. C a => a -> a -> a
*a
axforall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
+a
axforall a. C a => a -> a -> a
-a
axforall a. C a => a -> Integer -> a
^Integer
2))
forall a. C a => T a a
saw
{-# INLINE fastSine4LeastSquares #-}
fastSine4LeastSquares :: (Ord a, Trans.C a) => T a a
fastSine4LeastSquares :: forall a. (Ord a, C a) => T a a
fastSine4LeastSquares = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
let pi2 :: a
pi2 = forall a. C a => a
piforall a. C a => a -> a -> a
*forall a. C a => a
pi
pi3 :: a
pi3 = a
pi2forall a. C a => a -> a -> a
*forall a. C a => a
pi
c :: a
c = a
3forall a. C a => a -> a -> a
*((a
10080forall a. C a => a -> a -> a
/a
pi2 forall a. C a => a -> a -> a
- a
1050) forall a. C a => a -> a -> a
/ a
pi3 forall a. C a => a -> a -> a
+ a
1)
{-# INLINE bow #-}
bow :: a -> a
bow a
y = let y2 :: a
y2 = a
yforall a. C a => a -> a -> a
*a
y in a
1forall a. C a => a -> a -> a
-a
y2forall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
+a
cforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-a
y2))
in if a
2forall a. C a => a -> a -> a
*a
xforall a. Ord a => a -> a -> Bool
<a
1
then a -> a
bow (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1)
else - a -> a
bow (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3)
{-# INLINE fastSinePolynomials #-}
fastSinePolynomials :: (Field.C a) => [Poly.T a]
fastSinePolynomials :: forall a. C a => [T a]
fastSinePolynomials =
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(T a
p0,T a
p1) -> [T a
p0,T a
p1]) forall a b. (a -> b) -> a -> b
$
forall a. (a -> a) -> a -> [a]
iterate
(\(T a
_,T a
p1) ->
let integrateNormalize :: T b -> T b
integrateNormalize T b
p =
let pint :: T b
pint = forall a. C a => a -> T a -> T a
Poly.integrate forall a. C a => a
zero T b
p
in forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. C a => a -> a -> a
/ forall a. C a => T a -> a -> a
Poly.evaluate T b
pint forall a. C a => a
one) T b
pint
p2 :: T a
p2 = forall a. C a => a
one forall a. C a => a -> a -> a
- forall {b}. C b => T b -> T b
integrateNormalize T a
p1
p3 :: T a
p3 = forall {b}. C b => T b -> T b
integrateNormalize T a
p2
in (T a
p2,T a
p3))
(forall a. C a => a
one, forall a. [a] -> T a
Poly.fromCoeffs [forall a. C a => a
zero, forall a. C a => a
one])
{-# INLINE fastSines #-}
fastSines :: (RealField.C a) => [T a a]
fastSines :: forall a. C a => [T a a]
fastSines =
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a b. (a -> b) -> a -> b
($)
(forall a. [a] -> [a]
cycle
[\T a
p ->
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
App.liftA2 forall a. C a => a -> a -> a
(*) forall a. (Ord a, C a) => T a a
square forall a b. (a -> b) -> a -> b
$
forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. C a => T a -> a -> a
Poly.evaluate T a
p) forall a b. (a -> b) -> a -> b
$
forall t n y. (C t, C n) => n -> T t y -> T t y
overtone (Int
2::Int) forall a. C a => T a a
saw,
\T a
p -> forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. C a => T a -> a -> a
Poly.evaluate T a
p) forall a. (Ord a, C a) => T a a
triangle])
forall a. C a => [T a]
fastSinePolynomials
{-# INLINE rationalHelix1 #-}
rationalHelix1 :: Field.C a => a -> T a (Complex.T a)
rationalHelix1 :: forall a. C a => a -> T a (T a)
rationalHelix1 a
k = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
t ->
let num :: a
num = a
k forall a. C a => a -> a -> a
* (a
2forall a. C a => a -> a -> a
*a
tforall a. C a => a -> a -> a
-a
1)
den :: a
den = (a
1forall a. C a => a -> a -> a
-a
t)forall a. C a => a -> a -> a
*a
t
in forall a. C a => a -> a
negate forall a b. (a -> b) -> a -> b
$
forall a. C a => a -> T a -> T a
Complex.scale (forall a. C a => a -> a
recip (a
denforall a. C a => a -> Integer -> a
^Integer
2forall a. C a => a -> a -> a
+a
numforall a. C a => a -> Integer -> a
^Integer
2))
((a
denforall a. C a => a -> Integer -> a
^Integer
2forall a. C a => a -> a -> a
-a
numforall a. C a => a -> Integer -> a
^Integer
2) forall a. a -> a -> T a
Complex.+: (a
2forall a. C a => a -> a -> a
*a
denforall a. C a => a -> a -> a
*a
num))
rationalHelix1Alt :: Field.C a => a -> T a (Complex.T a)
rationalHelix1Alt :: forall a. C a => a -> T a (T a)
rationalHelix1Alt a
k = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
t ->
forall a. C a => a -> a
negate forall a b. (a -> b) -> a -> b
$ forall a. C a => a -> T a
helixFromTangent (a
k forall a. C a => a -> a -> a
* (forall a. C a => a -> a
recip (a
1forall a. C a => a -> a -> a
-a
t) forall a. C a => a -> a -> a
- forall a. C a => a -> a
recip a
t))
{-# INLINE rationalHelix #-}
rationalHelix :: Field.C a => Int -> a -> T a (Complex.T a)
rationalHelix :: forall a. C a => Int -> a -> T a (T a)
rationalHelix Int
n a
k = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
t ->
forall a. C a => a -> a
negate forall a b. (a -> b) -> a -> b
$ forall a. C a => a -> T a
helixFromTangent forall a b. (a -> b) -> a -> b
$ (forall a. C a => a -> a -> a
* forall a. C a => a -> a
negate a
k) forall a b. (a -> b) -> a -> b
$ forall a. C a => [a] -> a
sum forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\a
d0 a
d1 -> forall a. C a => a -> a
recip (a
t forall a. C a => a -> a -> a
+ a
d0) forall a. C a => a -> a -> a
+ forall a. C a => a -> a
recip (a
t forall a. C a => a -> a -> a
+ a
d1))
(forall a. [a] -> [a]
tail forall a b. (a -> b) -> a -> b
$ forall a. (a -> a) -> a -> [a]
iterate (forall a. C a => a -> a -> a
subtract a
1) a
0)
(forall a. (a -> a) -> a -> [a]
iterate (a
1forall a. C a => a -> a -> a
+) a
0)
{-# INLINE helixFromTangent #-}
helixFromTangent :: Field.C a => a -> Complex.T a
helixFromTangent :: forall a. C a => a -> T a
helixFromTangent a
t =
forall a. C a => a -> T a -> T a
Complex.scale (forall a. C a => a -> a
recip (a
1forall a. C a => a -> a -> a
+a
tforall a. C a => a -> Integer -> a
^Integer
2)) ((a
1forall a. C a => a -> a -> a
-a
tforall a. C a => a -> Integer -> a
^Integer
2) forall a. a -> a -> T a
Complex.+: (a
2forall a. C a => a -> a -> a
*a
t))
{-# INLINE saw #-}
saw :: Ring.C a => T a a
saw :: forall a. C a => T a a
saw = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
x
{-# INLINE sawCos #-}
sawCos :: (RealRing.C a, Trans.C a) => T a a
sawCos :: forall a. (C a, C a) => T a a
sawCos = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> forall a. C a => a -> a
log (a
2 forall a. C a => a -> a -> a
* forall a. C a => a -> a
sin (forall a. C a => a
piforall a. C a => a -> a -> a
*a
x)) forall a. C a => a -> a -> a
* (-a
2forall a. C a => a -> a -> a
/forall a. C a => a
pi)
{-# INLINE sawComplex #-}
sawComplex ::
(Complex.Power a, RealTrans.C a, ZeroTestable.C a) =>
T a (Complex.T a)
sawComplex :: forall a. (Power a, C a, C a) => T a (T a)
sawComplex = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> forall a. C a => a -> a
log (T a
1 forall a. C a => a -> a -> a
+ forall a. C a => a -> T a
Complex.cis (-forall a. C a => a
piforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
x))) forall a. C a => a -> a -> a
* (-T a
2forall a. C a => a -> a -> a
/forall a. C a => a
pi)
superSaw, _superSaw :: (RealRing.C a, Field.C a) => Int -> a -> T a a
superSaw :: forall a. (C a, C a) => Int -> a -> T a a
superSaw Int
n =
let nf :: a
nf = forall a b. (C a, C b) => a -> b
fromIntegral Int
n
in \a
d ->
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
y -> a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
y) forall a b. (a -> b) -> a -> b
$
forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
(a
x forall a. C a => a -> a -> a
+ (a
nfforall a. C a => a -> a -> a
-a
1)forall a. C a => a -> a -> a
/a
2forall a. C a => a -> a -> a
*a
d forall a. C a => a -> a -> a
- a
1) forall a. C a => a -> a -> a
+ forall a. Ord a => a -> a -> a
min a
1 (forall a b. (C a, C b) => a -> b
ceiling((a
1forall a. C a => a -> a -> a
-a
x)forall a. C a => a -> a -> a
/a
d) forall a. C a => a -> a -> a
/ a
nf)
_superSaw :: forall a. (C a, C a) => Int -> a -> T a a
_superSaw Int
n a
d =
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
y -> a
1 forall a. C a => a -> a -> a
- a
2forall a. C a => a -> a -> a
/forall a b. (C a, C b) => a -> b
fromIntegral Int
n forall a. C a => a -> a -> a
* a
y) forall a b. (a -> b) -> a -> b
$
forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
forall a. C a => [a] -> a
sum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. C a => a -> a
fraction forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
take Int
n forall a b. (a -> b) -> a -> b
$ forall a. (a -> a) -> a -> [a]
iterate (a
dforall a. C a => a -> a -> a
+) a
x
{-# INLINE square #-}
square :: (Ord a, Ring.C a) => T a a
square :: forall a. (Ord a, C a) => T a a
square = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x -> if a
2forall a. C a => a -> a -> a
*a
xforall a. Ord a => a -> a -> Bool
<a
1 then a
1 else -a
1
{-# INLINE squareCos #-}
squareCos :: (RealField.C a, Trans.C a) => T a a
squareCos :: forall a. (C a, C a) => T a a
squareCos = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
forall a. C a => a -> a
log (forall a. C a => a -> a
abs (forall a. C a => a -> a
tan (forall a. C a => a
piforall a. C a => a -> a -> a
*a
x))) forall a. C a => a -> a -> a
* (-a
2forall a. C a => a -> a -> a
/forall a. C a => a
pi)
{-# INLINE squareComplex #-}
squareComplex ::
(Complex.Power a, RealTrans.C a, ZeroTestable.C a) =>
T a (Complex.T a)
squareComplex :: forall a. (Power a, C a, C a) => T a (T a)
squareComplex = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
forall a. C a => a -> a
atanh (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
x)) forall a. C a => a -> a -> a
* (T a
4forall a. C a => a -> a -> a
/forall a. C a => a
pi)
{-# INLINE triangle #-}
triangle :: (Ord a, Ring.C a) => T a a
triangle :: forall a. (Ord a, C a) => T a a
triangle = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
let x4 :: a
x4 = a
4forall a. C a => a -> a -> a
*a
x
in forall a. a -> [(Bool, a)] -> a
select (a
2forall a. C a => a -> a -> a
-a
x4)
[(a
x4forall a. Ord a => a -> a -> Bool
<a
1, a
x4),
(a
x4forall a. Ord a => a -> a -> Bool
>a
3, a
x4forall a. C a => a -> a -> a
-a
4)]
truncOddCosine :: Trans.C a =>
Int -> T a a
truncOddCosine :: forall a. C a => Int -> T a a
truncOddCosine Int
k =
let f :: a
f = forall a. C a => a
pi forall a. C a => a -> a -> a
* forall a b. (C a, C b) => a -> b
fromIntegral (Int
2forall a. C a => a -> a -> a
*Int
kforall a. C a => a -> a -> a
+Int
1)
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x -> forall a. C a => a -> a
cos (a
fforall a. C a => a -> a -> a
*a
x)
truncOddTriangle :: (RealField.C a) =>
Int -> T a a
truncOddTriangle :: forall a. C a => Int -> T a a
truncOddTriangle Int
k =
let s :: a
s = forall a b. (C a, C b) => a -> b
fromIntegral (Int
2forall a. C a => a -> a -> a
*Int
kforall a. C a => a -> a -> a
+Int
1)
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x ->
let (Int
n,a
frac) = forall a b. (C a, C b) => a -> (b, a)
splitFraction (a
sforall a. C a => a -> a -> a
*a
x)
in if forall a. (C a, C a) => a -> Bool
even (Int
n::Int)
then a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
frac
else a
2forall a. C a => a -> a -> a
*a
fracforall a. C a => a -> a -> a
-a
1
truncCosine :: Trans.C a =>
a -> T a a
truncCosine :: forall a. C a => a -> T a a
truncCosine a
k =
let f :: a
f = a
2 forall a. C a => a -> a -> a
* forall a. C a => a
pi forall a. C a => a -> a -> a
* a
k
s :: a
s = a
2 forall a. C a => a -> a -> a
* (forall a. C a => a -> a
sin (a
fforall a. C a => a -> a -> a
*a
0.5) forall a. C a => a -> a -> a
- a
1)
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x0 ->
let x :: a
x = a
x0forall a. C a => a -> a -> a
-a
0.5
in - forall a. C a => a -> a
sin (a
fforall a. C a => a -> a -> a
*a
x) forall a. C a => a -> a -> a
+ a
sforall a. C a => a -> a -> a
*a
x
truncTriangle :: (RealField.C a) =>
a -> T a a
truncTriangle :: forall a. C a => a -> T a a
truncTriangle a
k =
let tr :: a -> a
tr a
x =
let (Int
n,a
frac) = forall a b. (C a, C b) => a -> (b, a)
splitFraction (a
2forall a. C a => a -> a -> a
*a
kforall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
+a
0.5)
in if forall a. (C a, C a) => a -> Bool
even (Int
n::Int)
then a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
frac
else a
2forall a. C a => a -> a -> a
*a
fracforall a. C a => a -> a -> a
-a
1
s :: a
s = a
2 forall a. C a => a -> a -> a
* (a
1 forall a. C a => a -> a -> a
+ a -> a
tr a
0.5)
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x0 ->
let x :: a
x = a
x0forall a. C a => a -> a -> a
-a
0.5
in a -> a
tr a
x forall a. C a => a -> a -> a
- a
sforall a. C a => a -> a -> a
*a
x
{-# DEPRECATED powerNormed "Use powerNormed2 instead." #-}
{-# INLINE powerNormed #-}
powerNormed :: (Absolute.C a, Trans.C a) => a -> T a a
powerNormed :: forall a. (C a, C a) => a -> T a a
powerNormed a
p = forall y t. C y => y -> T t y -> T t y
amplify (-a
pforall a. C a => a -> a -> a
-a
0.5) forall a b. (a -> b) -> a -> b
$ forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. (C a, C a) => a -> a -> a
Distort.powerSigned a
p) forall a. C a => T a a
saw
{-# INLINE powerNormed2 #-}
powerNormed2 :: (Absolute.C a, Trans.C a) => a -> T a a
powerNormed2 :: forall a. (C a, C a) => a -> T a a
powerNormed2 a
p = forall y t. C y => y -> T t y -> T t y
amplify (forall a. C a => a -> a
sqrt (a
1forall a. C a => a -> a -> a
+a
2forall a. C a => a -> a -> a
*a
p)) forall a b. (a -> b) -> a -> b
$ forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. (C a, C a) => a -> a -> a
Distort.powerSigned a
p) forall a. C a => T a a
saw
logitSaw :: (Trans.C a) => a -> T a a
logitSaw :: forall a. C a => a -> T a a
logitSaw a
c = forall y z t. (y -> z) -> T t y -> T t z
distort forall a. C a => a -> a
tanh forall a b. (a -> b) -> a -> b
$ forall y t. C y => y -> T t y -> T t y
amplify a
c forall a. C a => T a a
saw
logitSine :: (Trans.C a) => a -> T a a
logitSine :: forall a. C a => a -> T a a
logitSine a
c = forall y z t. (y -> z) -> T t y -> T t z
distort forall a. C a => a -> a
tanh forall a b. (a -> b) -> a -> b
$ forall y t. C y => y -> T t y -> T t y
amplify a
c forall a. C a => T a a
sine
{-# INLINE sineSquare #-}
sineSquare :: (RealRing.C a, Trans.C a) =>
a
-> T a a
sineSquare :: forall a. (C a, C a) => a -> T a a
sineSquare a
c =
forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. (C a, C a) => a -> a -> a
Distort.powerSigned (a
1forall a. C a => a -> a -> a
-a
c)) forall a. C a => T a a
sine
{-# INLINE piecewiseParabolaSaw #-}
piecewiseParabolaSaw :: (Algebraic.C a, Ord a) =>
a
-> T a a
piecewiseParabolaSaw :: forall a. (C a, Ord a) => a -> T a a
piecewiseParabolaSaw a
c =
let xb :: a
xb = (a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
sqrt a
c) forall a. C a => a -> a -> a
/ a
2
y :: a -> a
y a
x = a
1 forall a. C a => a -> a -> a
- ((a
4forall a. C a => a -> a -> a
*a
x forall a. C a => a -> a -> a
- (a
1forall a. C a => a -> a -> a
-a
c))forall a. C a => a -> a -> a
/(a
1forall a. C a => a -> a -> a
-a
c))forall a. C a => a -> Integer -> a
^Integer
2
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x ->
forall a. a -> [(Bool, a)] -> a
select
((a
2forall a. C a => a -> a -> a
*a
x forall a. C a => a -> a -> a
- a
1)forall a. C a => a -> a -> a
/(a
2forall a. C a => a -> a -> a
*a
xb forall a. C a => a -> a -> a
- a
1) forall a. C a => a -> a -> a
* a -> a
y a
xb)
[(a
x forall a. Ord a => a -> a -> Bool
< a
xb, a -> a
y a
x),
(a
x forall a. Ord a => a -> a -> Bool
> a
1forall a. C a => a -> a -> a
-a
xb, - a -> a
y (a
1forall a. C a => a -> a -> a
-a
x))]
{-# INLINE piecewiseSineSaw #-}
piecewiseSineSaw :: (Trans.C a, Ord a) =>
a
-> T a a
piecewiseSineSaw :: forall a. (C a, Ord a) => a -> T a a
piecewiseSineSaw a
c =
let
iter :: a -> a
iter a
z = forall a. (a -> a) -> a -> [a]
iterate (\a
zi -> forall a. C a => a
pi forall a. C a => a -> a -> a
+ forall a. C a => a -> a
atan (a
zi forall a. C a => a -> a -> a
- forall a. C a => a
pi forall a. C a => a -> a -> a
/ (a
1forall a. C a => a -> a -> a
-a
c))) a
z forall a. [a] -> Int -> a
!! Int
10
xb :: a
xb = (a
1forall a. C a => a -> a -> a
-a
c)forall a. C a => a -> a -> a
/(a
2forall a. C a => a -> a -> a
*forall a. C a => a
pi) forall a. C a => a -> a -> a
* a -> a
iter a
0
y :: a -> a
y a
x = forall a. C a => a -> a
sin (a
2forall a. C a => a -> a -> a
*forall a. C a => a
piforall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
/(a
1forall a. C a => a -> a -> a
-a
c))
in forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \ a
x -> forall a. a -> [(Bool, a)] -> a
select
((a
2forall a. C a => a -> a -> a
*a
x forall a. C a => a -> a -> a
- a
1)forall a. C a => a -> a -> a
/(a
2forall a. C a => a -> a -> a
*a
xb forall a. C a => a -> a -> a
- a
1) forall a. C a => a -> a -> a
* a -> a
y a
xb)
[(a
x forall a. Ord a => a -> a -> Bool
< a
xb, a -> a
y a
x),
(a
x forall a. Ord a => a -> a -> Bool
> a
1forall a. C a => a -> a -> a
-a
xb, - a -> a
y (a
1forall a. C a => a -> a -> a
-a
x))]
{-# INLINE sineSawSmooth #-}
sineSawSmooth :: (Trans.C a) =>
a
-> T a a
sineSawSmooth :: forall a. C a => a -> T a a
sineSawSmooth a
c =
forall y z t. (y -> z) -> T t y -> T t z
distort (\a
x -> forall a. C a => a -> a
sin (forall a. C a => a -> (a, a) -> a
affineComb a
c (forall a. C a => a
pi forall a. C a => a -> a -> a
* a
x, forall a. C a => a -> a
asin a
x forall a. C a => a -> a -> a
* a
2))) forall a. C a => T a a
saw
{-# INLINE sineSawSharp #-}
sineSawSharp :: (Trans.C a) =>
a
-> T a a
sineSawSharp :: forall a. C a => a -> T a a
sineSawSharp a
c =
forall y z t. (y -> z) -> T t y -> T t z
distort (\a
x -> forall a. C a => a -> a
sin (forall a. C a => a -> (a, a) -> a
affineComb a
c (forall a. C a => a
pi forall a. C a => a -> a -> a
* a
x, forall a. C a => a -> a
asin a
x))) forall a. C a => T a a
saw
affineComb :: Ring.C a => a -> (a,a) -> a
affineComb :: forall a. C a => a -> (a, a) -> a
affineComb a
phase (a
x0,a
x1) = (a
1forall a. C a => a -> a -> a
-a
phase)forall a. C a => a -> a -> a
*a
x0 forall a. C a => a -> a -> a
+ a
phaseforall a. C a => a -> a -> a
*a
x1
sawGaussianHarmonics ::
(RealField.C a, Trans.C a) => a -> [Harmonic a]
sawGaussianHarmonics :: forall a. (C a, C a) => a -> [Harmonic a]
sawGaussianHarmonics a
cutoff =
(forall a. T a -> a -> Harmonic a
harmonic forall a. C a => a
zero a
0 forall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (\a
n -> forall a. T a -> a -> Harmonic a
harmonic forall a. C a => a
zero (forall a. C a => a -> a
exp (-(a
nforall a. C a => a -> a -> a
/a
cutoff)forall a. C a => a -> Integer -> a
^Integer
2 forall a. C a => a -> a -> a
/ a
2) forall a. C a => a -> a -> a
* a
2 forall a. C a => a -> a -> a
/ (forall a. C a => a
piforall a. C a => a -> a -> a
*a
n))) forall a b. (a -> b) -> a -> b
$
forall a. (a -> a) -> a -> [a]
iterate (a
1forall a. C a => a -> a -> a
+) a
1
{-# INLINE sawPike #-}
sawPike :: (Ord a, Field.C a) =>
a
-> T a a
sawPike :: forall a. (Ord a, C a) => a -> T a a
sawPike a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
xforall a. Ord a => a -> a -> Bool
<a
r
then a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
/a
rforall a. C a => a -> a -> a
*a
x
else a
0
{-# INLINE trianglePike #-}
trianglePike :: (RealRing.C a, Field.C a) =>
a
-> T a a
trianglePike :: forall a. (C a, C a) => a -> T a a
trianglePike a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
x forall a. Ord a => a -> a -> Bool
< a
1forall a. C a => a -> a -> a
/a
2
then forall a. Ord a => a -> a -> a
max a
0 (a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1) forall a. C a => a -> a -> a
/ a
r)
else forall a. Ord a => a -> a -> a
min a
0 (forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3) forall a. C a => a -> a -> a
/ a
r forall a. C a => a -> a -> a
- a
1)
{-# INLINE trianglePikeShift #-}
trianglePikeShift :: (RealRing.C a, Field.C a) =>
a
-> a
-> T a a
trianglePikeShift :: forall a. (C a, C a) => a -> a -> T a a
trianglePikeShift a
r a
s = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
x forall a. Ord a => a -> a -> Bool
< a
1forall a. C a => a -> a -> a
/a
2
then forall a. Ord a => a -> a -> a
max a
0 (a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1forall a. C a => a -> a -> a
+a
sforall a. C a => a -> a -> a
*(a
rforall a. C a => a -> a -> a
-a
1)) forall a. C a => a -> a -> a
/ a
r)
else forall a. Ord a => a -> a -> a
min a
0 (forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3forall a. C a => a -> a -> a
+a
sforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-a
r)) forall a. C a => a -> a -> a
/ a
r forall a. C a => a -> a -> a
- a
1)
{-# INLINE squarePike #-}
squarePike :: (RealRing.C a) =>
a
-> T a a
squarePike :: forall a. C a => a -> T a a
squarePike a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
2forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
< a
1
then if forall a. C a => a -> a
abs(a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1)forall a. Ord a => a -> a -> Bool
<a
r then a
1 else a
0
else if forall a. C a => a -> a
abs(a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3)forall a. Ord a => a -> a -> Bool
<a
r then -a
1 else a
0
{-# INLINE squarePikeShift #-}
squarePikeShift :: (RealRing.C a) =>
a
-> a
-> T a a
squarePikeShift :: forall a. C a => a -> a -> T a a
squarePikeShift a
r a
s = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
2forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
< a
1
then if forall a. C a => a -> a
abs(a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1forall a. C a => a -> a -> a
+a
sforall a. C a => a -> a -> a
*(a
rforall a. C a => a -> a -> a
-a
1))forall a. Ord a => a -> a -> Bool
<a
r then a
1 else a
0
else if forall a. C a => a -> a
abs(a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3forall a. C a => a -> a -> a
+a
sforall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-a
r))forall a. Ord a => a -> a -> Bool
<a
r then -a
1 else a
0
{-# INLINE squareAsymmetric #-}
squareAsymmetric :: (Ord a, Ring.C a) =>
a
-> T a a
squareAsymmetric :: forall a. (Ord a, C a) => a -> T a a
squareAsymmetric a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
2forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
< a
rforall a. C a => a -> a -> a
+a
1 then a
1 else -a
1
{-# INLINE squareBalanced #-}
squareBalanced :: (Ord a, Ring.C a) => a -> T a a
squareBalanced :: forall a. (Ord a, C a) => a -> T a a
squareBalanced a
r =
forall y t. C y => y -> T t y -> T t y
raise (-a
r) forall a b. (a -> b) -> a -> b
$ forall a. (Ord a, C a) => a -> T a a
squareAsymmetric a
r
{-# INLINE triangleAsymmetric #-}
triangleAsymmetric :: (Ord a, Field.C a) =>
a
-> T a a
triangleAsymmetric :: forall a. (Ord a, C a) => a -> T a a
triangleAsymmetric a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
forall a. a -> [(Bool, a)] -> a
select ((a
2forall a. C a => a -> a -> a
-a
4forall a. C a => a -> a -> a
*a
x)forall a. C a => a -> a -> a
/(a
1forall a. C a => a -> a -> a
-a
r))
[(a
4forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
< a
1forall a. C a => a -> a -> a
+a
r, a
4forall a. C a => a -> a -> a
/(a
1forall a. C a => a -> a -> a
+a
r)forall a. C a => a -> a -> a
*a
x),
(a
4forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
> a
3forall a. C a => a -> a -> a
-a
r, a
4forall a. C a => a -> a -> a
/(a
1forall a. C a => a -> a -> a
+a
r)forall a. C a => a -> a -> a
*(a
xforall a. C a => a -> a -> a
-a
1))]
{-# INLINE trapezoid #-}
trapezoid :: (RealRing.C a, Field.C a) =>
a
-> T a a
trapezoid :: forall a. (C a, C a) => a -> T a a
trapezoid a
w = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
if a
x forall a. Ord a => a -> a -> Bool
< a
1forall a. C a => a -> a -> a
/a
2
then forall a. Ord a => a -> a -> a
min a
1 ((a
1 forall a. C a => a -> a -> a
- forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
1)) forall a. C a => a -> a -> a
/ (a
1forall a. C a => a -> a -> a
-a
w))
else forall a. Ord a => a -> a -> a
max (-a
1) ((forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
3) forall a. C a => a -> a -> a
- a
1) forall a. C a => a -> a -> a
/ (a
1forall a. C a => a -> a -> a
-a
w))
{-# INLINE trapezoidAsymmetric #-}
trapezoidAsymmetric :: (RealRing.C a, Field.C a) =>
a
-> a
-> T a a
trapezoidAsymmetric :: forall a. (C a, C a) => a -> a -> T a a
trapezoidAsymmetric a
w a
r = forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
x ->
let c0 :: a
c0 = a
1forall a. C a => a -> a -> a
+a
wforall a. C a => a -> a -> a
*a
r
c1 :: a
c1 = a
1forall a. C a => a -> a -> a
-a
wforall a. C a => a -> a -> a
*a
r
in if a
2forall a. C a => a -> a -> a
*a
x forall a. Ord a => a -> a -> Bool
< a
c0
then forall a. Ord a => a -> a -> a
min a
1 ((a
c0 forall a. C a => a -> a -> a
- forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*a
xforall a. C a => a -> a -> a
-a
c0)) forall a. C a => a -> a -> a
/ (a
1forall a. C a => a -> a -> a
-a
w))
else forall a. Ord a => a -> a -> a
max (-a
1) ((forall a. C a => a -> a
abs (a
4forall a. C a => a -> a -> a
*(a
1forall a. C a => a -> a -> a
-a
x)forall a. C a => a -> a -> a
-a
c1) forall a. C a => a -> a -> a
- a
c1) forall a. C a => a -> a -> a
/ (a
1forall a. C a => a -> a -> a
-a
w))
{-# INLINE trapezoidBalanced #-}
trapezoidBalanced :: (RealRing.C a, Field.C a) => a -> a -> T a a
trapezoidBalanced :: forall a. (C a, C a) => a -> a -> T a a
trapezoidBalanced a
w a
r =
forall y t. C y => y -> T t y -> T t y
raise (-a
wforall a. C a => a -> a -> a
*a
r) forall a b. (a -> b) -> a -> b
$ forall a. (C a, C a) => a -> a -> T a a
trapezoidAsymmetric a
w a
r
trapezoidSkew :: (Ord a, Field.C a) =>
a
-> T a a
trapezoidSkew :: forall a. (Ord a, C a) => a -> T a a
trapezoidSkew a
w =
forall t y. (t -> y) -> T t y
fromFunction forall a b. (a -> b) -> a -> b
$ \a
t ->
forall a. Bool -> a -> a -> a
if' (a
2forall a. C a => a -> a -> a
*a
tforall a. Ord a => a -> a -> Bool
<=a
1forall a. C a => a -> a -> a
-a
w) a
1 forall a b. (a -> b) -> a -> b
$
forall a. Bool -> a -> a -> a
if' (a
2forall a. C a => a -> a -> a
*a
tforall a. Ord a => a -> a -> Bool
>=a
1forall a. C a => a -> a -> a
+a
w) (-a
1) forall a b. (a -> b) -> a -> b
$
(a
1forall a. C a => a -> a -> a
-a
2forall a. C a => a -> a -> a
*a
t)forall a. C a => a -> a -> a
/a
w
data Harmonic a =
Harmonic {forall a. Harmonic a -> T a
harmonicPhase :: Phase.T a, forall a. Harmonic a -> a
harmonicAmplitude :: a}
{-# INLINE harmonic #-}
harmonic :: Phase.T a -> a -> Harmonic a
harmonic :: forall a. T a -> a -> Harmonic a
harmonic = forall a. T a -> a -> Harmonic a
Harmonic
{-# INLINE composedHarmonics #-}
composedHarmonics :: Trans.C a => [Harmonic a] -> T a a
composedHarmonics :: forall a. C a => [Harmonic a] -> T a a
composedHarmonics [Harmonic a]
hs =
let p :: T (T a)
p = forall a. [a] -> T a
Poly.fromCoeffs forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (\Harmonic a
h -> forall a. C a => a -> a -> T a
Complex.fromPolar (forall a. Harmonic a -> a
harmonicAmplitude Harmonic a
h)
(a
2forall a. C a => a -> a -> a
*forall a. C a => a
pi forall a. C a => a -> a -> a
* forall a. T a -> a
Phase.toRepresentative (forall a. Harmonic a -> T a
harmonicPhase Harmonic a
h))) [Harmonic a]
hs
in forall y z t. (y -> z) -> T t y -> T t z
distort (forall a. T a -> a
Complex.imag forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. C a => T a -> a -> a
Poly.evaluate T (T a)
p) forall a. C a => T a (T a)
helix