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

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

module DobutokO.Sound.Effects.Tremolo 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 Tremolo a = TL1 a | TL2 a a deriving Eq

instance Show (Tremolo Float) where
  show (TL1 x) = mconcat ["tremolo ", showFFloat Nothing (abs x) " "]
  show (TL2 x y) = mconcat ["tremolo ", showFFloat Nothing (abs x) " ", showFFloat Nothing (toRange 100.0 (abs y)) " "]

type Treml = Tremolo Float

tremoloC :: Tremolo a -> String
tremoloC (TL1 _) = "TL1"
tremoloC _ = "TL2"

tremolo1 :: Tremolo a -> a
tremolo1 (TL1 x) = x
tremolo1 (TL2 x _) = x

tremolo2 :: Tremolo a -> Maybe a
tremolo2 (TL2 _ y) = Just y
tremolo2 _ = Nothing

tremoloSet1 :: a -> Tremolo a -> Tremolo a
tremoloSet1 x (TL2 _ y) = TL2 x y
tremoloSet1 x _ = TL1 x

tremoloSet2 :: a -> Tremolo a -> Tremolo a
tremoloSet2 y (TL2 x _) = TL2 x y
tremoloSet2 y (TL1 x) = TL2 x y

showTLQ :: Treml -> [String]
showTLQ = words . show