synthesizer-0.2: src/Synthesizer/State/Miscellaneous.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Synthesizer.State.Miscellaneous where
import qualified Synthesizer.State.Signal as Signal
import qualified Algebra.NormedSpace.Euclidean as Euc
-- import qualified Algebra.Module as Module
-- import qualified Algebra.Transcendental as Trans
import qualified Algebra.Field as Field
-- import qualified Algebra.Ring as Ring
-- import qualified Algebra.Additive as Additive
-- import qualified Prelude as P
-- import PreludeBase
import NumericPrelude
{- * Spatial effects -}
{-| simulate an moving sounding object
convert the way of the object through 3D space
into a delay and attenuation information,
sonicDelay is the reciprocal of the sonic velocity -}
{-# INLINE receive3Dsound #-}
receive3Dsound :: (Field.C a, Euc.C a v) =>
a -> a -> v -> Signal.T v -> (Signal.T a,Signal.T a)
receive3Dsound att sonicDelay ear way =
let dists = Signal.map Euc.norm (Signal.map (subtract ear) way)
phase = Signal.map (sonicDelay*) dists
volumes = Signal.map (\x -> 1/(att+x)^2) dists
in (phase, volumes)