packages feed

synthesizer-llvm-1.1.0.1: 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"