module Sound.MED.Raw.NotationInfo where

import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility

data NotationInfo = NotationInfo
  { NotationInfo -> UBYTE
n_of_sharps :: UBYTE
  , NotationInfo -> UBYTE
flags       :: UBYTE
  , NotationInfo -> [WORD]
trksel      :: [ WORD ]
  , NotationInfo -> [UBYTE]
trkshow     :: [ UBYTE ]
  , NotationInfo -> [UBYTE]
trkghost    :: [ UBYTE ]
  , NotationInfo -> [BYTE]
notetr      :: [ BYTE ]
  , NotationInfo -> UBYTE
pad         :: UBYTE
  }
  deriving (Int -> NotationInfo -> ShowS
[NotationInfo] -> ShowS
NotationInfo -> String
(Int -> NotationInfo -> ShowS)
-> (NotationInfo -> String)
-> ([NotationInfo] -> ShowS)
-> Show NotationInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NotationInfo] -> ShowS
$cshowList :: [NotationInfo] -> ShowS
show :: NotationInfo -> String
$cshow :: NotationInfo -> String
showsPrec :: Int -> NotationInfo -> ShowS
$cshowsPrec :: Int -> NotationInfo -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader NotationInfo #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader NotationInfo #-}
peek :: (Reader m) => PTR -> m NotationInfo
peek :: PTR -> m NotationInfo
peek PTR
p = do
  UBYTE
n_of_sharps' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
0)
  UBYTE
flags'       <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
1)
  [WORD]
trksel'      <- (PTR -> m WORD) -> [PTR] -> m [WORD]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> m WORD
forall (m :: * -> *). Reader m => Peek m WORD
peekWORD  ([PTR] -> m [WORD]) -> [PTR] -> m [WORD]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+ PTR
2) PTR
2 Int
5
  [UBYTE]
trkshow'     <- Peek m UBYTE -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([PTR] -> m [UBYTE]) -> [PTR] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
22) PTR
1 Int
16
  [UBYTE]
trkghost'    <- Peek m UBYTE -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([PTR] -> m [UBYTE]) -> [PTR] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
38) PTR
1 Int
16
  [BYTE]
notetr'      <- (PTR -> m BYTE) -> [PTR] -> m [BYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> m BYTE
forall (m :: * -> *). Reader m => Peek m BYTE
peekBYTE  ([PTR] -> m [BYTE]) -> [PTR] -> m [BYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
54) PTR
1 Int
63
  UBYTE
pad'         <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
117)
  NotationInfo -> m NotationInfo
forall (m :: * -> *) a. Monad m => a -> m a
return (NotationInfo -> m NotationInfo) -> NotationInfo -> m NotationInfo
forall a b. (a -> b) -> a -> b
$ UBYTE
-> UBYTE
-> [WORD]
-> [UBYTE]
-> [UBYTE]
-> [BYTE]
-> UBYTE
-> NotationInfo
NotationInfo
    UBYTE
n_of_sharps' UBYTE
flags' [WORD]
trksel' [UBYTE]
trkshow' [UBYTE]
trkghost' [BYTE]
notetr' UBYTE
pad'