module Sound.MED.Raw.MMD0exp where

import qualified Sound.MED.Raw.InstrExt as InstrExt
import Sound.MED.Raw.InstrExt(InstrExt)
import qualified Sound.MED.Raw.MMDInstrInfo as MMDInstrInfo
import Sound.MED.Raw.MMDInstrInfo(MMDInstrInfo)
import qualified Sound.MED.Raw.NotationInfo as NotationInfo
import Sound.MED.Raw.NotationInfo(NotationInfo)
import qualified Sound.MED.Raw.MMDDumpData as MMDDumpData
import Sound.MED.Raw.MMDDumpData(MMDDumpData)
import qualified Sound.MED.Raw.MMDInfo as MMDInfo
import Sound.MED.Raw.MMDInfo(MMDInfo)
import qualified Sound.MED.Raw.MMDARexx as MMDARexx
import Sound.MED.Raw.MMDARexx(MMDARexx)
import qualified Sound.MED.Raw.MMDMIDICmd3x as MMDMIDICmd3x
import Sound.MED.Raw.MMDMIDICmd3x(MMDMIDICmd3x)

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

data MMD0exp = MMD0exp
  { MMD0exp -> PTR
nextmod       :: PTR -- FIXME
  , MMD0exp -> [InstrExt]
exp_smp       :: [ InstrExt ]
  , MMD0exp -> UWORD
s_ext_entries :: UWORD
  , MMD0exp -> UWORD
s_ext_entrsz  :: UWORD
  , MMD0exp -> [UBYTE]
annotxt       :: [ UBYTE ]
  , MMD0exp -> PTR
annolen       :: ULONG
  , MMD0exp -> [MMDInstrInfo]
iinfo         :: [ MMDInstrInfo ]
  , MMD0exp -> UWORD
i_ext_entries :: UWORD
  , MMD0exp -> UWORD
i_ext_entrsz  :: UWORD
  , MMD0exp -> PTR
jumpmask      :: ULONG
  , MMD0exp -> [UWORD]
rgbtable      :: [ UWORD ]
  , MMD0exp -> [UBYTE]
channelsplit  :: [ UBYTE ]
  , MMD0exp -> Maybe NotationInfo
n_info        :: Maybe NotationInfo
  , MMD0exp -> [UBYTE]
songname      :: [ UBYTE ]
  , MMD0exp -> PTR
songnamelen   :: ULONG
  , MMD0exp -> Maybe MMDDumpData
dumps         :: Maybe MMDDumpData
  , MMD0exp -> Maybe MMDInfo
mmdinfo       :: Maybe MMDInfo
  , MMD0exp -> Maybe MMDARexx
mmdrexx       :: Maybe MMDARexx
  , MMD0exp -> Maybe MMDMIDICmd3x
mmdcmd3x      :: Maybe MMDMIDICmd3x
  , MMD0exp -> [PTR]
reserved2     :: [ ULONG ]
  , MMD0exp -> PTR
tag_end       :: ULONG
  }
  deriving (Int -> MMD0exp -> ShowS
[MMD0exp] -> ShowS
MMD0exp -> String
(Int -> MMD0exp -> ShowS)
-> (MMD0exp -> String) -> ([MMD0exp] -> ShowS) -> Show MMD0exp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMD0exp] -> ShowS
$cshowList :: [MMD0exp] -> ShowS
show :: MMD0exp -> String
$cshow :: MMD0exp -> String
showsPrec :: Int -> MMD0exp -> ShowS
$cshowsPrec :: Int -> MMD0exp -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMD0exp #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD0exp #-}
peek :: (Reader m) => PTR -> m MMD0exp
peek :: PTR -> m MMD0exp
peek PTR
p = do
  PTR
nextmod'       <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
0)
  PTR
exp_smp''      <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
4)
  UWORD
s_ext_entries' <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
8)
  UWORD
s_ext_entrsz'  <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
10)
  [InstrExt]
exp_smp'       <- (PTR -> m InstrExt) -> [PTR] -> m [InstrExt]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (UWORD -> PTR -> m InstrExt
forall (m :: * -> *). Reader m => UWORD -> PTR -> m InstrExt
InstrExt.peek UWORD
s_ext_entrsz') ([PTR] -> m [InstrExt]) -> [PTR] -> m [InstrExt]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> UWORD -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
exp_smp'' (UWORD -> PTR
forall a b. (Integral a, Num b) => a -> b
fromIntegral UWORD
s_ext_entrsz') UWORD
s_ext_entries'
  PTR
annotxt''      <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
12)
  PTR
annolen'       <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekULONG (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
16)
  [UBYTE]
annotxt'       <- (PTR -> m UBYTE) -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> 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 -> PTR -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
annotxt'' PTR
1 PTR
annolen'
  PTR
iinfo''        <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
20)
  UWORD
i_ext_entries' <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
24)
  UWORD
i_ext_entrsz'  <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
26)
  [MMDInstrInfo]
