{-# LANGUAGE DataKinds #-}
-- {-# LANGUAGE OverloadedStrings #-}
-- {-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeFamilies, NoMonoLocalBinds #-}

{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ExtendedDefaultRules #-}

module Vivid.UGens.UserInteraction (
---     keyState
---   , mouseButton
     mouseX
   , mouseY
   ) where

import Vivid.SC.SynthDef.Types (CalculationRate(..))
import Vivid.SynthDef
import Vivid.UGens.Args
import Vivid.SynthDef.FromUA

-- import Data.ByteString (ByteString)


--- keyState ::
--- keyState =
--- mouseButton ::
--- mouseButton =

-- | Only runs at 'KR'
-- 
--   Args:
--    - warp -- "Mapping curve. 0 is linear, 1 is exponential (e. g. for freq or times)"
--    - lag -- "Lag factor to dezpipper cursor movement"
mouseY :: Args '[] '["min","max","warp","lagSecs"] a => a -> SDBody a Signal
mouseY :: a -> SDBody a Signal
mouseY = String -> a -> SDBody a Signal
forall a.
Args '[] '["min", "max", "warp", "lagSecs"] a =>
String -> a -> SDBody a Signal
mouseGeneral String
"MouseY"

-- | Only runs at 'KR'
-- 
--   Args:
--    - warp -- "Mapping curve. 0 is linear, 1 is exponential (e. g. for freq or times)"
--    - lag -- "Lag factor to dezpipper cursor movement"
mouseX :: Args '[] '["min","max","warp","lagSecs"] a => a -> SDBody a Signal
mouseX :: a -> SDBody a Signal
mouseX = String -> a -> SDBody a Signal
forall a.
Args '[] '["min", "max", "warp", "lagSecs"] a =>
String -> a -> SDBody a Signal
mouseGeneral String
"MouseX"

mouseGeneral :: Args '[] '["min","max","warp","lagSecs"] a => String -> a -> SDBody a Signal
mouseGeneral :: String -> a -> SDBody a Signal
mouseGeneral String
ugenName = String
-> CalculationRate
-> Vs '["min", "max", "warp", "lagSecs"]
-> (UA "min" (SDBodyArgs a), UA "max" (SDBodyArgs a),
    UA "warp" (SDBodyArgs a), UA "lagSecs" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
ugenName CalculationRate
KR
   (Vs '["min", "max", "warp", "lagSecs"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["min", "max", "warp", "lagSecs"])
   (Float -> UA "min" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "min" as
min_ (Float
0::Float), Float -> UA "max" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "max" as
max_ (Float
1::Float), Float -> UA "warp" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "warp" as
warp_ (Float
0::Float), Float -> UA "lagSecs" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "lagSecs" as
lagTime_ (Float
0.2::Float))