-- | -- Module : DobutokO.Sound.Effects.FIR -- Copyright : (c) OleksandrZhabenko 2020 -- License : MIT -- Stability : Experimental -- Maintainer : olexandr543@yahoo.com -- -- Helps to create experimental music. -- Can be used for applying the SoX \"fir\" effect. -- {-# OPTIONS_GHC -threaded #-} {-# LANGUAGE CPP, FlexibleInstances #-} module DobutokO.Sound.Effects.FIR 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 Fir a b = CF a | Cs [b] | EF deriving Eq instance Show (Fir FilePath Float) where show (CF file) = mconcat ["fir ", file, " "] show (Cs xs) = mconcat ["fir ", mconcat . intersperse " " . map (\x -> showFFloat Nothing x " ") $ xs] show _ = "" -- the shell command will expect input from stdin. If it is not prepared, planned and available, do not use at all. type FIR = Fir FilePath Float firC :: Fir a b -> String firC (CF _) = "CF" firC (Cs _) = "Cs" firC _ ="EF" fir1 :: Fir a b -> Maybe a fir1 (CF x) = Just x fir1 _ = Nothing fir2 :: Fir a b -> Maybe [b] fir2 (Cs xs) = Just xs fir2 _ = Nothing firSet1 :: a -> Fir a b firSet1 = CF firSet2 :: [b] -> Fir a b firSet2 = Cs showFIRQ :: FIR -> [String] showFIRQ = words . show