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

-- ConductiveDefaults.hs
-- created: Sun Sep 16 22:15:39 JST 2012

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

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

module Sound.Conductive.ConductiveDefaults where

import Control.Concurrent.STM
import Data.Map
import Sound.Conductive.ConductiveBaseData
import Sound.Conductive.MusicalEnvironment
import Sound.Conductive.MusicalTime
import Sound.Conductive.MutableMap
import Sound.Conductive.Player

defaultPlayerStore :: IO (TVar (Map String Player))
defaultPlayerStore = newPlayerStore ("default",("default","defaultIOI","defaultAction",0))

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 (TVar (Map [Char] TempoClock))
defaultTempoClockStore = do 
    t <- defaultTempoClock
    newMMap [("default",t)]

defaultActionStore :: IO (TVar (Map [Char] (t -> t1 -> t2 -> t3 -> IO ())))
defaultActionStore = newMMap [("defaultAction", (\x y z zz -> putStrLn message))]
    where message = "The default action is to print this message: yeah!"

-- defaultIOI e p = iOIFromList e p "default"

defaultIOIStore :: IO (TVar (Map [Char] a))
defaultIOIStore = newMMap [("defaultIOI", undefined)]

defaultInterruptStore :: IO (TVar (Map [Char] [IO ()]))
defaultInterruptStore = newMMap [("defaultInterrupt",[return()::IO()])]

defaultMusicalEnvironment :: IO MusicalEnvironment
defaultMusicalEnvironment = do
    tcs <- defaultTempoClockStore
    ps <- defaultPlayerStore
    iois <- defaultIOIStore
    acs <- defaultActionStore
    ints <- defaultInterruptStore
    let me = MusicalEnvironment
                    { environmentName = "default MusicalEnvironment"
                    , playerStore = ps
                    , tempoClockStore = tcs
                    , iOIStore = iois
                    , actionStore = acs
                    , interruptStore = ints
                    }
    return me