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

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

module DobutokO.Sound.Effects.LADSPA 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.One

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

data LADSPAS1 = L | R | N0 deriving LADSPAS1 -> LADSPAS1 -> Bool
(LADSPAS1 -> LADSPAS1 -> Bool)
-> (LADSPAS1 -> LADSPAS1 -> Bool) -> Eq LADSPAS1
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LADSPAS1 -> LADSPAS1 -> Bool
$c/= :: LADSPAS1 -> LADSPAS1 -> Bool
== :: LADSPAS1 -> LADSPAS1 -> Bool
$c== :: LADSPAS1 -> LADSPAS1 -> Bool
Eq

instance Show LADSPAS1 where
  show :: LADSPAS1 -> String
show LADSPAS1
L = String
"-l "
  show LADSPAS1
R = String
"-r "
  show LADSPAS1
_ = String
""

data Ladspa1 a b c = LPA2 a b | LPA3 a b b | LP3 a b c | LP4 a b b c deriving Ladspa1 a b c -> Ladspa1 a b c -> Bool
(Ladspa1 a b c -> Ladspa1 a b c -> Bool)
-> (Ladspa1 a b c -> Ladspa1 a b c -> Bool) -> Eq (Ladspa1 a b c)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c.
(Eq a, Eq b, Eq c) =>
Ladspa1 a b c -> Ladspa1 a b c -> Bool
/= :: Ladspa1 a b c -> Ladspa1 a b c -> Bool
$c/= :: forall a b c.
(Eq a, Eq b, Eq c) =>
Ladspa1 a b c -> Ladspa1 a b c -> Bool
== :: Ladspa1 a b c -> Ladspa1 a b c -> Bool
$c== :: forall a b c.
(Eq a, Eq b, Eq c) =>
Ladspa1 a b c -> Ladspa1 a b c -> Bool
Eq

instance (Show c) => Show (Ladspa1 LADSPAS1 String c) where
  show :: Ladspa1 LADSPAS1 String c -> String
show (LPA2 LADSPAS1
x String
ys) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"ladspa ", LADSPAS1 -> String
forall a. Show a => a -> String
show LADSPAS1
x, String
ys, String
" "]
  show (LPA3 LADSPAS1
x String
ys String
zs) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"ladspa ", LADSPAS1 -> String
forall a. Show a => a -> String
show LADSPAS1
x, String
ys, String
" ", String
zs, String
" "]
  show (LP3 LADSPAS1
x String
ys c
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"ladspa ", LADSPAS1 -> String
forall a. Show a => a -> String
show LADSPAS1
x, String
ys, String
" ", c -> String
forall a. Show a => a -> String
show c
z, String
" "]
  show (LP4 LADSPAS1
x String
ys String
zs c
t) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"ladspa ", LADSPAS1 -> String
forall a. Show a => a -> String
show LADSPAS1
x, String
ys, String
" ", String
zs, String
" ", c -> String
forall a. Show a => a -> String
show c
t, String
" "]

type Ladspa c = Ladspa1 LADSPAS1 String c

ladspaC :: Ladspa1 a b c -> String
ladspaC :: Ladspa1 a b c -> String
ladspaC (LPA2 a
_ b
_) = String
"LPA2"
ladspaC (LPA3 a
_ b
_ b
_) = String
"LPA3"
ladspaC (LP3 a
_ b
_ c
_) = String
"LP3"
ladspaC (LP4 a
_ b
_ b
_ c
_) = String
"LP4"

ladspa1 :: Ladspa1 a b c -> a
ladspa1 :: Ladspa1 a b c -> a
ladspa1 (LPA2 a
x b
_) = a
x
ladspa1 (LPA3 a
x b
_ b
_) = a
x
ladspa1 (LP3 a
x b
_ c
_) = a
x
ladspa1 (LP4 a
x b
_ b
_ c
_) = a
x

ladspa2 :: Ladspa1 a b c -> One2 b
ladspa2 :: Ladspa1 a b c -> One2 b
ladspa2 (LPA2 a
_ b
y) = b -> One2 b
forall a. a -> One2 a
O21 b
y
ladspa2 (LPA3 a
_ b
y b
z) = b -> b -> One2 b
forall a. a -> a -> One2 a
O22 b
y b
z
ladspa2 (LP3 a
_ b
y c
_) = b -> One2 b
forall a. a -> One2 a
O21 b
y
ladspa2 (LP4 a
_ b
y1 b
y2 c
_) = b -> b -> One2 b
forall a. a -> a -> One2 a
O22 b
y1 b
y2

