diff --git a/src/Temporal/Music/Notation/Pitch.hs b/src/Temporal/Music/Notation/Pitch.hs
--- a/src/Temporal/Music/Notation/Pitch.hs
+++ b/src/Temporal/Music/Notation/Pitch.hs
@@ -29,7 +29,8 @@
 	setBend, bend, step, transp,
     low, l', ll', high, h', hh', lower, higher, invert,
     -- * Rendering
-    frequency, absPitch
+    frequency, absPitch,
+    toneAsDouble, scaleAt, scaleAtInt, scaleStep
  )
 where
 
@@ -326,23 +327,46 @@
 
 -- | calculates frequency value for given tone on scale grid
 frequency :: Seg n => Scale -> Tone n -> Frequency
-frequency s t@(Tone b o n) = (bendCoeff r' d s * ) $
-    scaleFreq s d
-    where (b', r') = properFraction b
-          d = fromEnum t + fromIntegral b'
+frequency s t = scaleAt s $ toneAsDouble t
 
-bendCoeff :: Bend -> Step -> Scale -> Double
-bendCoeff r n s
-    | abs r < 1e-6 = 1
-    | r > 0        = flip loginterpCoeff r       $ getTones s n $ n + 1
-    | otherwise    = flip loginterpCoeff (abs r) $ getTones s n $ n - 1
-    where getTones s n1 n2 = (scaleFreq s n1, scaleFreq s n2)  
-   
+-- | flattens tone to double.
+toneAsDouble :: Seg s => Tone s -> Double
+toneAsDouble t@(Tone b o s) = (fromIntegral $ fromEnum t) + b
 
-scaleFreq :: Scale -> Int -> Frequency
-scaleFreq s x = f0 * (scaleOctave s ^^ o) * (scaleSteps s V.! n)
-    where (o, n)   = divMod (x - c0) $ scaleSize s
-          (c0, f0) = scaleBase s 
+
+-- | scale value on doubles          
+scaleAt :: Scale -> Double -> Double
+scaleAt s x = scaleAtInt s d * bendCoeff s n r 
+    where (d, r) = properFraction x          
+          n      = mod (d - c0) $ scaleSize s
+          c0     = fst $ scaleBase s
+
+-- | scale value on integers          
+scaleAtInt :: Scale -> Int -> Frequency
+scaleAtInt s x = f0 * scaleStep s x
+    where f0 = snd $ scaleBase s 
+
+-- | gives scale multiplier
+scaleStep :: Scale -> Int -> Interval
+scaleStep s x = (scaleOctave s ^ o) * scaleSteps s V.! n    
+    where (o, n) = divMod (x - c0) $ scaleSize s
+          c0     = fst $ scaleBase s
+          
+
+bendCoeff :: Scale -> Int -> Double -> Frequency          
+bendCoeff s n x
+    | abs x < 1e-6 = 1
+    | x > 0        = flip loginterpCoeff x       $ getTones s n $ n + 1
+    | otherwise    = flip loginterpCoeff (abs x) $ getTones s n $ n - 1
+    where getTones s n1 n2 = (getTone s n1, getTone s n2)  
+          getTone  s x
+            | x >= 0 && x < n = scaleSteps s V.! x
+            | x == n          = o
+            | x == -1         = scaleSteps s V.! (n-1) / o
+            | otherwise       = error $ "scaleStep: out of bounds"
+            where n = scaleSize s
+                  o = scaleOctave s
+   
 
 loginterpCoeff :: (Double, Double) -> Double -> Double
 loginterpCoeff (l, r) x = (r / l) ** x
diff --git a/src/Temporal/Music/Notation/Volume.hs b/src/Temporal/Music/Notation/Volume.hs
--- a/src/Temporal/Music/Notation/Volume.hs
+++ b/src/Temporal/Music/Notation/Volume.hs
@@ -20,13 +20,16 @@
     level, mediumLevel,
 	-- * Transformers
 	VolumeFunctor(..), LevelFunctor(..),
-	setDiapason, setLevel, setAccent,
+	setDiapason, setDiapasonRel, setLevel, setAccent,
     accent, al', aq',
     loud, quiet, louder, quieter,
     dynamics, dynamicsRel, dynamicsSeg,
     -- * Rendering
     amplitude, unsafeAmplitude, 
-    absVolume, unsafeAbsVolume
+    absVolume, unsafeAbsVolume,
+    diapasonAt, 
+    levelAsDouble, unsafeLevelAsDouble,
+    levelAsDoubleRel, unsafeLevelAsDoubleRel
 )
 where
 
