{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Module : Phonetic.Languages.Array.General.PropertiesSyllablesG2
-- Copyright : (c) OleksandrZhabenko 2020-2021
-- License : MIT
-- Stability : Experimental
-- Maintainer : olexandr543@yahoo.com
--
-- Generalization and extension of the functionality of the DobutokO.Poetry.Norms
-- and DobutokO.Poetry.Norms.Extended modules
-- from the @dobutokO-poetry@ package and more recent package @phonetic-languages-simplified-properties-array@.
-- Uses syllables information.
-- Instead of the vector-related, uses arrays.
-- If you use the functionality of the Phonetic.Languages.Array.Ukrainian.PropertiesSyllablesG2 module,
-- then import it qualified (or this module) because they have many common data. Is provided as a standalone one
-- to reduce dependencies list in general case.
{-# LANGUAGE CPP, BangPatterns, MultiWayIf #-}
module Phonetic.Languages.Array.General.PropertiesSyllablesG2 (
-- * Newtype to work with
CoeffTwo(..)
, Coeffs2
, isEmpty
, isPair
, fstCF
, sndCF
, readCF
-- * Rhythmicity properties (semi-empirical)
-- ** Simple one
, rhythmicity0i
, rhythmicity0Fi
-- ** With weight coefficients
, rhythmicityKi
, rhythmicityKFi
-- * General
, rhythmicityG
, rhythmicity
) 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 Languages.Rhythmicity
import Languages.Rhythmicity.Factor
import Rhythmicity.TwoFourth
import Rhythmicity.PolyRhythm
import Data.Phonetic.Languages.Base
import Data.Phonetic.Languages.Syllables
import Data.Maybe (isNothing,fromMaybe)
import Text.Read (readMaybe)
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif
data CoeffTwo a = CF0 | CF2 (Maybe a) (Maybe a) deriving (Eq)
isEmpty :: CoeffTwo a -> Bool
isEmpty CF0 = True
isEmpty _ = False
isPair :: CoeffTwo a -> Bool
isPair CF0 = False
isPair _ = True
fstCF :: CoeffTwo a -> Maybe a
fstCF (CF2 x _) = x
fstCF _ = Nothing
sndCF :: CoeffTwo a -> Maybe a
sndCF (CF2 _ y) = y
sndCF _ = Nothing
readCF :: String -> Coeffs2
readCF xs
| any (== '_') xs = let (!ys,!zs) = (\(ks,ts) -> (readMaybe ks::Maybe Double,readMaybe (drop 1 ts)::Maybe Double)) . break (== '_') $ xs in
if (isNothing ys && isNothing zs) then CF0 else CF2 ys zs
| otherwise = CF0
-- | A data type that is used to represent the coefficients of the rhythmicity functions as a one argument value.
type Coeffs2 = CoeffTwo Double
--------------------------------------------------------------------------------------------
eval23 = evalRhythmicity23 . mconcat
{-# INLINE eval23 #-}
eval23K k2 k3 = evalRhythmicity23K k2 k3 . mconcat
{-# INLINE eval23K #-}
eval23F k = evalRhythmicity23F k . mconcat
{-# INLINE eval23F #-}
eval23KF k k2 k3 = evalRhythmicity23KF k k2 k3 . mconcat
{-# INLINE eval23KF #-}
rhythmicityG
:: ([[[PRS]]] -> [[Double]])-- ^ A function that specifies the syllables durations, analogue of the
-- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
-> ([[Double]] -> Double) -- ^ Usually some kind of flattening of the double list into a single value.
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityG f g wrs ks arr hs us vs xs
| null xs = 0.0
| otherwise = g . f . createSyllablesPL wrs ks arr hs us vs $ xs
{-# INLINE rhythmicityG #-}
-------------------------------------------------------
rhythmicity0i
:: ([[[PRS]]] -> [[Double]]) -- ^ A function that specifies the syllables durations, analogue of the
-- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicity0i f = rhythmicityG f eval23
{-# INLINE rhythmicity0i #-}
-------------------------------------------------------
rhythmicityKi
:: ([[[PRS]]] -> [[Double]]) -- ^ A function that specifies the syllables durations, analogue of the
-- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
-> Double
-> Double
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityKi f k2 k3 = rhythmicityG f (eval23K k2 k3)
{-# INLINE rhythmicityKi #-}
--------------------------------------------------------
rhythmicity0Fi
:: ([[[PRS]]] -> [[Double]]) -- ^ A function that specifies the syllables durations, analogue of the
-- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
-> Double
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicity0Fi f k = rhythmicityG f (eval23F k)
{-# INLINE rhythmicity0Fi #-}
--------------------------------------------------------
rhythmicityKFi
:: ([[[PRS]]] -> [[Double]]) -- ^ A function that specifies the syllables durations, analogue of the
-- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
-> Double
-> Double
-> Double
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityKFi f k k2 k3 = rhythmicityG f (eval23KF k k2 k3)
{-# INLINE rhythmicityKFi #-}
--------------------------------------------------------
-- | It is intended to provide different functions :: 'Double' -> 'String' -> ([[['PRS']]] -> [['Double']]) for at least the
-- following values: \"0z\", \"02z\", \"03z\", \"04z\", \"0y\", \"02y\", \"03y\" and the default one for other variants.
-- The \"z\"-line uses \'F\' functions.
rhythmicity
:: Double
-> String -- ^ Is intended to be one of the following strings: \"02y\", \"02z\", \"03y\", \"03z\", \"04y\", \"04z\",
-- \"0y\", \"0z\", \"y\", \"y0\", \"y2\", \"y3\", \"y4\", \"yy\", \"yy2\", \"yy3\", \"z\", \"z2\", \"z3\", \"z4\",
-- \"zz\", \"zz2\", \"zz3\", \"zz4\" or some other one (that is the default one). Since the version 0.3.0.0 you
-- can also use \"w\" or \"x\"-based lines. Specifies the applied properties
-- to get the result. The \"z\"-line uses \'F\' functions.
-> (Double -> String -> ([[[PRS]]] -> [[Double]]))-- ^ The function that is needed in the 'procRhythmicity23F' function.
-- Specifies a way how the syllables represented in the phonetic language approach transforms into their durations and
-- depends on two parameters.
-> Coeffs2
-> GWritingSystemPRPLX -- ^ Data used to obtain the phonetic language representation of the text.
-> [(Char,Char)] -- ^ The pairs of the 'Char' that corresponds to the similar phonetic languages consonant phenomenon
-- (e. g. allophones). Must be sorted in the ascending order to be used correctly.
-> CharPhoneticClassification -- ^ The 'Array' 'Int' 'PRS' must be sorted in the ascending order to be used in the module correctly.
-> SegmentRulesG
-> String
-> String
-> String
-> Double
rhythmicity k choice h CF0
| choice `elem` ["0z","02z","03z","04z"] = rhythmicity0Fi f k
| take 1 choice == "w" = case take 2 choice of
"w0" -> w0F (Ch 1 1 4) (Rhythm 1 1 2)
"w1" -> w0F (Ch 1 0 4) (Rhythm 2 1 1)
"w2" -> w0F (Ch 0 1 4) (Rhythm 1 2 1)
"w3" -> w0F (Ch 0 0 4) (Rhythm 1 1 2)
_ -> w0F (Ch 0 0 4) (Rhythm 1 1 2)
| take 1 choice == "x" = case take 2 choice of
"x0" -> x0F (Ch 1 1 4) (Rhythm 1 1 2)
"x1" -> x0F (Ch 1 0 4) (Rhythm 2 1 1)
"x2" -> x0F (Ch 0 1 4) (Rhythm 1 2 1)
"x3" -> x0F (Ch 0 0 4) (Rhythm 1 1 2)
_ -> x0F (Ch 0 0 4) (Rhythm 1 1 2)
| take 1 choice == "C" = let just_probe = readRhythmicity choice in
case just_probe of
Just (P1 ch rh _) -> rhythmicityG f (rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat)
Just (P2 ch rh r _) -> rhythmicityG f (rhythmicityPolyWeightedF2 1.0 r ch rh . mconcat)
_ -> rhythmicity0i f
| take 1 choice == "N" = let just_probe = readRhythmicity choice in
case just_probe of
Just (P1 ch rh _) -> rhythmicityG f (rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat)
Just (P2 ch rh r _) -> rhythmicityG f (rhythmicityPolyWeightedF3 1.0 r ch rh . mconcat)
_ -> rhythmicity0i f
| take 1 choice == "c" = let just_probe = readRhythmicity choice in
case just_probe of
Just (P1 ch rh _) -> rhythmicityG f (rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat)
Just (P2 ch rh r _) -> rhythmicityG f (rhythmicityPoly 1.0 r ch rh . mconcat)
_ -> rhythmicity0i f
| take 1 choice == "U" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let uU0F rs = y0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> uU0F [True,True,True]
"1" -> uU0F [True,True,False]
"2" -> uU0F [True,False,True]
_ -> uU0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let uU0F rs = y0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> uU0F [True,True,True]
"5" -> uU0F [True,True,False]
"6" -> uU0F [True,False,True]
~"7" -> uU0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "W" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let wW0F rs = n0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> wW0F [True,True,True]
"1" -> wW0F [True,True,False]
"2" -> wW0F [True,False,True]
_ -> wW0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let wW0F rs = n0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> wW0F [True,True,True]
"5" -> wW0F [True,True,False]
"6" -> wW0F [True,False,True]
~"7" -> wW0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "u" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let uu0F rs = u0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> uu0F [True,True,True]
"1" -> uu0F [True,True,False]
"2" -> uu0F [True,False,True]
_ -> uu0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let uu0F rs = u0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> uu0F [True,True,True]
"5" -> uu0F [True,True,False]
"6" -> uu0F [True,False,True]
~"7" -> uu0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "V" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let vV0F rs = z0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> vV0F [True,True,True]
"1" -> vV0F [True,True,False]
"2" -> vV0F [True,False,True]
_ -> vV0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let vV0F rs = z0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> vV0F [True,True,True]
"5" -> vV0F [True,True,False]
"6" -> vV0F [True,False,True]
~"7" -> vV0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "X" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let xX0F rs = s0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> xX0F [True,True,True]
"1" -> xX0F [True,True,False]
"2" -> xX0F [True,False,True]
_ -> xX0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let xX0F rs = s0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> xX0F [True,True,True]
"5" -> xX0F [True,True,False]
"6" -> xX0F [True,False,True]
~"7" -> xX0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "v" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let vv0F rs = v0F (PolyCh rs 5) (PolyRhythm [1,2,1,1]) in
case drop 1 . take 2 $ choice of
"0" -> vv0F [True,True,True]
"1" -> vv0F [True,True,False]
"2" -> vv0F [True,False,True]
_ -> vv0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let vv0F rs = v0F (PolyCh rs 5) (PolyRhythm [2,1,1,1]) in
case drop 1 . take 2 $ choice of
"4" -> vv0F [True,True,True]
"5" -> vv0F [True,True,False]
"6" -> vv0F [True,False,True]
~"7" -> vv0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "S" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let sS0F rs = y0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> sS0F [True,True,True]
"1" -> sS0F [True,True,False]
"2" -> sS0F [True,False,True]
_ -> sS0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let sS0F rs = y0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> sS0F [True,True,True]
"5" -> sS0F [True,True,False]
"6" -> sS0F [True,False,True]
~"7" -> sS0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "Y" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let yY0F rs = n0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> yY0F [True,True,True]
"1" -> yY0F [True,True,False]
"2" -> yY0F [True,False,True]
_ -> yY0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let yY0F rs = n0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> yY0F [True,True,True]
"5" -> yY0F [True,True,False]
"6" -> yY0F [True,False,True]
~"7" -> yY0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "s" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let ss0F rs = u0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> ss0F [True,True,True]
"1" -> ss0F [True,True,False]
"2" -> ss0F [True,False,True]
_ -> ss0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let ss0F rs = u0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> ss0F [True,True,True]
"5" -> ss0F [True,True,False]
"6" -> ss0F [True,False,True]
~"7" -> ss0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "T" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let tT0F rs = z0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> tT0F [True,True,True]
"1" -> tT0F [True,True,False]
"2" -> tT0F [True,False,True]
_ -> tT0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let tT0F rs = z0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> tT0F [True,True,True]
"5" -> tT0F [True,True,False]
"6" -> tT0F [True,False,True]
~"7" -> tT0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "Z" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let zZ0F rs = s0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> zZ0F [True,True,True]
"1" -> zZ0F [True,True,False]
"2" -> zZ0F [True,False,True]
_ -> zZ0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let zZ0F rs = s0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> zZ0F [True,True,True]
"5" -> zZ0F [True,True,False]
"6" -> zZ0F [True,False,True]
~"7" -> zZ0F [True,False,False]
| otherwise -> rhythmicity0i f
| take 1 choice == "t" = if
| (drop 1 . take 2 $ choice) >= "0" && (drop 1 . take 2 $ choice) <= "3" ->
let tt0F rs = v0F (PolyCh rs 6) (PolyRhythm [1,2,1,2]) in
case drop 1 . take 2 $ choice of
"0" -> tt0F [True,True,True]
"1" -> tt0F [True,True,False]
"2" -> tt0F [True,False,True]
_ -> tt0F [True,False,False]
| (drop 1 . take 2 $ choice) >= "4" && (drop 1 . take 2 $ choice) <= "7" ->
let tt0F rs = v0F (PolyCh rs 6) (PolyRhythm [2,1,1,2]) in
case drop 1 . take 2 $ choice of
"4" -> tt0F [True,True,True]
"5" -> tt0F [True,True,False]
"6" -> tt0F [True,False,True]
~"7" -> tt0F [True,False,False]
| otherwise -> rhythmicity0i f
| otherwise = rhythmicity0i f
where f = h k choice
w0F ch rh = rhythmicityG f (rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat)
x0F ch rh = rhythmicityG f (rhythmicityABC0 1.0 2.0 0.125 ch rh . mconcat)
u0F ch rh = rhythmicityG f (rhythmicityPoly 1.0 4 ch rh . mconcat)
v0F ch rh = rhythmicityG f (rhythmicityPoly0 1.0 4 ch rh . mconcat)
{-# INLINE w0F #-}
{-# INLINE x0F #-}
{-# INLINE u0F #-}
{-# INLINE v0F #-}
y0F ch rh = rhythmicityG f (rhythmicityPolyWeightedF2 1.0 4 ch rh . mconcat)
z0F ch rh = rhythmicityG f (rhythmicityPolyWeightedF20 1.0 4 ch rh . mconcat)
{-# INLINE y0F #-}
{-# INLINE z0F #-}
n0F ch rh = rhythmicityG f (rhythmicityPolyWeightedF3 1.0 4 ch rh . mconcat)
s0F ch rh = rhythmicityG f (rhythmicityPolyWeightedF30 1.0 4 ch rh . mconcat)
{-# INLINE n0F #-}
{-# INLINE s0F #-}
rhythmicity k choice h (CF2 x y)
| choice `elem` ["0z","02z","03z","04z"] = rhythmicityKFi f k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
| take 1 choice == "w" = if
| choice `elem` ["w01","w02","w03","w04"] -> w0F (Ch 1 1 4) (Rhythm 1 1 2)
| choice `elem` ["w11","w12","w13","w14"] -> w0F (Ch 1 0 4) (Rhythm 2 1 1)
| choice `elem` ["w21","w22","w23","w24"] -> w0F (Ch 0 1 4) (Rhythm 1 2 1)
| choice `elem` ["w31","w32","w33","w34"] -> w0F (Ch 0 0 4) (Rhythm 1 1 2)
| otherwise -> w0F (Ch 1 0 4) (Rhythm 1 1 2)
| take 1 choice == "x" = if
| choice `elem` ["x01","x02","x03","x04"] -> x0F (Ch 1 1 4) (Rhythm 1 1 2)
| choice `elem` ["x11","x12","x13","x14"] -> x0F (Ch 1 0 4) (Rhythm 2 1 1)
| choice `elem` ["x21","x22","x23","x24"] -> x0F (Ch 0 1 4) (Rhythm 1 2 1)
| choice `elem` ["x31","x32","x33","x34"] -> x0F (Ch 0 0 4) (Rhythm 1 1 2)
| otherwise -> x0F (Ch 1 0 4) (Rhythm 1 1 2)
| take 1 choice == "C" = rhythmicity k choice h CF0
| take 1 choice == "U" = rhythmicity k choice h CF0
| take 1 choice == "V" = rhythmicity k choice h CF0
| take 1 choice == "S" = rhythmicity k choice h CF0
| take 1 choice == "T" = rhythmicity k choice h CF0
| take 1 choice == "N" = rhythmicity k choice h CF0
| take 1 choice == "W" = rhythmicity k choice h CF0
| take 1 choice == "X" = rhythmicity k choice h CF0
| take 1 choice == "Y" = rhythmicity k choice h CF0
| take 1 choice == "Z" = rhythmicity k choice h CF0
| take 1 choice == "c" = rhythmicity k choice h CF0
| take 1 choice == "u" = rhythmicity k choice h CF0
| take 1 choice == "v" = rhythmicity k choice h CF0
| take 1 choice == "s" = rhythmicity k choice h CF0
| take 1 choice == "t" = rhythmicity k choice h CF0
| otherwise = rhythmicityKi f (fromMaybe 1.0 x) (fromMaybe 1.0 y)
where f = h k choice
w0F ch rh = rhythmicityG f (rhythmicityABC 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat)
x0F ch rh = rhythmicityG f (rhythmicityABC0 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat)
{-# INLINE w0F #-}
{-# INLINE x0F #-}