{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.Storable.Oscillator where
import qualified Synthesizer.Basic.Wave as Wave
import qualified Synthesizer.Basic.Phase as Phase
import qualified Synthesizer.Storable.Signal as Signal
import Synthesizer.Storable.Signal (ChunkSize)
import Foreign.Storable (Storable)
import qualified Algebra.Transcendental as Trans
import qualified Algebra.RealRing as RealRing
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE freqToPhase #-}
freqToPhase :: (RealRing.C a, Storable a) =>
Phase.T a -> Signal.T a -> Signal.T (Phase.T a)
freqToPhase :: forall a. (C a, Storable a) => T a -> T a -> T (T a)
freqToPhase T a
phase T a
freq = (T a -> a -> T a) -> T a -> T a -> T (T a)
forall a b.
(Storable a, Storable b) =>
(a -> b -> a) -> a -> T b -> T a
Signal.scanL ((a -> T a -> T a) -> T a -> a -> T a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> T a -> T a
forall a. C a => a -> T a -> T a
Phase.increment) T a
phase T a
freq
{-# INLINE static #-}
static :: (RealRing.C a, Storable a, Storable b) =>
ChunkSize -> Wave.T a b -> (Phase.T a -> a -> Signal.T b)
static :: forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> a -> T b
static ChunkSize
size T a b
wave T a
phase a
freq =
(T a -> b) -> Vector (T a) -> Vector b
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
Signal.map (T a b -> T a -> b
forall t y. T t y -> T t -> y
Wave.apply T a b
wave) (ChunkSize -> (T a -> T a) -> T a -> Vector (T a)
forall a. Storable a => ChunkSize -> (a -> a) -> a -> Vector a
Signal.iterate ChunkSize
size (a -> T a -> T a
forall a. C a => a -> T a -> T a
Phase.increment a
freq) T a
phase)
phaseMod :: (RealRing.C a, Storable a, Storable b) =>
ChunkSize -> Wave.T a b -> a -> Signal.T a -> Signal.T b
phaseMod :: forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> a -> T a -> T b
phaseMod ChunkSize
size T a b
wave = ChunkSize -> (a -> T a b) -> T a -> a -> T a -> T b
forall a b c.
(C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> T a b) -> T a -> a -> T c -> T b
shapeMod ChunkSize
size (T a b -> a -> T a b
forall a b. C a => T a b -> a -> T a b
Wave.phaseOffset T a b
wave) T a
forall a. C a => a
zero
shapeMod :: (RealRing.C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> Wave.T a b) -> Phase.T a -> a -> Signal.T c -> Signal.T b
shapeMod :: forall a b c.
(C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> T a b) -> T a -> a -> T c -> T b
shapeMod ChunkSize
size c -> T a b
wave T a
phase a
freq T c
parameters =
(c -> T a -> b) -> T c -> Vector (T a) -> Vector b
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
Signal.zipWith (T a b -> T a -> b
forall t y. T t y -> T t -> y
Wave.apply (T a b -> T a -> b) -> (c -> T a b) -> c -> T a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> T a b
wave) T c
parameters
(ChunkSize -> (T a -> T a) -> T a -> Vector (T a)
forall a. Storable a => ChunkSize -> (a -> a) -> a -> Vector a
Signal.iterate ChunkSize
size (a -> T a -> T a
forall a. C a => a -> T a -> T a
Phase.increment a
freq) T a
phase)
freqMod :: (RealRing.C a, Storable a, Storable b) =>
ChunkSize -> Wave.T a b -> Phase.T a -> Signal.T a -> Signal.T b
freqMod :: forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
freqMod ChunkSize
_size T a b
wave T a
phase T a
freqs =
(T a -> b) -> Vector (T a) -> Vector b
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
Signal.map (T a b -> T a -> b
forall t y. T t y -> T t -> y
Wave.apply T a b
wave) (T a -> T a -> Vector (T a)
forall a. (C a, Storable a) => T a -> T a -> T (T a)
freqToPhase T a
phase T a
freqs)
phaseFreqMod :: (RealRing.C a, Storable a, Storable b) =>
ChunkSize -> Wave.T a b -> Signal.T a -> Signal.T a -> Signal.T b
phaseFreqMod :: forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
phaseFreqMod ChunkSize
size T a b
wave =
ChunkSize -> (a -> T a b) -> T a -> T a -> T a -> T b
forall a b c.
(C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> T a b) -> T a -> T c -> T a -> T b
shapeFreqMod ChunkSize
size (T a b -> a -> T a b
forall a b. C a => T a b -> a -> T a b
Wave.phaseOffset T a b
wave) T a
forall a. C a => a
zero
shapeFreqMod :: (RealRing.C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> Wave.T a b) ->
Phase.T a -> Signal.T c -> Signal.T a -> Signal.T b
shapeFreqMod :: forall a b c.
(C a, Storable a, Storable b, Storable c) =>
ChunkSize -> (c -> T a b) -> T a -> T c -> T a -> T b
shapeFreqMod ChunkSize
_size c -> T a b
wave T a
phase T c
parameters T a
freqs =
(c -> T a -> b) -> T c -> Vector (T a) -> Vector b
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
Signal.zipWith (T a b -> T a -> b
forall t y. T t y -> T t -> y
Wave.apply (T a b -> T a -> b) -> (c -> T a b) -> c -> T a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> T a b
wave) T c
parameters (T a -> T a -> Vector (T a)
forall a. (C a, Storable a) => T a -> T a -> T (T a)
freqToPhase T a
phase T a
freqs)
{-# INLINE staticSine #-}
staticSine :: (Trans.C a, RealRing.C a, Storable a) =>
ChunkSize -> Phase.T a -> a -> Signal.T a
staticSine :: forall a. (C a, C a, Storable a) => ChunkSize -> T a -> a -> T a
staticSine ChunkSize
size = ChunkSize -> T a a -> T a -> a -> T a
forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> a -> T b
static ChunkSize
size T a a
forall a. C a => T a a
Wave.sine
{-# INLINE freqModSine #-}
freqModSine :: (Trans.C a, RealRing.C a, Storable a) =>
ChunkSize -> Phase.T a -> Signal.T a -> Signal.T a
freqModSine :: forall a. (C a, C a, Storable a) => ChunkSize -> T a -> T a -> T a
freqModSine ChunkSize
size = ChunkSize -> T a a -> T a -> T a -> T a
forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
freqMod ChunkSize
size T a a
forall a. C a => T a a
Wave.sine
{-# INLINE phaseModSine #-}
phaseModSine :: (Trans.C a, RealRing.C a, Storable a) =>
ChunkSize -> a -> Signal.T a -> Signal.T a
phaseModSine :: forall a. (C a, C a, Storable a) => ChunkSize -> a -> T a -> T a
phaseModSine ChunkSize
size = ChunkSize -> T a a -> a -> T a -> T a
forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> a -> T a -> T b
phaseMod ChunkSize
size T a a
forall a. C a => T a a
Wave.sine
{-# INLINE staticSaw #-}
staticSaw :: (RealRing.C a, Storable a) =>
ChunkSize -> Phase.T a -> a -> Signal.T a
staticSaw :: forall a. (C a, Storable a) => ChunkSize -> T a -> a -> T a
staticSaw ChunkSize
size = ChunkSize -> T a a -> T a -> a -> T a
forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> a -> T b
static ChunkSize
size T a a
forall a. C a => T a a
Wave.saw
{-# INLINE freqModSaw #-}
freqModSaw :: (RealRing.C a, Storable a) =>
ChunkSize -> Phase.T a -> Signal.T a -> Signal.T a
freqModSaw :: forall a. (C a, Storable a) => ChunkSize -> T a -> T a -> T a
freqModSaw ChunkSize
size = ChunkSize -> T a a -> T a -> T a -> T a
forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
freqMod ChunkSize
size T a a
forall a. C a => T a a
Wave.saw