-- |
-- Module      :  DobutokO.Sound.Effects.Contrast
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Can be used for applying the SoX \"contrast\" effect. 
-- 

{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE CPP, FlexibleInstances #-}

module DobutokO.Sound.Effects.Contrast 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 DobutokO.Sound.ToRange
import Numeric (showFFloat)

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

data Contrast a = E | Ct a deriving Eq

instance Show (Contrast Float) where
  show E = "contrast 75"
  show (Ct x) = mconcat ["contrast ", showFFloat Nothing (toRange 100.0 . abs $ x) " "]

type Cntrst = Contrast Float

contrastC :: Contrast a -> String
contrastC E = "E"
contrastC _ = "Ct"

contrast1 :: Contrast a -> Maybe a
contrast1 (Ct x) = Just x
contrast1 _ = Nothing

contrastE1 :: Cntrst -> Float
contrastE1 (Ct x) = x
contrastE1 E = 75.0

contrastSet1 :: a -> Contrast a -> Contrast a
contrastSet1 x _ = Ct x

showCtQ :: Cntrst -> [String]
showCtQ = words . show