{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleContexts #-} {- | This is like "Synthesizer.LLVM.CausalParameterized.Controlled" but for vectorised signals. -} module Synthesizer.LLVM.CausalParameterized.ControlledPacked ( CtrlS.process, processCtrlRate, ) where import qualified Synthesizer.LLVM.CausalParameterized.Process as CausalP import qualified Synthesizer.LLVM.Causal.ControlledPacked as CtrlS import qualified Synthesizer.LLVM.Parameterized.Signal as SigP import qualified Synthesizer.LLVM.Parameter as Param import qualified Synthesizer.LLVM.Frame.SerialVector as Serial import qualified LLVM.Extra.Memory as Memory import qualified LLVM.Extra.ScalarOrVector as SoV import LLVM.Extra.Class (MakeValueTuple, ValueTuple, ) import qualified LLVM.Core as LLVM import LLVM.Core (Value, IsFloating, IsSized, ) import Foreign.Storable (Storable, ) import qualified Algebra.Field as Field import NumericPrelude.Numeric import NumericPrelude.Base import Prelude () processCtrlRate :: (CtrlS.C parameter av bv, Serial.Read av, n ~ Serial.Size av, Serial.C bv, n ~ Serial.Size bv, Memory.C parameter, Field.C r, Storable r, IsFloating r, SoV.IntegerConstant r, Memory.FirstClass r, Memory.Stored r ~ rm, IsSized r, IsSized rm, MakeValueTuple r, ValueTuple r ~ (Value r), LLVM.CmpRet r, LLVM.CmpResult r ~ Bool) => Param.T p r -> (Param.T p r -> SigP.T p parameter) -> CausalP.T p av bv processCtrlRate reduct ctrlGen = Serial.withSize $ \n -> CausalP.applyFst CtrlS.process (SigP.interpolateConstant (fmap (/ fromIntegral n) reduct) (ctrlGen reduct))