diff --git a/csound-expression.cabal b/csound-expression.cabal
--- a/csound-expression.cabal
+++ b/csound-expression.cabal
@@ -1,6 +1,6 @@
 Name:          csound-expression
-Version:       5.3.2
-Cabal-Version: >= 1.6
+Version:       5.3.3
+Cabal-Version: >= 1.10
 License:       BSD3
 License-file:  LICENSE
 Author:	       Anton Kholomiov
@@ -78,9 +78,10 @@
 Library
   Ghc-Options:    -Wall
   Build-Depends:
-        base >= 4, base < 5, process, data-default, Boolean >= 0.1.0, colour >= 2.0, transformers >= 0.3, containers,
-        csound-expression-typed >= 0.2.2.0, csound-expression-dynamic >= 0.3.3, temporal-media >= 0.6.3,
+        base >= 4.6, base < 5, process, data-default, Boolean >= 0.1.0, colour >= 2.0, transformers >= 0.3, containers,
+        csound-expression-typed >= 0.2.3.1, csound-expression-dynamic >= 0.3.5, temporal-media >= 0.6.3,
         csound-expression-opcodes >= 0.0.4.0
+  default-language: Haskell2010
   Hs-Source-Dirs:      src/
   Exposed-Modules:
         Csound.Base
diff --git a/src/Csound/Air/Live.hs b/src/Csound/Air/Live.hs
--- a/src/Csound/Air/Live.hs
+++ b/src/Csound/Air/Live.hs
@@ -25,13 +25,20 @@
     AdsrBound(..), AdsrInit(..),
     linAdsr, expAdsr,
     classicWaves,
-    masterVolume, masterVolumeKnob
+    masterVolume, masterVolumeKnob,
+
+    -- * Live row
+    LiveClip(..), ClipParam(..),
+    liveRow, liveRows,
+    ambiRow, ambiRowMp3
 ) where
 
 import Control.Monad
 
+import Data.Bool
 import Data.Colour
 import Data.Boolean
+import Data.Default
 import qualified Data.Colour.Names as C
 import qualified Data.Colour.SRGB as C
 
@@ -47,7 +54,10 @@
 import Csound.Air.Fx
 import Csound.Air.Patch
 import Csound.Air.Misc
+import Csound.Tab
 
+import qualified Csound.Typed.Plugins as P
+
 ----------------------------------------------------------------------
 -- mixer
 
@@ -123,14 +133,14 @@
     let (names, initVals) = unzip args
     (gs, as)  <- fmap unzip $ mapM (\(name, initVal) -> slider name (linSpan 0 1) initVal) $ zip names initVals
     let f x = do
-        ref <- newRef (0 :: a)
-        goff <- readRef offRef
-        writeRef ref x
-        when1 (goff ==* 1) $ do
-            x2 <- readRef ref
-            writeRef ref =<< fx as x2
-        res <- readRef ref
-        return res
+          ref <- newRef (0 :: a)
+          goff <- readRef offRef
+          writeRef ref x
+          when1 (goff ==* 1) $ do
+              x2 <- readRef ref
+              writeRef ref =<< fx as x2
+          res <- readRef ref
+          return res
     let gui = setBorder UpBoxBorder $ go (length names) gOff gs
     return (gui, f)
     where
@@ -475,3 +485,103 @@
 
 fromMonoFx :: Sigs a => (Sig -> Sig) -> Fx a
 fromMonoFx f = \asig2 -> bindSig (return . f) asig2