@@ -68,9 +71,16 @@
 instance Seg n => LevelFunctor (Volume n) where
     mapLevel f = \(Volume d l) -> Volume d $ f l
 
--- | setDiapason
+-- | sets diapason to specified value
 setDiapason :: VolumeFunctor a => (Amplitude, Amplitude) -> a -> a
 setDiapason x = mapVolume $ \(Volume _ l) -> Volume x l
+
+-- | relative update of diapason value in decibels, 
+-- (0, 1) turns diapason interval into itself.
+setDiapasonRel :: VolumeFunctor a => (Double, Double) -> a -> a
+setDiapasonRel (a, b) = mapVolume $ 
+    \(Volume x l) -> Volume (diapasonAt x a, diapasonAt x b) l
+
 --------------------------------------------------
 --------------------------------------------------
 -- Level
@@ -225,20 +235,37 @@
 -- Here resulting amplitude value lies within 'Diapason' interval.
 -- All outsiders are placed inside interval with saturation.
 amplitude :: Seg n => Diapason -> Level n -> Amplitude
-amplitude d l = amplitudeGen (sat 0 $ fromIntegral $ levelNum l) d l
+amplitude d l = diapasonAt d $ levelAsDoubleRel l
 
 -- | unsafe analog of 'amplitude' function. Here result can go
 -- beyond limits of 'Diapason' interval.
 unsafeAmplitude :: Seg n => Diapason -> Level n -> Amplitude
-unsafeAmplitude = amplitudeGen id
+unsafeAmplitude d l = diapasonAt d $ unsafeLevelAsDouble l
 
-amplitudeGen :: Seg n 
-    => (Double -> Double)
-    -> Diapason -> Level n -> Amplitude
-amplitudeGen bound (low, high) l@(Level a s) = (low * ) $ (high / low) ** x
-    where n = fromIntegral $ levelNum l
-          x = ( / n) $ bound $ (fromIntegral $ fromEnum s) + a
+-- | mapps decibels to amplitudes within specified amplitude diapason,
+-- 0 turns to lower diapason value and 1 turns to higher diapason value
+diapasonAt :: Diapason -> Double -> Double
+diapasonAt (low, high) d = (low * ) $ (high / low) ** d
 
+-- | converts level value to double
+levelAsDouble :: Seg s => Level s -> Double
+levelAsDouble x = sat 0 n $ unsafeLevelAsDouble x
+    where n = fromIntegral $ levelNum x - 1
+
+-- | converts level value to double, value can exceed level limits
+unsafeLevelAsDouble :: Seg s => Level s -> Double
+unsafeLevelAsDouble l@(Level a x) = (fromIntegral $ fromEnum l) + a
+
+-- | converts level value to double, and normalizes output by level limits
+levelAsDoubleRel :: Seg s => Level s -> Double
+levelAsDoubleRel l = (/n) $ levelAsDouble l
+    where n = fromIntegral $ levelNum l - 1
+
+-- | converts level value to double and normalizes output by level limits, 
+-- value can exceed (0, 1) interval
+unsafeLevelAsDoubleRel :: Seg s => Level s -> Double
+unsafeLevelAsDoubleRel l = (/n) $ unsafeLevelAsDoubleRel l
+    where n = fromIntegral $ levelNum l - 1
 
 --------------------------------------
 -- level manipulation
diff --git a/temporal-music-notation.cabal b/temporal-music-notation.cabal
--- a/temporal-music-notation.cabal
+++ b/temporal-music-notation.cabal
@@ -1,10 +1,10 @@
 Name:          temporal-music-notation
-Version:       0.1.3
+Version:       0.1.4
 Cabal-Version: >= 1.2
 License-file:  LICENSE
 License:       BSD3
 Author:	       Anton Kholomiov
-Maintainer:    Anton Kholomiov
+Maintainer:    <anton.kholomiov@gmail.com>
 Synopsis:      music notation
 Description:   Library for expressing musical ideas. Includes composable score representation, microsound tunings, flexible pitch and volume control.
 Category:      Music
