module Main where
import qualified SoundCollage
import qualified Option
import qualified Options.Applicative as OP
import qualified System.Exit as Exit
import qualified System.IO as IO
import System.FilePath ((</>), )
import System.IO.Temp (withSystemTempDirectory, )
exitFailureMsg :: String -> IO a
exitFailureMsg msg = do
IO.hPutStrLn IO.stderr msg
Exit.exitFailure
setChunkSize :: Int -> SoundCollage.Parameters -> SoundCollage.Parameters
setChunkSize chunkSize params =
params {
SoundCollage.paramShift =
div chunkSize (SoundCollage.paramOverlap params)
}
makeParams :: Maybe Int -> SoundCollage.Parameters
makeParams maybeChunkSize =
maybe
SoundCollage.defltParams
(flip setChunkSize SoundCollage.defltParams)
maybeChunkSize
main :: IO ()
main = do
Option.Cons maybeChunkSize action src dst <- OP.execParser Option.info
case action of
Option.Decompose ->
SoundCollage.runDecompose (makeParams maybeChunkSize) src dst
Option.Compose ->
SoundCollage.runCompose (makeParams maybeChunkSize) src dst
Option.Associate pool ->
SoundCollage.runAssociate (makeParams maybeChunkSize) pool src dst
Option.Batch pool ->
withSystemTempDirectory "sound-chunks" $ \chunkDir ->
withSystemTempDirectory "sound-collage" $ \collDir -> do
chunkSize <-
maybe
(SoundCollage.chunkSizeFromPool pool)
return
maybeChunkSize
let params = setChunkSize chunkSize SoundCollage.defltParams
putStrLn $ "determined chunk size: " ++ show chunkSize
putStrLn $ "decompose to " ++ chunkDir
SoundCollage.runDecompose params src
(chunkDir </> "%06d/%06d")
putStrLn $ "associate to " ++ collDir
SoundCollage.runAssociate params pool chunkDir collDir
putStrLn "compose"
SoundCollage.runCompose params collDir dst