+
+-----------------------------------------------
+-- live rows
+
+-- | Live row triggers audio clips in sync.
+--
+-- > liveRow clips bpm barSize clipIndex
+--
+-- * @clips@ - contains file path to audio clips
+--
+-- * @bpm@ - the BPM of the track
+--
+-- * @barLength@ - length of the bar in quater notes. So 4 means 4/4
+--
+-- * @clipIndex@ - identity of the clip to launch on the next bar.
+liveRow :: [LiveClip] -> D -> D -> Sig -> Sig
+liveRow clips iBpm iBeatDur kUserIndex = P.liveRow iTabSize iTabs iBpm iBeatDur kUserIndex iAuxParams
+    where
+        iTabSize = int $ length clips
+        iTabs = tabList $ fmap (wavLeft . liveClipFile) clips
+        iAuxParams = getAuxClipParams clips
+
+-- | Stereo version of liveRow
+liveRows :: [LiveClip] -> D -> D -> Sig -> Sig2
+liveRows clips iBpm iBeatDur kUserIndex = P.liveRows iTabSize iLeftTabs iRightTabs iBpm iBeatDur kUserIndex iAuxParams
+    where
+        iTabSize = int $ length clips
+        iLeftTabs  = tabList $ fmap (wavLeft  . liveClipFile) clips
+        iRightTabs = tabList $ fmap (wavRight . liveClipFile) clips
+        iAuxParams = getAuxClipParams clips
+
+-- | Clip and it's parameters
+data LiveClip = LiveClip
+    { liveClipFile  :: FilePath
+    -- ^ path to the file of audio clip
+    , liveClipParam :: ClipParam
+    -- ^ clip launch parameters
+    }
+
+data ClipParam = ClipParam
+    { clipParamSize     :: !Int
+    -- ^ Clip size in bars
+    , clipParamDel      :: !Int
+    -- ^ Clip offset from beginning in bars
+    , clipParamTail     :: !Int
+    -- ^ Clip skip time at the end of the clip
+    , clipParamNext     :: !Int
+    -- ^ Next clip to play after this one is finished. If it's -1 then play the same clip
+    , clipParamRetrig   :: !Bool
+    -- ^ Should we retrigger clip from the start or continue play where we left out.
+    , clipParamVol      :: !Double
+    -- ^ Volume scaling factor for the clip
+    }
+
+instance Default ClipParam where
+    def = ClipParam
+        { clipParamSize   = -1
+        , clipParamDel    = 0
+        , clipParamTail   = 0
+        , clipParamNext   = -1
+        , clipParamRetrig = False
+        , clipParamVol    = 1
+        }
+
+toClipParam :: ClipParam -> [Double]
+toClipParam x =
+        [ fromIntegral $ clipParamSize x
+        , fromIntegral $ clipParamDel x
+        , fromIntegral $ clipParamTail x
+        , fromIntegral $ clipParamNext x
+        , bool 0 1 (clipParamRetrig x)
+        , clipParamVol x]
+
+getAuxClipParams :: [LiveClip] -> Tab
+getAuxClipParams xs = doubles $ fillTabToPowerOfTwo $
+    toClipParam . liveClipParam =<< xs
+
+fillTabToPowerOfTwo :: [Double]  -> [Double]
+fillTabToPowerOfTwo xs = xs ++ replicate (nextPow - n) 0
+    where
+        n = length xs
+        nextPow
+            | frac == 0 = n
+            | otherwise = 2 ^ (integ + 1)
+            where
+                (integ, frac) = properFraction $ logBase 2 (fromIntegral n)
+
+
+ambiRow :: [String] -> Sig -> Sig -> D -> SE Sig2
+ambiRow files kSpeed kIndex iFadeTime = do
+  arr <- newGlobalCtrlArr [int $ length files]
+  zipWithM_ (\n f -> writeArr arr n $ text f) (fmap (sig . int) [0..]) files
+  return $ P.ambiRow arr kSpeed kIndex iFadeTime
+
+ambiRowMp3 :: [String] -> Sig -> Sig -> D -> SE Sig2
+ambiRowMp3 files kSpeed kIndex iFadeTime = do
+  arr <- newGlobalCtrlArr [int $ length files]
+  zipWithM_ (\n f -> writeArr arr n $ text f) (fmap (sig . int) [0..]) files
+  return $ P.ambiRowMp3 arr kSpeed kIndex iFadeTime
+
