{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Basic.DistortionControlled (
   clip, logit,
   zigZag, sine,
   quantize,
   ) where

import qualified Synthesizer.Basic.Distortion  as Dist

import qualified Algebra.Transcendental        as Trans
import qualified Algebra.RealField             as RealField
import qualified Algebra.Field                 as Field
import qualified Algebra.RealRing              as RealRing

import Data.Ord.HT (limit, )

import NumericPrelude.Numeric


{- * Clipping -}

{- |
limit, fuzz booster
-}
clip :: (RealRing.C a) => a -> a -> a
clip :: forall a. C a => a -> a -> a
clip a
c = (a, a) -> a -> a
forall a. Ord a => (a, a) -> a -> a
limit (a -> a
forall a. C a => a -> a
negate a
c, a
c)

{- |
logit, tanh
-}
logit :: (Trans.C a) => a -> a -> a
logit :: forall a. C a => a -> a -> a
logit a
k = a -> (a -> a) -> a -> a
forall a. C a => a -> (a -> a) -> a -> a
rescale a
k a -> a
forall a. C a => a -> a
Dist.logit

{-
probit, error function
-}



{- * Wrapping -}

{- |
zig-zag
-}
zigZag :: (RealField.C a) => a -> a -> a
zigZag :: forall a. C a => a -> a -> a
zigZag a
k = a -> (a -> a) -> a -> a
forall a. C a => a -> (a -> a) -> a -> a
rescale a
k a -> a
forall a. C a => a -> a
Dist.zigZag

{- |
sine
-}
sine :: (Trans.C a) => a -> a -> a
sine :: forall a. C a => a -> a -> a
sine a
k = a -> (a -> a) -> a -> a
forall a. C a => a -> (a -> a) -> a -> a
rescale a
k a -> a
forall a. C a => a -> a
Dist.sine




{- * Quantization -}

quantize :: (RealField.C a) => a -> a -> a
quantize :: forall a. C a => a -> a -> a
quantize a
k = a -> (a -> a) -> a -> a
forall a. C a => a -> (a -> a) -> a -> a
rescale a
k a -> a
forall a. C a => a -> a
Dist.quantize



{- Auxilary function -}

rescale :: (Field.C a) => a -> (a -> a) -> a -> a
rescale :: forall a. C a => a -> (a -> a) -> a -> a
rescale a
k a -> a
f a
x = a
k a -> a -> a
forall a. C a => a -> a -> a
* a -> a
f (a
xa -> a -> a
forall a. C a => a -> a -> a
/a
k)

{-
*Synthesizer.Basic.Distortion> GNUPlot.plotFuncs [] (GNUPlot.linearScale 1000 (-3,3::Double)) (map logit [0,0.1..1])
-}