-- -*- Mode: Haskell; -*-
--
-- Main module of MIDA describes logic of the program on top level.
--
-- Copyright © 2014, 2015 Mark Karpov
--
-- MIDA is free software: you can redistribute it and/or modify it under the
-- terms of the GNU General Public License as published by the Free Software
-- Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- MIDA is distributed in the hope that it will be useful, but WITHOUT ANY
-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-- details.
--
-- You should have received a copy of the GNU General Public License along
-- with this program. If not, see .
module Main (main) where
import Control.Monad
import Options.Applicative
import System.Directory (getHomeDirectory, doesFileExist, getCurrentDirectory)
import System.FilePath
import qualified Data.Map as M
import qualified Data.Text.Format as F
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as T
import Mida.Configuration
import Mida.Interaction
data Opts = Opts
{ opInterac :: Bool
, opSeed :: Int
, opQuarter :: Int
, opBeats :: Int
, opOutput :: String
, opLicense :: Bool
, opVersion :: Bool
, opFiles :: [String] }
main :: IO ()
main = execParser opts >>= f
where f Opts { opLicense = True } = T.putStr license
f Opts { opVersion = True } = F.print "MIDA {}\n" (F.Only version)
f Opts { opFiles = [] } = g $ interaction version
f Opts { opInterac = True
, opFiles = ns } = g $ cmdLoad ns >> interaction version
f Opts { opSeed = s
, opQuarter = q
, opBeats = b
, opOutput = out
, opFiles = ns } = g $ cmdLoad ns >> cmdMake s q b out
g x = T.putStrLn notice >> runMida x
version = "0.4.4"
notice :: T.Text
notice =
"MIDA Copyright © 2014, 2015 Mark Karpov\n\n\
\This program comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
\and you are welcome to redistribute it under certain conditions; see\n\
\GNU General Public License for details.\n"
license :: T.Text
license =
"MIDA — realization of MIDA, language for generation of MIDI files.\n\
\Copyright © 2014, 2015 Mark Karpov\n\
\\n\
\MIDA is free software: you can redistribute it and/or modify it under the\n\
\terms of the GNU General Public License as published by the Free Software\n\
\Foundation, either version 3 of the License, or (at your option) any\n\
\later version.\n\
\\n\
\MIDA is distributed in the hope that it will be useful, but WITHOUT ANY\n\
\WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n\
\FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n\
\details.\n\
\\n\
\You should have received a copy of the GNU General Public License along\n\
\with this program. If not, see .\n"
runMida :: MidaIO () -> IO ()
runMida e = do
params <- loadConfig
wdir <- getCurrentDirectory
void $ runMidaInt e
MidaSt { stPrevLen = lookupCfg params "prvlen" 18
, stSrcFile = lookupCfg params "src" wdir > "foo.da"
, stProg = lookupCfg params "prog" 0
, stTempo = lookupCfg params "tempo" 120 }
MidaCfg { cfgPrompt = lookupCfg params "prompt" "> "
, cfgVerbose = lookupCfg params "verbose" True
, cfgPrvCmd = lookupCfg params "prvcmd" "timidity"
, cfgProgOp = lookupCfg params "progop" "--force-program"
, cfgTempoOp = lookupCfg params "tempop" "--adjust-tempo" }
loadConfig :: IO Params
loadConfig = do
home <- getHomeDirectory
let file = home > ".mida"
exist <- doesFileExist file
if exist
then do params <- parseConfig file <$> T.readFile file
case params of
Right x -> return x
Left _ -> return M.empty
else return M.empty
opts :: ParserInfo Opts
opts = info (helper <*> options)
( fullDesc
<> progDesc "starts MIDA interpreter or translates source into MIDI file"
<> header "mida — interpreter for MIDA language" )
options :: Parser Opts
options = Opts
<$> switch
( long "interactive"
<> short 'i'
<> help "Start MIDA in interactive mode" )
<*> option auto
( long "seed"
<> short 's'
<> metavar "SEED"
<> value dfltSeed
<> help ("Set seed for MIDI generation, default is " ++ show dfltSeed) )
<*> option auto
( long "quarter"
<> short 'q'
<> metavar "TICKS"
<> value dfltQuarter
<> help ("Set ticks per quarter note, default is " ++ show dfltQuarter) )
<*> option auto
( long "beats"
<> short 'b'
<> metavar "BEATS"
<> value dfltBeats
<> help ("Set total time in quarter notes, default is " ++ show dfltBeats) )
<*> strOption
( long "output"
<> short 'o'
<> metavar "OUT"
<> value ""
<> help "Set name of output file" )
<*> switch
( long "license"
<> help "Show license of the program" )
<*> switch
( long "version"
<> help "Show version of the program" )
<*> many (strArgument $ metavar "FILES")