diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -67,3 +67,8 @@
 ## 0.7.2.1 -- 2020-03-11
 
 * Seventh version revised D. Fixed issue with being not compiled because of the syntactic error.
+
+## 0.8.0.0 -- 2020-03-12
+
+* Eigth version. Added the new functions to the library that allows to produce richer sounds especially 'oberSoXSynth2FDN' one. The user can now specify a
+function to be passed as an argument to it and obtain therefore own obertones formula. Added OPTIONS_GHC pragma to the module DobutokO.Sound.
diff --git a/DobutokO/Sound.hs b/DobutokO/Sound.hs
--- a/DobutokO/Sound.hs
+++ b/DobutokO/Sound.hs
@@ -8,6 +8,8 @@
 -- A program and a library to create experimental music
 -- from a mono audio and a Ukrainian text.
 
+{-# OPTIONS_GHC -threaded #-}
+
 module DobutokO.Sound (
   -- * Basic functions for the executable
   dobutokO2
@@ -242,6 +244,95 @@
   let paths = sort . filter (isPrefixOf "test") $ paths0
   _ <- readProcessWithExitCode (fromJust (showE "sox")) (["--combine", "mix"] ++ paths ++ ["result.wav","vol","0.3"]) ""
   mapM_ removeFile paths
+
+-- | Similar to 'oberSoXSynth' except that takes not necessarily pure lower quint note as the second one, but the one specified by the 'String' parameter
+-- as an argument to 'dNote'. If you begin the 'String' with space characters, or \"сь\", or \"ць\", or dash, or apostrophe, or soft sign, than there will
+-- be no interval and the sound will be solely one with its obertones.
+oberSoXSynthDN :: Double -> String -> IO ()
+oberSoXSynthDN x zs
+ | V.null . convertToProperUkrainian $ zs = oberSoXSynth x
+ | otherwise = do
+  let note0 = closestNote x
+      note1 = dNote (V.unsafeIndex (intervalsFromString zs) 0) note0
+      v0    = oberTones note0
+      v1    = if isNothing note1 then V.empty
+              else oberTones . fromJust $ note1
+      oberSoXSynthHelp vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+        ["-r22050", "-n", "test0" ++ show (i + 2) ++ ".wav", "synth", "0.5","sine", showFFloat (Just 4) noteN $ show 0, "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+      oberSoXSynthHelp2 vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+        ["-r22050", "-n", "test1" ++ show (i + 2) ++ ".wav", "synth", "0.5","sine", showFFloat (Just 4) noteN $ show 0, "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+  _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testA.wav", "synth", "0.5","sine", showFFloat (Just 4) note0 $ show 0] ""
+  if isNothing note1 then do oberSoXSynthHelp v0
+  else do 
+    _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testB.wav", "synth", "0.5","sine", showFFloat (Just 4) (fromJust note1) $ show 0]   ""
+    oberSoXSynthHelp v0
+    oberSoXSynthHelp2 v1
+  paths0 <- listDirectory "."
+  let paths = sort . filter (isPrefixOf "test") $ paths0
+  _ <- readProcessWithExitCode (fromJust (showE "sox")) (["--combine", "mix"] ++ paths ++ ["result.wav","vol","0.3"]) ""
+  mapM_ removeFile paths
+
+-- | Similar to 'oberSoXSynthDN' except that the resulting duration is specified by the second 'Double' parameter in seconds. For 'oberSoXSynthDN'
+-- it is equal to 0.5.
+oberSoXSynth2DN :: Double -> Double -> String -> IO ()
+oberSoXSynth2DN x y zs
+ | V.null . convertToProperUkrainian $ zs = oberSoXSynth x
+ | otherwise = do
+    let note0 = closestNote x
+        note1 = dNote (V.unsafeIndex (intervalsFromString zs) 0) note0
+        v0    = oberTones note0
+        v1    = if isNothing note1 then V.empty
+                else oberTones . fromJust $ note1
+        oberSoXSynthHelp vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+          ["-r22050", "-n", "test0" ++ show (i + 2) ++ ".wav", "synth", showFFloat (Just 4) y $ show 0,"sine", showFFloat (Just 4) noteN $ show 0,
+            "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+        oberSoXSynthHelp2 vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+          ["-r22050", "-n", "test1" ++ show (i + 2) ++ ".wav", "synth", showFFloat (Just 4) y $ show 0,"sine", showFFloat (Just 4) noteN $ show 0,
+            "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+    _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testA.wav", "synth", showFFloat (Just 4) y $ show 0,"sine",
+       showFFloat (Just 4) note0 $ show 0] ""
+    if isNothing note1 then do oberSoXSynthHelp v0
+    else do 
+      _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testB.wav", "synth", showFFloat (Just 4) y $ show 0,"sine",
+         showFFloat (Just 4) (fromJust note1) $ show 0] ""
+      oberSoXSynthHelp v0
+      oberSoXSynthHelp2 v1
+    paths0 <- listDirectory "."
+    let paths = sort . filter (isPrefixOf "test") $ paths0
+    _ <- readProcessWithExitCode (fromJust (showE "sox")) (["--combine", "mix"] ++ paths ++ ["result.wav","vol","0.3"]) ""
+    mapM_ removeFile paths
+
+-- | Similar to 'oberSoXSynth2DN' but instead of 'oberTones' function, it uses volatile function @f::Double -> V.Vector (Double, Double)@ with
+-- somewhat sofisticated mechanism to normalize the resulting 'V.Vector' elements @(Double, Double)@. The last one is experimental feature, so
+-- it is your responsibility to provide a function so that it does not lead to clipping.
+oberSoXSynth2FDN :: (Double -> V.Vector (Double, Double)) -> Double -> Double -> String -> IO ()
+oberSoXSynth2FDN f x y zs
+ | V.null . convertToProperUkrainian $ zs = oberSoXSynth x
+ | otherwise = do
+    let note0 = closestNote x
+        note1 = dNote (V.unsafeIndex (intervalsFromString zs) 0) note0
+        g     = V.map (\(noteX, amplX) -> (closestNote noteX, abs (amplX - (fromIntegral . truncate $ amplX)))) . f
+        v0    = g note0
+        v1    = if isNothing note1 then V.empty
+                else g . fromJust $ note1
+        oberSoXSynthHelp vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+          ["-r22050", "-n", "test0" ++ show (i + 2) ++ ".wav", "synth", showFFloat (Just 4) y $ show 0,"sine", showFFloat (Just 4) noteN $ show 0,
+            "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+        oberSoXSynthHelp2 vec = V.imapM_ (\i (noteN, amplN) -> readProcessWithExitCode (fromJust (showE "sox"))
+          ["-r22050", "-n", "test1" ++ show (i + 2) ++ ".wav", "synth", showFFloat (Just 4) y $ show 0,"sine", showFFloat (Just 4) noteN $ show 0,
+            "vol", showFFloat (Just 4) amplN $ show 0] "") vec
+    _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testA.wav", "synth", showFFloat (Just 4) y $ show 0,"sine",
+       showFFloat (Just 4) note0 $ show 0] ""
+    if isNothing note1 then do oberSoXSynthHelp v0
+    else do 
+      _ <- readProcessWithExitCode (fromJust (showE "sox")) ["-r22050", "-n", "testB.wav", "synth", showFFloat (Just 4) y $ show 0,"sine",
+         showFFloat (Just 4) (fromJust note1) $ show 0] ""
+      oberSoXSynthHelp v0
+      oberSoXSynthHelp2 v1
+    paths0 <- listDirectory "."
+    let paths = sort . filter (isPrefixOf "test") $ paths0
+    _ <- readProcessWithExitCode (fromJust (showE "sox")) (["--combine", "mix"] ++ paths ++ ["result.wav","vol","0.3"]) ""
+    mapM_ removeFile paths      
 
 -- | For the given frequency it generates a musical sound with a timbre. The main component of the sound includes the lower pure quint,
 -- which can be in the same octave or in the one with the number lower by one. Please, check before executing
diff --git a/dobutokO2.cabal b/dobutokO2.cabal
--- a/dobutokO2.cabal
+++ b/dobutokO2.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                dobutokO2
-version:             0.7.2.1
+version:             0.8.0.0
 synopsis:            A program and a library to create experimental music from a mono audio and a Ukrainian text
 description:         It can also create a timbre for the notes
 homepage:            https://hackage.haskell.org/package/dobutokO2
