{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE Rank2Types #-}
module Synthesizer.LLVM.Generator.Extra where

import qualified Synthesizer.LLVM.Causal.Process as Causal
import qualified Synthesizer.LLVM.Generator.Signal as Sig
import Synthesizer.Causal.Class (($*))

import qualified LLVM.DSL.Expression as Expr
import LLVM.DSL.Expression (Exp)

import qualified LLVM.Extra.Multi.Value.Marshal as Marshal
import qualified LLVM.Extra.Multi.Value as MultiValue

import Data.Word (Word)

import NumericPrelude.Numeric



ramp,
 parabolaFadeIn, parabolaFadeOut,
 parabolaFadeInMap, parabolaFadeOutMap ::
   (Marshal.C a, MultiValue.Field a, MultiValue.IntegerConstant a,
    MultiValue.NativeFloating a ar) =>
   Exp Word -> Sig.MV a

ramp dur =
   Causal.take dur $* Sig.rampInf (Expr.fromIntegral dur)

parabolaFadeIn dur =
   Causal.take dur $* Sig.parabolaFadeInInf (Expr.fromIntegral dur)

parabolaFadeOut dur =
   Causal.take dur $* Sig.parabolaFadeOutInf (Expr.fromIntegral dur)

parabolaFadeInMap dur = Causal.map (\t -> t*(2-t)) $* ramp dur
parabolaFadeOutMap dur = Causal.map (\t -> 1-t*t) $* ramp dur