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

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

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

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

data Downsample a = D | DS1 a deriving Downsample a -> Downsample a -> Bool
(Downsample a -> Downsample a -> Bool)
-> (Downsample a -> Downsample a -> Bool) -> Eq (Downsample a)
forall a. Eq a => Downsample a -> Downsample a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Downsample a -> Downsample a -> Bool
$c/= :: forall a. Eq a => Downsample a -> Downsample a -> Bool
== :: Downsample a -> Downsample a -> Bool
$c== :: forall a. Eq a => Downsample a -> Downsample a -> Bool
Eq

instance Show (Downsample Int) where
  show :: Downsample Int -> String
show (DS1 Int
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"downsample ", if Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int -> Int
forall a. Num a => a -> a
abs Int
x) Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then String
"2 " else Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
x) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" "]
  show Downsample Int
_ = String
"downsample 2 "
  
type DSample = Downsample Int 

downsampleC :: Downsample a -> String
downsampleC :: Downsample a -> String
downsampleC Downsample a
D = String
"D"
downsampleC Downsample a
_ = String
"DS1"

downSample1 :: Downsample a -> Maybe a
downSample1 :: Downsample a -> Maybe a
downSample1 (DS1 a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
downSample1 Downsample a
_ = Maybe a
forall a. Maybe a
Nothing

downSampleE1 :: DSample -> Int
downSampleE1 :: Downsample Int -> Int
downSampleE1 (DS1 Int
x) = Int
x
downSampleE1 Downsample Int
_ = Int
2

downSampleSet1 :: a -> Downsample a
downSampleSet1 :: a -> Downsample a
downSampleSet1 = a -> Downsample a
forall a. a -> Downsample a
DS1

showDSQ :: DSample -> [String]
showDSQ :: Downsample Int -> [String]
showDSQ = String -> [String]
words (String -> [String])
-> (Downsample Int -> String) -> Downsample Int -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Downsample Int -> String
forall a. Show a => a -> String
show