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

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

module DobutokO.Sound.Effects.Reverb 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)
import qualified DobutokO.Sound.Frequency as FQ
import DobutokO.Sound.ToRange

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

data Four = O4 | T4 | H4 | F4 deriving Four -> Four -> Bool
(Four -> Four -> Bool) -> (Four -> Four -> Bool) -> Eq Four
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Four -> Four -> Bool
$c/= :: Four -> Four -> Bool
== :: Four -> Four -> Bool
$c== :: Four -> Four -> Bool
Eq

data Reverb a b c d =  Rvrb a b [c] d deriving Reverb a b c d -> Reverb a b c d -> Bool
(Reverb a b c d -> Reverb a b c d -> Bool)
-> (Reverb a b c d -> Reverb a b c d -> Bool)
-> Eq (Reverb 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) =>
Reverb a b c d -> Reverb a b c d -> Bool
/= :: Reverb a b c d -> Reverb a b c d -> Bool
$c/= :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Reverb a b c d -> Reverb a b c d -> Bool
== :: Reverb a b c d -> Reverb a b c d -> Bool
$c== :: forall a b c d.
(Eq a, Eq b, Eq c, Eq d) =>
Reverb a b c d -> Reverb a b c d -> Bool
Eq

instance Show (Reverb Four FQ.Di Float Int) where
  show :: Reverb Four Di Float Int -> String
show (Rvrb Four
variant Di
wet [Float]
xs Int
n) 
   | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT = ShowS
forall a. HasCallStack => String -> a
error ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
"DobutokO.Sound.Effects.Reverb.show is not defined for the value of the last argument " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
   | Bool
otherwise = 
      let ([Float]
zs, [Float]
ks) = Int -> [Float] -> ([Float], [Float])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
4 [Float]
xs in 
        let ys :: [Float]
ys = (Float -> Float) -> [Float] -> [Float]
forall a b. (a -> b) -> [a] -> [b]
map (Float -> Float -> Float
toRange Float
100.0) [Float]
zs in 
             if [Float] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Float]
ks 
               then case Four
variant of
                       Four
O4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys]
                       Four
T4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" reverse"]
                       Four
H4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" reverse"]
                       Four
_  -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys]
               else let r5 :: Float
r5 = [Float] -> Float
forall a. [a] -> a
head [Float]
ks in if [Float] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Float] -> Bool) -> ([Float] -> [Float]) -> [Float] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Float] -> [Float]
forall a. [a] -> [a]
tail ([Float] -> Bool) -> [Float] -> Bool
forall a b. (a -> b) -> a -> b
$ [Float]
ks then 
                      case Four
variant of
                        Four
O4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys, String
" ",
                          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
""]
                        Four
T4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
"",String
" reverse"]
                        Four
H4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
"",String
" reverse"]
                        Four
_  -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                          Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
""]
                     else let r60 :: Float
r60 = [Float] -> Float
forall a. [a] -> a
last [Float]
ks in 
                            let r6 :: Float
r6 = (Float
r60 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
120.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
- (Integer -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Float) -> (Float -> Integer) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
r60 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
120.0)) Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
120.0 in
                                 case Four
variant of 
                                   Four
O4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys, String
" ",
                                     Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
"",String
" ",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r6 String
""]
                                   Four
T4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                                     Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
" ",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r6 String
" reverse"]
                                   Four
H4 -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                                     Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
" ",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r6 String
" reverse"]
                                   Four
_  -> [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"reverse reverb ", if Di
wet Di -> Di -> Bool
forall a. Eq a => a -> a -> Bool
== Di
FQ.O then String
"-w " else String
"", [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String) -> ([Float] -> [String]) -> [Float] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([Float] -> [String]) -> [Float] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> String) -> [Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Float
x -> Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
x String
" ") ([Float] -> String) -> [Float] -> String
forall a b. (a -> b) -> a -> b
$ [Float]
ys,String
" ",
                                     Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r5 String
" ",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
n) Float
r6 String
""]

reverb1 :: Reverb a b c d -> a
reverb1 :: Reverb a b c d -> a
reverb1 (Rvrb a
x b
_ [c]
_ d
_) = a
x

reverb2 :: Reverb a b c d -> b
reverb2 :: Reverb a b c d -> b
reverb2 (Rvrb a
_ b
y [c]
_ d
_) = b
y

reverb3 :: Reverb a b c d -> [c]
reverb3 :: Reverb a b c d -> [c]
reverb3 (Rvrb a
_ b
_ [c]
zs d
_) = Int -> [c] -> [c]
forall a. Int -> [a] -> [a]
take Int
6 [c]
zs

reverb4 :: Reverb a b c d -> d
reverb4 :: Reverb a b c d -> d
reverb4 (Rvrb a
_ b
_ [c]
_ d
t) = d
t

type ReverbE = Reverb Four FQ.Di Float Int

