diff --git a/sox.cabal b/sox.cabal
--- a/sox.cabal
+++ b/sox.cabal
@@ -1,5 +1,5 @@
 Name:             sox
-Version:          0.2.1.1
+Version:          0.2.2
 License:          GPL
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -46,11 +46,12 @@
     explicit-exception >= 0.1.3 && < 0.2,
     -- that's the way to get compatibility between GHC 6.10 and 6.12
     extensible-exceptions >=0.1.1 && <0.2,
-    transformers >=0.2 && <0.4
+    transformers >=0.2 && <0.4,
+    utility-ht >=0.0.5 && <0.1
   If flag(splitBase)
     Build-Depends:
       process >=1.0 && <1.2,
-      containers >=0.1 && <0.5,
+      containers >=0.1 && <0.6,
       base >=2 && <5
   Else
     Build-Depends:
@@ -76,6 +77,7 @@
     Sound.Sox.Frame
     Sound.Sox.Frame.Stereo
     Sound.Sox.Signal.List
+    Sound.Sox.Information
   Other-Modules:
     Sound.Sox.Private.Option
     Sound.Sox.Private.Arguments
diff --git a/src/Sound/Sox/Information.hs b/src/Sound/Sox/Information.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/Sox/Information.hs
@@ -0,0 +1,82 @@
+{- |
+This module calls the 'soxi' command
+which is available since 'sox' version 14.
+
+We have to call 'soxi' for every option.
+However we hide this in our interface,
+such that we could do more efficiently,
+if 'soxi' supports multiple outputs in future.
+-}
+module Sound.Sox.Information where
+
+import qualified Control.Monad.Trans.Reader as MR
+import Control.Applicative (Applicative, pure, liftA3, (<*>), )
+import Text.Read.HT (maybeRead, )
+
+import qualified System.Process as Proc
+import qualified System.IO as IO
+import Control.Exception (bracket, )
+-- import System.IO.Error (ioError, userError, )
+-- import System.Exit (ExitCode, )
+
+import Prelude hiding (length, )
+
+
+newtype T a =
+   Cons (MR.ReaderT FilePath IO a)
+
+instance Functor T where
+   {-# INLINE fmap #-}
+   fmap f (Cons m) = Cons (fmap f m)
+
+instance Applicative T where
+   {-# INLINE pure #-}
+   {-# INLINE (<*>) #-}
+   pure = Cons . pure
+   (Cons f) <*> (Cons x) = Cons (f <*> x)
+
+
+simple :: Read a => (String -> Maybe a) -> String -> T a
+simple rd option =
+   Cons $ MR.ReaderT $ \fileName ->
+      bracket
+         (Proc.runInteractiveProcess "soxi"
+             (option : fileName : [])
+             Nothing Nothing)
+         (\(input,output,err,proc) ->
+             mapM_ IO.hClose [input, output, err] >>
+             Proc.terminateProcess proc)
+         (\(_,output,_,_) ->
+            maybe
+               (ioError (userError "soxi returned rubbish"))
+               return .
+            rd =<<
+            IO.hGetContents output)
+
+format :: T String
+format = simple Just "-t"
+
+sampleRate :: T Int
+sampleRate = simple maybeRead "-r"
+
+numberOfChannels :: T Int
+numberOfChannels = simple maybeRead "-c"
+
+length :: T Int
+length = simple maybeRead "-s"
+
+bitsPerSample :: T Int
+bitsPerSample = simple maybeRead "-b"
+
+
+
+get :: T a -> FilePath -> IO a
+get (Cons act) = MR.runReaderT act
+
+exampleMulti :: IO (String, Int, Int)
+exampleMulti =
+   get (liftA3 (,,) format sampleRate bitsPerSample) "test.aiff"
+
+exampleSingle :: IO Int
+exampleSingle =
+   get sampleRate "test.aiff"
diff --git a/src/Sound/Sox/Option/Format.hs b/src/Sound/Sox/Option/Format.hs
--- a/src/Sound/Sox/Option/Format.hs
+++ b/src/Sound/Sox/Option/Format.hs
@@ -26,6 +26,10 @@
 sampleRate r =
    single "-r" [show r]
 
+bitsPerSample :: Int -> T
+bitsPerSample b =
+   single "-b" [show b]
+
 format :: Format.T -> T
 format fmt =
    single "-t" [Format.decons fmt]
