{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE CPP, FlexibleInstances #-}
module DobutokO.Sound.Effects.Vol where
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import Numeric (showFFloat)
import DobutokO.Sound.ToRange
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif
data VolType = N | A | P | D deriving Eq
instance Show VolType where
show A = "amplitude "
show P = "power "
show D = "dB "
show _ = ""
data Vol2 a b = V1 a | V2 a b | V3 a b a deriving Eq
instance Show (Vol2 Float VolType) where
show (V1 x) = mconcat ["vol ", showFFloat Nothing x " "]
show (V2 x y) = mconcat ["vol ", showFFloat Nothing x " ", show y]
show (V3 x y z) = mconcat ["vol ", showFFloat Nothing x " ", show y, showFFloat Nothing (toRange 0.1 (abs z)) " "]
type Vol = Vol2 Float VolType
volC :: Vol2 a b -> String
volC (V1 _) = "V1"
volC (V2 _ _) = "V2"
volC (V3 _ _ _) = "V3"
vol1 :: Vol2 a b -> a
vol1 (V1 x) = x
vol1 (V2 x _) = x
vol1 (V3 x _ _) = x
vol2 :: Vol2 a b -> Maybe b
vol2 (V2 _ y) = Just y
vol2 (V3 _ y _) = Just y
vol2 _ = Nothing
vol3 :: Vol2 a b -> Maybe a
vol3 (V3 _ _ z) = Just z
vol3 _ = Nothing
volSet1 :: a -> Vol2 a b -> Vol2 a b
volSet1 x (V1 _) = V1 x
volSet1 x (V2 _ y) = V2 x y
volSet1 x (V3 _ y z) = V3 x y z
volSet2 :: b -> Vol2 a b -> Vol2 a b
volSet2 y (V1 x) = V2 x y
volSet2 y (V2 x _) = V2 x y
volSet2 y (V3 x _ z) = V3 x y z
volSet3 :: Float -> Vol -> Vol
volSet3 x (V1 x1) = V3 x1 N x
volSet3 x (V2 x1 y) = V3 x1 y x
volSet3 x (V3 x1 y z) = V3 x1 y x
showVQ :: Vol -> [String]
showVQ = words . show