reverb3E :: Int -> ReverbE -> Float
reverb3E :: Int -> Reverb Four Di Float Int -> Float
reverb3E Int
n Reverb Four Di Float Int
x 
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT Bool -> Bool -> Bool
&& Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
7 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT = if [Float] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Float] -> Bool)
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
drop (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> Bool)
-> Reverb Four Di Float Int -> Bool
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x then Float
50.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral ((((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
3) else Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 Reverb Four Di Float Int
x [Float] -> Int -> Float
forall a. [a] -> Int -> a
!! (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
 | Bool
otherwise = String -> Float
forall a. HasCallStack => String -> a
error String
"DobutokO.Sound.Effects.Reverb.reverb3E: Not defined parameter. "

reverbSet1 :: a -> Reverb a b c d -> Reverb a b c d
reverbSet1 :: a -> Reverb a b c d -> Reverb a b c d
reverbSet1 a
x (Rvrb a
_ b
y [c]
zs d
t) = a -> b -> [c] -> d -> Reverb a b c d
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb a
x b
y [c]
zs d
t

reverbSet2 :: b -> Reverb a b c d -> Reverb a b c d
reverbSet2 :: b -> Reverb a b c d -> Reverb a b c d
reverbSet2 b
y (Rvrb a
x b
_ [c]
zs d
t) = a -> b -> [c] -> d -> Reverb a b c d
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb a
x b
y [c]
zs d
t

reverbSet3 :: [c] -> Reverb a b c d -> Reverb a b c d
reverbSet3 :: [c] -> Reverb a b c d -> Reverb a b c d
reverbSet3 [c]
zs (Rvrb a
x b
y [c]
_ d
t) = a -> b -> [c] -> d -> Reverb a b c d
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb a
x b
y (Int -> [c] -> [c]
forall a. Int -> [a] -> [a]
take Int
6 [c]
zs) d
t

reverbSet4 :: d -> Reverb a b c d -> Reverb a b c d
reverbSet4 :: d -> Reverb a b c d -> Reverb a b c d
reverbSet4 d
t (Rvrb a
x b
y [c]
zs d
_) = a -> b -> [c] -> d -> Reverb a b c d
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb a
x b
y [c]
zs d
t

reverbSet3E :: Int -> Float -> ReverbE -> ReverbE
reverbSet3E :: Int
-> Float -> Reverb Four Di Float Int -> Reverb Four Di Float Int
reverbSet3E Int
n Float
y Reverb Four Di Float Int
x 
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT Bool -> Bool -> Bool
&& Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
5 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT = Four -> Di -> [Float] -> Int -> Reverb Four Di Float Int
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb (Reverb Four Di Float Int -> Four
forall a b c d. Reverb a b c d -> a
reverb1 Reverb Four Di Float Int
x) (Reverb Four Di Float Int -> Di
forall a b c d. Reverb a b c d -> b
reverb2 Reverb Four Di Float Int
x) ([[Float]] -> [Float]
forall a. Monoid a => [a] -> a
mconcat [Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
take (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int -> [Float]
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x, [Float -> Float -> Float
toRange Float
100.0 Float
y], Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
drop Int
n ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int -> [Float]
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x]) (Reverb Four Di Float Int -> Int
forall a b c d. Reverb a b c d -> d
reverb4 Reverb Four Di Float Int
x)
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
5 = Four -> Di -> [Float] -> Int -> Reverb Four Di Float Int
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb (Reverb Four Di Float Int -> Four
forall a b c d. Reverb a b c d -> a
reverb1 Reverb Four Di Float Int
x) (Reverb Four Di Float Int -> Di
forall a b c d. Reverb a b c d -> b
reverb2 Reverb Four Di Float Int
x) ([[Float]] -> [Float]
forall a. Monoid a => [a] -> a
mconcat [Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
take Int
4 ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int -> [Float]
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x, [Float
y], Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
drop Int
5 ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int -> [Float]
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x]) (Reverb Four Di Float Int -> Int
forall a b c d. Reverb a b c d -> d
reverb4 Reverb Four Di Float Int
x)
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
6 = Four -> Di -> [Float] -> Int -> Reverb Four Di Float Int
forall a b c d. a -> b -> [c] -> d -> Reverb a b c d
Rvrb (Reverb Four Di Float Int -> Four
forall a b c d. Reverb a b c d -> a
reverb1 Reverb Four Di Float Int
x) (Reverb Four Di Float Int -> Di
forall a b c d. Reverb a b c d -> b
reverb2 Reverb Four Di Float Int
x) ([[Float]] -> [Float]
forall a. Monoid a => [a] -> a
mconcat [Int -> [Float] -> [Float]
forall a. Int -> [a] -> [a]
take Int
5 ([Float] -> [Float])
-> (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int
-> [Float]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> [Float]
forall a b c d. Reverb a b c d -> [c]
reverb3 (Reverb Four Di Float Int -> [Float])
-> Reverb Four Di Float Int -> [Float]
forall a b. (a -> b) -> a -> b
$ Reverb Four Di Float Int
x, [Float -> Float -> Float
toRange Float
120.0 Float
y]]) (Reverb Four Di Float Int -> Int
forall a b c d. Reverb a b c d -> d
reverb4 Reverb Four Di Float Int
x)
 | Bool
otherwise = String -> Reverb Four Di Float Int
forall a. HasCallStack => String -> a
error String
"DobutokO.Sound.Effects.Reverb.reverbSet3E: The first argument is out of range [1..6]. "

showQReverb :: ReverbE -> [String]
showQReverb :: Reverb Four Di Float Int -> [String]
showQReverb = String -> [String]
words (String -> [String])
-> (Reverb Four Di Float Int -> String)
-> Reverb Four Di Float Int
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reverb Four Di Float Int -> String
forall a. Show a => a -> String
show