packages feed

padKONTROL-0.1: UI/PadKontrol/Types.hs

{-# LANGUAGE GADTs, FlexibleContexts #-}
module UI.PadKontrol.Types where
import Data.Word
import Control.Monad.Operational.Mini

data Pad = Pad01 | Pad02 | Pad03 | Pad04
         | Pad05 | Pad06 | Pad07 | Pad08
         | Pad09 | Pad10 | Pad11 | Pad12
         | Pad13 | Pad14 | Pad15 | Pad16
          deriving (Show, Read, Eq, Ord, Enum)

data Button = ButtonScene | ButtonMessage | ButtonSetting
    | ButtonNoteCC | ButtonMidiCh | ButtonSWType | ButtonRelVal | ButtonVelocity | ButtonPort
    | ButtonFixedVelocity | ButtonProgChange
    | ButtonX | ButtonY | ButtonKnob1Assign | ButtonKnob2Assign | ButtonPedal
    | ButtonRoll | ButtonFlam | ButtonHold deriving (Show, Read, Eq, Ord, Enum)

data SevenSegment = SegTop
    | SegUpperRight
    | SegLowerRight
    | SegBottom
    | SegLowerLeft
    | SegUpperLeft
    | SegCenter
    | SegPoint
    deriving (Show, Read, Eq, Ord, Enum)

data Light = Off | On | Blink | Flash Float

data Message x where
    Display :: Word8 -> Word8 -> Word8 -> Message ()
    DisplayBlink :: Word8 -> Word8 -> Word8 -> Message ()
    DisplayLeft :: SevenSegment -> Light -> Message ()
    DisplayCenter :: SevenSegment -> Light -> Message ()
    DisplayRight :: SevenSegment -> Light -> Message ()
    PadLight :: Pad -> Light -> Message ()
    ButtonLight :: Button -> Light -> Message ()
    AllLight :: (Either Pad Button -> Bool) -> Word8 -> Word8 -> Word8 -> Message ()
    LiftIO :: IO a -> Message a

display :: Operational Message m => Word8 -> Word8 -> Word8 -> m ()
display x y z = singleton $ Display x y z

displayBlink :: Operational Message m => Word8 -> Word8 -> Word8 -> m ()
displayBlink x y z = singleton $ DisplayBlink x y z

displayLeft :: Operational Message m => SevenSegment -> Light -> m ()
displayLeft s l = singleton $ DisplayLeft s l

displayCenter :: Operational Message m => SevenSegment -> Light -> m ()
displayCenter s l = singleton $ DisplayCenter s l

displayRight :: Operational Message m => SevenSegment -> Light -> m ()
displayRight s l = singleton $ DisplayRight s l

padLight :: Operational Message m => Pad -> Light -> m ()
padLight p l = singleton $ PadLight p l

buttonLight :: Operational Message m => Button -> Light -> m ()
buttonLight b l = singleton $ ButtonLight b l

allLight :: Operational Message m => (Either Pad Button -> Bool) -> Word8 -> Word8 -> Word8 -> m ()
allLight w x y z = singleton $ AllLight w x y z

data Event = PadDown Pad Int
    | PadUp Pad
    | ButtonDown Button
    | ButtonUp Button
    | Knob1 Float
    | Knob2 Float
    | XYPad Float Float
    | XYTouch
    | XYRelease
    | JogCW
    | JogCCW
    | PedalDown
    | PedalUp
    deriving Show