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"