packages feed

mmsyn6ukr 0.8.3.0 → 0.9.0.0

raw patch · 4 files changed

+41/−284 lines, 4 filesdep +ukrainian-phonetics-basicPVP ok

version bump matches the API change (PVP)

Dependencies added: ukrainian-phonetics-basic

API changes (from Hackage documentation)

- Melodics.Ukrainian: instance GHC.Classes.Eq Melodics.Ukrainian.Triple
- Melodics.Ukrainian: instance GHC.Classes.Ord Melodics.Ukrainian.Triple
- Melodics.Ukrainian: instance GHC.Show.Show Melodics.Ukrainian.Triple
+ Melodics.Ukrainian: new2OldRepresentation :: String -> Vector String

Files

ChangeLog.md view
@@ -6,8 +6,8 @@  ## 0.2.0.0 -- 2019-11-25 -* Second version. Added the possibility for program to use the installed -SoX binary in the system to automatically create a raw PCM file into +* Second version. Added the possibility for program to use the installed+SoX binary in the system to automatically create a raw PCM file into the .wav sound file that can be easily listened to.  ## 0.2.0.1 -- 2019-11-25@@ -16,7 +16,7 @@  ## 0.3.0.0 -- 2019-11-28 -* Third version. Fixed an issue with the unnecessary additional file. +* Third version. Fixed an issue with the unnecessary additional file. Changed the package into executable and library format.  ## 0.3.0.1 -- 2019-11-28@@ -93,7 +93,7 @@  ## 0.5.2.0 -- 2019-12-16 -* Fifth version revised B. Added support for better pauses and therefore additional file "-.wav". Fixed issues with the conversion in case of punctuation separated words. +* Fifth version revised B. Added support for better pauses and therefore additional file "-.wav". Fixed issues with the conversion in case of punctuation separated words. Added additional information about sound files. Deprecated (===) operator in favour of `elem` function.  ## 0.6.0.0 -- 2019-12-18@@ -118,27 +118,27 @@  ## 0.6.4.0 -- 2020-05-11 -* Sixth version revised E. Changed sound representations for the Ukrainian "и" -- file "K.wav", "к" -- file "M.wav", "т" -- file "V.wav", "ч" -- file "b.wav", +* Sixth version revised E. Changed sound representations for the Ukrainian "и" -- file "K.wav", "к" -- file "M.wav", "т" -- file "V.wav", "ч" -- file "b.wav", "і" -- file "e.wav".  ## 0.6.5.0 -- 2020-05-12 -* Sixth version revised F. Changed sound representations for the Ukrainian "б" -- file "B.wav", "д" -- file "E.wav", "дж" -- file "F.wav", +* Sixth version revised F. Changed sound representations for the Ukrainian "б" -- file "B.wav", "д" -- file "E.wav", "дж" -- file "F.wav", "ж" -- file "I.wav", "п" -- file "R.wav", "р" -- file "S.wav". Changed durations accordingly in the Map.txt file.  ## 0.6.6.0 -- 2020-05-12 -* Sixth version revised G. Changed sound representations for the Ukrainian "б" -- file "B.wav", "к" -- file "M.wav". +* Sixth version revised G. Changed sound representations for the Ukrainian "б" -- file "B.wav", "к" -- file "M.wav".  ## 0.7.0.0 -- 2020-05-12 -* Seventh version. Changed the module structure (and some functions accordinly, too) to more logical and convenient for factorization and composition. -Added a new module Melodics.Executable with the most of the Main module processment functions. Changed the behaviour of the executable -into repeated so you can create many files with it during one runtime operation. +* Seventh version. Changed the module structure (and some functions accordinly, too) to more logical and convenient for factorization and composition.+Added a new module Melodics.Executable with the most of the Main module processment functions. Changed the behaviour of the executable+into repeated so you can create many files with it during one runtime operation.  ## 0.7.1.0 -- 2020-05-12 -* Seventh version revised A. Fixed issues with being not circled because of the semi-closed handles. +* Seventh version revised A. Fixed issues with being not circled because of the semi-closed handles.  ## 0.7.2.0 -- 2020-05-14 @@ -146,24 +146,30 @@  ## 0.7.3.0 -- 2020-06-01 -* Seventh version revised C. Added Melodics.Executable.recFileName function to the export list of the module because it is re-used by the dobutokO-poetry +* Seventh version revised C. Added Melodics.Executable.recFileName function to the export list of the module because it is re-used by the dobutokO-poetry package.  ## 0.8.0.0 -- 2020-08-16 -* Eighth version. Added a new module MMSyn6Ukr.Show7s with the function from mmsyn7s module. It is done for the possible refactoring and changing the dependencies +* Eighth version. Added a new module MMSyn6Ukr.Show7s with the function from mmsyn7s module. It is done for the possible refactoring and changing the dependencies for other packages (first of all, mmsyn7h).  ## 0.8.1.0 -- 2020-09-25 -* Eighth version revised A. Added to the exported functions isUkrainian from the Melodics.Ukrainian module. +* Eighth version revised A. Added to the exported functions isUkrainian from the Melodics.Ukrainian module.  ## 0.8.2.0 -- 2020-10-28 -* Eighth version revised B. Fixed issues with some combinations that were not +* Eighth version revised B. Fixed issues with some combinations that were not properly handled.  ## 0.8.3.0 -- 2020-10-29  * Eighth version revised C. Changed the dependencies boundaries. Some minor code improvements.++## 0.9.0.0 -- 2020-11-07++* Ninth version. Switched to the ukrainian-phonetics-basic package (and so added it as a new dependency) as the engine of the phonetics conversions and+representations. By this fixed some issues related to complex letter combinations. Please, update all the dependent packages related to the mmsyn6ukr+to use the new approach. 
Melodics/Ukrainian.hs view
@@ -13,25 +13,23 @@   , convertToProperUkrainian   , takeData   , isUkrainian+  -- ** Since 0.9.0.0 version -- transformation function.+  , new2OldRepresentation ) where -import Data.Char import qualified Data.Vector.Unboxed as V import qualified Data.Vector as VB import qualified Data.ByteString.Char8 as B import System.IO import CaseBi.Unboxed (getBFst') import qualified CaseBi as X (getBFst')-import Data.List.InnToOut.Basic (mapI, mapI2)+import qualified Melodics.ByteString.Ukrainian as MU (convertToProperUkrainianS) import Paths_mmsyn6ukr  {- -- Inspired by: https://mail.haskell.org/pipermail/beginners/2011-October/008649.html -} -data Triple = Z | O | T-  deriving (Eq,Ord,Show)- -- | Function to take raw sound data from the \".wav\" file given. takeData :: FilePath -> IO B.ByteString takeData file = do@@ -68,263 +66,12 @@ -- | The function that converts a written Ukrainian text into the sounding in the program phonetical respesentation. -- It is not exact phonetically but you can make for yourself a general impression of the Ukrainian sounding. convertToProperUkrainian :: String -> VB.Vector String-convertToProperUkrainian ys = toVector . correctA . applyChanges . createTuplesByAnalysis . changeJotted . secondConv . wasFstConverted . filterUkr $ ys--correctB :: [String] -> [String]-correctB ys@(xs:xss) | compare (length . filter (== "1") . takeFromFT2 6 $ ys) 1 == GT =-  map (\t -> if t == "1" || isPunctuation (head t) then "-" else t) (takeFromFT2 6 ys) ++ correctB (dropFromFT2 6 ys)-                     | otherwise = (if isPunctuation . head $ xs then "-" else xs):correctB xss-correctB [] = []--filterUkr :: String -> String-filterUkr xs = concatMap (\x -> if isUkrainian x then [toLower x] else if isSpace x || isControl x || isPunctuation x then [x] else []) xs--secondConv :: String -> String-secondConv (y:ys) | if isSpace y then True else isControl y = '1':secondConv ys-                  | otherwise = y:secondConv ys-secondConv _ = []--createTuplesByAnalysis :: String -> [(String, Triple)]-createTuplesByAnalysis x@(y:ys) | getBFst' (False, V.fromList $ zip "\1075\1076\1078\1079\1082\1085\1087\1089\1090\1092\1093\1094\1095\1096" (repeat True)) y = initialA x-                                | not (null ys) && head ys == '\1081' && isConsNotJ y = case y of-  '\1089' -> ("\1089\1100", T):createTuplesByAnalysis (tail ys)-  '\1094' -> ("\1094\1100", T):createTuplesByAnalysis (tail ys)-  _       -> ([y], T):("\1100", Z):createTuplesByAnalysis (tail ys)-                                | otherwise = ([y], Z):createTuplesByAnalysis ys-createTuplesByAnalysis _ = []--canChange :: Char -> Triple-canChange x | isSpace x || isControl x || x == '-' = O-            | getBFst' (False, V.fromList $ zip "\1075\1076\1078\1079\1082\1085\1087\1089\1090\1092\1093\1094\1095\1096" (repeat True)) x = T-            | otherwise = Z--isVoicedObstruent :: String -> Bool-isVoicedObstruent xs | not (null xs) = X.getBFst' (False, VB.fromList $ zip ["\1073","\1075","\1076","\1076\1078","\1076\1079","\1078","\1079","\1169"] (repeat True)) xs-                     | otherwise = False--initialA :: String -> [(String, Triple)]-initialA t1@(t:ts) | canChange t == O = ("1", Z):initialA ts-                   | canChange t == T =- if getBFst' (False, V.fromList $ zip "\1076\1085\1089\1090\1093\1094" (repeat True)) t-   then let (us,vs) = splitAt 2 t1 in-    if X.getBFst' (False, VB.fromList $ zip ["\1076\1078","\1076\1079","\1085\1090","\1089\1090","\1089\1100","\1090\1089","\1090\1100","\1093\1075","\1094\1100"] (repeat True)) us-      then (us, T):initialA (vs)-      else ([t], T):initialA ts-   else case (getBFst' (False, V.fromList $ zip "\1075\1078\1079\1082\1087\1092\1095\1096" (repeat True)) t) of-          ~True -> ([t], T):initialA ts-                   | otherwise = ([t], Z):initialA ts-initialA _ = []--wasFstConverted :: String -> String-wasFstConverted = mapI mustBeConverted convertionFst--mustBeConverted :: Char -> Bool-mustBeConverted c = getBFst' (False, V.fromList $ zip "'-\700\1097\1102\1103\1108\1111\8217" (repeat True)) c--convertionFst :: Char -> String-convertionFst u = X.getBFst' ([u], VB.fromList $ zip "'-\700\1097\1102\1103\1108\1111\8217" ["0","0","0","\1096\1095","\1081\1091","\1081\1072","\1081\1077","\1081\1110","0"]) u--isConsNotJ :: Char -> Bool-isConsNotJ = getBFst' (False, V.fromList $ zip "\1073\1074\1075\1076\1078\1079\1082\1083\1084\1085\1087\1088\1089\1090\1092\1093\1094\1095\1096\1097\1169" (repeat True))--changeJotted :: String -> String-changeJotted (x:y:z:zs) | (getBFst' (False, V.fromList $ zip "\1072\1077\1080\1091\1110" (repeat True)) z) && (y == '\1081') && (isConsNotJ x) = x:'\1100':z:changeJotted zs-                        | isConsNotJ x && y == '\1110' = x:'\1100':y:changeJotted (z:zs)-                        | otherwise = x:changeJotted (y:z:zs)-changeJotted xs = xs--applyChanges :: [(String, Triple)] -> [(String, Triple)]-applyChanges (z:t:zs) | snd z == T =-  X.getBFst' ((fst z, Z), VB.fromList . zip ["\1075","\1076","\1076\1079","\1078","\1079","\1082","\1085\1090",-    "\1087","\1089","\1089\1090","\1089\1100","\1090","\1090\1089","\1090\1100","\1092","\1093","\1093\1075","\1094","\1094\1100","\1095","\1096"]-      $ [гT (t:zs), дT (t:zs), дзT (t:zs), жT (t:zs), зT (t:zs), кT (t:zs),-        нтT (t:zs), пT (t:zs), сT (t:zs), стT (t:zs), сьT (t:zs), тT (t:zs), тсT (t:zs), тьT (t:zs),-          фT (t:zs), хT (t:zs), хгT (t:zs), цT (t:zs), цьT (t:zs), чT (t:zs), шT (t:zs)]) (fst z):applyChanges (t:zs)-                      | otherwise = z:applyChanges (t:zs)-applyChanges [(xs, _)] = [(xs, Z)]-applyChanges _ = []---- in the further ??T functions the last (, T) means that it must be afterwards be separated with the soft sign into two tuples (1 additional function in the composition)--- need further processing means that there should be additional checks and may be transformations. May be they can be omitted--isSoftDOrL :: [(String, Triple)] -> Bool-isSoftDOrL xs = X.getBFst' (False, VB.fromList . zip ["\1073\1100","\1074\1100","\1076\1100","\1079\1100","\1083\1100",-  "\1084\1100","\1085\1100","\1087\1100","\1089\1100","\1090\1100","\1092\1100","\1094\1100"] $ (repeat True)) (takeFromFT_ 2 xs)--isSoftDen :: [(String, Triple)] -> Bool-isSoftDen xs = X.getBFst' (False, VB.fromList . zip ["\1076\1100","\1079\1100","\1083\1100","\1085\1100","\1089\1100",-  "\1090\1100","\1094\1100"] $ (repeat True)) (takeFromFT_ 2 xs) || takeFromFT_ 3 xs == "\1076\1079\1100"--гT :: [(String, Triple)] -> (String, Triple)-гT (t:_) | head (fst t) == '\1082' || head (fst t) == '\1090' = ("\1093", Z)-         | otherwise = ("\1075", Z)-гT _ = ("г", Z)--дT :: [(String, Triple)] -> (String, Triple)-дT t1@(_:_) | takeFromFT_ 1 t1 `elem` ["\1078","\1095","\1096"] = ("\1076\1078", Z) -- need further processing д дж-            | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1076\1079\1100", T) -- need further processing д дзь-            | takeFromFT_ 1 t1 `elem` ["\1079","\1089","\1094"] = ("\1076\1079", Z) -- need further processing  д дз-            | otherwise = ("\1076", Z)-дT _ = ("д", Z)--дзT :: [(String, Triple)] -> (String, Triple)-дзT t1@(_:_) | isSoftDOrL t1 = ("\1076\1079\1100", T)-             | otherwise = ("\1076\1079", Z)-дзT _ = ("дз", Z)--жT :: [(String, Triple)] -> (String, Triple)-жT t1@(_:_) | takeFromFT 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1079\1100", T)-            | otherwise = ("\1078", Z)-жT _ = ("ж", Z)--зT :: [(String, Triple)] -> (String, Triple)-зT t1@(_:_) | takeFromFT_ 1 t1 `elem` ["\1078","\1095","\1096"] || takeFromFT_ 2 t1 == "\1076\1078" = ("\1078", Z)-            | isSoftDOrL t1 = ("\1079\1100", T)-            | takeFromFT 1 t1 `elem` ["\1095","\1096"] = ("\1096", Z) -- need further processing з ш-            | takeFromFT 1 t1  `elem` ["\1089","\1094"] || takeFromFT_ 1 t1 `elem` ["\1082","\1087","\1090","\1092","\1093"] = ("\1089", Z) -- need further processing з с-            | otherwise = ("\1079", Z)-зT _ = ("з", Z)--кT :: [(String, Triple)] -> (String, Triple)-кT t1@(_:_) | isVoicedObstruent (takeFromFT_ 1 t1) || isVoicedObstruent (takeFromFT_ 2 t1) = ("\1169", Z)-            | otherwise = ("\1082", Z)-кT _ = ("к", Z)--нтT :: [(String, Triple)] -> (String, Triple)-нтT t1@(_:_) | takeFromFT 2 t1 == "\1089\1090" = ("\1085", Z)-             | takeFromFT 3 t1 == "\1089\1100\1082" = ("\1085\1100", T)-             | otherwise = ("\1085\1090", Z)-нтT _ = ("нт", T)--пT :: [(String, Triple)] -> (String, Triple)-пT t1@(_:_) | isVoicedObstruent (takeFromFT_ 1 t1) || isVoicedObstruent (takeFromFT_ 2 t1) = ("\1073", Z)-            | otherwise = ("\1087", Z)-пT _ = ("п", Z)--сT :: [(String, Triple)] -> (String, Triple)-сT t1@(_:_) | (isVoicedObstruent (takeFromFT_ 1 t1) && drop 1 (takeFromFT_ 2 t1) == "\1100") ||-   (isVoicedObstruent (takeFromFT_ 2 t1) && drop 2 (takeFromFT_ 3 t1) == "\1100") = ("\1079\1100", T)-            | isVoicedObstruent (takeFromFT_ 1 t1) || isVoicedObstruent (takeFromFT_ 2 t1) = ("\1073", Z)-            | isSoftDOrL t1 = ("\1089\1100", Z)-            | takeFromFT_ 1 t1 == "\1096" = ("\1096", Z)-            | otherwise = ("\1089", Z)-сT _ = ("с", Z)--стT :: [(String, Triple)] -> (String, Triple)-стT t1@(_:_) | isVoicedObstruent (takeFromFT_ 1 t1) || isVoicedObstruent (takeFromFT_ 2 t1) = ("\1079", Z)-             | takeFromFT_ 3 t1 == "\1089\1100\1082" || takeFromFT_ 2 t1 == "\1094\1100" = ("\1089\1100", Z)-             | takeFromFT_ 1 t1 `elem` ["\1089","\1085"] = ("\1089", Z)-             | takeFromFT_ 1 t1 == "\1095" = ("\1096", Z)-             | otherwise = ("\1089\1090", T)-стT _ = ("ст", T)--сьT :: [(String, Triple)] -> (String, Triple)-сьT t1@(_:_) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1079\1100", T)-             | otherwise = ("\1089\1100", Z)-сьT _ = ("сь", Z)--тT :: [(String, Triple)] -> (String, Triple)-тT t1@(_:_) | (isVoicedObstruent (takeFromFT_ 1 t1) && drop 1 (takeFromFT_ 2 t1) == "\1100") ||-   (isVoicedObstruent (takeFromFT_ 2 t1) && drop 2 (takeFromFT_ 3 t1) == "\1100") = ("\1076\1100", T)-            | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1076", Z)-            | takeFromFT_ 2 t1 == "\1094\1100" = ("\1094\1100", Z)-            | takeFromFT_ 1 t1 == "\1094" = ("\1094", Z)-            | isSoftDen t1 = ("\1090\1100", T)-            | takeFromFT_ 1 t1 `elem` ["\1095","\1096"] = ("\1095", Z)-            | otherwise = ("\1090", Z)-тT _ = ("т", Z)--тсT :: [(String, Triple)] -> (String, Triple)-тсT _ = ("\1094", Z)--тьT :: [(String, Triple)] -> (String, Triple)-тьT t1@(_:_) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1076\1100", T)-             | takeFromFT_ 3 t1 == "\1089\1100\1072" = ("\1094\1100", Z)-             | otherwise = ("\1090\1100", T)-тьT _ = ("ть", T)--фT :: [(String, Triple)] -> (String, Triple)-фT t1@(_:_) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1074", Z)-            | otherwise = ("\1092", Z)-фT _ = ("ф", Z)--хT :: [(String, Triple)] -> (String, Triple)-хT t1@(_:_) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1075", Z)-            | otherwise = ("\1093", Z)-хT _ = ("х", Z)--хгT :: [(String, Triple)] -> (String, Triple)-хгT _ = ("\1075", Z)--цT :: [(String, Triple)] -> (String, Triple)-цT t1@(_:_) | (isVoicedObstruent (takeFromFT_ 1 t1) && drop 1 (takeFromFT_ 2 t1) == "\1100") ||-   (isVoicedObstruent (takeFromFT_ 2 t1) && drop 2 (takeFromFT_ 3 t1) == "\1100") = ("\1076\1079\1100", T)-            | isSoftDOrL t1 = ("\1094\1100", Z)-            | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1076\1079", Z)-            | otherwise = ("\1094", Z)-цT _ = ("ц", Z)--цьT :: [(String, Triple)] -> (String, Triple)-цьT t1@(_:_) | (isVoicedObstruent (takeFromFT_ 1 t1) && drop 1 (takeFromFT_ 2 t1) == "\1100") ||-   (isVoicedObstruent (takeFromFT_ 2 t1) && drop 2 (takeFromFT_ 3 t1) == "\1100") = ("\1076\1079\1100", T)-             | otherwise = ("\1094\1100", Z)-цьT _ = ("ць", Z)--чT :: [(String, Triple)] -> (String, Triple)-чT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1094\1100", Z)-            | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1076\1078", Z)-            | otherwise = ("\1095", Z)-чT _ = ("ч", Z)--шT :: [(String, Triple)] -> (String, Triple)-шT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1089\1100", Z)-            | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1078", Z)-            | otherwise = ("\1096", Z)-шT _ = ("ш", Z)--correctA :: [(String, Triple)] -> [(String, Triple)]-correctA = correctSomeW . separateSoftS--separateSoftS :: [(String, Triple)] -> [(String, Triple)]-separateSoftS xss = mapI (\x -> snd x == T) divideToParts xss--divideToParts :: (String, Triple) -> [(String, Triple)]-divideToParts (xs, _) = [(init xs, Z),([last xs], Z)]--correctSomeW :: [(String, Triple)] -> [(String, Triple)]-correctSomeW (x:y:z:xs) | fst x == "\1094\1100" && fst y == "\1089\1100" && fst z == "\1072" = x:("\1094\1100", Z):z:correctSomeW xs-                        | (fst x == "1" || fst x == "0") && fst y == "\1081" && fst z == "\1072" =-  if takeFromFT 2 xs == "\1095\1085"-    then x:y:z:("\1096", Z):correctSomeW (tail xs)-    else x:correctSomeW (y:z:xs)-                        | otherwise = x:correctSomeW (y:z:xs)-correctSomeW zs = zs--takeFromFT :: Int -> [(String, Triple)] -> String-takeFromFT n ts | if compare 0 n /= LT then True else null ts = []-                | compare k n /= LT = take n ks-                | otherwise = ks ++ takeFromFT (n - k) (tail ts)-    where ks = fst (head ts)-          k = length ks--takeFromFT2 :: Int -> [String] -> [String]-takeFromFT2 n ts | if compare 0 n /= LT then True else null ts = []-                 | compare k n /= LT = [ks]-                 | otherwise = ks:takeFromFT2 (n - k) (tail ts)-    where ks = head ts-          k = length ks--dropFromFT2 :: Int -> [String] -> [String]-dropFromFT2 n ts | if compare 0 n /= LT then True else null ts = []-                 | compare k n /= LT = tail ts-                 | otherwise = dropFromFT2 (n - k) (tail ts)-    where k = length (head ts)--takeFromFT_ :: Int -> [(String, Triple)] -> String-takeFromFT_ n ts = takeFromFT n (filter (\(xs, _) -> (xs /= "1" && xs /= "0")) ts)+convertToProperUkrainian = new2OldRepresentation . MU.convertToProperUkrainianS -toVector :: [(String, Triple)] -> VB.Vector String-toVector ts = VB.fromList . correctB . mapI2 (\x -> not . null . fst $ x) fst (\_ -> []) $ ts+new2OldRepresentation :: String -> VB.Vector String+new2OldRepresentation xs = VB.fromList . map f $ xs+  where f = X.getBFst' ("",VB.fromList . zip "-01ABCDEFabcdefghijklmnopqrstuvwxyz" $ ["-","0","1","дз","ж","й","сь","ч","ш","а","б",+              "ц","д","е","ф","ґ","г","і","дж","к","л","м","н","о","п","ь","р","с","т","у","в","ць","х","и","з"])  isUkrainian :: Char -> Bool isUkrainian y | (y >= '\1040' && y <= '\1065') || (y >= '\1070' && y <= '\1097') = True
README.md view
@@ -1,18 +1,22 @@               ***** Usage *****               ================= -The program can be used as a special musical instrument -or a voicing for Ukrainian text. It is not -phonetically exact and proper, but it gives +The program can be used as a special musical instrument+or a voicing for Ukrainian text. It is not+phonetically exact and proper, but it gives an inspiration to listen to the Ukrainian sounds more attentively. It can be used by writers (especially poets) to compose melodic texts. It can be used simply for the experiments. There is an opinion that Ukrainian is a very melodic language, so you can even not knowing it get some impression and get acquainted with-this beautiful language. There are a lot of songs in it and the +this beautiful language. There are a lot of songs in it and the program is intended to open some part of beauty of the language itself.  The phonetic and writing system material are from the source: -[Solomija Buk, Ján Mačutek, Andrij Rovenchak. Some properties of +[Solomija Buk, Ján Mačutek, Andrij Rovenchak. Some properties of the Ukrainian writing system. Electronic resource](https://arxiv.org/ftp/arxiv/papers/0802/0802.4198.pdf)++Since the version 0.9.0.0 switched to the ukrainian-phonetics-basic package.++Please, update all the dependent packages related to the mmsyn6ukr to use the new approach.
mmsyn6ukr.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                mmsyn6ukr-version:             0.8.3.0+version:             0.9.0.0 synopsis:            A musical instrument synthesizer or a tool for Ukrainian language listening description:         A program can be used as a musical instrument synthesizer or for Ukrainian speech synthesis especially for poets and writers homepage:            https://hackage.haskell.org/package/mmsyn6ukr@@ -21,7 +21,7 @@   exposed-modules:     Paths_mmsyn6ukr, Melodics.Ukrainian, Melodics.Executable, UkrainianLControl, MMSyn6Ukr.Show7s   other-modules:       Main   -- other-extensions:-  build-depends:       base >=4.7 && <4.15, process >=1.4 && <1.9, mmsyn3 >=0.1.5.0 && <1, directory >= 1 && < 1.5, vector >=0.11 && <0.14, bytestring >=0.10 && <0.13, mmsyn2 >=0.3 && <1, mmsyn5 >=0.5 && <1+  build-depends:       base >=4.7 && <4.15, process >=1.4 && <1.9, mmsyn3 >=0.1.5.0 && <1, directory >= 1 && < 1.5, vector >=0.11 && <0.14, bytestring >=0.10 && <0.13, mmsyn2 >=0.3 && <1, mmsyn5 >=0.5 && <1, ukrainian-phonetics-basic >=0.1.11 && <1   -- hs-source-dirs:   default-language:    Haskell2010 @@ -29,6 +29,6 @@   main-is:             Main.hs   other-modules:       Melodics.Executable, Melodics.Ukrainian, Paths_mmsyn6ukr, UkrainianLControl, MMSyn6Ukr.Show7s   -- other-extensions:-  build-depends:       base >=4.7 && <4.15, process >=1.4 && <1.9, mmsyn3 >=0.1.5.0 && <1, directory >= 1 && < 1.5, vector >=0.11 && <0.14, bytestring >=0.10 && <0.13, mmsyn2 >=0.3 && <1, mmsyn5 >=0.5 && <1+  build-depends:       base >=4.7 && <4.15, process >=1.4 && <1.9, mmsyn3 >=0.1.5.0 && <1, directory >= 1 && < 1.5, vector >=0.11 && <0.14, bytestring >=0.10 && <0.13, mmsyn2 >=0.3 && <1, mmsyn5 >=0.5 && <1, ukrainian-phonetics-basic >=0.1.11 && <1   -- hs-source-dirs:   default-language:    Haskell2010