iinfo'         <- (PTR -> m MMDInstrInfo) -> [PTR] -> m [MMDInstrInfo]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (UWORD -> PTR -> m MMDInstrInfo
forall (m :: * -> *). Reader m => UWORD -> PTR -> m MMDInstrInfo
MMDInstrInfo.peek UWORD
i_ext_entrsz') ([PTR] -> m [MMDInstrInfo]) -> [PTR] -> m [MMDInstrInfo]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> UWORD -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
iinfo'' (UWORD -> PTR
forall a b. (Integral a, Num b) => a -> b
fromIntegral UWORD
i_ext_entrsz') UWORD
i_ext_entries'
  PTR
jumpmask'      <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekULONG (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
28)
  PTR
rgbtable''     <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
32)
  [UWORD]
rgbtable'      <- Peek m UWORD -> [PTR] -> m [UWORD]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD ([PTR] -> m [UWORD]) -> [PTR] -> m [UWORD]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
rgbtable'' PTR
2 (Int
8::Int)
  [UBYTE]
channelsplit'  <- (PTR -> m UBYTE) -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> 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
36) PTR
1 Int
4
  PTR
n_info'''      <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
40)
  Maybe NotationInfo
n_info'        <- PTR -> m NotationInfo
forall (m :: * -> *). Reader m => PTR -> m NotationInfo
NotationInfo.peek (PTR -> m NotationInfo) -> PTR -> m (Maybe NotationInfo)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
n_info'''
  PTR
songname''     <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
44)
  PTR
songnamelen'   <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekULONG (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
48)
  [UBYTE]
songname'      <- (PTR -> m UBYTE) -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> 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 -> PTR -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGenCheck PTR
songname'' PTR
1 PTR
songnamelen'
  PTR
dumps'''       <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
52)
  Maybe MMDDumpData
dumps'         <- PTR -> m MMDDumpData
forall (m :: * -> *). Reader m => PTR -> m MMDDumpData
MMDDumpData.peek (PTR -> m MMDDumpData) -> PTR -> m (Maybe MMDDumpData)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
dumps'''
  PTR
mmdinfo'''     <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
56)
  Maybe MMDInfo
mmdinfo'       <- PTR -> m MMDInfo
forall (m :: * -> *). Reader m => PTR -> m MMDInfo
MMDInfo.peek (PTR -> m MMDInfo) -> PTR -> m (Maybe MMDInfo)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
mmdinfo'''
  PTR
mmdrexx'''     <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
60)
  Maybe MMDARexx
mmdrexx'       <- PTR -> m MMDARexx
forall (m :: * -> *). Reader m => PTR -> m MMDARexx
MMDARexx.peek (PTR -> m MMDARexx) -> PTR -> m (Maybe MMDARexx)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
mmdrexx'''
  PTR
mmdcmd3x'''    <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR   (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
64)
  Maybe MMDMIDICmd3x
mmdcmd3x'      <- PTR -> m MMDMIDICmd3x
forall (m :: * -> *). Reader m => PTR -> m MMDMIDICmd3x
MMDMIDICmd3x.peek (PTR -> m MMDMIDICmd3x) -> PTR -> m (Maybe MMDMIDICmd3x)
forall (m :: * -> *) a.
Monad m =>
(PTR -> m a) -> PTR -> m (Maybe a)
$? PTR
mmdcmd3x'''
  [PTR]
reserved2'     <- Peek m PTR -> [PTR] -> m [PTR]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekULONG ([PTR] -> m [PTR]) -> [PTR] -> m [PTR]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
68) PTR
4 Int
3
  PTR
tag_end'       <- Peek m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekULONG (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
80)
  MMD0exp -> m MMD0exp
forall (m :: * -> *) a. Monad m => a -> m a
return (MMD0exp -> m MMD0exp) -> MMD0exp -> m MMD0exp
forall a b. (a -> b) -> a -> b
$ PTR
-> [InstrExt]
-> UWORD
-> UWORD
-> [UBYTE]
-> PTR
-> [MMDInstrInfo]
-> UWORD
-> UWORD
-> PTR
-> [UWORD]
-> [UBYTE]
-> Maybe NotationInfo
-> [UBYTE]
-> PTR
-> Maybe MMDDumpData
-> Maybe MMDInfo
-> Maybe MMDARexx
-> Maybe MMDMIDICmd3x
-> [PTR]
-> PTR
-> MMD0exp
MMD0exp
    PTR
nextmod' [InstrExt]
exp_smp' UWORD
i_ext_entries' UWORD
s_ext_entrsz' [UBYTE]
annotxt' PTR
annolen'
    [MMDInstrInfo]
iinfo' UWORD
i_ext_entries' UWORD
i_ext_entrsz' PTR
jumpmask' [UWORD]
rgbtable'
    [UBYTE]
channelsplit' Maybe NotationInfo
n_info' [UBYTE]
songname' PTR
songnamelen' Maybe MMDDumpData
dumps' Maybe MMDInfo
mmdinfo'
    Maybe MMDARexx
mmdrexx' Maybe MMDMIDICmd3x
mmdcmd3x' [PTR]
reserved2' PTR
tag_end'