{-# Language TypeFamilies #-}
module Csound.Typed.Control.Sf2(
    Sf(..), unSf
) where

import Data.Boolean
import Data.Default

import qualified Csound.Dynamic as D

import Csound.Typed.Types
import Csound.Typed.GlobalState

-- | The sf2 sound font preset. It is defined with
-- file name, bank and program integers.
data Sf = Sf 
    { sfName :: String
    , sfBank :: Int
    , sfProg :: Int } 
    | SfId (GE E)
    
instance Val Sf where
    fromGE = SfId
    toGE   = unSf

unSf :: Sf -> GE E
unSf x = case x of
    SfId a -> a
    Sf name bank prog -> fmap D.int $ saveSf (SfSpec name bank prog)

instance Default Sf where 
    def = fromE 0

type instance BooleanOf Sf  = BoolD
instance IfB Sf where ifB = on3 ifB