packages feed

synthesizer-llvm-0.8: render/Synthesizer/LLVM/Server/Option.hs

module Synthesizer.LLVM.Server.Option (
   T(..),
   get,
   ) where

import qualified Synthesizer.LLVM.Server.OptionCommon as Option
import qualified Synthesizer.LLVM.Server.Default as Default
import Synthesizer.LLVM.Server.Common (SampleRate, )
import qualified Data.StorableVector.Lazy as SVL

import qualified Sound.MIDI.Message.Channel as ChannelMsg

import qualified System.Path as Path

import qualified Options.Applicative as OP
import Control.Applicative (pure, (<$>), (<*>), )
import Data.Maybe (fromMaybe, )
import Data.Monoid ((<>), )

import Prelude hiding (Real, )


data T =
   Cons {
      channel, extraChannel :: ChannelMsg.Channel,
      sampleDirectory :: Path.AbsRelDir,
      sampleRate :: SampleRate Int,
      chunkSize :: SVL.ChunkSize
--      volume :: Float
   }
   deriving (Show)



options :: OP.Parser T
options =
   pure Cons
   <*> Option.channel
   <*> Option.extraChannel
   <*> Option.sampleDirectory
   <*> fmap (fromMaybe Default.sampleRate) Option.sampleRate
   <*> Option.blockSize (SVL.chunkSize (128*1024))
{-
   <*>
      (OP.option (parseNumber "volume" (const True) "any")
         (OP.short 'v' <>
          OP.long "volume" <>
          OP.metavar "FACTOR" <>
          OP.help "global volume")
-}


parser :: OP.Parser (T, String, Maybe String)
parser =
   pure (,,)
   <*> options
   <*> OP.strArgument (OP.metavar "infile.mid")
   <*> OP.argument (Just <$> OP.str)
         (OP.metavar "outfile.wav" <> OP.value Nothing)


get :: IO (T, String, Maybe String)
get = Option.get parser "Render MIDI to audio files using LLVM and SoX"