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

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

module DobutokO.Sound.Effects.Gain 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)

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

data FirstO = N1 | E | B | Bc | R deriving FirstO -> FirstO -> Bool
(FirstO -> FirstO -> Bool)
-> (FirstO -> FirstO -> Bool) -> Eq FirstO
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FirstO -> FirstO -> Bool
$c/= :: FirstO -> FirstO -> Bool
== :: FirstO -> FirstO -> Bool
$c== :: FirstO -> FirstO -> Bool
Eq

instance Show FirstO where
  show :: FirstO -> String
show FirstO
E = String
"-e "
  show FirstO
B = String
"-B "
  show FirstO
Bc = String
"-b "
  show FirstO
R = String
"-r "
  show FirstO
_ = String
""

data SecondO = N2 | E0 deriving SecondO -> SecondO -> Bool
(SecondO -> SecondO -> Bool)
-> (SecondO -> SecondO -> Bool) -> Eq SecondO
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SecondO -> SecondO -> Bool
$c/= :: SecondO -> SecondO -> Bool
== :: SecondO -> SecondO -> Bool
$c== :: SecondO -> SecondO -> Bool
Eq

instance Show SecondO where
  show :: SecondO -> String
show SecondO
N2 = String
"-n "
  show SecondO
_ = String
""

data ThirdO = L | H | N3 deriving ThirdO -> ThirdO -> Bool
(ThirdO -> ThirdO -> Bool)
-> (ThirdO -> ThirdO -> Bool) -> Eq ThirdO
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThirdO -> ThirdO -> Bool
$c/= :: ThirdO -> ThirdO -> Bool
== :: ThirdO -> ThirdO -> Bool
$c== :: ThirdO -> ThirdO -> Bool
Eq

instance Show ThirdO where
  show :: ThirdO -> String
show ThirdO
L = String
"-l "
  show ThirdO
H = String
"-h "
  show ThirdO
_ = String
""

data Gain1 a b c d = G a b c d deriving Gain1 a b c d -> Gain1 a b c d -> Bool
(Gain1 a b c d -> Gain1 a b c d -> Bool)
-> (Gain1 a b c d -> Gain1 a b c d -> Bool) -> Eq (Gain1 a b c d)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Gain1 a b c d -> Gain1 a b c d -> Bool
/= :: Gain1 a b c d -> Gain1 a b c d -> Bool
$c/= :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Gain1 a b c d -> Gain1 a b c d -> Bool
== :: Gain1 a b c d -> Gain1 a b c d -> Bool
$c== :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Gain1 a b c d -> Gain1 a b c d -> Bool
Eq

instance Show (Gain1 FirstO SecondO ThirdO Float) where
  show :: Gain1 FirstO SecondO ThirdO Float -> String
show (G FirstO
x SecondO
y ThirdO
z Float
t) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"gain ", FirstO -> String
forall a. Show a => a -> String
show FirstO
x, SecondO -> String
forall a. Show a => a -> String
show SecondO
y, ThirdO -> String
forall a. Show a => a -> String
show ThirdO
z, Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
t String
" "]

type Gain = Gain1 FirstO SecondO ThirdO Float

gain1 :: Gain1 a b c d -> a
gain1 :: Gain1 a b c d -> a
gain1 (G a
x b
_ c
_ d
_) = a
x

gain2 :: Gain1 a b c d -> b
gain2 :: Gain1 a b c d -> b
gain2 (G a
_ b
y c
_ d
_) = b
y

gain3 :: Gain1 a b c d -> c
gain3 :: Gain1 a b c d -> c
gain3 (G a
_ b
_ c
z d
_) = c
z

gain4 :: Gain1 a b c d -> d
gain4 :: Gain1 a b c d -> d
gain4 (G a
_ b
_ c
_ d
t) = d
t

gainSet1 :: a -> Gain1 a b c d -> Gain1 a b c d
gainSet1 :: a -> Gain1 a b c d -> Gain1 a b c d
gainSet1 a
x (G a
_ b
y c
z d
t) = a -> b -> c -> d -> Gain1 a b c d
forall a b c d. a -> b -> c -> d -> Gain1 a b c d
G a
x b
y c
z d
t

gainSet2 :: b -> Gain1 a b c d -> Gain1 a b c d
gainSet2 :: b -> Gain1 a b c d -> Gain1 a b c d
gainSet2 b
y (G a
x b
_ c
z d
t) = a -> b -> c -> d -> Gain1 a b c d
forall a b c d. a -> b -> c -> d -> Gain1 a b c d
G a
x b
y c
z d
t

gainSet3 :: c -> Gain1 a b c d -> Gain1 a b c d
gainSet3 :: c -> Gain1 a b c d -> Gain1 a b c d
gainSet3 c
z (G a
x b
y c
_ d
t) = a -> b -> c -> d -> Gain1 a b c d
forall a b c d. a -> b -> c -> d -> Gain1 a b c d
G a
x b
y c
z d
t

gainSet4 :: d -> Gain1 a b c d -> Gain1 a b c d
gainSet4 :: d -> Gain1 a b c d -> Gain1 a b c d
gainSet4 d
t (G a
x b
y c
z d
_) = a -> b -> c -> d -> Gain1 a b c d
forall a b c d. a -> b -> c -> d -> Gain1 a b c d
G a
x b
y c
z d
t

showGQ :: Gain -> [String]
showGQ :: Gain1 FirstO SecondO ThirdO Float -> [String]
showGQ = String -> [String]
words (String -> [String])
-> (Gain1 FirstO SecondO ThirdO Float -> String)
-> Gain1 FirstO SecondO ThirdO Float
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gain1 FirstO SecondO ThirdO Float -> String
forall a. Show a => a -> String
show

data Norm = Norm | N4 deriving Norm -> Norm -> Bool
(Norm -> Norm -> Bool) -> (Norm -> Norm -> Bool) -> Eq Norm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Norm -> Norm -> Bool
$c/= :: Norm -> Norm -> Bool
== :: Norm -> Norm -> Bool
$c== :: Norm -> Norm -> Bool
Eq

instance Show Norm where
  show :: Norm -> String
show Norm
Norm = String
"norm "
  show Norm
_ = String
""