    {- |
    System Real Time messages
    -}
    module Sound.MIDI.Message.System.RealTime (
       T(..), get, put,
       ) where

    -- import           Sound.MIDI.Parser.Primitive
    import qualified Sound.MIDI.Parser.Class as Parser

    import qualified Sound.MIDI.Writer.Basic as Writer

    import Data.Ix(Ix)

    data T =
         TimingClock                   -- F8
       | Start                         -- FA
       | Continue                      -- FB
       | Stop                          -- FC
       | ActiveSensing                 -- FE
       | Reset                         -- FF
       deriving (Eq, Ord, Show, Enum, Ix)

    -- * serialization

    get :: Parser.C parser => Int -> Parser.Fallible parser T
    get code =
       case code of
          0xF8 -> return TimingClock
          0xFA -> return Start
          0xFB -> return Continue
          0xFC -> return Stop
          0xFE -> return ActiveSensing
          0xFF -> return Reset
          _    -> Parser.giveUp ("unknown System Real Time message code " ++ show code)

    put :: Writer.C writer => T -> writer
    put msg =
       case msg of
          TimingClock   -> Writer.putByte 0xF8
          Start         -> Writer.putByte 0xFA
          Continue      -> Writer.putByte 0xFB
          Stop          -> Writer.putByte 0xFC
          ActiveSensing -> Writer.putByte 0xFE
          Reset         -> Writer.putByte 0xFF