{-# LANGUAGE NoImplicitPrelude #-}
{- |
<http://en.wikipedia.org/wiki/Particle_displacement>
-}
module Synthesizer.Plain.Displacement where

import qualified Algebra.Additive              as Additive

import qualified Synthesizer.Plain.Signal as Sig

import NumericPrelude.Numeric
import NumericPrelude.Base


{- * Mixing -}

{-| Mix two signals.
    In opposition to 'zipWith' the result has the length of the longer signal. -}
mix :: (Additive.C v) => Sig.T v -> Sig.T v -> Sig.T v
mix :: forall v. C v => T v -> T v -> T v
mix = T v -> T v -> T v
forall a. C a => a -> a -> a
(+)

{- relict from Prelude98's Num
mixMono :: Ring.C a => [a] -> [a] -> [a]
mixMono [] x  = x
mixMono x  [] = x
mixMono (x:xs) (y:ys) = x+y : mixMono xs ys
-}

{-| Mix an arbitrary number of signals. -}
mixMulti :: (Additive.C v) => [Sig.T v] -> Sig.T v
mixMulti :: forall v. C v => [T v] -> T v
mixMulti = (T v -> T v -> T v) -> T v -> [T v] -> T v
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl T v -> T v -> T v
forall v. C v => T v -> T v -> T v
mix T v
forall a. C a => a
zero


{-| Add a number to all of the signal values.
    This is useful for adjusting the center of a modulation. -}
raise :: (Additive.C v) => v -> Sig.T v -> Sig.T v
raise :: forall v. C v => v -> T v -> T v
raise v
x = (v -> v) -> [v] -> [v]
forall a b. (a -> b) -> [a] -> [b]
map (v -> v -> v
forall a. C a => a -> a -> a
(+) v
x)


{- * Distortion -}
{- |
In "Synthesizer.Basic.Distortion" you find a collection
of appropriate distortion functions.
-}
distort :: (c -> a -> a) -> Sig.T c -> Sig.T a -> Sig.T a
distort :: forall c a. (c -> a -> a) -> T c -> T a -> T a
distort = (c -> a -> a) -> [c] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith