module Synthesizer.Dimensional.RateAmplitude.Noise
(white, whiteBandEnergy, randomPeeks,
whiteGen, whiteBandEnergyGen, randomPeeksGen,
) where
import qualified Synthesizer.State.NoiseCustom as Noise
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.RandomKnuth as Knuth
import qualified Synthesizer.Dimensional.RateAmplitude.Signal as SigA
import qualified Synthesizer.Dimensional.Process as Proc
import Synthesizer.Dimensional.Process (($#), )
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import Number.DimensionTerm ((&*&))
import qualified Algebra.Algebraic as Algebraic
import qualified Algebra.Field as Field
import qualified Algebra.Ring as Ring
import System.Random (Random, RandomGen, mkStdGen)
import NumericPrelude
import PreludeBase as P
white :: (Field.C yv, Random yv, Algebraic.C q, Dim.C u, Dim.C v) =>
DN.T (Dim.Recip u) q
-> DN.T v q
-> Proc.T s u q (SigA.R s v q yv)
white =
whiteGen (Knuth.cons 6746)
whiteGen ::
(Field.C yv, Random yv, RandomGen g, Algebraic.C q, Dim.C u, Dim.C v) =>
g
-> DN.T (Dim.Recip u) q
-> DN.T v q
-> Proc.T s u q (SigA.R s v q yv)
whiteGen gen bandWidth volume =
do bw <- SigA.toFrequencyScalar bandWidth
return $
SigA.fromSamples
(DN.scale (sqrt $ 3 / bw) volume)
(Noise.whiteGen gen)
whiteBandEnergy :: (Field.C yv, Random yv, Algebraic.C q, Dim.C u, Dim.C v) =>
DN.T (Dim.Mul u (Dim.Sqr v)) q
-> Proc.T s u q (SigA.R s v q yv)
whiteBandEnergy = whiteBandEnergyGen (mkStdGen 6746)
whiteBandEnergyGen ::
(Field.C yv, Random yv, RandomGen g, Algebraic.C q, Dim.C u, Dim.C v) =>
g
-> DN.T (Dim.Mul u (Dim.Sqr v)) q
-> Proc.T s u q (SigA.R s v q yv)
whiteBandEnergyGen gen energy =
do rate <- Proc.getSampleRate
return $
SigA.fromSamples
(DN.sqrt $ DN.scale 3 $
DN.rewriteDimension
(Dim.identityLeft . Dim.applyLeftMul Dim.cancelLeft .
Dim.associateLeft) $
rate &*& energy)
(Noise.whiteGen gen)
randomPeeks ::
(Field.C q, Random q, Ord q, Dim.C u) =>
Proc.T s u q (
SigA.R s (Dim.Recip u) q q
-> SigA.R s (Dim.Recip u) q q)
randomPeeks =
randomPeeksGen (mkStdGen 876)
randomPeeksGen ::
(Field.C q, Random q, Ord q, Dim.C u,
RandomGen g) =>
g
-> Proc.T s u q (
SigA.R s (Dim.Recip u) q q
-> SigA.R s (Dim.Recip u) q q)
randomPeeksGen g =
Proc.withParam $ \ dens ->
do freq <- SigA.toFrequencyScalar (SigA.amplitude dens)
SigA.fromPeaks $#
(SigA.Peaks $
Sig.zipWith (<)
(Noise.randomRs (0, recip freq) g)
(SigA.samples dens))