module Synthesizer.Amplitude.Control
(
constant, constantVector,
mapLinear, mapExponential,
) where
import qualified Synthesizer.Plain.Control as Ctrl
import qualified Synthesizer.Amplitude.Signal as SigV
import Synthesizer.Amplitude.Signal (toAmplitudeScalar)
import qualified Algebra.OccasionallyScalar as OccScalar
import qualified Algebra.Module as Module
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Field as Field
import qualified Algebra.Real as Real
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import NumericPrelude
import PreludeBase as P
import Prelude ()
constant :: (Field.C y', Real.C y', OccScalar.C y y') =>
y'
-> SigV.T y y' y
constant y =
constantVector (abs y) (OccScalar.toScalar (signum y))
constantVector ::
y'
-> yv
-> SigV.T y y' yv
constantVector y yv =
SigV.Cons y (Ctrl.constant yv)
mapLinear :: (Ring.C y, Field.C y', Real.C y', OccScalar.C y y') =>
y'
-> y'
-> SigV.T y y' y
-> SigV.T y y' y
mapLinear range center (SigV.Cons amp ss) =
let absRange = abs range * amp
absCenter = abs center
rng = toAmplitudeScalar z absRange
cnt = toAmplitudeScalar z absCenter
z = SigV.Cons
(absRange + absCenter)
(map (\y -> cnt + rng*y) ss)
in z
mapExponential :: (Field.C y', Trans.C y, Module.C y y') =>
y
-> y'
-> SigV.T y y y
-> SigV.T y y' y
mapExponential range center (SigV.Cons amp ss) =
let b = range**amp
in SigV.Cons (b*>center) (map (\x -> b**(xone)) ss)