packages feed

mmsyn6ukr 0.5.1.0 → 0.5.2.0

raw patch · 5 files changed

+87/−27 lines, 5 filesbinary-addedPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

+ -.wav view

binary file changed (absent → 4542 bytes)

ChangeLog.md view
@@ -87,6 +87,11 @@  * Fifth version. Changed a behaviour of the Main.main function, added a possibility of more control on the program mmsyn6ukr. -## 0.5.0.0 -- 2019-12-09+## 0.5.1.0 -- 2019-12-09  * Fifth version revised A. Fixed the genControl function, added more documentation, make the exception message more exact.++## 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. +Added additional information about sound files. Deprecated (===) operator in favour of `elem` function.
+ Map.txt view
@@ -0,0 +1,39 @@+Sound            |   Corresponding       |       File+representation   |   file                |       duration, s+-------------------------------------------------------------------+"-"            ->    "-.wav"            ->       0.101995+"0"            ->    "0.wav"            ->       0.051020+"1"            ->    "1.wav"            ->       0.153016+"а"            ->    "A.wav"            ->       0.138231+"б"            ->    "B.wav"            ->       0.057098+"в"            ->    "C.wav"            ->       0.082268+"г"            ->    "D.wav"            ->       0.076825+"д"            ->    "E.wav"            ->       0.072063+"дж"           ->    "F.wav"            ->       0.048934+"дз"           ->    "G.wav"            ->       0.055601+"е"            ->    "H.wav"            ->       0.093605+"ж"            ->    "I.wav"            ->       0.070612+"з"            ->    "J.wav"            ->       0.056054+"и"            ->    "K.wav"            ->       0.099955+"й"            ->    "L.wav"            ->       0.057143+"к"            ->    "M.wav"            ->       0.045397+"л"            ->    "N.wav"            ->       0.064036+"м"            ->    "O.wav"            ->       0.077370+"н"            ->    "P.wav"            ->       0.074240+"о"            ->    "Q.wav"            ->       0.116463+"п"            ->    "R.wav"            ->       0.071837+"р"            ->    "S.wav"            ->       0.049206+"с"            ->    "T.wav"            ->       0.074603+"сь"           ->    "U.wav"            ->       0.074558+"т"            ->    "V.wav"            ->       0.110658+"у"            ->    "W.wav"            ->       0.109070+"ф"            ->    "X.wav"            ->       0.062268+"х"            ->    "Y.wav"            ->       0.077188+"ц"            ->    "Z.wav"            ->       0.053061+"ць"           ->    "a.wav"            ->       0.089342+"ч"            ->    "b.wav"            ->       0.057551+"ш"            ->    "c.wav"            ->       0.066077+"ь"            ->    "d.wav"            ->       0.020227+"і"            ->    "e.wav"            ->       0.094150+"ґ"            ->    "f.wav"            ->       0.062948+-------------------------------------------------------------------
Melodics/Ukrainian.hs view
@@ -34,12 +34,12 @@   data1 <- B.readFile file   let dataN = B.drop 44 data1 in return dataN --- | The function that actually produces a .raw file.+-- | The function that actually produces a .raw file. The mapping table is given in the @Map.txt@ file. appendS16LEFile ::  V.Vector String -> Handle -> IO () appendS16LEFile xs hdl | not (V.null xs) =    do     dataFileList <- mapM getDataFileName -      ["0.wav", "1.wav", "A.wav", "B.wav", "C.wav", "D.wav", "E.wav", "F.wav", "G.wav", "H.wav", +      ["-.wav", "0.wav", "1.wav", "A.wav", "B.wav", "C.wav", "D.wav", "E.wav", "F.wav", "G.wav", "H.wav",          "I.wav", "J.wav", "K.wav", "L.wav", "M.wav", "N.wav", "O.wav", "P.wav", "Q.wav", "R.wav",            "S.wav", "T.wav", "U.wav", "V.wav", "W.wav", "X.wav", "Y.wav", "Z.wav", "a.wav", "b.wav", "c.wav",              "d.wav", "e.wav", "f.wav"]@@ -51,11 +51,11 @@           closedHdl <- hIsClosed hdl           if closedHdl              then do -                   B.appendFile rs $ dataList V.! (getBFst' (0, V.fromList [("0", 0), ("1", 1), ("а", 2), ("б", 3), -                     ("в", 4), ("г", 5), ("д", 6), ("дж", 7), ("дз", 8), ("е", 9), ("ж", 10), ("з", 11), ("и", 12), -                        ("й", 13), ("к", 14), ("л", 15), ("м", 16), ("н", 17), ("о", 18), ("п", 19), ("р", 20), -                          ("с", 21), ("сь", 22), ("т", 23), ("у", 24), ("ф", 25), ("х", 26), ("ц", 27), ("ць", 28), ("ч", 29), -                            ("ш", 30), ("ь", 31), ("і", 32), ("ґ", 33)]) u)+                   B.appendFile rs $ dataList V.! (getBFst' (0, V.fromList [("-", 0), ("0", 1), ("1", 2), ("а", 3), ("б", 4), +                     ("в", 5), ("г", 6), ("д", 7), ("дж", 8), ("дз", 9), ("е", 10), ("ж", 11), ("з", 12), ("и", 13), +                        ("й", 14), ("к", 15), ("л", 16), ("м", 17), ("н", 18), ("о", 19), ("п", 20), ("р", 21), +                          ("с", 22), ("сь", 23), ("т", 24), ("у", 25), ("ф", 26), ("х", 27), ("ц", 28), ("ць", 29), ("ч", 30), +                            ("ш", 31), ("ь", 32), ("і", 33), ("ґ", 34)]) u)             else error "File is not closed!"         else error "Data sound file is not read!") xs     hClose hdl@@ -66,8 +66,14 @@ convertToProperUkrainian :: String -> V.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 then [x] else []) xs+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@@ -134,9 +140,6 @@ applyChanges [(xs, _)] = [(xs, Z)] applyChanges _ = [] -(===) :: Eq a => a -> [a] -> Bool-(===) x ys = any (\y -> x == y) ys- -- 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 @@ -154,9 +157,9 @@ гT _ = ("г", Z)  дT :: [(String, Triple)] -> (String, Triple)-дT t1@(_:_) | takeFromFT_ 1 t1 === ["\1078","\1095","\1096"] = ("\1076\1078", Z) -- need further processing д дж-            | takeFromFT_ 2 t1 === ["\1089\1100","\1094\1100"] = ("\1076\1079\1100", T) -- need further processing д дзь-            | takeFromFT_ 1 t1 === ["\1079","\1089","\1094"] = ("\1076\1079", Z) -- need further processing  д дз             +д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) @@ -166,15 +169,15 @@ дзT _ = ("дз", Z)  жT :: [(String, Triple)] -> (String, Triple)-жT t1@(_:_) | takeFromFT 2 t1 === ["\1089\1100","\1094\1100"] = ("\1079\1100", T)+ж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 === ["\1078","\1095","\1096"] || takeFromFT_ 2 t1 == "\1076\1078" = ("\1078", Z)+зT t1@(_:_) | takeFromFT_ 1 t1 `elem` ["\1078","\1095","\1096"] || takeFromFT_ 2 t1 == "\1076\1078" = ("\1078", Z)             | isSoftDOrL t1 = ("\1079\1100", T)-            | takeFromFT 1 t1 === ["\1095","\1096"] = ("\1096", Z) -- need further processing з ш-            | takeFromFT 1 t1  === ["\1089","\1094"] || takeFromFT_ 1 t1 === ["\1082","\1087","\1090","\1092","\1093"] = ("\1089", Z) -- need further processing з с+            | 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) @@ -206,7 +209,7 @@ ст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 === ["\1089","\1085"] = ("\1089", Z)+             | takeFromFT_ 1 t1 `elem` ["\1089","\1085"] = ("\1089", Z)              | takeFromFT_ 1 t1 == "\1095" = ("\1096", Z)              | otherwise = ("\1089\1090", T) стT _ = ("ст", T)@@ -223,7 +226,7 @@             | takeFromFT_ 2 t1 == "\1094\1100" = ("\1094\1100", Z)             | takeFromFT_ 1 t1 == "\1094" = ("\1094", Z)             | isSoftDen t1 = ("\1090\1100", T)-            | takeFromFT_ 1 t1 === ["\1095","\1096"] = ("\1095", Z)+            | takeFromFT_ 1 t1 `elem` ["\1095","\1096"] = ("\1095", Z)             | otherwise = ("\1090", Z) тT _ = ("т", Z) @@ -264,13 +267,13 @@ цьT _ = ("ць", Z)  чT :: [(String, Triple)] -> (String, Triple)-чT t1@(_:_) | takeFromFT_ 2 t1 === ["\1089\1100","\1094\110"] = ("\1094\1100", Z)+чT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\110"] = ("\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 === ["\1089\1100","\1094\110"] = ("\1089\1100", Z)+шT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\110"] = ("\1089\1100", Z)             | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1078", Z)             | otherwise = ("\1096", Z) шT _ = ("ш", Z)@@ -300,11 +303,24 @@     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)  toVector :: [(String, Triple)] -> V.Vector String-toVector ts = V.fromList . mapI2 (\x -> not . null . fst $ x) fst (\_ -> []) $ ts+toVector ts = V.fromList . correctB . mapI2 (\x -> not . null . fst $ x) fst (\_ -> []) $ ts  isUkrainian :: Char -> Bool isUkrainian y | (y >= '\1040' && y <= '\1065') || (y >= '\1070' && y <= '\1097') = True
mmsyn6ukr.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                mmsyn6ukr-version:             0.5.1.0+version:             0.5.2.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@@ -13,8 +13,8 @@ copyright:           (c) OleksandrZhabenko 2019 category:            Language build-type:          Simple-extra-source-files:  ChangeLog.md, README.md-data-files:          0.wav, 1.wav, A.wav, B.wav, C.wav, D.wav, E.wav, F.wav, G.wav, H.wav, I.wav, J.wav, K.wav, L.wav, M.wav, N.wav, O.wav, P.wav, Q.wav, R.wav, S.wav, T.wav, U.wav, V.wav, W.wav, X.wav, Y.wav, Z.wav, a.wav, b.wav, c.wav, d.wav, e.wav, f.wav+extra-source-files:  ChangeLog.md, README.md, Map.txt+data-files:          -.wav, 0.wav, 1.wav, A.wav, B.wav, C.wav, D.wav, E.wav, F.wav, G.wav, H.wav, I.wav, J.wav, K.wav, L.wav, M.wav, N.wav, O.wav, P.wav, Q.wav, R.wav, S.wav, T.wav, U.wav, V.wav, W.wav, X.wav, Y.wav, Z.wav, a.wav, b.wav, c.wav, d.wav, e.wav, f.wav cabal-version:       >=1.10  library