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

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

module DobutokO.Sound.Effects.Sinc 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 DobutokO.Sound.ToRange
import DobutokO.Sound.Effects.Specs (Freq1)
import DobutokO.Sound.One

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

data PhaseR a = P a | M | I | L deriving PhaseR a -> PhaseR a -> Bool
(PhaseR a -> PhaseR a -> Bool)
-> (PhaseR a -> PhaseR a -> Bool) -> Eq (PhaseR a)
forall a. Eq a => PhaseR a -> PhaseR a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhaseR a -> PhaseR a -> Bool
$c/= :: forall a. Eq a => PhaseR a -> PhaseR a -> Bool
== :: PhaseR a -> PhaseR a -> Bool
$c== :: forall a. Eq a => PhaseR a -> PhaseR a -> Bool
Eq

instance Show (PhaseR Float) where
  show :: PhaseR Float -> String
show (P Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-p ", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float -> Float
toRange Float
100.0 (Float -> Float
forall a. Num a => a -> a
abs Float
x)) String
" "]
  show PhaseR Float
M = String
"-M "
  show PhaseR Float
I = String
"-I "
  show PhaseR Float
_ = String
"-L "

type Phase1 = PhaseR Float

phaseRC :: PhaseR a -> String  
phaseRC :: PhaseR a -> String
phaseRC PhaseR a
M = String
"M"
phaseRC PhaseR a
I = String
"I"
phaseRC PhaseR a
L = String
"L"
phaseRC PhaseR a
_ = String
"P"

