diff --git a/Help/stat.help.hs b/Help/stat.help.hs
new file mode 100644
--- /dev/null
+++ b/Help/stat.help.hs
@@ -0,0 +1,27 @@
+-- Trivial sound file statistics.
+
+import qualified Sound.File.HSndFile as F
+import System.Environment
+
+stat ::FilePath -> IO ()
+stat fn = do
+  (hdr, d) <- F.read fn
+  let nf = F.frameCount hdr
+      sr = F.sampleRate hdr
+      nc = F.channelCount hdr
+  mapM_ print [("nframes", [fromIntegral nf])
+              ,("srate", [sr])
+              ,("nchan", [fromIntegral nc])
+              ,("minimum", map minimum d)
+              ,("maximum", map maximum d)]
+
+main :: IO ()
+main = do
+  a <- getArgs
+  case a of
+    [fn] -> stat fn
+    _ -> putStrLn "stat file-name"
+
+{-
+stat "/home/rohan/audio/text.snd"
+-}
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,13 @@
+hsc3-sf-hsndfile - hsc3-sf interface to hsndfile
+
+hsc3-sf-sndfile provides a trivial hsc3-sf equivalent
+interface to the hsndfile package.  hsndfile has more
+extensive dependencies than hsc3-sf, and this allows
+the two packages to be used interchangably by modifying
+a single import.
+
+  http://slavepianos.org/rd
+  http://code.haskell.org/hsndfile
+
+(c) rohan drape, 2010
+    gpl, http://gnu.org/copyleft/
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/Sound/File/HSndFile.hs b/Sound/File/HSndFile.hs
new file mode 100644
--- /dev/null
+++ b/Sound/File/HSndFile.hs
@@ -0,0 +1,38 @@
+-- | Read and write sound files using hsndfile.
+module Sound.File.HSndFile ( Header(..)
+                           , header
+                           , read ) where
+
+import qualified Data.Vector.Storable as V
+import Prelude hiding (read)
+import qualified Sound.File.Decode as D
+import qualified Sound.File.Sndfile as F
+import qualified Sound.File.Sndfile.Buffer.Vector as F
+
+data Header = Header { channelCount :: Int 
+                     , frameCount :: Int
+                     , sampleRate :: Double }
+              deriving (Eq, Show)
+
+-- | file-name -> (channel-count, frame-count, sample-rate)
+header :: FilePath -> IO Header
+header fn = do
+  h <- F.openFile fn F.ReadMode F.defaultInfo
+  let i = F.hInfo h
+      nc = F.channels i
+      nf = F.frames i
+      sr = F.samplerate i
+  F.hClose h
+  return (Header nc (fromIntegral nf) (fromIntegral sr))
+
+read :: FilePath -> IO (Header, [[Double]])
+read fn = do
+  hd <- header fn
+  h <- F.openFile fn F.ReadMode F.defaultInfo
+  let Header nc nf _ = hd
+      ns = nc * nf
+  b <- F.hGetBuffer h ns
+  case b of
+    Just b' -> let e = V.toList (F.fromBuffer b')
+               in return (hd, D.deinterleave nc e)
+    Nothing -> return (hd, [])
diff --git a/hsc3-sf-hsndfile.cabal b/hsc3-sf-hsndfile.cabal
new file mode 100644
--- /dev/null
+++ b/hsc3-sf-hsndfile.cabal
@@ -0,0 +1,32 @@
+Name:              hsc3-sf-hsndfile
+Version:           0.8
+Synopsis:          Haskell SuperCollider SoundFile
+Description:       Provide hsc3-sf interface to Stefan 
+                   Kersten's hsndfile package.
+License:           GPL
+Category:          Sound
+Copyright:         (c) Rohan Drape, 2010
+Author:            Rohan Drape
+Maintainer:        rd@slavepianos.org
+Stability:         Experimental
+Homepage:          http://slavepianos.org/rd/?t=hsc3-sf-hsndfile
+Tested-With:       GHC == 6.10.3
+Build-Type:        Simple
+Cabal-Version:     >= 1.6
+
+Data-files:        README
+                   Help/stat.help.hs
+
+Library
+  Build-Depends:   array,
+                   base == 4.*,
+                   hsc3-sf == 0.8,
+                   hsndfile == 0.4.*,
+                   hsndfile-vector == 0.4.*,
+                   vector >= 0.5
+  GHC-Options:     -Wall -fwarn-tabs
+  Exposed-modules: Sound.File.HSndFile
+
+Source-Repository  head
+  Type:            darcs
+  Location:        http://slavepianos.org/~rd/sw/hsc3-sf-hsndfile/
