{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.State.NoiseCustom where
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.RandomKnuth as Knuth
import qualified System.Random as Rnd
import System.Random (Random, RandomGen, )
import qualified Algebra.RealField as RealField
import qualified Algebra.Field as Field
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE white #-}
white :: (Field.C y, Random y) =>
Sig.T y
white :: forall y. (C y, Random y) => T y
white = T -> T y
forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteGen (Int -> T
Knuth.cons Int
12354)
{-# INLINE whiteGen #-}
whiteGen ::
(Field.C y, Random y, RandomGen g) =>
g -> Sig.T y
whiteGen :: forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteGen = (y, y) -> g -> T y
forall y g. (C y, Random y, RandomGen g) => (y, y) -> g -> T y
randomRs (-y
1,y
1)
{-# INLINE whiteQuadraticBSplineGen #-}
whiteQuadraticBSplineGen ::
(Field.C y, Random y, RandomGen g) =>
g -> Sig.T y
whiteQuadraticBSplineGen :: forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteQuadraticBSplineGen g
g =
let (g
g0,g
gr) = g -> (g, g)
forall g. RandomGen g => g -> (g, g)
Rnd.split g
g
(g
g1,g
g2) = g -> (g, g)
forall g. RandomGen g => g -> (g, g)
Rnd.split g
gr
in g -> T y
forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteGen g
g0 T y -> T y -> T y
forall a. C a => T a -> T a -> T a
`Sig.mix`
g -> T y
forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteGen g
g1 T y -> T y -> T y
forall a. C a => T a -> T a -> T a
`Sig.mix`
g -> T y
forall y g. (C y, Random y, RandomGen g) => g -> T y
whiteGen g
g2
{-# INLINE randomPeeks #-}
randomPeeks :: (RealField.C y, Random y) =>
Sig.T y
-> Sig.T Bool
randomPeeks :: forall y. (C y, Random y) => T y -> T Bool
randomPeeks =
T -> T y -> T Bool
forall y g. (C y, Random y, RandomGen g) => g -> T y -> T Bool
randomPeeksGen (Int -> T
Knuth.cons Int
876)
{-# INLINE randomPeeksGen #-}
randomPeeksGen :: (RealField.C y, Random y, RandomGen g) =>
g
-> Sig.T y
-> Sig.T Bool
randomPeeksGen :: forall y g. (C y, Random y, RandomGen g) => g -> T y -> T Bool
randomPeeksGen =
(y -> y -> Bool) -> T y -> T y -> T Bool
forall a b c. (a -> b -> c) -> T a -> T b -> T c
Sig.zipWith y -> y -> Bool
forall a. Ord a => a -> a -> Bool
(<) (T y -> T y -> T Bool) -> (g -> T y) -> g -> T y -> T Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (y, y) -> g -> T y
forall y g. (C y, Random y, RandomGen g) => (y, y) -> g -> T y
randomRs (y
0,y
1)
{-# INLINE randomRs #-}
randomRs ::
(Field.C y, Random y, RandomGen g) =>
(y,y) -> g -> Sig.T y
randomRs :: forall y g. (C y, Random y, RandomGen g) => (y, y) -> g -> T y
randomRs (y, y)
bnd = (g -> Maybe (y, g)) -> g -> T y
forall acc y. (acc -> Maybe (y, acc)) -> acc -> T y
Sig.unfoldR ((y, g) -> Maybe (y, g)
forall a. a -> Maybe a
Just ((y, g) -> Maybe (y, g)) -> (g -> (y, g)) -> g -> Maybe (y, g)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (y, y) -> g -> (y, g)
forall g y. (RandomGen g, C y) => (y, y) -> g -> (y, g)
randomR (y, y)
bnd)
{-# INLINE randomR #-}
randomR ::
(RandomGen g, Field.C y) =>
(y, y) -> g -> (y, g)
randomR :: forall g y. (RandomGen g, C y) => (y, y) -> g -> (y, g)
randomR (y
lower,y
upper) g
g0 =
let (Int
n,g
g1) = g -> (Int, g)
forall g. RandomGen g => g -> (Int, g)
Rnd.next g
g0
(Int
l,Int
u) = g -> (Int, Int)
forall g. RandomGen g => g -> (Int, Int)
Rnd.genRange g
g0
nd :: y
nd = Int -> y
forall a b. (C a, C b) => a -> b
fromIntegral Int
n
ld :: y
ld = Int -> y
forall a b. (C a, C b) => a -> b
fromIntegral Int
l
ud :: y
ud = Int -> y
forall a b. (C a, C b) => a -> b
fromIntegral Int
u
x01 :: y
x01 = (y
ndy -> y -> y
forall a. C a => a -> a -> a
-y
ld)y -> y -> y
forall a. C a => a -> a -> a
/(y
udy -> y -> y
forall a. C a => a -> a -> a
-y
ld)
in ((y
1y -> y -> y
forall a. C a => a -> a -> a
-y
x01)y -> y -> y
forall a. C a => a -> a -> a
*y
lower y -> y -> y
forall a. C a => a -> a -> a
+ y
x01y -> y -> y
forall a. C a => a -> a -> a
*y
upper, g
g1)