module Sound.MED.Raw.MMD2 where

import qualified Sound.MED.Raw.MMD2Song as MMD2Song
import Sound.MED.Raw.MMD2Song(MMD2Song)
import qualified Sound.MED.Raw.MMD1Block as MMD1Block
import Sound.MED.Raw.MMD1Block(MMD1Block)
import qualified Sound.MED.Raw.InstrHdr as InstrHdr
import Sound.MED.Raw.InstrHdr(InstrHdr)
import qualified Sound.MED.Raw.MMD0exp as MMD0exp
import Sound.MED.Raw.MMD0exp(MMD0exp)
import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility

data MMD2 = MMD2
  { MMD2 -> ULONG
id          :: ULONG
  , MMD2 -> ULONG
modlen      :: ULONG
  , MMD2 -> MMD2Song
song        :: MMD2Song
  , MMD2 -> UWORD
psecnum     :: UWORD
  , MMD2 -> UWORD
pseq        :: UWORD
  , MMD2 -> [MMD1Block]
blockarr    :: [ MMD1Block ]
  , MMD2 -> UBYTE
mmdflags    :: UBYTE
  , MMD2 -> UBYTE
reserved1   :: UBYTE
  , MMD2 -> UBYTE
reserved2   :: UBYTE
  , MMD2 -> UBYTE
reserved3   :: UBYTE
  , MMD2 -> [Maybe InstrHdr]
smplarr     :: [ Maybe InstrHdr ]
  , MMD2 -> ULONG
reserved4   :: ULONG
  , MMD2 -> Maybe MMD0exp
expdata     :: Maybe MMD0exp
  , MMD2 -> ULONG
reserved5   :: ULONG
  , MMD2 -> UWORD
pstate      :: UWORD
  , MMD2 -> UWORD
pblock      :: UWORD
  , MMD2 -> UWORD
pline       :: UWORD
  , MMD2 -> UWORD
pseqnum     :: UWORD
  , MMD2 -> WORD
actplayline :: WORD
  , MMD2 -> UBYTE
counter     :: UBYTE
  , MMD2 -> UBYTE
extra_songs :: UBYTE
  }
  deriving (Int -> MMD2 -> ShowS
[MMD2] -> ShowS
MMD2 -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMD2] -> ShowS
$cshowList :: [MMD2] -> ShowS
show :: MMD2 -> String
$cshow :: MMD2 -> String
showsPrec :: Int -> MMD2 -> ShowS
$cshowsPrec :: Int -> MMD2 -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMD2 #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD2 #-}
peek :: (Reader m) => PTR -> m MMD2
peek :: forall (m :: * -> *). Reader m => ULONG -> m MMD2
peek ULONG
p = do
  ULONG
id'          <- forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
0)
  ULONG
modlen'      <- forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
4)
  ULONG
song''       <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
8)
  MMD2Song
song'        <- forall (m :: * -> *). Reader m => ULONG -> m MMD2Song
MMD2Song.peek ULONG
song''
  UWORD
psecnum'     <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
12)
  UWORD
pseq'        <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
14)
  ULONG
blockarr'''  <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
16)
  [ULONG]
blockarr''   <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR forall a b. (a -> b) -> a -> b
$ forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
blockarr''' ULONG
4 (MMD2Song -> UWORD
MMD2Song.numblocks MMD2Song
song')
  [MMD1Block]
blockarr'    <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => ULONG -> m MMD1Block
MMD1Block.peek [ULONG]
blockarr''
  UBYTE
mmdflags'    <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
20)
  UBYTE
reserved1'   <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
21)
  UBYTE
reserved2'   <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
22)
  UBYTE
reserved3'   <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
23)
  ULONG
smplarr'''   <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
24)
  [ULONG]
smplarr''    <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR forall a b. (a -> b) -> a -> b
$ forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGenCheck ULONG
smplarr''' ULONG
4 (MMD2Song -> UBYTE
MMD2Song.numsamples MMD2Song
song')
  [Maybe InstrHdr]
smplarr'     <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *). Reader m => ULONG -> m InstrHdr
InstrHdr.peek forall (m :: * -> *) a.
Monad m =>
(ULONG -> m a) -> ULONG -> m (Maybe a)
$?) [ULONG]
smplarr''
  ULONG
reserved4'   <- forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
28)
  ULONG
expdata'''   <- forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
32)
  Maybe MMD0exp
expdata'     <- forall (m :: * -> *). Reader m => ULONG -> m MMD0exp
MMD0exp.peek forall (m :: * -> *) a.
Monad m =>
(ULONG -> m a) -> ULONG -> m (Maybe a)
$? ULONG
expdata'''
  ULONG
reserved5'   <- forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
36)
  UWORD
pstate'      <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
40)
  UWORD
pblock'      <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
42)
  UWORD
pline'       <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
44)
  UWORD
pseqnum'     <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
46)
  WORD
actplayline' <- forall (m :: * -> *). Reader m => Peek m WORD
peekWORD  (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
48)
  UBYTE
counter'     <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
50)
  UBYTE
extra_songs' <- forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
p forall a. Num a => a -> a -> a
+ ULONG
51)
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ ULONG
-> ULONG
-> MMD2Song
-> UWORD
-> UWORD
-> [MMD1Block]
-> UBYTE
-> UBYTE
-> UBYTE
-> UBYTE
-> [Maybe InstrHdr]
-> ULONG
-> Maybe MMD0exp
-> ULONG
-> UWORD
-> UWORD
-> UWORD
-> UWORD
-> WORD
-> UBYTE
-> UBYTE
-> MMD2
MMD2
    ULONG
id' ULONG
modlen' MMD2Song
song' UWORD
psecnum' UWORD
pseq' [MMD1Block]
blockarr' UBYTE
mmdflags'
    UBYTE
reserved1' UBYTE
reserved2' UBYTE
reserved3' [Maybe InstrHdr]
smplarr' ULONG
reserved4'
    Maybe MMD0exp
expdata' ULONG
reserved5' UWORD
pstate' UWORD
pblock' UWORD
pline' UWORD
pseqnum'
    WORD
actplayline' UBYTE
counter' UBYTE
extra_songs'