packages feed

synthesizer-core-0.9: src/Synthesizer/Generic/Noise.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleContexts #-}
{- | Noise and random processes. -}
module Synthesizer.Generic.Noise where

import qualified Synthesizer.State.Noise as Noise

import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.State.Signal as SigS

import qualified Algebra.RealRing              as RealRing
import qualified Algebra.Ring                  as Ring

import System.Random (Random, RandomGen, randomR, mkStdGen, )

import NumericPrelude.Numeric
import NumericPrelude.Base


{-|
Deterministic white noise, uniformly distributed between -1 and 1.
That is, variance is 1\/3.
-}
white :: (Ring.C y, Random y, SigG.Produce sig y) => sig y
white = SigG.fromState $ Noise.white

whiteGen :: (Ring.C y, Random y, RandomGen g, SigG.Produce sig y) => g -> sig y
whiteGen = SigG.fromState . Noise.whiteGen


{- |
Approximates normal distribution with variance 1
by a quadratic B-spline distribution.
-}
whiteQuadraticBSplineGen ::
   (Ring.C y, Random y, RandomGen g, SigG.Produce sig y) => g -> sig y
whiteQuadraticBSplineGen =
   SigG.fromState . Noise.whiteQuadraticBSplineGen


randomPeeks ::
   (RealRing.C y, Random y, SigG.Transform sig y, SigG.Transform sig Bool) =>
      sig y    {- ^ momentary densities, @p@ means that there is about one peak
                      in the time range of @1\/p@ samples -}
   -> sig Bool {- ^ Every occurence of 'True' represents a peak. -}
randomPeeks =
   randomPeeksGen (mkStdGen 876)

randomPeeksGen ::
   (RealRing.C y, Random y, RandomGen g, SigG.Transform sig y, SigG.Transform sig Bool) =>
      g
   -> sig y
   -> sig Bool
randomPeeksGen =
   SigG.zipWithState (<) . SigS.unfoldR (Just . randomR (0,1))