phaseR1 :: PhaseR a -> Maybe a
phaseR1 :: PhaseR a -> Maybe a
phaseR1 (P a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
phaseR1 PhaseR a
_ = Maybe a
forall a. Maybe a
Nothing

phaseRSet1 :: a -> PhaseR a
phaseRSet1 :: a -> PhaseR a
phaseRSet1 = a -> PhaseR a
forall a. a -> PhaseR a
P

data SincAB a = N1 | A a | B a deriving SincAB a -> SincAB a -> Bool
(SincAB a -> SincAB a -> Bool)
-> (SincAB a -> SincAB a -> Bool) -> Eq (SincAB a)
forall a. Eq a => SincAB a -> SincAB a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SincAB a -> SincAB a -> Bool
$c/= :: forall a. Eq a => SincAB a -> SincAB a -> Bool
== :: SincAB a -> SincAB a -> Bool
$c== :: forall a. Eq a => SincAB a -> SincAB a -> Bool
Eq

instance Show (SincAB Float) where
  show :: SincAB Float -> String
show (A Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-a ", if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float -> Float
toRange Float
180.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
forall a. Num a => a -> a
abs (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
x) Float
40.0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then String
"40 " else Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float -> Float
toRange Float
180.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
forall a. Num a => a -> a
abs (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
x) String
" "]
  show (B Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-b ", Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float -> Float
toRange Float
256.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
forall a. Num a => a -> a
abs (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
x) String
" "]
  show SincAB Float
_ = String
""

type Sinc1 = SincAB Float

sincABC :: SincAB a -> String
sincABC :: SincAB a -> String
sincABC (A a
_) = String
"A"
sincABC (B a
_) = String
"B"
sincABC SincAB a
_ = String
"N1"

sincAB1 :: SincAB a -> Maybe a
sincAB1 :: SincAB a -> Maybe a
sincAB1 (A a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
sincAB1 (B a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
sincAB1 SincAB a
_ = Maybe a
forall a. Maybe a
Nothing

sincABSet1 :: Bool -> a -> SincAB a
sincABSet1 :: Bool -> a -> SincAB a
sincABSet1 Bool
True a
x = a -> SincAB a
forall a. a -> SincAB a
A a
x
sincABSet1 Bool
False a
x = a -> SincAB a
forall a. a -> SincAB a
B a
x

data SincTN a = N2 | T a | N a deriving SincTN a -> SincTN a -> Bool
(SincTN a -> SincTN a -> Bool)
-> (SincTN a -> SincTN a -> Bool) -> Eq (SincTN a)
forall a. Eq a => SincTN a -> SincTN a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SincTN a -> SincTN a -> Bool
$c/= :: forall a. Eq a => SincTN a -> SincTN a -> Bool
== :: SincTN a -> SincTN a -> Bool
$c== :: forall a. Eq a => SincTN a -> SincTN a -> Bool
Eq

instance Show (SincTN Float) where
  show :: SincTN Float -> String
show (T Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-t ", if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float
forall a. Num a => a -> a
abs Float
x) Float
1.0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then String
"1 " else Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
x) String
" "]
  show (N Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-n ", if Float -> Float -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Float -> Float -> Float
toRange Float
32767.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
forall a. Num a => a -> a
abs (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
x) Float
11.0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then String
"11 " else Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float -> Float
toRange Float
32767.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float
forall a. Num a => a -> a
abs (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
x) String
" "]
  show SincTN Float
_ = String
""

type Sinc2 = SincTN Float

sincTNC :: SincTN a -> String
sincTNC :: SincTN a -> String
sincTNC (T a
_) = String
"T"
sincTNC (N a
_) = String
"N"
sincTNC SincTN a
_ = String
"N2"

sincTN1 :: SincTN a -> Maybe a
sincTN1 :: SincTN a -> Maybe a
sincTN1 (T a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
sincTN1 (N a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
sincTN1 SincTN a
_ = Maybe a
forall a. Maybe a
Nothing

sincTNSet1 :: Bool -> a -> SincTN a
sincTNSet1 :: Bool -> a -> SincTN a
sincTNSet1 Bool
True a
x = a -> SincTN a
forall a. a -> SincTN a
T a
x
sincTNSet1 Bool
False a
x = a -> SincTN a
forall a. a -> SincTN a
N a
x

data FreqL a = LF a deriving FreqL a -> FreqL a -> Bool
(FreqL a -> FreqL a -> Bool)
-> (FreqL a -> FreqL a -> Bool) -> Eq (FreqL a)
forall a. Eq a => FreqL a -> FreqL a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FreqL a -> FreqL a -> Bool
$c/= :: forall a. Eq a => FreqL a -> FreqL a -> Bool
== :: FreqL a -> FreqL a -> Bool
$c== :: forall a. Eq a => FreqL a -> FreqL a -> Bool
Eq

instance Show (FreqL Freq1) where
  show :: FreqL Freq1 -> String
show (LF Freq1
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"-", Freq1 -> String
forall a. Show a => a -> String
show Freq1
x]

type FreqFL = FreqL Freq1

freqL1 :: FreqL a -> a
freqL1 :: FreqL a -> a
freqL1 (LF a
x) = a
x

freqLSet1 :: a -> FreqL a
freqLSet1 :: a -> FreqL a
freqLSet1 = a -> FreqL a
forall a. a -> FreqL a
LF

data FreqH a =  HF a deriving FreqH a -> FreqH a -> Bool
(FreqH a -> FreqH a -> Bool)
-> (FreqH a -> FreqH a -> Bool) -> Eq (FreqH a)
forall a. Eq a => FreqH a -> FreqH a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FreqH a -> FreqH a -> Bool
$c/= :: forall a. Eq a => FreqH a -> FreqH a -> Bool
== :: FreqH a -> FreqH a -> Bool
$c== :: forall a. Eq a => FreqH a -> FreqH a -> Bool
Eq

instance Show (FreqH Freq1) where
  show :: FreqH Freq1 -> String
show (HF Freq1
x) = Freq1 -> String
forall a. Show a => a -> String
show Freq1
x
  
type FreqFH = FreqH Freq1

freqH1 :: FreqH a -> a
freqH1 :: FreqH a -> a
freqH1 (HF a
x) = a
x

freqHSet1 :: a -> FreqH a
freqHSet1 :: a -> FreqH a
freqHSet1 = a -> FreqH a
forall a. a -> FreqH a
HF  

data FrequencyS a b = F11 a | F12 b | F2 a b deriving FrequencyS a b -> FrequencyS a b -> Bool
(FrequencyS a b -> FrequencyS a b -> Bool)
-> (FrequencyS a b -> FrequencyS a b -> Bool)
-> Eq (FrequencyS a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b.
(Eq a, Eq b) =>
FrequencyS a b -> FrequencyS a b -> Bool
/= :: FrequencyS a b -> FrequencyS a b -> Bool
$c/= :: forall a b.
(Eq a, Eq b) =>
FrequencyS a b -> FrequencyS a b -> Bool
== :: FrequencyS a b -> FrequencyS a b -> Bool
$c== :: forall a b.
(Eq a, Eq b) =>
FrequencyS a b -> FrequencyS a b -> Bool
Eq

instance Show (FrequencyS FreqFH FreqFL) where
  show :: FrequencyS (FreqH Freq1) (FreqL Freq1) -> String
show (F11 FreqH Freq1
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [FreqH Freq1 -> String
forall a. Show a => a -> String
show FreqH Freq1
x, String
" "]
  show (F12 FreqL Freq1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [FreqL Freq1 -> String
forall a. Show a => a -> String
show FreqL Freq1
y, String
" "]
  show (F2 FreqH Freq1
x FreqL Freq1
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [FreqH Freq1 -> String
forall a. Show a => a -> String
show FreqH Freq1
x, FreqL Freq1 -> String
forall a. Show a => a -> String
show FreqL Freq1
y, String
" "]

type FrequencyS2 = FrequencyS FreqFH FreqFL

data Sinc a b c d = SC1 a b c d | SC2 a b d c | SC a b c d c deriving Sinc a b c d -> Sinc a b c d -> Bool
(Sinc a b c d -> Sinc a b c d -> Bool)
-> (Sinc a b c d -> Sinc a b c d -> Bool) -> Eq (Sinc 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) =>
Sinc a b c d -> Sinc a b c d -> Bool
/= :: Sinc a b c d -> Sinc a b c d -> Bool
$c/= :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Sinc a b c d -> Sinc a b c d -> Bool
== :: Sinc a b c d -> Sinc a b c d -> Bool
$c== :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Sinc a b c d -> Sinc a b c d -> Bool
Eq

instance Show (Sinc Sinc1 Phase1 Sinc2 FrequencyS2) where
  show :: Sinc
  (SincAB Float)
  (PhaseR Float)
  (SincTN Float)
  (FrequencyS (FreqH Freq1) (FreqL Freq1))
-> String
show (SC1 SincAB Float
x PhaseR Float
y SincTN Float
z FrequencyS (FreqH Freq1) (FreqL Freq1)
t) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"sinc ", SincAB Float -> String
forall a. Show a => a -> String
show SincAB Float
x, PhaseR Float -> String
forall a. Show a => a -> String
show PhaseR Float
y, SincTN Float -> String
forall a. Show a => a -> String
show SincTN Float
z, FrequencyS (FreqH Freq1) (FreqL Freq1) -> String
forall a. Show a => a -> String
show FrequencyS (FreqH Freq1) (FreqL Freq1)
t]
  show (SC2 SincAB Float
x PhaseR Float
y FrequencyS (FreqH Freq1) (FreqL Freq1)
t SincTN Float
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"sinc ", SincAB Float -> String
forall a. Show a => a -> String
show SincAB Float
x, PhaseR Float -> String
forall a. Show a => a -> String
show PhaseR Float
y, FrequencyS (FreqH Freq1) (FreqL Freq1) -> String
forall a. Show a => a -> String
show FrequencyS (FreqH Freq1) (FreqL Freq1)
t, SincTN Float -> String
forall a. Show a => a -> String
show SincTN Float
z]
  show (SC SincAB Float
x PhaseR Float
y SincTN Float
z1 FrequencyS (FreqH Freq1) (FreqL Freq1)
t SincTN Float
z2) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"sinc ", SincAB Float -> String
forall a. Show a => a -> String
show SincAB Float
x, PhaseR Float -> String
forall a. Show a => a -> String
show PhaseR Float
y, SincTN Float -> String
forall a. Show a => a -> String
show SincTN Float
z1, FrequencyS (FreqH Freq1) (FreqL Freq1) -> String
forall a. Show a => a -> String
show FrequencyS (FreqH Freq1) (FreqL Freq1)
t, SincTN Float -> String
forall a. Show a => a -> String
show SincTN Float
z2]

type Sinc4 = Sinc Sinc1 Phase1 Sinc2 FrequencyS2

sincC :: Sinc a b c d -> String
sincC :: Sinc a b c d -> String
sincC (SC1 a
_ b
_ c
_ d
_) = String
"SC1"
sincC (SC2 a
_ b
_ d
_ c
_) = String
"SC2"
sincC (SC a
_ b
_ c
_ d
_ c
_) = String
"SC"

sinc1 :: Sinc a b c d -> a
sinc1 :: Sinc a b c d -> a
sinc1 (SC1 a
x b
_ c
_ d
_) = a
x
sinc1 (SC2 a
x b
_ d
_ c
_) = a
x
sinc1 (SC a
x b
_ c
_ d
_ c
_) = a
x

sinc2 :: Sinc a b c d -> b
sinc2 :: Sinc a b c d -> b
sinc2 (SC1 a
_ b
y c
_ d
_) = b
y
sinc2 (SC2 a
_ b
y d
_ c
_) = b
y
sinc2 (SC a
_ b
y c
_ d
_ c
_) = b
y

sinc3 :: Sinc a b c d -> One2 c
sinc3 :: Sinc a b c d -> One2 c
sinc3 (SC1 a
_ b
_ c
z d
_) = c -> One2 c
forall a. a -> One2 a
O21 c
z
sinc3 (SC2 a
_ b
_ d
_ c
z) = c -> One2 c
forall a. a -> One2 a
O21 c
z
sinc3 (SC a
_ b
_ c
z1 d
_ c
z2) = c -> c -> One2 c
forall a. a -> a -> One2 a
O22 c
z1 c
z2

sinc4 :: Sinc a b c d -> d
sinc4 :: Sinc a b c d -> d
sinc4 (SC1 a
_ b
_ c
_ d
t) = d
t
sinc4 (SC2 a
_ b
_ d
t c
_) = d
t
sinc4 (SC a
_ b
_ c
_ d
t c
_) = d
t

sincSet1 :: a -> Sinc a b c d -> Sinc a b c d
sincSet1 :: a -> Sinc a b c d -> Sinc a b c d
sincSet1 a
x (SC1 a
_ b
y c
z d
t) = a -> b -> c -> d -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> Sinc a b c d
SC1 a
x b
y c
z d
t
sincSet1 a
x (SC2 a
_ b
y d
t c
z) = a -> b -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> d -> c -> Sinc a b c d
SC2 a
x b
y d
t c
z
sincSet1 a
x (SC a
_ b
y c
z1 d
t c
z2) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2

sincSet2 :: b -> Sinc a b c d -> Sinc a b c d
sincSet2 :: b -> Sinc a b c d -> Sinc a b c d
sincSet2 b
y (SC1 a
x b
_ c
z d
t) = a -> b -> c -> d -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> Sinc a b c d
SC1 a
x b
y c
z d
t
sincSet2 b
y (SC2 a
x b
_ d
z c
t) = a -> b -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> d -> c -> Sinc a b c d
SC2 a
x b
y d
z c
t
sincSet2 b
y (SC a
x b
_ c
z1 d
t c
z2) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2

sincSet3 :: One2 c -> Sinc a b c d -> Sinc a b c d
sincSet3 :: One2 c -> Sinc a b c d -> Sinc a b c d
sincSet3 (O21 c
z) (SC1 a
x b
y c
_ d
t) = a -> b -> c -> d -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> Sinc a b c d
SC1 a
x b
y c
z d
t
sincSet3 (O22 c
z1 c
z2) (SC1 a
x b
y c
_ d
t) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2
sincSet3 (O21 c
z) (SC2 a
x b
y d
t c
_) = a -> b -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> d -> c -> Sinc a b c d
SC2 a
x b
y d
t c
z
sincSet3 (O22 c
z1 c
z2) (SC2 a
x b
y d
t c
_) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2
sincSet3 (O21 c
z) (SC a
x b
y c
_ d
t c
z2) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z d
t c
z2
sincSet3 (O22 c
z1 c
z2) (SC a
x b
y c
_ d
t c
_) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2

sincSet4 :: d -> Sinc a b c d -> Sinc a b c d
sincSet4 :: d -> Sinc a b c d -> Sinc a b c d
sincSet4 d
t (SC1 a
x b
y c
z d
_) = a -> b -> c -> d -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> Sinc a b c d
SC1 a
x b
y c
z d
t
sincSet4 d
t (SC2 a
x b
y d
_ c
z) = a -> b -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> d -> c -> Sinc a b c d
SC2 a
x b
y d
t c
z
sincSet4 d
t (SC a
x b
y c
z1 d
_ c
z2) = a -> b -> c -> d -> c -> Sinc a b c d
forall a b c d. a -> b -> c -> d -> c -> Sinc a b c d
SC a
x b
y c
z1 d
t c
z2

showSCQ :: Sinc4 -> [String]
showSCQ :: Sinc
  (SincAB Float)
  (PhaseR Float)
  (SincTN Float)
  (FrequencyS (FreqH Freq1) (FreqL Freq1))
-> [String]
showSCQ = String -> [String]
words (String -> [String])
-> (Sinc
      (SincAB Float)
      (PhaseR Float)
      (SincTN Float)
      (FrequencyS (FreqH Freq1) (FreqL Freq1))
    -> String)
-> Sinc
     (SincAB Float)
     (PhaseR Float)
     (SincTN Float)
     (FrequencyS (FreqH Freq1) (FreqL Freq1))
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sinc
  (SincAB Float)
  (PhaseR Float)
  (SincTN Float)
  (FrequencyS (FreqH Freq1) (FreqL Freq1))
-> String
forall a. Show a => a -> String
show