packages feed

aftovolio-0.1.0.0: Aftovolio/Ukrainian/ReadDurations.hs

-- |
-- Module      :  Aftovolio.Ukrainian.ReadDurations
-- Copyright   :  (c) OleksandrZhabenko 2021-2024
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- Functions to read the properties data from the files with the special Haskell-like syntaxis.

{-# LANGUAGE BangPatterns, NoImplicitPrelude #-}

module Aftovolio.Ukrainian.ReadDurations where

import GHC.Base
import CaseBi.Arr (getBFstLSorted')
import Aftovolio.Ukrainian.SyllableWord8
import Text.Read (readMaybe)
import Data.Maybe
import System.IO
import GHC.List
import Data.List (unlines,lines)
import System.Directory (doesFileExist)
import Aftovolio.Ukrainian.Melodics
import GHC.Word
import Aftovolio.General.Datatype3 (zippedDouble2Word8) 

{-| For more information on implementation, please refer to the link:
 
<https://oleksandr-zhabenko.github.io/uk/rhythmicity/PhLADiPreLiO.Eng.21.html#ability-to-use-your-own-durations-of-representations-of-sounds-or-phonetic-phenomena> 
-}
sound8s :: FlowSound
sound8s = [1,2,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,
   43,44,45,46,47,48,49,50,51,52,53,54,66,101]



{-|

Since the version 0.5.0.0 the semantics changed. Now, there is no duration for the pause between words. 
The 52 'Double' numbers become the durations of the above specified 'Sound8' values respectively, the order
must be preserved (if you consider it important, well, it should be!). If some number in the file cannot be read
as a 'Double' number the function uses the first one that can be instead (the default value). If no such is specified
at all, then the default number is 5 for all the 'Sound8' sound representations.

-}
readSound8ToWord8 :: String -> (Word8,[(Sound8, Word8)])
readSound8ToWord8 xs
 | null xs = (5,zip sound8s . replicate 10000 $ 5)
 | otherwise =
    let wws = lines xs
        dbls = map (\ks -> readMaybe ks::Maybe Double) wws
        dbSs = map (fromMaybe 5) dbls in (5,zippedDouble2Word8 . zip sound8s $ dbSs `mappend` replicate 10000 1.0)

divide2SDDs :: String -> [String]
divide2SDDs ys
 | null tss = [unlines kss]
 | otherwise = unlines kss : divide2SDDs (unlines rss)
     where wwss = lines ys
           (kss,tss) = break (any (=='*')) wwss
           rss = dropWhile (any (== '*')) tss

readSyllableDurations :: FilePath -> IO [[[[Sound8]]] -> [[Word8]]]
readSyllableDurations file = do
  exists <- doesFileExist file
  if exists then do 
   xs <- readFile file
   let yss = take 9 . divide2SDDs $ xs
       readData = map readSound8ToWord8 yss
   return . map (\(d,zs) -> syllableDurationsGDc (getBFstLSorted' d zs)) $ readData
  else return []