{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Languages.Rhythmicity where
import GHC.Int
maxPosition2 :: (RealFrac a) => [a] -> a
maxPosition2 :: [a] -> a
maxPosition2 [a]
xs
| [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs = a
0.0
| a
mx2 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0.0 = a
2.0 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Num a => a -> a
abs ([a] -> Int16 -> a
forall a p. (Ord a, Num p) => [a] -> Int16 -> p
maxP21 [a]
xs Int16
0)
| a -> a
forall a. Num a => a -> a
abs a
mx2 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1 = a
1.6 a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Num a => a -> a
abs ([a] -> Int16 -> a
forall a p. (Ord a, Num p) => [a] -> Int16 -> p
maxP21 [a]
xs Int16
0)
| Bool
otherwise = a -> a
forall a. Num a => a -> a
abs ([a] -> Int16 -> a
forall a p. (Ord a, Num p) => [a] -> Int16 -> p
maxP21 [a]
xs Int16
0 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
mx2)
where maxP21 :: [a] -> Int16 -> p
maxP21 (a
x:a
y:[a]
ys) !Int16
acc1 = [a] -> Int16 -> p
maxP21 [a]
ys (if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y then (Int16
acc1 Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
+ Int16
1)::Int16 else (Int16
acc1 Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
- Int16
1)::Int16)
maxP21 [a]
_ !Int16
acc1 = Int16 -> p
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
acc1
maxP22 :: [a] -> Int16 -> p
maxP22 (a
x:a
y:[a]
ys) !Int16
acc1 = [a] -> Int16 -> p
maxP22 (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys) (if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y then (Int16
acc1 Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
+ Int16
1)::Int16 else (Int16
acc1 Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
- Int16
1)::Int16)
maxP22 [a]
_ !Int16
acc1 = Int16 -> p
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
acc1
!mx2 :: a
mx2 = [a] -> Int16 -> a
forall a p. (Ord a, Num p) => [a] -> Int16 -> p
maxP22 [a]
xs (Int16
0::Int16)
posMaxIn3
:: (Ord a) => a
-> a
-> a
-> Int16
posMaxIn3 :: a -> a -> a -> Int16
posMaxIn3 a
x a
y a
z
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y = if a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
z then Int16
3 else Int16
2
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
z = Int16
3
| Bool
otherwise = Int16
1
maxPosition3 :: RealFrac a => [a] -> a
maxPosition3 :: [a] -> a
maxPosition3 [a]
xs
| [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs = a
0.0
| [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = a
3.0 a -> a -> a
forall a. Num a => a -> a -> a
* Int16 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Int16] -> (Int16, Int16, Int16) -> Int16
forall a. (Eq a, Num a) => [a] -> (Int16, Int16, Int16) -> Int16
go ([a] -> [Int16]
forall a. Ord a => [a] -> [Int16]
h [a]
xs) ((Int16
0, Int16
0, Int16
0)::(Int16,Int16,Int16)))
| Bool
otherwise = Int16 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Int16] -> (Int16, Int16, Int16) -> Int16
forall a. (Eq a, Num a) => [a] -> (Int16, Int16, Int16) -> Int16
go ([a] -> [Int16]
forall a. Ord a => [a] -> [Int16]
h [a]
xs) ((Int16
0, Int16
0, Int16
0)::(Int16,Int16,Int16)))
where h :: [a] -> [Int16]
h (a
x:a
y:a
z:[a]
ys) = a -> a -> a -> Int16
forall a. Ord a => a -> a -> a -> Int16
posMaxIn3 a
x a
y a
zInt16 -> [Int16] -> [Int16]
forall a. a -> [a] -> [a]
:[a] -> [Int16]
h [a]
ys
h [a]
_ = []
go :: [a] -> (Int16, Int16, Int16) -> Int16
go (a
x:[a]
zs) (!Int16
acc21,!Int16
acc22,!Int16
acc23) = [a] -> (Int16, Int16, Int16) -> Int16
go [a]
zs (a -> (Int16, Int16, Int16) -> (Int16, Int16, Int16)
forall a.
(Eq a, Num a) =>
a -> (Int16, Int16, Int16) -> (Int16, Int16, Int16)
h1 a
x (Int16
acc21,Int16
acc22,Int16
acc23))
go [a]
_ (!Int16
acc21,!Int16
acc22,!Int16
acc23)
| Int16
acc21 Int16 -> Int16 -> Bool
forall a. Ord a => a -> a -> Bool
> Int16
acc22 = if Int16
acc21 Int16 -> Int16 -> Bool
forall a. Ord a => a -> a -> Bool
> Int16
acc23 then Int16
acc21 else Int16
acc23
| Int16
acc22 Int16 -> Int16 -> Bool
forall a. Ord a => a -> a -> Bool
> Int16
acc23 = Int16
acc22
| Bool
otherwise = Int16
acc23
h1 :: a -> (Int16, Int16, Int16) -> (Int16, Int16, Int16)
h1 !a
x (!Int16
t,!Int16
u,!Int16
w)
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1 = (Int16
t Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
+ (Int16
1::Int16), Int16
u, Int16
w)
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
2 = (Int16
t, Int16
u Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
+ (Int16
1::Int16), Int16
w)
| Bool
otherwise = (Int16
t,Int16
u,Int16
w Int16 -> Int16 -> Int16
forall a. Num a => a -> a -> a
+ (Int16
1::Int16))
evalRhythmicity23 :: (RealFrac a, Floating a) => [a] -> a
evalRhythmicity23 :: [a] -> a
evalRhythmicity23 [a]
xs = [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
+ [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs
evalRhythmicity23K
:: (RealFrac a, Floating a) => a
-> a
-> [a]
-> a
evalRhythmicity23K :: a -> a -> [a] -> a
evalRhythmicity23K a
k2 a
k3 [a]
xs = a
k2 a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
+ a
k3 a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs a -> a -> a
forall a. Num a => a -> a -> a
* [a] -> a
forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs