diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -38,3 +38,7 @@
 
 * Third version revised B. Changed the behaviour for 'alterVadB' and 'alterVadE' functions so that are now fully iterative with thread delay.
 
+## 0.4.0.0 -- 2019-12-31
+
+* Fourth version. Changed the behaviour of the program. Now it uses command line arguments (if any). See README. Added functions and rewrote the complex ones. 
+
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -18,15 +18,18 @@
 import Data.Maybe (fromJust)
 import Paths_mmsyn6ukr
 import Processing_mmsyn7ukr
+import System.Environment (getArgs)
 
 -- | Function responds for general program execution. It starts with Caution to be responsible for usage and to 
 -- use it personally. Then the program guides you through the creating and using your Ukrainian \"voice\". 
 -- Please, use it carefully. After the execution the program if terminated naturally without interruption 
 -- removes (cleans) all the created sound files in the current directory for security reasons. If it terminates 
--- by interruption or in general it is a good practice to remove the current directory sound files manually.
+-- by interruption or in general it is a good practice to remove the current directory sound files manually. 
+-- The function uses a command line arguments. For their meaning, please, refer to README file.
 -- 
 main :: IO ()
 main = do
+  args <- getArgs
   putStrLn "     ***** CAUTION! *****"
   putStrLn ""
   putStrLn "\"The possession of great power necessarily implies great responsibility.\""
@@ -105,7 +108,9 @@
           "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"]
   copiedFs <- mapM getDataFileName ["-.wav", "0.wav", "1.wav"]
-  mapM_ produceSound paths
+  let a0 = concat . take 1 $ args
+      a1 = concat . drop 1 . take 2 $ args
+  mapM_ (produceSound (a0, a1)) paths
   silenceFs <- mapM makeAbsolute ["-.wav", "0.wav", "1.wav"]
   let pairs = zip copiedFs silenceFs
   mapM_ (\(x, y) -> copyFile x y) pairs
diff --git a/Processing_mmsyn7ukr.hs b/Processing_mmsyn7ukr.hs
--- a/Processing_mmsyn7ukr.hs
+++ b/Processing_mmsyn7ukr.hs
@@ -14,120 +14,189 @@
 
 import Numeric
 import System.Directory
-import Control.Exception (bracketOnError, onException)
+import Control.Exception (onException)
 import EndOfExe (showE)
 import Data.Maybe (fromJust)
 import Data.Char
-import Data.List (isSuffixOf)
 import qualified Data.Vector as V
-import qualified Data.ByteString.Lazy as B
 import System.Process
 import System.IO
 import SoXBasics
-import Melodics.Ukrainian (convertToProperUkrainian, takeData)
-import UkrainianLControl
 import CaseBi (getBFst')
 
--- | Function that being given a path to the installed by the @mmsyn6ukr@ package file produces the corresponding analogous sound with your created 
--- voicing.
-produceSound :: FilePath -> IO ()
-produceSound file = let file1 = drop (length file - 5) file in do
-  let soundUkr = getBFst' ("е", V.fromList . zip ["A.wav", "B.wav", "C.wav", "D.wav", "E.wav", "F.wav", "G.wav", "H.wav", 
+-- | Function that being given a tuple of String and a path to the installed by the @mmsyn6ukr@ package file produces the corresponding analogous sound with your created 
+-- voicing.. The tuple control the function behaviour. The first @String@ in it specifies the actions that will be performed to produce a sound file and the second one 
+-- specifies a maximum absolute amplitude starting from which the sound will not be truncated if the 'alterVadB' and 'alterVabE' functions must be applied (that is specified 
+-- by the first @String@ parameter). 
+produceSound :: (String, String) -> FilePath -> IO ()
+produceSound (actsctrl, noiseLim) file  = do {
+; let file1 = drop (length file - 5) file 
+      soundUkr = getBFst' ("е", V.fromList . zip ["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"] $ ["а", "б", "в", "г", "д", "дж", "дз", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", 
                "с", "сь", "т", "у", "ф", "х", "ц", "ць", "ч", "ш", "ь", "і", "ґ"]) $ file1
-  putStr "The needed files were NOT created, because the sound was not at the moment of recording! The process will be restarted "
-  putStrLn "for the sound. Please, produce a sound during the first 3 seconds (after 0.5 second delay) or specify greater ratio!"
-  playA file
-  putStrLn "The sound duration is:"
-  duration0 <- durationA file
-  putStrLn $ showFFloat Nothing duration0 $ show 0
-  putStrLn ""
-  putStrLn "It means that to produce more than 3 seconds of recording, you must specify at least "
-  putStrLn $ "   " ++ show (3.0/(7*duration0)) ++ " as a next step ratio being prompt "
-  putStrLn "   OR "
-  putStrLn $ "   " ++ show (1.0/(7*duration0)) ++ " per one second but not less than the previous number."
-  putStrLn $ "For example for 10 seconds record, please, specify " ++ show (10.0/(7*duration0)) ++ " as a next step ratio."
-  longerK0 <- tempS soundUkr
-  (_, Just hout, _, _) <- createProcess (proc (fromJust . showE $ "soxi") ["-D", file]) { std_out = CreatePipe }
-  x3 <- hGetContents hout
-  let longerK = (read x3::Double)*longerK0
-  putStrLn "Please, wait for 0.5 second and pronounce the sound representation for the "
-  putStrLn ""
-  putStrLn $ "                     \"" ++ (if soundUkr /= "ь" then map toUpper soundUkr else soundUkr) ++ "\""
-  putStrLn ""
-  putStrLn " sound or whatever you would like to be substituted instead (be sensible, please)! "
-  if (compare (7*longerK) 3.0 == LT)
-    then recA "x.wav" (7*longerK)
-    else recA "x.wav" 3.0
-  putStrLn "The file is recorded and now will be automatically processed. You will be notificated with the text message in the terminal about the creation of the needed file. Please, wait a little. "
-  norm "x.wav"
-  noiseProfB "8x.wav"
-  noiseReduceB "8x.wav"
-  lim0 <- durationA "_8x.wav"
-  alterVadB "_8x.wav" lim0 (duration0*0.1)
-  lim1 <- durationA "_8x.wav"
-  if lim1 <= 0.0
-    then beginProcessing file file1 soundUkr
-    else do 
-      alterVadE "_8x.wav" lim1 (duration0*0.1)
-      sincA "_8x.wav"
-      resampleA "4._8x.wav" (22050::Int)
-      quarterSinFade "34._8x.wav"
-      norm "434._8x.wav"
-      volS2 "8434._8x.wav" file
-      renameFile "8.434._8x.wav" file1
-      cleanTemp
+; putStr "The needed files were NOT created, because the sound was not at the moment of recording! The process will be restarted "
+; putStrLn "for the sound. Please, produce a sound during the first 3 seconds (after 0.5 second delay) or specify greater ratio!"
+; playA file
+; putStrLn "The sound duration is: "
+; produceSound2 (file, file1) (actsctrl, noiseLim) soundUkr
+; return () }
+
+
+-- | Function 'produceSound3' is used internally in the 'produceSound2' function.
+produceSound3 :: (String, String) -> (FilePath, FilePath) -> String -> (Int, Double) -> Double -> IO ()
+produceSound3 (actsctrl, noiseLim) (file, file1) soundUkr (noiseMax, duration0) lim0 = case actsctrl of
+    "0" -> 
+      do
+          lim1 <- durationA "_8x.wav"
+          if lim1 <= 0.0
+            then beginProcessing file file1 soundUkr (actsctrl, noiseLim)
+            else do 
+              resampleA "_8x.wav" (22050::Int)
+              norm "3_8x.wav"
+              volS2 "83_8x.wav" file
+              renameFile "8.3_8x.wav" file1
+    "1" -> 
+      do
+          alterVadB "_8x.wav" lim0 noiseMax (duration0*0.1)
+          lim1 <- durationA "_8x.wav"
+          if lim1 <= 0.0
+            then beginProcessing file file1 soundUkr (actsctrl, noiseLim)
+            else do 
+              alterVadE "_8x.wav" lim1 noiseMax (duration0*0.1)
+              resampleA "_8x.wav" (22050::Int)
+              norm "3_8x.wav"
+              volS2 "83_8x.wav" file
+              renameFile "8.3_8x.wav" file1    
+    "2" ->
+      do
+          alterVadB "_8x.wav" lim0 noiseMax (duration0*0.1)
+          lim1 <- durationA "_8x.wav"
+          if lim1 <= 0.0
+            then beginProcessing file file1 soundUkr (actsctrl, noiseLim)
+            else do 
+              alterVadE "_8x.wav" lim1 noiseMax (duration0*0.1)
+              sincA "_8x.wav"
+              resampleA "4._8x.wav" (22050::Int)
+              norm "34._8x.wav"
+              volS2 "834._8x.wav" file
+              renameFile "8.34._8x.wav" file1  
+    _ ->
+      do
+          alterVadB "_8x.wav" lim0 noiseMax (duration0*0.1)
+          lim1 <- durationA "_8x.wav"
+          if lim1 <= 0.0
+            then beginProcessing file file1 soundUkr (actsctrl, noiseLim)
+            else do 
+              alterVadE "_8x.wav" lim1 noiseMax (duration0*0.1)
+              sincA "_8x.wav"
+              resampleA "4._8x.wav" (22050::Int)
+              quarterSinFade "34._8x.wav"
+              norm "434._8x.wav"
+              volS2 "8434._8x.wav" file
+              renameFile "8.434._8x.wav" file1
+
+-- | Function 'produceSound2' is used internally in the 'produceSound' function.
+produceSound2 :: (FilePath, FilePath) -> (String, String) -> String -> IO ()
+produceSound2 (file, file1) (actsctrl, noiseLim) soundUkr = 
+ do { duration0 <- durationA file 
+    ; longerK0 <- tempS soundUkr
+    ; (_, Just hout, _, _) <- createProcess (proc (fromJust . showE $ "soxi") ["-D", file]) { std_out = CreatePipe }
+    ; x3 <- hGetContents hout
+    ; putStrLn $ showFFloat Nothing duration0 $ show 0
+    ; putStrLn ""
+    ; putStrLn "It means that to produce more than 3 seconds of recording, you must specify at least "
+    ; putStrLn $ "    ;  " ++ show (3.0/(7*duration0)) ++ " as a next step ratio being prompt "
+    ; putStrLn "    ;  OR "
+    ; putStrLn $ "    ;  " ++ show (1.0/(7*duration0)) ++ " per one second but not less than the previous number."
+    ; putStrLn $ "For example for 10 seconds record, please, specify " ++ show (10.0/(7*duration0)) ++ " as a next step ratio."
+    ; let longerK = (read x3::Double)*longerK0
+    ; putStrLn "Please, wait for 0.5 second and pronounce the sound representation for the "
+    ; putStrLn ""
+    ; putStrLn $ "    ;     ;     ;     ;     ;     ;     ;     ;     ;     ;  \"" ++ (if soundUkr /= "ь" then map toUpper soundUkr else soundUkr) ++ "\""
+    ; putStrLn ""
+    ; putStrLn " sound or whatever you would like to be substituted instead (be sensible, please)! "
+    ; if (compare (7*longerK) 3.0 == LT)
+       then recA "x.wav" (7*longerK)
+       else recA "x.wav" 3.0
+    ; putStrLn "The file is recorded and now will be automatically processed. You will be notificated with the text message in the terminal about the creation of the needed file. Please, wait a little. "
+    ; norm "x.wav"
+    ; noiseProfB "8x.wav"
+    ; noiseReduceB "8x.wav"
+    ; lim0 <- durationA "_8x.wav"
+    ; putStrLn ""
+    ; putStrLn "If you specified as a first command line argument the following the program behaves: "
+    ; putStrLn "0 -> after the noise reduction the program only resample the audio to the needed 22050 Hz and adjusts the amlitude; "
+    ; putStrLn "1 -> after the noise reduction the program additionally to the 0-processing truncates the silence from the beginning and end of the audio to the level given by the second command line parameter; "
+    ; putStrLn "2 -> after the noise reduction the program additionally to the 1-processing applies a double band-reject filter to the audio (SoX \"sinc\" effect); "
+    ; putStrLn "3 -> after the noise reduction the program additionally to the 2-processing applies fade-in and fade-out effects to the audio; "
+    ; putStrLn "_ -> is the same as 3. "
+    ; putStrLn ""
+    ; putStrLn "If you specified as a second command line argument the following the program behaves: "
+    ; putStrLn "0 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.01; "
+    ; putStrLn "1 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.02; "
+    ; putStrLn "2 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.04; "
+    ; putStrLn "3 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.08; "
+    ; putStrLn "_ -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.04; "
+    ; putStrLn ""
+    ; let noiseMax = getBFst' (2::Int, V.fromList [("0", 0::Int), ("1", 1::Int), ("2", 2::Int), ("3", 3::Int)]) noiseLim 
+    ; produceSound3 (actsctrl, noiseLim) (file, file1) soundUkr (noiseMax, duration0) lim0
+    ; cleanTemp }
       
 -- | Function 'beginProcessing' is used to catch the variant where the sound is fully cut by the SoX because the sound was created in inappropriate time.
--- It returns the process to the beginning of the sound recording.
-beginProcessing :: FilePath -> FilePath -> String -> IO ()
-beginProcessing file file1 soundUkr = do
+-- It returns the process to the beginning of the sound recording. For the meaning of the tuple of @Sring@ parameters, refer to 'produceSound' documentation.
+beginProcessing :: FilePath -> FilePath -> String -> (String, String) -> IO ()
+beginProcessing file file1 soundUkr (actsctrl, noiseLim) = do {
   cleanTemp
-  putStr "The needed files were NOT created, because the sound was not at the moment of recording! The process will be restarted "
-  putStrLn "for the sound. Please, produce a sound during the first 3 seconds (after 0.5 second delay) or specify greater ratio!"
-  putStrLn $ "Listen to the \"" ++ soundUkr ++ "\" sound and note first of all its duration. "
-  playA file
-  putStrLn "The sound duration is:"
-  duration0 <- durationA file
-  putStrLn $ showFFloat Nothing duration0 $ show 0
-  putStrLn ""
-  putStrLn "It means that to produce more than 3 seconds of recording, you must specify at least "
-  putStrLn $ "   " ++ show (3.0/(7*duration0)) ++ " as a next step ratio being prompt "
-  putStrLn "   OR "
-  putStrLn $ "   " ++ show (1.0/(7*duration0)) ++ " per one second but not less than the previous number."
-  putStrLn $ "For example for 10 seconds record, please, specify " ++ show (10.0/(7*duration0)) ++ " as a next step ratio."
-  longerK0 <- tempS soundUkr
-  (_, Just hout, _, _) <- createProcess (proc (fromJust . showE $ "soxi") ["-D", file]) { std_out = CreatePipe }
-  x3 <- hGetContents hout
-  let longerK = (read x3::Double)*longerK0
-  putStrLn "Please, wait for 0.5 second and pronounce the sound representation for the "
-  putStrLn ""
-  putStrLn $ "                     \"" ++ (if soundUkr /= "ь" then map toUpper soundUkr else soundUkr) ++ "\""
-  putStrLn ""
-  putStrLn "sound or whatever you would like to be substituted instead (be sensible, please)! "
-  if (compare (7*longerK) 3.0 == LT)
+; putStr "The needed files were NOT created, because the sound was not at the moment of recording! The process will be restarted "
+; putStrLn "for the sound. Please, produce a sound during the first 3 seconds (after 0.5 second delay) or specify greater ratio!"
+; putStrLn $ "Listen to the \"" ++ soundUkr ++ "\" sound and note first of all its duration. "
+; playA file
+; putStrLn "The sound duration is: "
+; duration0 <- durationA file
+; putStrLn $ showFFloat Nothing duration0 $ show 0
+; putStrLn ""
+; putStrLn "It means that to produce more than 3 seconds of recording, you must specify at least "
+; putStrLn $ ";  " ++ show (3.0/(7*duration0)) ++ " as a next step ratio being prompt "
+; putStrLn ";  OR "
+; putStrLn $ ";  " ++ show (1.0/(7*duration0)) ++ " per one second but not less than the previous number."
+; putStrLn $ "For example for 10 seconds record, please, specify " ++ show (10.0/(7*duration0)) ++ " as a next step ratio."
+; longerK0 <- tempS soundUkr
+; (_, Just hout, _, _) <- createProcess (proc (fromJust . showE $ "soxi") ["-D", file]) { std_out = CreatePipe }
+; x3 <- hGetContents hout
+; let longerK = (read x3::Double)*longerK0
+; putStrLn "Please, wait for 0.5 second and pronounce the sound representation for the "
+; putStrLn ""
+; putStrLn $ "; ; ; ; ; ; ; ; ; ;  \"" ++ (if soundUkr /= "ь" then map toUpper soundUkr else soundUkr) ++ "\""
+; putStrLn ""
+; putStrLn "sound or whatever you would like to be substituted instead (be sensible, please)! "
+; if (compare (7*longerK) 3.0 == LT)
     then recA "x.wav" (7*longerK)
     else recA "x.wav" 3.0
-  putStrLn "The file is recorded and now will be automatically processed. You will be notificated with the text message in the terminal about the creation of the needed file. Please, wait a little. "
-  norm "x.wav"
-  noiseProfB "8x.wav"
-  noiseReduceB "8x.wav"
-  lim0 <- durationA "_8x.wav"
-  alterVadB "_8x.wav" lim0 (duration0 * 0.1)
-  lim1 <- durationA "_8x.wav"
-  if lim1 <= 0.0
-    then beginProcessing file file1 soundUkr
-    else do 
-      alterVadE "_8x.wav" lim1 (duration0 * 0.1)
-      sincA "_8x.wav"
-      resampleA "4._8x.wav" (22050::Int)
-      quarterSinFade "34._8x.wav"
-      norm "434._8x.wav"
-      volS2 "8434._8x.wav" file
-      renameFile "8.434._8x.wav" file1
-      cleanTemp
+; putStrLn "The file is recorded and now will be automatically processed. You will be notificated with the text message in the terminal about the creation of the needed file. Please, wait a little. "
+; norm "x.wav"
+; noiseProfB "8x.wav"
+; noiseReduceB "8x.wav"
+; lim0 <- durationA "_8x.wav"
+; putStrLn ""
+; putStrLn "If you specified as a first command line argument the following the program behaves: "
+; putStrLn "0 -> after the noise reduction the program only resample the audio to the needed 22050 Hz and adjusts the amlitude; "
+; putStrLn "1 -> after the noise reduction the program additionally to the 0-processing truncates the silence from the beginning and end of the audio to the level given by the second command line parameter; "
+; putStrLn "2 -> after the noise reduction the program additionally to the 1-processing applies a double band-reject filter to the audio (SoX \"sinc\" effect); "
+; putStrLn "3 -> after the noise reduction the program additionally to the 2-processing applies fade-in and fade-out effects to the audio; "
+; putStrLn "_ -> is the same as 3. "
+; putStrLn ""
+; putStrLn "If you specified as a second command line argument the following the program behaves: "
+; putStrLn "0 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.01; "
+; putStrLn "1 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.02; "
+; putStrLn "2 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.04; "
+; putStrLn "3 -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.08; "
+; putStrLn "_ -> the maximum amplitude, starting from which the file will not be trimmed for the first command line argument greater of 1, is 0.04; "
+; putStrLn ""
+; let noiseMax = getBFst' (2::Int, V.fromList [("0", 0::Int), ("1", 1::Int), ("2", 2::Int), ("3", 3::Int)]) noiseLim 
+; produceSound3 (actsctrl, noiseLim) (file, file1) soundUkr (noiseMax, duration0) lim0
+; cleanTemp }
 
 -- | Function to get the @Double@ value, which shows in how many times you expect that your sound representation will be longer than the one provided by the @mmsyn6ukr@ package. 
 tempS :: String -> IO Double
diff --git a/README b/README
--- a/README
+++ b/README
@@ -81,3 +81,39 @@
 The author of the program accordingly to the LICENSE (MIT) does not 
 response for any possible issues, but by this notification tries to 
 intent you to be aware of some possible issues.
+
+        ***** Command line arguments *****
+
+If you specified as a first command line argument the following number
+the program behaves: 
+    0 -> after the noise reduction the program only resample 
+      the audio to the needed 22050 Hz and adjusts the amlitude; 
+    1 -> after the noise reduction the program additionally 
+      to the 0-processing truncates the silence from the beginning 
+       and end of the audio to the level given by the second 
+        command line parameter; 
+    2 -> after the noise reduction the program additionally to 
+      the 1-processing applies a double band-reject filter to 
+       the audio (SoX \"sinc\" effect); 
+    3 -> after the noise reduction the program additionally to 
+      the 2-processing applies fade-in and fade-out effects to 
+       the audio; 
+    _ -> is the same as 3. 
+
+If you specified as a second command line argument the following number
+the program behaves: 
+    0 -> the maximum amplitude, starting from which the file will 
+      not be trimmed for the first command line argument greater 
+       of 1, is 0.01; 
+    1 -> the maximum amplitude, starting from which the file 
+      will not be trimmed for the first command line argument 
+       greater of 1, is 0.02; 
+    2 -> the maximum amplitude, starting from which the file 
+      will not be trimmed for the first command line argument 
+       greater of 1, is 0.04; 
+    3 -> the maximum amplitude, starting from which the file 
+      will not be trimmed for the first command line argument 
+       greater of 1, is 0.08; 
+    _ -> the maximum amplitude, starting from which the file 
+      will not be trimmed for the first command line argument 
+       greater of 1, is 0.04; 
diff --git a/SoXBasics.hs b/SoXBasics.hs
--- a/SoXBasics.hs
+++ b/SoXBasics.hs
@@ -74,44 +74,60 @@
 -- | Function 'alterVadB' removes an approximate silence measured by the absolute value of the sound amplitude from the beginning of the file. 
 -- The function must be used with the @FilePath@ parameter containing no directories in its name (that mean the file of the @FilePath@ parameter must be 
 -- in the same directory that also the function is called from). The file must have maximum amplitude absolute value close to 1 before call to the 'alterVadB'. 
--- The second @Double@ parameter is used to exit the iteration cycle.
-alterVadB :: FilePath -> Double -> Double -> IO ()
-alterVadB file lim exit | compare lim exit /= GT = putStrLn $ "File " ++ file ++ " is ready for further processing."
-                        | otherwise = 
+-- The second @Double@ parameter is used to exit the iteration cycle. The @Int@ parameter from the range [0..3] specifies a maximum amplitude, starting from 
+-- which the sound will not be trimmed.
+alterVadB :: FilePath -> Double -> Int -> Double -> IO ()
+alterVadB file lim noiseMax exit | compare lim exit /= GT = putStrLn $ "File " ++ file ++ " is ready for further processing."
+                                 | otherwise = 
  if isJust (showE "sox")
   then do
-    lim1 <- durationA file
-    case (compare lim1 lim) of 
-      LT -> alterVadB file lim1 exit
-      EQ -> do 
-        (_, _, herr) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "-n", "trim", "0", showFFloat Nothing (lim1 / 2.0) $ show 0, "stat"] ""
-        let zs = lines herr in let z = concatMap (dropWhile (not . isDigit)) . take 1 . drop 3 $ zs in if z < "0.04" 
+         lim1 <- durationA file
+         alterVadHelp file lim1 lim noiseMax exit  
+  else error "SoX is not properly installed in your system. Please, install it properly and then call the function again."
+  
+-- | Function 'alterVadHelp' is used internally in the 'alterVadB' and 'alterVadE' functions. 
+alterVadHelp :: FilePath -> Double -> Double -> Int -> Double -> IO ()
+alterVadHelp file lim1 lim noiseMax exit | compare lim1 lim == LT = alterVadB file lim1 noiseMax exit
+                                         | compare lim1 lim == EQ = 
+ let noiseM = (case noiseMax of 
+                0 -> "0.01"
+                1 -> "0.02"
+                2 -> "0.04"
+                3 -> "0.08"
+                _ -> "0.04") in do 
+       (_, _, herr) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "-n", "trim", "0", showFFloat Nothing (lim1 / 2.0) $ show 0, "stat"] ""
+       let zs = lines herr in let z = concatMap (dropWhile (not . isDigit)) . take 1 . drop 3 $ zs in if z < noiseM
           then do 
-            (_, _, herr3) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "7" ++ file, "trim", showFFloat Nothing (lim1 / 2.0) $ show 0, "-0.000000"] ""
+            _ <- readProcessWithExitCode (fromJust (showE "sox")) [file, "7" ++ file, "trim", showFFloat Nothing (lim1 / 2.0) $ show 0, "-0.000000"] ""
             threadDelay 100000
-            opFile file exit
-          else alterVadB file (lim1 / 4.0) exit
-      _  -> do
-        (_, _, herr) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "-n", "trim", "0", showFFloat Nothing (lim / 2.0) $ show 0, "stat"] ""
-        let zs = lines herr in let z = concatMap (dropWhile (not . isDigit)) . take 1 . drop 3 $ zs in if z < "0.04" 
+            opFile file exit noiseMax
+          else alterVadB file (lim1 / 4.0) noiseMax exit  
+                                         | otherwise = 
+ let noiseM = (case noiseMax of 
+                0 -> "0.01"
+                1 -> "0.02"
+                2 -> "0.04"
+                3 -> "0.08"
+                _ -> "0.04") in do 
+       (_, _, herr) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "-n", "trim", "0", showFFloat Nothing (lim / 2.0) $ show 0, "stat"] ""
+       let zs = lines herr in let z = concatMap (dropWhile (not . isDigit)) . take 1 . drop 3 $ zs in if z < noiseM
           then do 
