Skip to content

Instantly share code, notes, and snippets.

@dramforever
Created August 26, 2014 14:02
Show Gist options
  • Save dramforever/7e9cb4a9c5ed4f0342fa to your computer and use it in GitHub Desktop.
Save dramforever/7e9cb4a9c5ed4f0342fa to your computer and use it in GitHub Desktop.
hrevoice
module Main where
import Sound.Wav
import Data.Int
import qualified Data.ByteString.Lazy as B
import Data.ByteString.Lazy.Builder
import Data.Monoid
import System.Environment
import System.Exit
import System.IO
reverseData :: Int64 -> B.ByteString -> B.ByteString
reverseData c d = flipper . B.reverse $ d
where flipperBuilder b
| B.null b = mempty
| otherwise =
let (x, y) = B.splitAt c b
x' = B.reverse x
in lazyByteString x' <> flipperBuilder y
flipper b = toLazyByteString (flipperBuilder b)
reverseWaveFile :: WaveFile -> Either String WaveFile
reverseWaveFile wf = Right wf'
where wf' = wf { waveData = wd' }
wd' = reverseData chans wd
wd = waveData wf
chans = fromIntegral . waveNumChannels . waveFormat $ wf
main :: IO ()
main = do
args <- getArgs
case args of
[fromFile, toFile] -> withWaveFile fromFile $ \ewf -> do
case ewf of
Left err -> do
hPutStrLn stderr "Parse error"
hPutStrLn stderr err
exitFailure
Right wf -> do
case reverseWaveFile wf of
Right rwf -> do
encodeWaveFile toFile rwf
hPutStrLn stderr "Done!"
Left err -> do
hPutStrLn stderr "Decode error"
hPutStrLn stderr err
exitFailure
_ -> do
hPutStrLn stderr "Usage: hrevoice <from> <to>"
exitFailure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment