pitchtrack-0.1.0.1: src/PitchTrack/Track.hs
{- |
This module provides a high-level interface for the most common cases.
The default number of samples used for each computation is 2048,
which should be enough if you never go below 65Hz.
If you need a different number, you should use the functions whose name ends with @N@,
which take the number of samples as a first parameter.
-}
module PitchTrack.Track (
-- * Reading from a file
trackFile
, trackFileN
, trackFileToList
-- * Reading from stdin
, trackStdin
, trackStdinN
-- * Reading from a handle
, trackHandle
, trackHandleN
-- * Reading from a lazy 'LBS.ByteString'
, trackLBS
, trackLBSN
-- * Other definitions
, defaultSampleNum
) where
import DywaPitchTrack
import PitchTrack.Pipes
import qualified Data.ByteString.Lazy as LBS
import Pipes
import qualified Pipes.Prelude as P
import System.IO
-- | Track a file and apply a function to each computed pitch
--
-- >>> trackFile "a440.raw" $ \pitch -> liftIO $ putStr (show pitch ++ ",")
-- 440.0,440.0,440.0,440.0,440.0,440.0,440.0,440.0,440.0,440.0,440.0,440.0,
trackFile :: FilePath -> (Double -> PitchTrack ()) -> IO ()
trackFile = trackFileN defaultSampleNum
-- | Same as 'trackFile', but takes the number of samples as a first parameter
trackFileN :: Int -> FilePath -> (Double -> PitchTrack ()) -> IO ()
trackFileN sampleNum file f = withFileR file $ \ h->
trackHandleN sampleNum h f
-- | Same as 'trackFile' but reads from 'System.IO.stdin' instead of a file
trackStdin :: (Double -> PitchTrack ()) -> IO ()
trackStdin = trackStdinN defaultSampleNum
-- | Same as 'trackStdin', but takes the number of samples as a first parameter
trackStdinN :: Int -> (Double -> PitchTrack ()) -> IO ()
trackStdinN sampleNum = trackHandleN sampleNum stdin
-- | Same as 'trackFile' but reads from a handle instead of a file
trackHandle :: Handle -> (Double -> PitchTrack ()) -> IO ()
trackHandle = trackHandleN defaultSampleNum
-- | Same as 'trackHandle', but takes the number of samples as a first parameter
trackHandleN :: Int -> Handle -> (Double -> PitchTrack ()) -> IO ()
trackHandleN sampleNum h f = runPitchTrack sampleNum $
runEffect $ forPitch_ (samplesFromHandle h) f
-- | Track a lazy 'LBS.ByteString' and apply a function to each computed pitch
trackLBS :: LBS.ByteString -> (Double -> PitchTrack ()) -> IO ()
trackLBS = trackLBSN defaultSampleNum
-- | Same as 'trackLBS', but takes the number of samples as a first parameter
trackLBSN :: Int -> LBS.ByteString -> (Double -> PitchTrack ()) -> IO ()
trackLBSN sampleNum lbs f = runPitchTrack sampleNum $
runEffect $ forPitch_ (samplesFromLBS lbs) f
-- | Track a file and return a list of all the computed pitches
--
-- Note: the whole list is loaded into memory
trackFileToList :: FilePath -> IO [Double]
trackFileToList = trackFileToListN defaultSampleNum
trackFileToListN :: Int -> FilePath -> IO [Double]
trackFileToListN sampleNum file = withFileR file $ \h ->
runPitchTrack sampleNum $ P.toListM $ forPitch (samplesFromHandle h) return
-- | The default number of samples used for each computation (2048)
defaultSampleNum :: Int
defaultSampleNum = 2048
withFileR :: FilePath -> (Handle -> IO r) -> IO r
withFileR file = withFile file ReadMode