module DywaPitchTrack (
PitchTrack
, runPitchTrack
, askSampleNum
, computePitch
, neededSampleNum
, sampleSize
) where
import DywaPitchTrack.Internal.Bindings
import Control.Monad.IO.Class
import Control.Monad.Trans.Reader
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import System.IO.Unsafe
newtype PitchTrack a = PitchTrack
{ unPitchTrack :: ReaderT (DywaPitchTrackPtr, Int) IO a
} deriving (Functor, Applicative, Monad, MonadIO)
runPitchTrack :: Int
-> PitchTrack a
-> IO a
runPitchTrack sampleNum f = withDywaPitchTrack $ \ptr -> do
dywapitchInitTracking ptr
runReaderT (unPitchTrack f) (ptr, sampleNum)
askSampleNum :: PitchTrack Int
askSampleNum = PitchTrack $ snd <$> ask
computePitch :: ByteString
-> PitchTrack Double
computePitch rawSample = PitchTrack $ do
(ptr, sampleNum) <- ask
liftIO $ B.useAsCString rawSample $ \cString ->
liftIO $ realToFrac <$>
dywapitchComputePitch ptr (castToPtrDouble cString) 0 (fromIntegral sampleNum)
neededSampleNum :: Int
-> Int
neededSampleNum n = unsafePerformIO $
fromIntegral <$> dywapitchNeededSampleCount (fromIntegral n)