{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE CPP, FlexibleInstances #-}
module DobutokO.Sound.Effects.Echo 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 Data.List (intersperse)
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif
data EchoTail a = ET a a deriving Eq
instance Show (EchoTail Float) where
show (ET delay decay) = mconcat [showFFloat Nothing (abs delay) " ", showFFloat Nothing (abs decay) " "]
type EchoTail1 = EchoTail Float
data Echo a b = E1 a a [b] deriving Eq
instance Show (Echo Float EchoTail1) where
show (E1 gin gout ys)
| null ys = ""
| otherwise = mconcat ["echo ", showFFloat Nothing (abs gin) " ", showFFloat Nothing (abs gout) " ", mconcat . intersperse " " . map show $ ys]
type Echo1 = Echo Float EchoTail1
echoTail1 :: Int -> EchoTail a -> a
echoTail1 n (ET x0 x1)
| n == 1 = x0
| n == 2 = x1
| otherwise = error "DobutokO.Sound.Effects.Echo.echoTail1: Not defined parameter. "
echoTailSet1 :: Int -> a -> EchoTail a -> EchoTail a
echoTailSet1 n x (ET x0 x1)
| n == 1 = ET x x1
| n == 2 = ET x0 x
| otherwise = error "DobutokO.Sound.Effects.Echo.echoTailSet1: Not defined parameter. "
echo1 :: Int -> Echo a b -> a
echo1 n (E1 x0 x1 _)
| n == 1 = x0
| n == 2 = x1
| otherwise = error "DobutokO.Sound.Effects.Echo.echo1: Not defined parameter. "
echo2 :: Echo a b -> [b]
echo2 (E1 _ _ ys) = ys
echoSet1 :: Int -> a -> Echo a b -> Echo a b
echoSet1 n x (E1 x0 x1 y)
| n == 1 = E1 x x1 y
| n == 2 = E1 x0 x y
| otherwise = error "DobutokO.Sound.Effects.Echo.echoSet1: Not defined parameter. "
echoSet2 :: [b] -> Echo a b -> Echo a b
echoSet2 ys (E1 x0 x1 _) = E1 x0 x1 ys
showEchQ :: Echo1 -> [String]
showEchQ = words . show
data Echos a b = ES a a [b] deriving Eq
instance Show (Echos Float EchoTail1) where
show (ES gin gout ys)
| null ys = ""
| otherwise = mconcat ["echos ", showFFloat Nothing (abs gin) " ", showFFloat Nothing (abs gout) " ", mconcat . intersperse " " . map show $ ys]
type Echos1 = Echos Float EchoTail1
echos1 :: Int -> Echos a b -> a
echos1 n (ES x0 x1 _)
| n == 1 = x0
| n == 2 = x1
| otherwise = error "DobutokO.Sound.Effects.Echo.echos1: Not defined parameter. "
echos2 :: Echos a b -> [b]
echos2 (ES _ _ ys) = ys
echosSet1 :: Int -> a -> Echos a b -> Echos a b
echosSet1 n x (ES x0 x1 y)
| n == 1 = ES x x1 y
| n == 2 = ES x0 x y
| otherwise = error "DobutokO.Sound.Effects.Echo.echosSet1: Not defined parameter. "
echosSet2 :: [b] -> Echos a b -> Echos a b
echosSet2 ys (ES x0 x1 _) = ES x0 x1 ys
showEchsQ :: Echos1 -> [String]
showEchsQ = words . show