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

{-# SPECIALISE peek :: PTR -> StorableReader MMD3 #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD3 #-}
peek :: (Reader m) => PTR -> m MMD3
peek :: ULONG -> m MMD3
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)
  MMD2Song
song'        <- ULONG -> m MMD2Song
forall (m :: * -> *). Reader m => ULONG -> m MMD2Song
MMD2Song.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 (MMD2Song -> UWORD
MMD2Song.numblocks MMD2Song
song')
  [MMD1Block]
blockarr'    <- (ULONG -> m MMD1Block) -> [ULONG] -> m [MMD1Block]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m MMD1Block
forall (m :: * -> *). Reader m => ULONG -> m MMD1Block
MMD1Block.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 (MMD2Song -> UBYTE
MMD2Song.numsamples MMD2Song
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)
  MMD3 -> m MMD3
forall (m :: * -> *) a. Monad m => a -> m a
return (MMD3 -> m MMD3) -> MMD3 -> m MMD3
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
-> MMD3
MMD3
    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'