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