module Synthesizer.Dimensional.Rate.Oscillator (
static,
staticAntiAlias,
freqMod,
freqModAntiAlias,
phaseMod,
phaseFreqMod,
shapeMod,
shapeFreqMod,
staticSample,
freqModSample,
shapeFreqModFromSampledTone,
shapePhaseFreqModFromSampledTone,
) where
import qualified Synthesizer.Dimensional.Abstraction.HomogeneousGen as Hom
import qualified Synthesizer.Dimensional.Abstraction.Flat as Flat
import qualified Synthesizer.Dimensional.Amplitude as Amp
import qualified Synthesizer.Dimensional.RatePhantom as RP
import qualified Synthesizer.Dimensional.RateWrapper as SigP
import qualified Synthesizer.State.Oscillator as Osci
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.Dimensional.Causal.Process as CausalD
import qualified Synthesizer.Dimensional.Causal.Oscillator as OsciC
import qualified Synthesizer.Dimensional.Map as MapD
import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.Basic.WaveSmoothed as WaveSmooth
import qualified Synthesizer.Basic.Wave as Wave
import qualified Synthesizer.Basic.Phase as Phase
import qualified Synthesizer.Dimensional.Straight.Signal as SigS
import qualified Synthesizer.Dimensional.Cyclic.Signal as SigC
import qualified Synthesizer.Dimensional.Amplitude.Signal as SigA
import qualified Synthesizer.Dimensional.Process as Proc
import Synthesizer.Dimensional.Process (toFrequencyScalar, )
import qualified Synthesizer.Interpolation as Interpolation
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import qualified Algebra.RealField as RealField
import qualified Algebra.Field as Field
import PreludeBase as P
class (Hom.C amp (Wave.T t) wave, Hom.C amp Sig.T signal) =>
Simple amp t wave signal
| wave -> t, signal t -> wave, wave -> signal,
signal -> amp, wave -> amp where
instance Simple CausalD.Flat t (Wave.T t) (SigS.T Sig.T) where
instance (Amp.C amp) =>
Simple amp t (SigA.T amp (Wave.T t)) (SigA.T amp (SigS.T Sig.T)) where
class (Hom.C amp (WaveSmooth.T t) wave, Hom.C amp Sig.T signal) =>
Smooth amp t wave signal
| wave -> t, signal t -> wave, wave -> signal,
signal -> amp, wave -> amp where
instance Smooth CausalD.Flat t (WaveSmooth.T t) (SigS.T Sig.T) where
instance (Amp.C amp) =>
Smooth amp t (SigA.T amp (WaveSmooth.T t)) (SigA.T amp (SigS.T Sig.T)) where
withWave ::
(Hom.C amp waveStore wave, Hom.C amp Sig.T sig) =>
wave y -> (waveStore y -> Sig.T y) -> RP.T s sig y
withWave w f =
RP.fromSignal $ Hom.plainProcessSamples f w
static ::
(RealField.C t, Dim.C u,
Simple amp t wave sig) =>
wave y
-> Phase.T t
-> DN.T (Dim.Recip u) t
-> Proc.T s u t (RP.T s sig y)
static wave phase =
staticAux (\freq -> withWave wave $ \w -> Osci.static w phase freq)
staticAntiAlias ::
(RealField.C t, Dim.C u,
Smooth amp t wave sig) =>
wave y
-> Phase.T t
-> DN.T (Dim.Recip u) t
-> Proc.T s u t (RP.T s sig y)
staticAntiAlias wave phase =
staticAux (\freq -> withWave wave $ \w -> Osci.staticAntiAlias w phase freq)
freqMod ::
(RealField.C t, Dim.C u,
Simple amp t wave sig) =>
wave y
-> Phase.T t
-> Proc.T s u t (
SigA.R s (Dim.Recip u) t t
-> RP.T s sig y)
freqMod wave phase =
freqModAux (\t -> withWave wave $ \w -> Osci.freqMod w phase t)
freqModAntiAlias ::
(RealField.C t, Dim.C u,
Smooth amp t wave sig) =>
wave y
-> Phase.T t
-> Proc.T s u t (
SigA.R s (Dim.Recip u) t t
-> RP.T s sig y)
freqModAntiAlias wave phase =
freqModAux (\t -> withWave wave $ \w -> Osci.freqModAntiAlias w phase t)
phaseMod ::
(Flat.C flat t, RealField.C t, Dim.C u,
Simple amp t wave sig) =>
wave y
-> DN.T (Dim.Recip u) t
-> Proc.T s u t (
RP.T s flat t
-> RP.T s sig y)
phaseMod wave =
staticAux (\freq sig ->
withWave wave $ \w -> Osci.phaseMod w freq . Flat.toSamples $ sig)
shapeMod ::
(Flat.C flat c, RealField.C t, Dim.C u) =>
(c -> Wave.T t y)
-> Phase.T t
-> DN.T (Dim.Recip u) t
-> Proc.T s u t (
RP.T s flat c
-> SigS.R s y)
shapeMod wave phase =
staticAux (\freq -> SigS.fromSamples . Osci.shapeMod wave phase freq . Flat.toSamples)
phaseFreqMod ::
(Flat.C flat t, RealField.C t, Dim.C u,
Simple amp t wave sig) =>
wave y
-> Proc.T s u t (
RP.T s flat t
-> SigA.R s (Dim.Recip u) t t
-> RP.T s sig y)
phaseFreqMod wave =
fmap flip $
freqModAux (\ freqs phases ->
withWave wave $ \w ->
Osci.phaseFreqMod w (Flat.toSamples phases) freqs)
shapeFreqMod :: (Flat.C flat c, RealField.C t, Dim.C u) =>
(c -> Wave.T t y)
-> Phase.T t
-> Proc.T s u t (
RP.T s flat c
-> SigA.R s (Dim.Recip u) t t
-> SigS.R s y)
shapeFreqMod wave phase =
fmap flip $
freqModAux
(\ freqs parameters ->
SigS.fromSamples $ Osci.shapeFreqMod wave phase (Flat.toSamples parameters) freqs)
staticSample :: (RealField.C t, Dim.C u) =>
Interpolation.T t y
-> SigC.R r y
-> Phase.T t
-> DN.T (Dim.Recip u) t
-> Proc.T s u t (SigS.R s y)
staticSample ip wave phase =
staticAux (SigS.fromSamples . Osci.staticSample ip (SigC.toPeriod wave) phase)
freqModSample :: (RealField.C t, Dim.C u) =>
Interpolation.T t y
-> SigC.R r y
-> Phase.T t
-> Proc.T s u t (
SigA.R s (Dim.Recip u) t t
-> SigS.R s y)
freqModSample ip wave phase =
freqModAux (SigS.fromSamples . Osci.freqModSample ip (SigC.toPeriod wave) phase)
shapeFreqModFromSampledTone ::
(RealField.C t, SigG.Transform storage yv, Dim.C u,
Hom.C amp storage input, Hom.C amp Sig.T output,
Flat.C flat t) =>
Interpolation.T t yv
-> Interpolation.T t yv
-> DN.T (Dim.Recip u) t
-> SigP.T u t input yv
-> t -> Phase.T t
-> Proc.T s u t (
RP.T s flat t
-> SigA.R s (Dim.Recip u) t t
-> RP.T s output yv)
shapeFreqModFromSampledTone
ipLeap ipStep srcFreq sampledTone shape0 phase =
flip fmap
(OsciC.shapeFreqModFromSampledTone
ipLeap ipStep srcFreq sampledTone shape0 phase)
(\osci ->
\shapes freqs ->
osci
`CausalD.applyFlatFst`
shapes
`CausalD.apply`
freqs)
shapePhaseFreqModFromSampledTone ::
(RealField.C t, SigG.Transform storage yv, Dim.C u,
Hom.C amp storage input, Hom.C amp Sig.T output,
Flat.C flatS t, Flat.C flatP t) =>
Interpolation.T t yv
-> Interpolation.T t yv
-> DN.T (Dim.Recip u) t
-> SigP.T u t input yv
-> t -> Phase.T t
-> Proc.T s u t (
RP.T s flatS t
-> RP.T s flatP t
-> SigA.R s (Dim.Recip u) t t
-> RP.T s output yv)
shapePhaseFreqModFromSampledTone
ipLeap ipStep srcFreq sampledTone shape0 phase =
flip fmap
(OsciC.shapePhaseFreqModFromSampledTone
ipLeap ipStep srcFreq sampledTone shape0 phase)
(\osci ->
\shapes phaseDistort freqs ->
(osci CausalD.<<^ MapD.packTriple)
`CausalD.applyFlatFst`
shapes
`CausalD.applyFlatFst`
phaseDistort
`CausalD.apply`
freqs)
freqModAux :: (Field.C t, Dim.C u) =>
(Sig.T t -> c)
-> Proc.T s u t (
SigA.R s (Dim.Recip u) t t
-> c)
freqModAux f =
fmap
(\toFreq -> f . SigA.scalarSamples toFreq)
(Proc.withParam toFrequencyScalar)
staticAux :: (Dim.C u, Field.C t) =>
(t -> c)
-> DN.T (Dim.Recip u) t
-> Proc.T s u t c
staticAux f freq =
fmap f (toFrequencyScalar freq)