{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE CPP, FlexibleInstances #-}
module DobutokO.Sound.Effects.Overdrive 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 Overdrive a = OD | OD1 a | OD2 a a deriving Eq
instance Show (Overdrive Float) where
show (OD1 x) = mconcat ["overdrive ", showFFloat Nothing (toRange 100.0 (abs x)) " "]
show (OD2 x y) = mconcat ["overdrive ", showFFloat Nothing (toRange 100.0 (abs x)) " ", showFFloat Nothing (toRange 100.0 (abs y)) " "]
show _ = "overdrive "
type Ovdrive = Overdrive Float
overdriveC :: Overdrive a -> String
overdriveC OD = "OD"
overdriveC (OD1 _) = "OD1"
overdriveC _ = "OD2"
overdrive1 :: Overdrive a -> Maybe a
overdrive1 (OD1 x) = Just x
overdrive1 (OD2 x _) = Just x
overdrive1 _ = Nothing
overdrive2 :: Overdrive a -> Maybe a
overdrive2 (OD2 _ y) = Just y
overdrive2 _ = Nothing
overdriveSet1 :: a -> Overdrive a -> Overdrive a
overdriveSet1 x (OD2 _ y) = OD2 x y
overdriveSet1 x _ = OD1 x
overdriveSet2 :: a -> Overdrive a -> Maybe (Overdrive a)
overdriveSet2 y (OD2 x _) = Just (OD2 x y)
overdriveSet2 y (OD1 x) = Just (OD2 x y)
overdriveSet2 _ _ = Nothing
showODQ :: Ovdrive -> [String]
showODQ = words . show