ladspa3 :: Ladspa1 a b c -> Maybe c
ladspa3 :: Ladspa1 a b c -> Maybe c
ladspa3 (LP3 a
_ b
_ c
z) = c -> Maybe c
forall a. a -> Maybe a
Just c
z
ladspa3 (LP4 a
_ b
_ b
_ c
z) = c -> Maybe c
forall a. a -> Maybe a
Just c
z
ladspa3 Ladspa1 a b c
_ = Maybe c
forall a. Maybe a
Nothing

ladspaSet1 :: a -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet1 :: a -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet1 a
x (LPA2 a
_ b
y) = a -> b -> Ladspa1 a b c
forall a b c. a -> b -> Ladspa1 a b c
LPA2 a
x b
y
ladspaSet1 a
x (LPA3 a
_ b
y1 b
y2) = a -> b -> b -> Ladspa1 a b c
forall a b c. a -> b -> b -> Ladspa1 a b c
LPA3 a
x b
y1 b
y2
ladspaSet1 a
x (LP3 a
_ b
y c
z) = a -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> c -> Ladspa1 a b c
LP3 a
x b
y c
z
ladspaSet1 a
x (LP4 a
_ b
y1 b
y2 c
z) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y1 b
y2 c
z

ladspaSet2 :: One2 b -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet2 :: One2 b -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet2 (O21 b
y) (LPA2 a
x b
_) = a -> b -> Ladspa1 a b c
forall a b c. a -> b -> Ladspa1 a b c
LPA2 a
x b
y
ladspaSet2 (O21 b
y) (LPA3 a
x b
_ b
y2) = a -> b -> b -> Ladspa1 a b c
forall a b c. a -> b -> b -> Ladspa1 a b c
LPA3 a
x b
y b
y2
ladspaSet2 (O21 b
y) (LP3 a
x b
_ c
z) = a -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> c -> Ladspa1 a b c
LP3 a
x b
y c
z
ladspaSet2 (O21 b
y) (LP4 a
x b
_ b
y2 c
z) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y b
y2 c
z
ladspaSet2 (O22 b
y1 b
y2) (LPA2 a
x b
_) = a -> b -> b -> Ladspa1 a b c
forall a b c. a -> b -> b -> Ladspa1 a b c
LPA3 a
x b
y1 b
y2
ladspaSet2 (O22 b
y1 b
y2) (LPA3 a
x b
_ b
_) = a -> b -> b -> Ladspa1 a b c
forall a b c. a -> b -> b -> Ladspa1 a b c
LPA3 a
x b
y1 b
y2
ladspaSet2 (O22 b
y1 b
y2) (LP3 a
x b
_ c
z) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y1 b
y2 c
z
ladspaSet2 (O22 b
y1 b
y2) (LP4 a
x b
_ b
_ c
z) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y1 b
y2 c
z

ladspaSet3 :: (Show c) => c -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet3 :: c -> Ladspa1 a b c -> Ladspa1 a b c
ladspaSet3 c
z (LPA2 a
x b
y) = a -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> c -> Ladspa1 a b c
LP3 a
x b
y c
z
ladspaSet3 c
z (LPA3 a
x b
y1 b
y2) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y1 b
y2 c
z
ladspaSet3 c
z (LP3 a
x b
y c
_) = a -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> c -> Ladspa1 a b c
LP3 a
x b
y c
z
ladspaSet3 c
z (LP4 a
x b
y1 b
y2 c
_) = a -> b -> b -> c -> Ladspa1 a b c
forall a b c. a -> b -> b -> c -> Ladspa1 a b c
LP4 a
x b
y1 b
y2 c
z

showLPQ :: (Show c) => Ladspa c -> [String]
showLPQ :: Ladspa c -> [String]
showLPQ = String -> [String]
words (String -> [String])
-> (Ladspa c -> String) -> Ladspa c -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ladspa c -> String
forall a. Show a => a -> String
show