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

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

module DobutokO.Sound.Effects.Tempo where


import Numeric (showFFloat)
import DobutokO.Sound.Effects.Segment

data MSL = E | M | S | L deriving MSL -> MSL -> Bool
(MSL -> MSL -> Bool) -> (MSL -> MSL -> Bool) -> Eq MSL
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MSL -> MSL -> Bool
$c/= :: MSL -> MSL -> Bool
== :: MSL -> MSL -> Bool
$c== :: MSL -> MSL -> Bool
Eq

instance Show MSL where
  show :: MSL -> String
show MSL
M = String
"-m "
  show MSL
S = String
"-s "
  show MSL
L = String
"-l "
  show MSL
_ = String
""

data Tempo a b c d = Tm3 a b c | Tm4 a b c d deriving Tempo a b c d -> Tempo a b c d -> Bool
(Tempo a b c d -> Tempo a b c d -> Bool)
-> (Tempo a b c d -> Tempo a b c d -> Bool) -> Eq (Tempo a b c d)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Tempo a b c d -> Tempo a b c d -> Bool
/= :: Tempo a b c d -> Tempo a b c d -> Bool
$c/= :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Tempo a b c d -> Tempo a b c d -> Bool
== :: Tempo a b c d -> Tempo a b c d -> Bool
$c== :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Tempo a b c d -> Tempo a b c d -> Bool
Eq

instance Show (Tempo Qdash MSL Float Segm) where
  show :: Tempo Qdash MSL Float Segm -> String
show (Tm3 Qdash
x MSL
y Float
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"tempo ", Qdash -> String
forall a. Show a => a -> String
show Qdash
x,MSL -> String
forall a. Show a => a -> String
show MSL
y, Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
z String
" "]
  show (Tm4 Qdash
x MSL
y Float
z Segm
t) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"tempo ", Qdash -> String
forall a. Show a => a -> String
show Qdash
x, MSL -> String
forall a. Show a => a -> String
show MSL
y, Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing Float
z String
" ", Segm -> String
forall a. Show a => a -> String
show Segm
t]

type Tmp = Tempo Qdash MSL Float Segm

tempoC :: Tempo a b c d -> String
tempoC :: Tempo a b c d -> String
tempoC (Tm3 a
_ b
_ c
_) = String
"Tm3"
tempoC (Tm4 a
_ b
_ c
_ d
_) = String
"Tm4"

tempo1 :: Tempo a b c d -> a
tempo1 :: Tempo a b c d -> a
tempo1 (Tm3 a
x b
_ c
_) = a
x
tempo1 (Tm4 a
x b
_ c
_ d
_) = a
x

tempo2 :: Tempo a b c d -> b
tempo2 :: Tempo a b c d -> b
tempo2 (Tm3 a
_ b
y c
_) = b
y
tempo2 (Tm4 a
_ b
y c
_ d
_) = b
y

tempo3 :: Tempo a b c d -> c
tempo3 :: Tempo a b c d -> c
tempo3 (Tm4 a
_ b
_ c
z d
_) = c
z
tempo3 (Tm3 a
_ b
_ c
z) = c
z

tempo4 :: Tempo a b c d -> Maybe d
tempo4 :: Tempo a b c d -> Maybe d
tempo4 (Tm4 a
_ b
_ c
_ d
t) = d -> Maybe d
forall a. a -> Maybe a
Just d
t
tempo4 Tempo a b c d
_ = Maybe d
forall a. Maybe a
Nothing

tempoSet1 :: a -> Tempo a b c d -> Tempo a b c d
tempoSet1 :: a -> Tempo a b c d -> Tempo a b c d
tempoSet1 a
x (Tm3 a
_ b
y c
z) = a -> b -> c -> Tempo a b c d
forall a b c d. a -> b -> c -> Tempo a b c d
Tm3 a
x b
y c
z
tempoSet1 a
x (Tm4 a
_ b
y c
z d
t) = a -> b -> c -> d -> Tempo a b c d
forall a b c d. a -> b -> c -> d -> Tempo a b c d
Tm4 a
x b
y c
z d
t

tempoSet2 :: b -> Tempo a b c d -> Tempo a b c d
tempoSet2 :: b -> Tempo a b c d -> Tempo a b c d
tempoSet2 b
y (Tm3 a
x b
_ c
z) = a -> b -> c -> Tempo a b c d
forall a b c d. a -> b -> c -> Tempo a b c d
Tm3 a
x b
y c
z
tempoSet2 b
y (Tm4 a
x b
_ c
z d
t) = a -> b -> c -> d -> Tempo a b c d
forall a b c d. a -> b -> c -> d -> Tempo a b c d
Tm4 a
x b
y c
z d
t

tempoSet3 :: c -> Tempo a b c d -> Tempo a b c d
tempoSet3 :: c -> Tempo a b c d -> Tempo a b c d
tempoSet3 c
z (Tm4 a
x b
y c
_ d
t) = a -> b -> c -> d -> Tempo a b c d
forall a b c d. a -> b -> c -> d -> Tempo a b c d
Tm4 a
x b
y c
z d
t
tempoSet3 c
z (Tm3 a
x b
y c
_) = a -> b -> c -> Tempo a b c d
forall a b c d. a -> b -> c -> Tempo a b c d
Tm3 a
x b
y c
z

tempoSet4 :: d -> Tempo a b c d -> Tempo a b c d
tempoSet4 :: d -> Tempo a b c d -> Tempo a b c d
tempoSet4 d
t (Tm3 a
x b
y c
z) = a -> b -> c -> d -> Tempo a b c d
forall a b c d. a -> b -> c -> d -> Tempo a b c d
Tm4 a
x b
y c
z d
t
tempoSet4 d
t (Tm4 a
x b
y c
z d
_) = a -> b -> c -> d -> Tempo a b c d
forall a b c d. a -> b -> c -> d -> Tempo a b c d
Tm4 a
x b
y c
z d
t

showTmpQ :: Tmp -> [String]
showTmpQ :: Tempo Qdash MSL Float Segm -> [String]
showTmpQ = String -> [String]
words (String -> [String])
-> (Tempo Qdash MSL Float Segm -> String)
-> Tempo Qdash MSL Float Segm
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tempo Qdash MSL Float Segm -> String
forall a. Show a => a -> String
show