packages feed

phonetic-languages-simplified-properties-array-0.9.1.0: Phonetic/Languages/Array/Ukrainian/PropertiesSyllablesG2.hs

{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Phonetic.Languages.Array.Ukrainian.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. Uses syllables information.
-- Instead of the vector-related, uses just arrays.

{-# LANGUAGE CPP, BangPatterns, MultiWayIf #-}

module Phonetic.Languages.Array.Ukrainian.PropertiesSyllablesG2 (
    -- * Newtype to work with
  CoeffTwo(..)
  , Coeffs2
  , isEmpty
  , isPair
  , fstCF
  , sndCF
  , readCF
  -- * Rhythmicity properties (semi-empirical)
  -- ** General ones
  , rhythmicity0H
  , rhythmicity0FH
  , rhythmicityKH
  , rhythmicityKFH
  -- ** Simple one
  , rhythmicity0
  , rhythmicity0F
  -- ** With weight coefficients
  , rhythmicityK
  , rhythmicityKF
  -- * Rhythmicity properties from generated with r-glpk-phonetic-languages-ukrainian-durations package (since 0.2.0.0 version)
  -- ** Simple one
  , rhythmicity02
  , rhythmicity02F
  -- ** With weight coefficients
  , rhythmicityK2
  , rhythmicityKF2
  -- * NEW Rhythmicity properties from generated with r-glpk-phonetic-languages-ukrainian-durations package
  -- ** Simple ones
  , rhythmicity03
  , rhythmicity03F
  , rhythmicity04
  , rhythmicity04F
  -- ** With weight coefficients
  , rhythmicityK3
  , rhythmicityKF3
  , rhythmicityK4
  , rhythmicityKF4
  -- * General
  , rhythmicityG
  , rhythmicityGH
  , rhythmicity
  , rhythmicityH
  , rhythmicityH'
) 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 Languages.Phonetic.Ukrainian.Syllable.Double.Arr
import Languages.Phonetic.Ukrainian.Syllable.Arr
import Data.Maybe (isNothing,fromMaybe,fromJust)
import Text.Read (readMaybe)
import Rhythmicity.TwoFourth
import Rhythmicity.PolyRhythm

#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

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 #-}

rhythmicityGH :: ([[[UZPP2]]] -> [[Double]]) -> ([[Double]] -> Double) -> String -> Double
rhythmicityGH f g xs
 | null xs = 0.0
 | otherwise = g . f . createSyllablesUkrS $ xs
{-# INLINE rhythmicityGH #-}

-------------------------------------------------------

rhythmicity0H :: ([[[UZPP2]]] -> [[Double]]) -> String -> Double
rhythmicity0H f = rhythmicityGH f eval23
{-# INLINE rhythmicity0H #-}

rhythmicity0 :: String -> Double
rhythmicity0 = rhythmicity0H syllableDurationsD
{-# INLINE rhythmicity0 #-}

rhythmicity02 :: String -> Double
rhythmicity02 = rhythmicity0H syllableDurationsD2
{-# INLINE rhythmicity02 #-}

rhythmicity03 :: String -> Double
rhythmicity03 = rhythmicity0H syllableDurationsD3
{-# INLINE rhythmicity03 #-}

rhythmicity04 :: String -> Double
rhythmicity04 = rhythmicity0H syllableDurationsD4
{-# INLINE rhythmicity04 #-}

-------------------------------------------------------

rhythmicityKH :: ([[[UZPP2]]] -> [[Double]]) -> Double -> Double -> String -> Double
rhythmicityKH f k2 k3 = rhythmicityGH f (eval23K k2 k3)
{-# INLINE rhythmicityKH #-}

rhythmicityK :: Double -> Double -> String -> Double
rhythmicityK k2 k3 = rhythmicityKH syllableDurationsD k2 k3
{-# INLINE rhythmicityK #-}

rhythmicityK2 :: Double -> Double -> String -> Double
rhythmicityK2 k2 k3 = rhythmicityKH syllableDurationsD2 k2 k3
{-# INLINE rhythmicityK2 #-}

rhythmicityK3 :: Double -> Double -> String -> Double
rhythmicityK3 k2 k3 = rhythmicityKH syllableDurationsD3 k2 k3
{-# INLINE rhythmicityK3 #-}

rhythmicityK4 :: Double -> Double -> String -> Double
rhythmicityK4 k2 k3 = rhythmicityKH syllableDurationsD4 k2 k3
{-# INLINE rhythmicityK4 #-}

--------------------------------------------------------

rhythmicity0FH :: ([[[UZPP2]]] -> [[Double]]) -> Double -> String -> Double
rhythmicity0FH f k = rhythmicityGH f (eval23F k)
{-# INLINE rhythmicity0FH #-}

rhythmicity0F :: Double -> String -> Double
rhythmicity0F k = rhythmicity0FH syllableDurationsD k
{-# INLINE rhythmicity0F #-}

rhythmicity02F :: Double -> String -> Double
rhythmicity02F k = rhythmicity0FH syllableDurationsD2 k
{-# INLINE rhythmicity02F #-}

rhythmicity03F :: Double -> String -> Double
rhythmicity03F k = rhythmicity0FH syllableDurationsD3 k
{-# INLINE rhythmicity03F #-}

rhythmicity04F :: Double -> String -> Double
rhythmicity04F k = rhythmicity0FH syllableDurationsD4 k
{-# INLINE rhythmicity04F #-}

--------------------------------------------------------

rhythmicityKFH :: ([[[UZPP2]]] -> [[Double]]) -> Double -> Double -> Double -> String -> Double
rhythmicityKFH f k k2 k3 = rhythmicityGH f (eval23KF k k2 k3)
{-# INLINE rhythmicityKFH #-}

rhythmicityKF :: Double -> Double -> Double -> String -> Double
rhythmicityKF k k2 k3 = rhythmicityKFH syllableDurationsD k k2 k3
{-# INLINE rhythmicityKF #-}

rhythmicityKF2 :: Double -> Double -> Double -> String -> Double
rhythmicityKF2 k k2 k3 = rhythmicityKFH syllableDurationsD2 k k2 k3
{-# INLINE rhythmicityKF2 #-}

rhythmicityKF3 :: Double -> Double -> Double -> String -> Double
rhythmicityKF3 k k2 k3 = rhythmicityKFH syllableDurationsD3 k k2 k3
{-# INLINE rhythmicityKF3 #-}

rhythmicityKF4 :: Double -> Double -> Double -> String -> Double
rhythmicityKF4 k k2 k3 = rhythmicityKFH syllableDurationsD4 k k2 k3
{-# INLINE rhythmicityKF4 #-}

--------------------------------------------------------

rhythmicityG
  :: ([[[UZPP2]]] -> [[Double]])-- ^ A function that specifies the syllables durations, analogue of (or one of) the
  -- syllableDurationsD functions from the @ukrainian-phonetics-basics-array@ package.
  -> String
  -> [Double]
rhythmicityG f xs
 | null xs = []
 | otherwise = mconcat . f . createSyllablesUkrS $ xs
{-# INLINE rhythmicityG #-}

--------------------------------------------------------

rhythmicity :: Double -> String -> Coeffs2 -> String -> Double
rhythmicity k choice CF0 = if
 | take 1 choice `elem` ["c","M","N"] || (take 1 choice >= "A" && take 1 choice <= "F") -> let just_probe = readRhythmicity choice in
           case just_probe of
             Just (P1 ch rh n) -> rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
             Just (P2 ch rh r n) -> case take 1 choice of
                   "A" -> rhythmicityPolyWeightedLEF2 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "D" -> rhythmicityPolyWeightedLF2 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "E" -> rhythmicityPolyWeightedLEF3 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "F" -> rhythmicityPolyWeightedLF3 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "B" -> rhythmicityPolyWeightedEF2 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "C" -> rhythmicityPolyWeightedF2 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "M" -> rhythmicityPolyWeightedEF3 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "N" -> rhythmicityPolyWeightedF3 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
                   "c" -> rhythmicityPoly 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrS
             _ -> rhythmicity04
 | choice == "0y" -> rhythmicity0
 | choice == "02y" -> rhythmicity02
 | choice == "03y" -> rhythmicity03
 | choice == "0z" -> rhythmicity0F k
 | choice == "02z" -> rhythmicity02F k
 | choice == "03z" -> rhythmicity03F k
 | choice == "04z" -> rhythmicity04F k
 | take 1 choice == "0" -> rhythmicity04
 | take 1 choice == "w" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "w0" -> wwF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "w1" -> wwF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "w2" -> wwF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "w3" -> wwF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity04
          | otherwise -> rhythmicity04
 | take 1 choice == "x" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "x0" -> xxF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "x1" -> xxF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "x2" -> xxF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "x3" -> xxF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity04
          | otherwise -> rhythmicity04
 | otherwise -> if
    | (take 1 choice == "b" || ((take 1 choice >= "d" && take 1 choice <= "v") || (take 1 choice >= "I" && take 1 choice <= "Z"))) && (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
        case take 1 choice of
          "b" -> g rhythmicityPolyWeightedLEF3 5 1
          "d" -> g rhythmicityPolyWeightedLEF30 5 1
          "e" -> g rhythmicityPolyWeightedLEF3 6 2
          "f" -> g rhythmicityPolyWeightedLEF30 6 2
          "g" -> g rhythmicityPolyWeightedLEF2 5 1
          "h" -> g rhythmicityPolyWeightedLEF20 5 1
          "i" -> g rhythmicityPolyWeightedLEF2 6 2
          "j" -> g rhythmicityPolyWeightedLEF20 6 2
          "k" -> g rhythmicityPolyWeightedLF3 5 1
          "l" -> g rhythmicityPolyWeightedLF30 5 1
          "m" -> g rhythmicityPolyWeightedLF3 6 2
          "n" -> g rhythmicityPolyWeightedLF30 6 2
          "o" -> g rhythmicityPolyWeightedLF2 5 1
          "p" -> g rhythmicityPolyWeightedLF20 5 1
          "q" -> g rhythmicityPolyWeightedLF2 6 2
          "r" -> g rhythmicityPolyWeightedLF20 6 2
          "I" -> g rhythmicityPolyWeightedEF3 5 1
          "J" -> g rhythmicityPolyWeightedEF30 5 1
          "K" -> g rhythmicityPolyWeightedEF3 6 2
          "L" -> g rhythmicityPolyWeightedEF30 6 2
          "O" -> g rhythmicityPolyWeightedEF2 5 1
          "P" -> g rhythmicityPolyWeightedEF20 5 1
          "Q" -> g rhythmicityPolyWeightedEF2 6 2
          "R" -> g rhythmicityPolyWeightedEF20 6 2
          "W" -> g rhythmicityPolyWeightedF3 5 1
          "X" -> g rhythmicityPolyWeightedF30 5 1
          "Y" -> g rhythmicityPolyWeightedF3 6 2
          "Z" -> g rhythmicityPolyWeightedF30 6 2
          "U" -> g rhythmicityPolyWeightedF2 5 1
          "V" -> g rhythmicityPolyWeightedF20 5 1
          "S" -> g rhythmicityPolyWeightedF2 6 2
          "T" -> g rhythmicityPolyWeightedF20 6 2
          "u" -> g rhythmicityPoly 5 1
          "v" -> g rhythmicityPoly0 5 1
          "s" -> g rhythmicityPoly 6 2
          "t" -> g rhythmicityPoly0 6 2
    | otherwise -> rhythmicity04
        where h1 f ts xs m n = f 1.0 4 (PolyCh xs m) (PolyRhythm [1,2,1,n]) . mconcat . (case readMaybe ts::Maybe Int of { Just 1 -> syllableDurationsD ; Just 2 -> syllableDurationsD2 ; Just 3 -> syllableDurationsD3 ; Just 4 -> syllableDurationsD4 }) . createSyllablesUkrS
              h2 f ts xs m n = f 1.0 4 (PolyCh xs m) (PolyRhythm [2,1,1,n]) . mconcat . (case readMaybe ts::Maybe Int of { Just 1 -> syllableDurationsD ; Just 2 -> syllableDurationsD2 ; Just 3 -> syllableDurationsD3 ; Just 4 -> syllableDurationsD4 }) . createSyllablesUkrS
              g f m n
                | drop 1 choice `elem` ["01","02","03","04"] = h1 f (drop 2 . take 3 $ choice) [True,True,True] m n
                | drop 1 choice `elem` ["11","12","13","14"] = h1 f (drop 2 . take 3 $ choice) [True,True,False] m n
                | drop 1 choice `elem` ["21","22","23","24"] = h1 f (drop 2 . take 3 $ choice) [True,False,True] m n
                | drop 1 choice `elem` ["31","32","33","34"] = h1 f (drop 2 . take 3 $ choice) [True,False,False] m n
                | drop 1 choice `elem` ["41","42","43","44"] = h2 f (drop 2 . take 3 $ choice) [True,True,True] m n
                | drop 1 choice `elem` ["51","52","53","54"] = h2 f (drop 2 . take 3 $ choice) [True,True,False] m n
                | drop 1 choice `elem` ["61","62","63","64"] = h2 f (drop 2 . take 3 $ choice) [True,False,True] m n
                | drop 1 choice `elem` ["71","72","73","74"] = h2 f (drop 2 . take 3 $ choice) [True,False,False] m n
                | otherwise = rhythmicity04
              w1F f ch rh = rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat . f . createSyllablesUkrS
              wwF2 g2 xs = let (Just n) = readMaybe xs::Maybe Int in
                      case n `rem` 4 of
                       1 -> g2 syllableDurationsD
                       2 -> g2 syllableDurationsD2
                       3 -> g2 syllableDurationsD3
                       _ -> g2 syllableDurationsD4
              x1F f ch rh = rhythmicityABC0 1.0 2.0 0.125 ch rh . mconcat . f . createSyllablesUkrS
              xxF = wwF2 x1F
              wwF = wwF2 w1F
              {-# INLINE w1F #-}
              {-# INLINE wwF2 #-}
              {-# INLINE x1F #-}
              {-# INLINE xxF #-}
              {-# INLINE wwF #-}
rhythmicity k choice (CF2 x y) =
 case take 1 choice of
  "0" -> case choice of
           "0y" -> rhythmicityK (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "02y" -> rhythmicityK2 (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "03y" -> rhythmicityK3 (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "0z" -> rhythmicityKF k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "02z" -> rhythmicityKF2 k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "03z" -> rhythmicityKF3 k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "04z" -> rhythmicityKF4 k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           _ -> rhythmicityK4 (fromMaybe 1.0 x) (fromMaybe 1.0 y)
  "w" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "w0" -> wwF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "w1" -> wwF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "w2" -> wwF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "w3" -> wwF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity04
          | otherwise -> rhythmicity04
              where w1F f ch rh = rhythmicityABC 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat . f . createSyllablesUkrS
                    wwF xs = let (Just n) = readMaybe xs::Maybe Int in
                      case n `rem` 4 of
                       1 -> w1F syllableDurationsD
                       2 -> w1F syllableDurationsD2
                       3 -> w1F syllableDurationsD3
                       _ -> w1F syllableDurationsD4
                    {-# INLINE w1F #-}
                    {-# INLINE wwF #-}
  "x" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "x0" -> xxF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "x1" -> xxF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "x2" -> xxF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "x3" -> xxF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity04
          | otherwise -> rhythmicity04
              where x1F f ch rh = rhythmicityABC0 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat . f . createSyllablesUkrS
                    xxF xs = let (Just n) = readMaybe xs::Maybe Int in
                      case n `rem` 4 of
                       1 -> x1F syllableDurationsD
                       2 -> x1F syllableDurationsD2
                       3 -> x1F syllableDurationsD3
                       _ -> x1F syllableDurationsD4
                    {-# INLINE x1F #-}
                    {-# INLINE xxF #-}
  _ -> if
     | ((take 1 choice >= "b" && take 1 choice <= "v") || (take 1 choice >= "A" && take 1 choice <= "Z" && take 1 choice `notElem` ["G","H"])) -> rhythmicity k choice CF0
     | otherwise -> rhythmicityK4 (fromMaybe 1.0 x) (fromMaybe 1.0 y)

helperF4 :: Int -> [[[UZPP2]]] -> [[Double]]
helperF4 n
 | n == 1 = syllableDurationsD
 | n == 2 = syllableDurationsD2
 | n == 3 = syllableDurationsD3
 | otherwise = syllableDurationsD4

parseChRhEndMaybe :: ParseChRh -> Maybe Int
parseChRhEndMaybe (P0 _) = Nothing
parseChRhEndMaybe (P1 _ _ n) = Just n
parseChRhEndMaybe (P2 _ _ _ n) = Just n

----------------------------------------------------------------

{-| Allows to use the user-defined custom 'UZPP2' durations. This is used when the first character in the second argument is
\'H\'.
-}
rhythmicityH
  :: Double
  -> String
  -> [[[[UZPP2]]] -> [[Double]]]
  -> Coeffs2
  -> String
  -> Double
rhythmicityH k choice syllableDurationsDs coeffs
  | take 1 choice == "H" = rhythmicityH' k (drop 1 choice) syllableDurationsDs coeffs
  | otherwise = rhythmicity k choice coeffs

rhythmicityH'
  :: Double
  -> String
  -> [[[[UZPP2]]] -> [[Double]]]
  -> Coeffs2
  -> String
  -> Double
rhythmicityH' k choice syllableDurationsDs CF0 = if
 | take 1 choice `elem` ["c","M","N"] || (take 1 choice >= "A" && take 1 choice <= "F") -> let just_probe = readRhythmicity choice in
           case just_probe of
             Just (P1 ch rh n) -> rhythmicityABC 1.0 2.0 0.125 ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
             Just (P2 ch rh r n) -> case take 1 choice of
                   "A" -> rhythmicityPolyWeightedLEF2 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "D" -> rhythmicityPolyWeightedLF2 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "E" -> rhythmicityPolyWeightedLEF3 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "F" -> rhythmicityPolyWeightedLF3 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "B" -> rhythmicityPolyWeightedEF2 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "C" -> rhythmicityPolyWeightedF2 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "M" -> rhythmicityPolyWeightedEF3 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "N" -> rhythmicityPolyWeightedF3 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
                   "c" -> rhythmicityPoly 1.0 r ch rh . rhythmicityG (helperHF4 n syllableDurationsDs)
             _ -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | choice == "0y" -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | take 1 choice == "0" && drop 2 (take 3 choice) == "y" ->
    let n2 = readMaybe (drop 1 . take 2 $ choice)::Maybe Int in
      case n2 of
        Just n3 -> rhythmicity0H (helperHF4 n3 syllableDurationsDs)
        Nothing -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | choice == "0z" -> rhythmicity0FH (helperHF4 1 syllableDurationsDs) k
 | take 1 choice == "0" && drop 2 (take 3 choice) == "z" ->
    let n2 = readMaybe (drop 1 . take 2 $ choice)::Maybe Int in
      case n2 of
        Just n3 -> rhythmicity0FH (helperHF4 n3 syllableDurationsDs) k
        Nothing -> rhythmicity0FH (helperHF4 1 syllableDurationsDs) k
 | take 1 choice == "0" -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | take 1 choice == "w" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "w0" -> wwF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "w1" -> wwF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "w2" -> wwF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "w3" -> wwF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
          | otherwise -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | take 1 choice == "x" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "x0" -> xxF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "x1" -> xxF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "x2" -> xxF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "x3" -> xxF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
          | otherwise -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
 | otherwise -> if
    | (take 1 choice == "b" || ((take 1 choice >= "d" && take 1 choice <= "v") || (take 1 choice >= "I" && take 1 choice <= "Z"))) && (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "9" ->
        case take 1 choice of
          "b" -> g rhythmicityPolyWeightedLEF3 5 1
          "d" -> g rhythmicityPolyWeightedLEF30 5 1
          "e" -> g rhythmicityPolyWeightedLEF3 6 2
          "f" -> g rhythmicityPolyWeightedLEF30 6 2
          "g" -> g rhythmicityPolyWeightedLEF2 5 1
          "h" -> g rhythmicityPolyWeightedLEF20 5 1
          "i" -> g rhythmicityPolyWeightedLEF2 6 2
          "j" -> g rhythmicityPolyWeightedLEF20 6 2
          "k" -> g rhythmicityPolyWeightedLF3 5 1
          "l" -> g rhythmicityPolyWeightedLF30 5 1
          "m" -> g rhythmicityPolyWeightedLF3 6 2
          "n" -> g rhythmicityPolyWeightedLF30 6 2
          "o" -> g rhythmicityPolyWeightedLF2 5 1
          "p" -> g rhythmicityPolyWeightedLF20 5 1
          "q" -> g rhythmicityPolyWeightedLF2 6 2
          "r" -> g rhythmicityPolyWeightedLF20 6 2
          "I" -> g rhythmicityPolyWeightedEF3 5 1
          "J" -> g rhythmicityPolyWeightedEF30 5 1
          "K" -> g rhythmicityPolyWeightedEF3 6 2
          "L" -> g rhythmicityPolyWeightedEF30 6 2
          "O" -> g rhythmicityPolyWeightedEF2 5 1
          "P" -> g rhythmicityPolyWeightedEF20 5 1
          "Q" -> g rhythmicityPolyWeightedEF2 6 2
          "R" -> g rhythmicityPolyWeightedEF20 6 2
          "W" -> g rhythmicityPolyWeightedF3 5 1
          "X" -> g rhythmicityPolyWeightedF30 5 1
          "Y" -> g rhythmicityPolyWeightedF3 6 2
          "Z" -> g rhythmicityPolyWeightedF30 6 2
          "U" -> g rhythmicityPolyWeightedF2 5 1
          "V" -> g rhythmicityPolyWeightedF20 5 1
          "S" -> g rhythmicityPolyWeightedF2 6 2
          "T" -> g rhythmicityPolyWeightedF20 6 2
          "u" -> g rhythmicityPoly 5 1
          "v" -> g rhythmicityPoly0 5 1
          "s" -> g rhythmicityPoly 6 2
          "t" -> g rhythmicityPoly0 6 2
    | otherwise -> rhythmicity0H
       (let ts = drop 2 . take 3 $ choice in
          case ts of { [] -> syllableDurationsD4 ; ks ->
            let q = readMaybe ks::Maybe Int in
              case q of {Just q' -> helperHF4 q' syllableDurationsDs; ~Nothing -> syllableDurationsD4 }})
        where h1 f ts xs m n = f 1.0 4 (PolyCh xs m) (PolyRhythm [1,2,1,n]) . mconcat .
                  (case ts of { [] -> syllableDurationsD4 ; ks -> let q = readMaybe ks::Maybe Int in
                      case q of {Just q' -> helperHF4 q' syllableDurationsDs; ~Nothing -> syllableDurationsD4 }}) .
                        createSyllablesUkrS
              h2 f ts xs m n = f 1.0 4 (PolyCh xs m) (PolyRhythm [2,1,1,n]) . mconcat .
                  (case ts of { [] -> syllableDurationsD4 ; ks -> let q = readMaybe ks::Maybe Int in
                      case q of {Just q' -> helperHF4 q' syllableDurationsDs; ~Nothing -> syllableDurationsD4 }}) .
                        createSyllablesUkrS
              g f m n
                | drop 1 (take 2 choice) == "0" = h1 f (drop 2 . take 3 $ choice) [True,True,True] m n
                | drop 1 (take 2 choice) == "1" = h1 f (drop 2 . take 3 $ choice) [True,True,False] m n
                | drop 1 (take 2 choice) == "2" = h1 f (drop 2 . take 3 $ choice) [True,False,True] m n
                | drop 1 (take 2 choice) == "3" = h1 f (drop 2 . take 3 $ choice) [True,False,False] m n
                | drop 1 (take 2 choice) == "4" = h2 f (drop 2 . take 3 $ choice) [True,True,True] m n
                | drop 1 (take 2 choice) == "5" = h2 f (drop 2 . take 3 $ choice) [True,True,False] m n
                | drop 1 (take 2 choice) == "6" = h2 f (drop 2 . take 3 $ choice) [True,False,True] m n
                | drop 1 (take 2 choice) == "7" = h2 f (drop 2 . take 3 $ choice) [True,False,False] m n
                | otherwise = rhythmicity0H (helperHF4 n syllableDurationsDs)
              w1F f ch rh = rhythmicityABC 1.0 2.0 0.125 ch rh . mconcat . f . createSyllablesUkrS
              wwF2 g2 xs =
                let n1 = readMaybe xs::Maybe Int in
                   case n1 of
                     Just n2 -> g2 (helperHF4 n2 syllableDurationsDs)
                     Nothing -> g2 syllableDurationsD4
              x1F f ch rh = rhythmicityABC0 1.0 2.0 0.125 ch rh . mconcat . f . createSyllablesUkrS
              xxF = wwF2 x1F
              wwF = wwF2 w1F
              {-# INLINE w1F #-}
              {-# INLINE wwF2 #-}
              {-# INLINE x1F #-}
              {-# INLINE xxF #-}
              {-# INLINE wwF #-}
rhythmicityH' k choice syllableDurationsDs (CF2 x y) =
 case take 1 choice of
  "0" -> case choice of
           "0y" -> rhythmicityKH (helperHF4 1 syllableDurationsDs) (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "02y" -> rhythmicityKH (helperHF4 2 syllableDurationsDs) (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "03y" -> rhythmicityKH (helperHF4 3 syllableDurationsDs) (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "0z" -> rhythmicityKFH (helperHF4 1 syllableDurationsDs) k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "02z" -> rhythmicityKFH (helperHF4 2 syllableDurationsDs) k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "03z" -> rhythmicityKFH (helperHF4 3 syllableDurationsDs) k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           "04z" -> rhythmicityKFH (helperHF4 4 syllableDurationsDs) k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
           _ -> rhythmicityKH (helperHF4 1 syllableDurationsDs) (fromMaybe 1.0 x) (fromMaybe 1.0 y)
  "w" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "w0" -> wwF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "w1" -> wwF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "w2" -> wwF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "w3" -> wwF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
          | otherwise -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
              where w1F f ch rh = rhythmicityABC 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat . f . createSyllablesUkrS
                    wwF xs =
                      let n1 = readMaybe xs::Maybe Int in
                        case n1 of
                         Just n2 -> w1F (helperHF4 n2 syllableDurationsDs)
                         Nothing -> w1F syllableDurationsD4
                    {-# INLINE w1F #-}
                    {-# INLINE wwF #-}
  "x" -> if
          | (drop 2 . take 3 $ choice) >= "1" && (drop 2 . take 3 $ choice) <= "4" ->
             case take 2 choice of
              "x0" -> xxF (drop 2 . take 3 $ choice) (Ch 1 1 4) (Rhythm 1 1 2)
              "x1" -> xxF (drop 2 . take 3 $ choice) (Ch 1 0 4) (Rhythm 2 1 1)
              "x2" -> xxF (drop 2 . take 3 $ choice) (Ch 0 1 4) (Rhythm 1 2 1)
              "x3" -> xxF (drop 2 . take 3 $ choice) (Ch 0 0 4) (Rhythm 1 1 2)
              _ -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
          | otherwise -> rhythmicity0H (helperHF4 1 syllableDurationsDs)
              where x1F f ch rh = rhythmicityABC0 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat . f . createSyllablesUkrS
                    xxF xs =
                      let n1 = readMaybe xs::Maybe Int in
                        case n1 of
                         Just n2 -> x1F (helperHF4 n2 syllableDurationsDs)
                         Nothing -> x1F syllableDurationsD4
                    {-# INLINE x1F #-}
                    {-# INLINE xxF #-}
  _ -> if
     | ((take 1 choice >= "b" && take 1 choice <= "v") || (take 1 choice >= "A" && take 1 choice <= "Z" && take 1 choice `notElem` ["G","H"])) -> rhythmicityH' k choice syllableDurationsDs CF0
     | otherwise -> rhythmicityKH
        (let ts = drop 2 . take 3 $ choice in
          case ts of { [] -> syllableDurationsD4 ; ks ->
            let q = readMaybe ks::Maybe Int in
              case q of {Just q' -> helperHF4 q' syllableDurationsDs; ~Nothing -> syllableDurationsD4 }})
                (fromMaybe 1.0 x) (fromMaybe 1.0 y)


helperHF4 :: Int -> [[[[UZPP2]]] -> [[Double]]] -> [[[UZPP2]]] -> [[Double]]
helperHF4 n xs
  | null xs = syllableDurationsD4
  | (n `rem` length xs) == 0 = head xs
  | otherwise = xs !! ((n `rem` length xs) - 1)