------------------------------------------------------------------------------

-- ConductiveDefaults.hs
-- created: Fri Oct  1 23:21:01 JST 2010

------------------------------------------------------------------------------

-- This module contains useful defaults for getting started with Conductive.

module Sound.Conductive.ConductiveDefaults where

import Control.Concurrent.MVar
import Data.Map
import Sound.Conductive.ConductiveBaseData
import Sound.Conductive.Generator
import Sound.Conductive.IOI
import Sound.Conductive.MusicalEnvironment
import Sound.Conductive.MusicalTime
import Sound.Conductive.Player

defaultPlayerStore :: Data.Map.Map String Player
defaultPlayerStore = newPlayerStore ("default",("default","defaultIOI","defaultAction",50))

defaultTempoClock :: IO TempoClock
defaultTempoClock = do
    s <- currentTime
    let defaultTempo = TempoChange { newTempo = 120
                                   , beatOfTempoChange = 0
                                   , timeOfTempoChange = s
                                   }
    let defaultTS = TimeSignature { startingMeasure = 0
                                  , startingBeat = 0
                                  , timeSignature = 4
                                  }
    return $ TempoClock { startTime = s
                        , tempoChanges = [defaultTempo]
                        , timeSignatureChanges = [defaultTS]
                        }

defaultTempoClockStore :: IO (Map [Char] TempoClock)
defaultTempoClockStore = do 
    t <- defaultTempoClock
    return $ fromList [("default",t)]

defaultActionStore :: Data.Map.Map [Char] (t -> t1 -> IO ())
defaultActionStore = fromList [("defaultAction", (\x y -> putStrLn "yeah!"))]

defaultIOI :: MVar MusicalEnvironment -> Player -> IO Double
defaultIOI e p = iOIFromList e p "default"

defaultIOIStore
  :: Data.Map.Map
       [Char] (MVar MusicalEnvironment -> Player -> IO Double)
defaultIOIStore = fromList [("defaultIOI", defaultIOI)]

defaultInterruptStore :: Data.Map.Map [Char] [IO ()]
defaultInterruptStore = fromList [("defaultInterrupt",[return()::IO()])]

defaultIOIListStore :: Data.Map.Map [Char] [Double]
defaultIOIListStore = fromList [("default",makeIOIList 0 [1.0])]

defaultMusicalEnvironment :: IO (MVar MusicalEnvironment)
defaultMusicalEnvironment = do
    tcs <- defaultTempoClockStore
    gs  <- defaultGeneratorStore
    let me = MusicalEnvironment
                    { environmentName = "defaultEnvironment"
                    , playerStore = defaultPlayerStore
                    , tempoClockStore = tcs
                    , iOIStore = defaultIOIStore
                    , actionStore = defaultActionStore
                    , interruptStore = defaultInterruptStore
                    , doubleGeneratorStore = gs
                    , iOIListStore = defaultIOIListStore
                    }
    newMVar me