-- |
-- Module      :  DobutokO.Sound.Effects.PassReject
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Can be used for applying the SoX effects with the needed specifications. 
-- 

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

module DobutokO.Sound.Effects.PassReject 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.Effects.Specs
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

data FreqWidth a b = Fr1 a | FrW2 a b deriving FreqWidth a b -> FreqWidth a b -> Bool
(FreqWidth a b -> FreqWidth a b -> Bool)
-> (FreqWidth a b -> FreqWidth a b -> Bool) -> Eq (FreqWidth a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => FreqWidth a b -> FreqWidth a b -> Bool
/= :: FreqWidth a b -> FreqWidth a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => FreqWidth a b -> FreqWidth a b -> Bool
== :: FreqWidth a b -> FreqWidth a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => FreqWidth a b -> FreqWidth a b -> Bool
Eq

instance Show (FreqWidth Freq1 Width1) where
  show :: FreqWidth Freq1 Width1 -> String
show (Fr1 Freq1
x) = Freq1 -> String
forall a. Show a => a -> String
show Freq1
x
  show (FrW2 Freq1
x Width1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Freq1 -> String
forall a. Show a => a -> String
show Freq1
x,String
" ",Width1 -> String
forall a. Show a => a -> String
show Width1
y]

type FreqW2 = FreqWidth Freq1 Width1   

freqWidthC :: FreqWidth a b -> String
freqWidthC :: FreqWidth a b -> String
freqWidthC (Fr1 a
_) = String
"Fr1"
freqWidthC (FrW2 a
_ b
_) = String
"FrW2"

freqWidth1 :: FreqWidth a b -> a
freqWidth1 :: FreqWidth a b -> a
freqWidth1 (Fr1 a
x) = a
x
freqWidth1 (FrW2 a
x b
_) = a
x

freqWidth2 :: FreqWidth a b -> Maybe b
freqWidth2 :: FreqWidth a b -> Maybe b
freqWidth2 (Fr1 a
_) = Maybe b
forall a. Maybe a
Nothing
freqWidth2 (FrW2 a
_ b
y) = b -> Maybe b
forall a. a -> Maybe a
Just b
y

freqWidthSet1 :: a -> FreqWidth a b -> FreqWidth a b
freqWidthSet1 :: a -> FreqWidth a b -> FreqWidth a b
freqWidthSet1 a
x (Fr1 a
_) = a -> FreqWidth a b
forall a b. a -> FreqWidth a b
Fr1 a
x
freqWidthSet1 a
x (FrW2 a
_ b
y) = a -> b -> FreqWidth a b
forall a b. a -> b -> FreqWidth a b
FrW2 a
x b
y

freqWidthSet2 :: b -> FreqWidth a b -> FreqWidth a b
freqWidthSet2 :: b -> FreqWidth a b -> FreqWidth a b
freqWidthSet2 b
y (Fr1 a
x) = a -> b -> FreqWidth a b
forall a b. a -> b -> FreqWidth a b
FrW2 a
x b
y
freqWidthSet2 b
y (FrW2 a
x b
_) = a -> b -> FreqWidth a b
forall a b. a -> b -> FreqWidth a b
FrW2 a
x b
y

data Freq a = Fr a deriving Freq a -> Freq a -> Bool
(Freq a -> Freq a -> Bool)
-> (Freq a -> Freq a -> Bool) -> Eq (Freq a)
forall a. Eq a => Freq a -> Freq a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Freq a -> Freq a -> Bool
$c/= :: forall a. Eq a => Freq a -> Freq a -> Bool
== :: Freq a -> Freq a -> Bool
$c== :: forall a. Eq a => Freq a -> Freq a -> Bool
Eq

instance Show (Freq Freq1) where
  show :: Freq Freq1 -> String
show (Fr Freq1
x) = Freq1 -> String
forall a. Show a => a -> String
show Freq1
x

type Freq11 = Freq Freq1

freqC :: Freq a -> String
freqC :: Freq a -> String
freqC (Fr a
_) = String
"Fr"

freq1 :: Freq a -> a
freq1 :: Freq a -> a
freq1 (Fr a
x) = a
x

freqSet1 :: a -> Freq a -> Freq a
freqSet1 :: a -> Freq a -> Freq a
freqSet1 a
x (Fr a
_) = a -> Freq a
forall a. a -> Freq a
Fr a
x

data AllPass a = AP a deriving AllPass a -> AllPass a -> Bool
(AllPass a -> AllPass a -> Bool)
-> (AllPass a -> AllPass a -> Bool) -> Eq (AllPass a)
forall a. Eq a => AllPass a -> AllPass a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AllPass a -> AllPass a -> Bool
$c/= :: forall a. Eq a => AllPass a -> AllPass a -> Bool
== :: AllPass a -> AllPass a -> Bool
$c== :: forall a. Eq a => AllPass a -> AllPass a -> Bool
Eq

instance Show (AllPass FreqW2) where
  show :: AllPass (FreqWidth Freq1 Width1) -> String
show (AP FreqWidth Freq1 Width1
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"allpass ",FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
x]

type Allpass = AllPass FreqW2

allPass1 :: AllPass a -> a
allPass1 :: AllPass a -> a
allPass1 (AP a
x) = a
x

allPassSet1 :: a -> AllPass a -> AllPass a
allPassSet1 :: a -> AllPass a -> AllPass a
allPassSet1 a
x (AP a
_) = a -> AllPass a
forall a. a -> AllPass a
AP a
x

showApQ :: Allpass -> [String]
showApQ :: AllPass (FreqWidth Freq1 Width1) -> [String]
showApQ = String -> [String]
words (String -> [String])
-> (AllPass (FreqWidth Freq1 Width1) -> String)
-> AllPass (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AllPass (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show

data BandReject a = BR a deriving BandReject a -> BandReject a -> Bool
(BandReject a -> BandReject a -> Bool)
-> (BandReject a -> BandReject a -> Bool) -> Eq (BandReject a)
forall a. Eq a => BandReject a -> BandReject a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BandReject a -> BandReject a -> Bool
$c/= :: forall a. Eq a => BandReject a -> BandReject a -> Bool
== :: BandReject a -> BandReject a -> Bool
$c== :: forall a. Eq a => BandReject a -> BandReject a -> Bool
Eq

instance Show (BandReject FreqW2) where
  show :: BandReject (FreqWidth Freq1 Width1) -> String
show (BR FreqWidth Freq1 Width1
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"bandreject ",FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
x]

type Bandreject = BandReject FreqW2

bandReject1 :: BandReject a -> a
bandReject1 :: BandReject a -> a
bandReject1 (BR a
x) = a
x

bandRejectSet1 :: a -> BandReject a -> BandReject a
bandRejectSet1 :: a -> BandReject a -> BandReject a
bandRejectSet1 a
x (BR a
_) = a -> BandReject a
forall a. a -> BandReject a
BR a
x

showBrQ :: Bandreject -> [String]
showBrQ :: BandReject (FreqWidth Freq1 Width1) -> [String]
showBrQ = String -> [String]
words (String -> [String])
-> (BandReject (FreqWidth Freq1 Width1) -> String)
-> BandReject (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BandReject (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show

data BandpassPar = C0 | C deriving BandpassPar -> BandpassPar -> Bool
(BandpassPar -> BandpassPar -> Bool)
-> (BandpassPar -> BandpassPar -> Bool) -> Eq BandpassPar
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BandpassPar -> BandpassPar -> Bool
$c/= :: BandpassPar -> BandpassPar -> Bool
== :: BandpassPar -> BandpassPar -> Bool
$c== :: BandpassPar -> BandpassPar -> Bool
Eq

instance Show BandpassPar where
  show :: BandpassPar -> String
show BandpassPar
C0 = String
""
  show BandpassPar
C = String
"-c "

data BandPass a b = BP a b deriving BandPass a b -> BandPass a b -> Bool
(BandPass a b -> BandPass a b -> Bool)
-> (BandPass a b -> BandPass a b -> Bool) -> Eq (BandPass a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => BandPass a b -> BandPass a b -> Bool
/= :: BandPass a b -> BandPass a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => BandPass a b -> BandPass a b -> Bool
== :: BandPass a b -> BandPass a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => BandPass a b -> BandPass a b -> Bool
Eq

instance Show (BandPass BandpassPar FreqW2) where
  show :: BandPass BandpassPar (FreqWidth Freq1 Width1) -> String
show (BP BandpassPar
x FreqWidth Freq1 Width1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"bandpass ",BandpassPar -> String
forall a. Show a => a -> String
show BandpassPar
x,FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
y]

type Bandpass = BandPass BandpassPar FreqW2

bandPass1 :: BandPass a b -> a
bandPass1 :: BandPass a b -> a
bandPass1 (BP a
x b
_) = a
x

bandPass2 :: BandPass a b -> b
bandPass2 :: BandPass a b -> b
bandPass2 (BP a
_ b
y) = b
y

bandPassSet1 :: a -> BandPass a b -> BandPass a b
bandPassSet1 :: a -> BandPass a b -> BandPass a b
bandPassSet1 a
x (BP a
_ b
y) = a -> b -> BandPass a b
forall a b. a -> b -> BandPass a b
BP a
x b
y

bandPassSet2 :: b -> BandPass a b -> BandPass a b
bandPassSet2 :: b -> BandPass a b -> BandPass a b
bandPassSet2 b
y (BP a
x b
_) = a -> b -> BandPass a b
forall a b. a -> b -> BandPass a b
BP a
x b
y

showBpQ :: Bandpass -> [String]
showBpQ :: BandPass BandpassPar (FreqWidth Freq1 Width1) -> [String]
showBpQ = String -> [String]
words (String -> [String])
-> (BandPass BandpassPar (FreqWidth Freq1 Width1) -> String)
-> BandPass BandpassPar (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BandPass BandpassPar (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show  

data BandPar = N0 | N deriving BandPar -> BandPar -> Bool
(BandPar -> BandPar -> Bool)
-> (BandPar -> BandPar -> Bool) -> Eq BandPar
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BandPar -> BandPar -> Bool
$c/= :: BandPar -> BandPar -> Bool
== :: BandPar -> BandPar -> Bool
$c== :: BandPar -> BandPar -> Bool
Eq

instance Show BandPar where
  show :: BandPar -> String
show BandPar
N0 = String
""
  show BandPar
N = String
"-n "

data Band a b = B a b deriving Band a b -> Band a b -> Bool
(Band a b -> Band a b -> Bool)
-> (Band a b -> Band a b -> Bool) -> Eq (Band a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => Band a b -> Band a b -> Bool
/= :: Band a b -> Band a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => Band a b -> Band a b -> Bool
== :: Band a b -> Band a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => Band a b -> Band a b -> Bool
Eq

instance Show (Band BandPar FreqW2) where
  show :: Band BandPar (FreqWidth Freq1 Width1) -> String
show (B BandPar
x FreqWidth Freq1 Width1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"band ",BandPar -> String
forall a. Show a => a -> String
show BandPar
x,FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
y]

type Band2 = Band BandPar FreqW2

band1 :: Band a b -> a
band1 :: Band a b -> a
band1 (B a
x b
_) = a
x

band2 :: Band a b -> b
band2 :: Band a b -> b
band2 (B a
_ b
y) = b
y

bandSet1 :: a -> Band a b -> Band a b
bandSet1 :: a -> Band a b -> Band a b
bandSet1 a
x (B a
_ b
y) = a -> b -> Band a b
forall a b. a -> b -> Band a b
B a
x b
y

bandSet2 :: b -> Band a b -> Band a b
bandSet2 :: b -> Band a b -> Band a b
bandSet2 b
y (B a
x b
_) = a -> b -> Band a b
forall a b. a -> b -> Band a b
B a
x b
y

showB2Q :: Band2 -> [String]
showB2Q :: Band BandPar (FreqWidth Freq1 Width1) -> [String]
showB2Q = String -> [String]
words (String -> [String])
-> (Band BandPar (FreqWidth Freq1 Width1) -> String)
-> Band BandPar (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Band BandPar (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show  

data HighLowPar = HL1 | HL2 deriving HighLowPar -> HighLowPar -> Bool
(HighLowPar -> HighLowPar -> Bool)
-> (HighLowPar -> HighLowPar -> Bool) -> Eq HighLowPar
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HighLowPar -> HighLowPar -> Bool
$c/= :: HighLowPar -> HighLowPar -> Bool
== :: HighLowPar -> HighLowPar -> Bool
$c== :: HighLowPar -> HighLowPar -> Bool
Eq

instance Show HighLowPar where
 show :: HighLowPar -> String
show HighLowPar
HL1 = String
"-1 "
 show HighLowPar
HL2 = String
"-2 "

data HighPass a b = HP a b deriving HighPass a b -> HighPass a b -> Bool
(HighPass a b -> HighPass a b -> Bool)
-> (HighPass a b -> HighPass a b -> Bool) -> Eq (HighPass a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => HighPass a b -> HighPass a b -> Bool
/= :: HighPass a b -> HighPass a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => HighPass a b -> HighPass a b -> Bool
== :: HighPass a b -> HighPass a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => HighPass a b -> HighPass a b -> Bool
Eq

instance Show (HighPass HighLowPar FreqW2) where
  show :: HighPass HighLowPar (FreqWidth Freq1 Width1) -> String
show (HP HighLowPar
x FreqWidth Freq1 Width1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"highpass ",HighLowPar -> String
forall a. Show a => a -> String
show HighLowPar
x,FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
y]

type HighPass2 = HighPass HighLowPar FreqW2

highPass1 :: HighPass a b -> a
highPass1 :: HighPass a b -> a
highPass1 (HP a
x b
_) = a
x

highPass2 :: HighPass a b -> b
highPass2 :: HighPass a b -> b
highPass2 (HP a
_ b
y) = b
y

highPassSet1 :: a -> HighPass a b -> HighPass a b
highPassSet1 :: a -> HighPass a b -> HighPass a b
highPassSet1 a
x (HP a
_ b
y) = a -> b -> HighPass a b
forall a b. a -> b -> HighPass a b
HP a
x b
y

highPassSet2 :: b -> HighPass a b -> HighPass a b
highPassSet2 :: b -> HighPass a b -> HighPass a b
highPassSet2 b
y (HP a
x b
_) = a -> b -> HighPass a b
forall a b. a -> b -> HighPass a b
HP a
x b
y

showHpQ :: HighPass2 -> [String]
showHpQ :: HighPass HighLowPar (FreqWidth Freq1 Width1) -> [String]
showHpQ = String -> [String]
words (String -> [String])
-> (HighPass HighLowPar (FreqWidth Freq1 Width1) -> String)
-> HighPass HighLowPar (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HighPass HighLowPar (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show  
 
data LowPass a b = LP a b deriving LowPass a b -> LowPass a b -> Bool
(LowPass a b -> LowPass a b -> Bool)
-> (LowPass a b -> LowPass a b -> Bool) -> Eq (LowPass a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => LowPass a b -> LowPass a b -> Bool
/= :: LowPass a b -> LowPass a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => LowPass a b -> LowPass a b -> Bool
== :: LowPass a b -> LowPass a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => LowPass a b -> LowPass a b -> Bool
Eq

instance Show (LowPass HighLowPar FreqW2) where
  show :: LowPass HighLowPar (FreqWidth Freq1 Width1) -> String
show (LP HighLowPar
x FreqWidth Freq1 Width1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"lowpass ",HighLowPar -> String
forall a. Show a => a -> String
show HighLowPar
x,FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
y]

type LowPass2 = LowPass HighLowPar FreqW2

lowPass1 :: LowPass a b -> a
lowPass1 :: LowPass a b -> a
lowPass1 (LP a
x b
_) = a
x

lowPass2 :: LowPass a b -> b
lowPass2 :: LowPass a b -> b
lowPass2 (LP a
_ b
y) = b
y

lowPassSet1 :: a -> LowPass a b -> LowPass a b
lowPassSet1 :: a -> LowPass a b -> LowPass a b
lowPassSet1 a
x (LP a
_ b
y) = a -> b -> LowPass a b
forall a b. a -> b -> LowPass a b
LP a
x b
y

lowPassSet2 :: b -> LowPass a b -> LowPass a b
lowPassSet2 :: b -> LowPass a b -> LowPass a b
lowPassSet2 b
y (LP a
x b
_) = a -> b -> LowPass a b
forall a b. a -> b -> LowPass a b
LP a
x b
y

showLpQ :: LowPass2 -> [String]
showLpQ :: LowPass HighLowPar (FreqWidth Freq1 Width1) -> [String]
showLpQ = String -> [String]
words (String -> [String])
-> (LowPass HighLowPar (FreqWidth Freq1 Width1) -> String)
-> LowPass HighLowPar (FreqWidth Freq1 Width1)
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LowPass HighLowPar (FreqWidth Freq1 Width1) -> String
forall a. Show a => a -> String
show  
 
data Equalizer a b = Eqlz a b deriving Equalizer a b -> Equalizer a b -> Bool
(Equalizer a b -> Equalizer a b -> Bool)
-> (Equalizer a b -> Equalizer a b -> Bool) -> Eq (Equalizer a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => Equalizer a b -> Equalizer a b -> Bool
/= :: Equalizer a b -> Equalizer a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => Equalizer a b -> Equalizer a b -> Bool
== :: Equalizer a b -> Equalizer a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => Equalizer a b -> Equalizer a b -> Bool
Eq

instance Show (Equalizer FreqW2 Float) where
  show :: Equalizer (FreqWidth Freq1 Width1) Float -> String
show (Eqlz FreqWidth Freq1 Width1
x Float
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"equalizer ",FreqWidth Freq1 Width1 -> String
forall a. Show a => a -> String
show FreqWidth Freq1 Width1
x,String
" ",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
y String
" "]

type Equaliz = Equalizer FreqW2 Float

equalizer1 :: Equalizer a b -> a
equalizer1 :: Equalizer a b -> a
equalizer1 (Eqlz a
x b
_) = a
x

equalizer2 :: Equalizer a b -> b
equalizer2 :: Equalizer a b -> b
equalizer2 (Eqlz a
_ b
y) = b
y

equalizerSet1 :: a -> Equalizer a b -> Equalizer a b
equalizerSet1 :: a -> Equalizer a b -> Equalizer a b
equalizerSet1 a
x (Eqlz a
_ b
y) = a -> b -> Equalizer a b
forall a b. a -> b -> Equalizer a b
Eqlz a
x b
y

equalizerSet2 :: b -> Equalizer a b -> Equalizer a b
equalizerSet2 :: b -> Equalizer a b -> Equalizer a b
equalizerSet2 b
y (Eqlz a
x b
_) = a -> b -> Equalizer a b
forall a b. a -> b -> Equalizer a b
Eqlz a
x b
y

showEqlQ :: Equaliz -> [String]
showEqlQ :: Equalizer (FreqWidth Freq1 Width1) Float -> [String]
showEqlQ = String -> [String]
words (String -> [String])
-> (Equalizer (FreqWidth Freq1 Width1) Float -> String)
-> Equalizer (FreqWidth Freq1 Width1) Float
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Equalizer (FreqWidth Freq1 Width1) Float -> String
forall a. Show a => a -> String
show