-            (_, _, herr3) <- readProcessWithExitCode (fromJust (showE "sox")) [file, "7" ++ file, "trim", showFFloat Nothing (lim / 2.0) $ show 0, "-0.000000"] ""
+            _ <- readProcessWithExitCode (fromJust (showE "sox")) [file, "7" ++ file, "trim", showFFloat Nothing (lim / 2.0) $ show 0, "-0.000000"] ""
             threadDelay 100000
-            opFile file exit
-          else alterVadB file (lim / 4.0) exit
-  else error "SoX is not properly installed in your system. Please, install it properly and then call the function again."
+            opFile file exit noiseMax
+          else alterVadB file (lim / 4.0) noiseMax exit
 
 -- | Function 'opFile' is used internally in 'alterVadB' to check whether @FilePath@ exist and if so to do some processing to allow the 'alterVadB' function iterate further.
-opFile :: FilePath -> Double -> IO ()
-opFile file exit = do
+opFile :: FilePath -> Double -> Int -> IO ()
+opFile file exit noiseMax = do
   removeFile file
   exist0 <- doesFileExist file
   if not exist0 
     then do 
       renameFile ("7" ++ file) file
       lim2 <- durationA file
-      alterVadB file lim2 exit
-    else opFile file exit
+      alterVadB file lim2 noiseMax exit
+    else opFile file exit noiseMax
 
 -- | Function 'norm' applies a SoX normalization effect on the audio file. 
 -- The function must be used with the @FilePath@ parameter containing no directories in its name (that mean the file of the @FilePath@ parameter must be 
@@ -139,14 +155,15 @@
   
 -- | Function 'alterVadE' removes an approximate silence measured by the absolute value of the sound amplitude from the end of the file. 
 -- The function must be used with the @FilePath@ parameter containing no directories in its name (that mean the file of the @FilePath@ parameter must be 
--- in the same directory that also the function is called from). The second @Double@ parameter is used to exit the iteration cycle.
-alterVadE :: FilePath -> Double -> Double -> IO ()
-alterVadE file lim exit | compare lim exit /= GT = putStrLn $ "File " ++ file ++ " is ready for further processing"
-                        | otherwise = 
+-- in the same directory that also the function is called from). The second @Double@ parameter is used to exit the iteration cycle. The @Int@ parameter 
+-- from the range [0..3] specifies a maximum amplitude, starting from which the sound will not be trimmed.
+alterVadE :: FilePath -> Double -> Int -> Double -> IO ()
+alterVadE file lim noiseMax exit | compare lim exit /= GT = putStrLn $ "File " ++ file ++ " is ready for further processing"
+                                 | otherwise = 
  if isJust (showE "sox") 
   then do
     _ <- readProcessWithExitCode (fromJust (showE "sox")) [file, "6" ++ file, "reverse"] ""
-    alterVadB ("6" ++ file) lim exit
+    alterVadB ("6" ++ file) lim noiseMax exit
     _ <- readProcessWithExitCode (fromJust (showE "sox")) ["6" ++ file, "76" ++ file, "reverse"] ""
     removeFile $ "6" ++ file
     renameFile ("76" ++ file) file
diff --git a/mmsyn7ukr.cabal b/mmsyn7ukr.cabal
--- a/mmsyn7ukr.cabal
+++ b/mmsyn7ukr.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                mmsyn7ukr
-version:             0.3.1.0
+version:             0.4.0.0
 synopsis:            A simple basic interface to some SoX functionality or to produce a voice that can be used by mmsyn7h
 description:         A program and a library that can be used as a simple basic interface to some SoX functionality or to produce your voice in Ukrainian (if you pronounce the sounds properly) represented by the separate sounds or something special like soft sign.
 homepage:            https://hackage.haskell.org/package/mmsyn7ukr
