{-# 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 :: forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
ramp Exp Word
dur =
   Exp Word -> T (T a) (T a)
forall a. Exp Word -> T a a
Causal.take Exp Word
dur T (T a) (T a) -> SignalOf T (T a) -> SignalOf T (T a)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* Exp a -> T (T a)
forall a. (C a, Field a, IntegerConstant a) => Exp a -> MV a
Sig.rampInf (Exp Word -> Exp a
forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar) =>
Exp i -> Exp a
Expr.fromIntegral Exp Word
dur)

parabolaFadeIn :: forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
parabolaFadeIn Exp Word
dur =
   Exp Word -> T (T a) (T a)
forall a. Exp Word -> T a a
Causal.take Exp Word
dur T (T a) (T a) -> SignalOf T (T a) -> SignalOf T (T a)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* Exp a -> T (T a)
forall a. (C a, Field a, IntegerConstant a) => Exp a -> MV a
Sig.parabolaFadeInInf (Exp Word -> Exp a
forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar) =>
Exp i -> Exp a
Expr.fromIntegral Exp Word
dur)

parabolaFadeOut :: forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
parabolaFadeOut Exp Word
dur =
   Exp Word -> T (T a) (T a)
forall a. Exp Word -> T a a
Causal.take Exp Word
dur T (T a) (T a) -> SignalOf T (T a) -> SignalOf T (T a)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* Exp a -> T (T a)
forall a. (C a, Field a, IntegerConstant a) => Exp a -> MV a
Sig.parabolaFadeOutInf (Exp Word -> Exp a
forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar) =>
Exp i -> Exp a
Expr.fromIntegral Exp Word
dur)

parabolaFadeInMap :: forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
parabolaFadeInMap Exp Word
dur = (Exp a -> Exp a) -> T (T a) (T a)
forall ae a be b.
(Aggregate ae a, Aggregate be b) =>
(ae -> be) -> T a b
Causal.map (\Exp a
t -> Exp a
tExp a -> Exp a -> Exp a
forall a. C a => a -> a -> a
*(Exp a
2Exp a -> Exp a -> Exp a
forall a. C a => a -> a -> a
-Exp a
t)) T (T a) (T a) -> SignalOf T (T a) -> SignalOf T (T a)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* Exp Word -> T (T a)
forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
ramp Exp Word
dur
parabolaFadeOutMap :: forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
parabolaFadeOutMap Exp Word
dur = (Exp a -> Exp a) -> T (T a) (T a)
forall ae a be b.
(Aggregate ae a, Aggregate be b) =>
(ae -> be) -> T a b
Causal.map (\Exp a
t -> Exp a
1Exp a -> Exp a -> Exp a
forall a. C a => a -> a -> a
-Exp a
tExp a -> Exp a -> Exp a
forall a. C a => a -> a -> a
*Exp a
t) T (T a) (T a) -> SignalOf T (T a) -> SignalOf T (T a)
forall (process :: * -> * -> *) a b.
C process =>
process a b -> SignalOf process a -> SignalOf process b
$* Exp Word -> T (T a)
forall a ar.
(C a, Field a, IntegerConstant a, NativeFloating a ar) =>
Exp Word -> MV a
ramp Exp Word
dur