packages feed

phonetic-languages-simplified-properties-array-0.17.0.0: Phladiprelio/Ukrainian/PropertiesSyllablesG2H.hs

{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Phladiprelio.Ukrainian.PropertiesSyllablesG2H
-- Copyright   :  (c) Oleksandr Zhabenko 2020-2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@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 NoImplicitPrelude, BangPatterns, MultiWayIf #-}

module Phladiprelio.Ukrainian.PropertiesSyllablesG2H (
  -- * General
  parseChRhEndMaybe
  -- * Extended general
  , rhythmicityTup
) where

import Data.Tuple (uncurry)
import GHC.Base
import GHC.List
import GHC.Real (rem)
import Phladiprelio.Ukrainian.Common
import Phladiprelio.Ukrainian.SyllableDouble
import Phladiprelio.Ukrainian.Melodics (Sound8,FlowSound)
import Phladiprelio.Ukrainian.Syllable
import Data.Maybe (fromMaybe)
import Text.Read (readMaybe)
import Phladiprelio.Rhythmicity.TwoFourth
import Phladiprelio.Rhythmicity.PolyRhythm
import Phladiprelio.Ukrainian.PropertiesSyllablesG201
import GHC.Arr (Array)
import GHC.Int (Int8)
import Phladiprelio.Ukrainian.Emphasis
import Phladiprelio.Coeffs
import qualified Logical.OrdConstraints as LO
import Phladiprelio.Rhythmicity.Factor

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

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

rhythmicityTup
  :: Factors
  -> Double
  -> String
  -> Coeffs2
  -> Array Int (Int8, Bool)
  -> Array Int (Int8, Bool)
  -> Array Int (Int8, Bool)
  -> Array Int (Int8, Bool)
  -> Array Int ([Int8], Bool)
  -> Array Int ([Int8], Int8)
  -> Array Int (Int8, FlowSound -> Sound8)
  -> Array Int (Int8, Bool)
  -> Array Int ([Int8], Bool)
  -> Array Int ([Int8], Bool)
  -> Array Int ([Int8], Bool)
  -> Array Int (Int8, [Int8])
  -> Array Int (Char,Int8)
  -> Array Int (Int8,[Int8])
  -> Array Int (Char, Bool)
  -> Array Int (Char, Bool)
  -> Array Int (Int8,Bool)
  -> ReadyForConstructionUkr
  -> Double
rhythmicityTup ff k choice@(t1:t2@(t3:t4@(t5:jis))) CF0 tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt@(Str tttts)
 | LO.ordCs2HPred1 [LO.O "cMN", LO.C "AF"] t1 = 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 . -- the latter one is to be interchanged with weights2SyllableDurationsD
               (helperF4 n) . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 $ tttts
             Just (P2 ch rh r n) -> (case t1 of
                   'A' -> rhythmicityPolyWeightedLEF2
                   'D' -> rhythmicityPolyWeightedLF2
                   'E' -> rhythmicityPolyWeightedLEF3
                   'F' -> rhythmicityPolyWeightedLF3
                   'B' -> rhythmicityPolyWeightedEF2
                   'C' -> rhythmicityPolyWeightedF2
                   'M' -> rhythmicityPolyWeightedEF3
                   'N' -> rhythmicityPolyWeightedF3
                   'c' -> rhythmicityPoly) 1.0 r ch rh . mconcat . (helperF4 n) . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 $ tttts
             _ -> rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | t1 == '0' = 
     (case t2 of
      "2y" -> rhythmicity02Tup 
      "3y" -> rhythmicity03Tup 
      "2f" -> rhythmicity02FTup ff k
      "3f" -> rhythmicity03FTup ff k
      "4f" -> rhythmicity04FTup ff k
      _ -> rhythmicity04Tup) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | t1 `elem` "wx" = if
          | t5 >= '1' && t5 <= '4' ->   if t3 >= '0' && t3 <= '3'  then uncurry (wwF t4 tttts) (case t3 of
             '0' -> (Ch 1 1 4, Rhythm 1 1 2)
             '1' -> (Ch 1 0 4, Rhythm 2 1 1)
             '2' -> (Ch 0 1 4, Rhythm 1 2 1)
             '3' -> (Ch 0 0 4, Rhythm 1 1 2)) 
                else rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
          | otherwise -> rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | LO.ordCs2HPred1 [LO.O "bz", LO.C "degvIZ"] t1 && t5 >= '1' && t5 <= '4' =
        (case t1 of
          'b' -> g rhythmicityPolyWeightedLEF3 5 1
          'd' -> g rhythmicityPolyWeightedLEF30 5 1
          'e' -> g rhythmicityPolyWeightedLEF3 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
          'z' -> g rhythmicityPolyWeightedLEF30 6 2) tttts
 | otherwise = rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
        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 }) . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17
              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 }) . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17
              g f m n
                | t3 >= '0' && t3 <= '3' && t5 >= '1' && t5 <= '4' = h1 f t4 
                   (case t3 of
                      '0' -> [True,True,True]
                      '1' -> [True,True,False]
                      '2' -> [True,False,True]
                      '3' -> [True,False,False]) m n
                | t3 >= '4' && t3 <= '7' && t5 >= '1' && t5 <= '4' = h2 f t4 
                   (case t3 of
                      '4' -> [False,False,True]
                      '5' -> [False,True,False]
                      '6' -> [False,True,True]
                      '7' -> [False,False,False]) m n
                | otherwise = \_ -> rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
              w1F f tttts ch rh = (if t1 == 'w' then rhythmicityABC else rhythmicityABC0) 1.0 2.0 0.125 ch rh . mconcat . f . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 $ tttts
              wwF2 g2 xs = let (Just n) = readMaybe xs::Maybe Int in g2 
                      (case n `rem` 4 of 
                       1 -> syllableDurationsD
                       2 -> syllableDurationsD2
                       3 -> syllableDurationsD3
                       _ -> syllableDurationsD4)
              wwF = wwF2 w1F
              {-# INLINE w1F #-}
              {-# INLINE wwF2 #-}
              {-# INLINE wwF #-}
rhythmicityTup ff k choice@(t1:t2@(t3:t4@(t5:jis))) (CF2 x y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt@(Str tttts) 
 | t1 == '0' = 
     (case t2 of
       "2y" -> rhythmicityK2Tup
       "3y" -> rhythmicityK3Tup
       "2f" -> rhythmicityKF2Tup ff k
       "3f" -> rhythmicityKF3Tup ff k
       "4f" -> rhythmicityKF4Tup ff k
       _ -> rhythmicityK4Tup) (fromMaybe 1.0 x) (fromMaybe 1.0 y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | t1 `elem` "wx" = if t5 >= '1' && t5 <= '4' then  if t3 >= '0' && t3 <= '3'  then uncurry (wwF t4 tttts) (case t3 of
             '0' -> (Ch 1 1 4, Rhythm 1 1 2)
             '1' -> (Ch 1 0 4, Rhythm 2 1 1)
             '2' -> (Ch 0 1 4, Rhythm 1 2 1)
             '3' -> (Ch 0 0 4, Rhythm 1 1 2)) 
                else rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
     else rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | LO.ordCs2HPred1 [LO.O "bz", LO.C "begvAFIZ" ] t1 = rhythmicityTup ff k choice CF0 tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | otherwise = rhythmicityK4Tup (fromMaybe 1.0 x) (fromMaybe 1.0 y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
              where w1F f tttts ch rh = (if t1 == 'w' then rhythmicityABC else rhythmicityABC0) 1.0 (fromMaybe 2.0 x) (fromMaybe 0.125 y) ch rh . mconcat . f . createSyllablesUkrSTup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 $ tttts
                    wwF xs = let (Just n) = readMaybe xs::Maybe Int in w1F 
                      (case n `rem` 4 of
                       1 -> syllableDurationsD
                       2 -> syllableDurationsD2
                       3 -> syllableDurationsD3
                       _ -> syllableDurationsD4)
                    {-# INLINE w1F #-}
                    {-# INLINE wwF #-}
rhythmicityTup ff k choice@(t1:t2@(t3:jis)) CF0 tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt@(Str tttts)
 | t1 == '0' = 
     (case t2 of
      "y" -> rhythmicity0Tup
      "f" -> rhythmicity0FTup ff k
      _ -> rhythmicity04Tup) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | otherwise =  rhythmicity04Tup tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
rhythmicityTup ff k choice@(t1:t2@(t3:jis)) (CF2 x y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt@(Str tttts)
 | t1 == '0' = 
     (case t2 of
      "y" -> rhythmicityKTup
      "f" -> rhythmicityKFTup ff k
      _ -> rhythmicityK4Tup) (fromMaybe 1.0 x) (fromMaybe 1.0 y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
 | otherwise =  rhythmicityK4Tup (fromMaybe 1.0 x) (fromMaybe 1.0 y) tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 tttt
rhythmicityTup ff k choice tup1 tup2 tup3 tup4 tup5 tup6 tup7 tup8 tup9 tup10 tup11 tup12 tup13 tup14 tup15 tup16 tup17 _ _ = -1.0