packages feed

tidal-1.10.3: src/Sound/Tidal/Config.hs

module Sound.Tidal.Config where

import Control.Monad (when)
import Data.Int (Int64)
import Foreign.C (CDouble)
import qualified Sound.Tidal.Clock as Clock

{-
    Config.hs - For default Tidal configuration values.
    Copyright (C) 2020, Alex McLean and contributors

    This library 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.

    This library 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 library.  If not, see <http://www.gnu.org/licenses/>.
-}

data Config = Config
  { cCtrlListen :: Bool,
    cCtrlAddr :: String,
    cCtrlPort :: Int,
    cCtrlBroadcast :: Bool,
    cVerbose :: Bool,
    cQuantum :: CDouble,
    cBeatsPerCycle :: CDouble,
    cFrameTimespan :: Double,
    cEnableLink :: Bool,
    cSkipTicks :: Int64,
    cProcessAhead :: Double
  }

defaultConfig :: Config
defaultConfig =
  Config
    { cCtrlListen = True,
      cCtrlAddr = "127.0.0.1",
      cCtrlPort = 6010,
      cCtrlBroadcast = False,
      cVerbose = True,
      cFrameTimespan = Clock.clockFrameTimespan Clock.defaultConfig,
      cEnableLink = Clock.clockEnableLink Clock.defaultConfig,
      cProcessAhead = Clock.clockProcessAhead Clock.defaultConfig,
      cSkipTicks = Clock.clockSkipTicks Clock.defaultConfig,
      cQuantum = Clock.clockQuantum Clock.defaultConfig,
      cBeatsPerCycle = Clock.clockBeatsPerCycle Clock.defaultConfig
    }

toClockConfig :: Config -> Clock.ClockConfig
toClockConfig conf =
  Clock.ClockConfig
    { Clock.clockFrameTimespan = cFrameTimespan conf,
      Clock.clockEnableLink = cEnableLink conf,
      Clock.clockProcessAhead = cProcessAhead conf,
      Clock.clockSkipTicks = cSkipTicks conf,
      Clock.clockQuantum = cQuantum conf,
      Clock.clockBeatsPerCycle = cBeatsPerCycle conf
    }

verbose :: Config -> String -> IO ()
verbose c s = when (cVerbose c) $ putStrLn s

setFrameTimespan :: Double -> Config -> Config
setFrameTimespan n c =
  c {cFrameTimespan = n}

setProcessAhead :: Double -> Config -> Config
setProcessAhead n c =
  c
    { cProcessAhead = n
    }