diff --git a/src/Temporal/Media.hs b/src/Temporal/Media.hs
--- a/src/Temporal/Media.hs
+++ b/src/Temporal/Media.hs
@@ -236,13 +236,15 @@
 instance Sliceable t a => Sliceable t (Media c a) where
 	slice t0 t1 m 
 	    | t1 < t0   = sliceErrorMessage
+	    | t1 <= 0   = none $ (t1 - t0)
+	    | t0 >= tm  = none $ (t1 - t0)
 	    | t0 < 0    = none (abs t0) :+: slice 0 t1 m
 	    | t1 > tm   = slice t0 tm m :+: none (t1 - tm)
 	    | otherwise = case m of
-		    		Prim a      -> Prim $ slice t0 t1 a
-		    		a :+: b     -> sliceSeq t0 t1 a b 
-				a :=: b     -> ((:=:) `on` slice t0 t1) a b
-				Control c a -> Control c $ slice t0 t1 a
+                        Prim a      -> Prim $ slice t0 t1 a
+                        a :+: b     -> sliceSeq t0 t1 a b 
+                        a :=: b     -> ((:=:) `on` slice t0 t1) a b
+                        Control c a -> Control c $ slice t0 t1 a
 		where tm = dur m
 
 sliceSeq :: Sliceable t a => t -> t -> Media c a -> Media c a -> Media c a
@@ -629,29 +631,20 @@
 linseg1 (a, dur, b) x = a + (b - a) * x / dur
 
 -- | linear interpolation
-linseg :: (Num t, Ord t, Fractional t) => [t] -> t -> t
-linseg ps x
-    | x < 0     = head ps
-    | otherwise = if null ds 
-                  then last ps
-                  else flip f x $ head ds
-    where ds  = offset x ps
-          f ((k, _), p) x = linseg1 p $ x - k
-   
-offset :: (Num t, Ord t) => t -> [t] -> [((t, t), (t, t, t))]
-offset x ps = dropWhile ((x > ) . snd . fst) $ zip (stamps ps') ps'
-    where ps' = parts ps
-
-stamps :: (Num t) => [(t, t, t)] -> [(t, t)]
-stamps xs = P.reverse $ foldl f [(0, p)] xs
-    where f ((a, b):res) x = (b, b + snd3 x):(a, b):res
-          snd3 (_, a, _) = a
-          p = snd3 $ head xs
-
-parts :: [t] -> [(t, t, t)]
-parts xs = 
+--
+-- linseg [a, da, b, db, c, ... ]
+--
+-- @a, b, c ...@ - values
+--
+-- @da, db, ...@ - duration of segments
+linseg :: (Ord t, Fractional t) => [t] -> t -> t
+linseg xs t = 
     case xs of
-        (a:dur:b:[])      -> [(a, dur, b)] 
-        (a:dur:b:(x:xs')) -> (a, dur, b) : parts (b : x : xs')
-        _                 -> error "linseg : length must be odd and greater than 2"
-
+        (a:dur:b:[])      -> seg a dur b t
+        (a:dur:b:(x:xs')) -> if t < dur 
+                             then seg a dur b t
+                             else linseg (b:x:xs') (t - dur)
+    where seg a dur b t 
+                | t < 0     = a
+                | t >= dur  = b
+                | otherwise = a + (b - a)*(t/dur)
diff --git a/temporal-media.cabal b/temporal-media.cabal
--- a/temporal-media.cabal
+++ b/temporal-media.cabal
@@ -1,5 +1,5 @@
 Name:          temporal-media
-Version:       0.1.0
+Version:       0.1.1
 License-file:  LICENSE
 Cabal-Version: >= 1.2
 License:       BSD3
