{-# 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 = forall a b.
(Storable a, Storable b) =>
(a -> b -> a) -> a -> T b -> T a
Signal.scanL (forall a b c. (a -> b -> c) -> b -> a -> c
flip 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 =
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
Signal.map (forall t y. T t y -> T t -> y
Wave.apply T a b
wave) (forall a. Storable a => ChunkSize -> (a -> a) -> a -> Vector a
Signal.iterate ChunkSize
size (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 = 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 (forall a b. C a => T a b -> a -> T a b
Wave.phaseOffset T a b
wave) 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 =
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
Signal.zipWith (forall t y. T t y -> T t -> y
Wave.apply forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> T a b
wave) T c
parameters
(forall a. Storable a => ChunkSize -> (a -> a) -> a -> Vector a
Signal.iterate ChunkSize
size (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 =
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
Signal.map (forall t y. T t y -> T t -> y
Wave.apply T a b
wave) (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 =
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 (forall a b. C a => T a b -> a -> T a b
Wave.phaseOffset T a b
wave) 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 =
forall a b c.
(Storable a, Storable b, Storable c) =>
(a -> b -> c) -> Vector a -> Vector b -> Vector c
Signal.zipWith (forall t y. T t y -> T t -> y
Wave.apply forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> T a b
wave) T c
parameters (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 = forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> a -> T b
static ChunkSize
size 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 = forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
freqMod ChunkSize
size 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 = forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> a -> T a -> T b
phaseMod ChunkSize
size 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 = forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> a -> T b
static ChunkSize
size 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 = forall a b.
(C a, Storable a, Storable b) =>
ChunkSize -> T a b -> T a -> T a -> T b
freqMod ChunkSize
size forall a. C a => T a a
Wave.saw