module Sound.MED.Raw.MMD0 where

import qualified Sound.MED.Raw.MMD0Song as MMD0Song
import Sound.MED.Raw.MMD0Song(MMD0Song)
import qualified Sound.MED.Raw.MMD0Block as MMD0Block
import Sound.MED.Raw.MMD0Block(MMD0Block)
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 MMD0 = MMD0
  { MMD0 -> ULONG
id          :: ULONG
  , MMD0 -> ULONG
modlen      :: ULONG
  , MMD0 -> MMD0Song
song        :: MMD0Song
  , MMD0 -> UWORD
psecnum     :: UWORD
  , MMD0 -> UWORD
pseq        :: UWORD
  , MMD0 -> [MMD0Block]
blockarr    :: [ MMD0Block ]
  , MMD0 -> UBYTE
mmdflags    :: UBYTE
  , MMD0 -> UBYTE
reserved1   :: UBYTE
  , MMD0 -> UBYTE
reserved2   :: UBYTE
  , MMD0 -> UBYTE
reserved3   :: UBYTE
  , MMD0 -> [Maybe InstrHdr]
smplarr     :: [ Maybe InstrHdr ]
  , MMD0 -> ULONG
reserved4   :: ULONG
  , MMD0 -> Maybe MMD0exp
expdata     :: Maybe MMD0exp
  , MMD0 -> ULONG
reserved5   :: ULONG
  , MMD0 -> UWORD
pstate      :: UWORD
  , MMD0 -> UWORD
pblock      :: UWORD
  , MMD0 -> UWORD
pline       :: UWORD
  , MMD0 -> UWORD
pseqnum     :: UWORD
  , MMD0 -> WORD
actplayline :: WORD
  , MMD0 -> UBYTE
counter     :: UBYTE
  , MMD0 -> UBYTE
extra_songs :: UBYTE
  }
  deriving (Int -> MMD0 -> ShowS
[MMD0] -> ShowS
MMD0 -> String
(Int -> MMD0 -> ShowS)
-> (MMD0 -> String) -> ([MMD0] -> ShowS) -> Show MMD0
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMD0] -> ShowS
$cshowList :: [MMD0] -> ShowS
show :: MMD0 -> String
$cshow :: MMD0 -> String
showsPrec :: Int -> MMD0 -> ShowS
$cshowsPrec :: Int -> MMD0 -> ShowS
Show)

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