module Sound.MED.Raw.MMD2Song where
import qualified Sound.MED.Raw.MMD0Sample as MMD0Sample
import Sound.MED.Raw.MMD0Sample(MMD0Sample)
import qualified Sound.MED.Raw.PlaySeq as PlaySeq
import Sound.MED.Raw.PlaySeq(PlaySeq)
import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility
data MMD2Song = MMD2Song
{ sample :: [ MMD0Sample ]
, numblocks :: UWORD
, songlen :: UWORD
, playseqtable :: [ PlaySeq ]
, sectiontable :: [ UWORD ]
, trackvols :: [ UBYTE ]
, numtracks :: UWORD
, numpseqs :: UWORD
, trackpans :: [ BYTE ]
, flags3 :: ULONG
, voladj :: UWORD
, channels :: UWORD
, mix_echotype :: UBYTE
, mix_echodepth :: UBYTE
, mix_echolen :: UWORD
, mix_stereosep :: BYTE
, pad0 :: [ UBYTE ]
, deftempo :: UWORD
, playtransp :: BYTE
, flags :: UBYTE
, flags2 :: UBYTE
, tempo2 :: UBYTE
, pad1 :: [ UBYTE ]
, mastervol :: UBYTE
, numsamples :: UBYTE
}
deriving (Show)
peek :: (Reader m) => PTR -> m MMD2Song
peek p = do
sample' <- mapM MMD0Sample.peek $ pointerRange p 8 63
numblocks' <- peekUWORD (p+504)
songlen' <- peekUWORD (p+506)
numpseqs' <- peekUWORD (p+522)
playseqtable''' <- peekPTR (p+508)
playseqtable'' <- mapM peekPTR $ pointerRangeGen playseqtable''' 4 numpseqs'
playseqtable' <- mapM PlaySeq.peek playseqtable''
sectiontable'' <- peekPTR (p+512)
sectiontable' <- mapM peekUWORD $ pointerRangeGen sectiontable'' 2 songlen'
numtracks' <- peekUWORD (p+520)
trackvols'' <- peekPTR (p+516)
trackvols' <- mapM peekUBYTE $ pointerRangeGen trackvols'' 1 numtracks'
trackpans'' <- peekPTR (p+524)
trackpans' <- if trackpans'' == 0 then return $ replicate (fromIntegral numtracks') 0 else mapM peekBYTE $ pointerRangeGen trackpans'' 1 numtracks'
flags3' <- peekULONG (p+528)
voladj' <- peekUWORD (p+532)
channels' <- peekUWORD (p+534)
mix_echotype' <- peekUBYTE (p+536)
mix_echodepth' <- peekUBYTE (p+537)
mix_echolen' <- peekUWORD (p+538)
mix_stereosep' <- peekBYTE (p+540)
pad0' <- mapM peekUBYTE $ pointerRange (p+541) 1 223
deftempo' <- peekUWORD (p+764)
playtransp' <- peekBYTE (p+766)
flags' <- peekUBYTE (p+767)
flags2' <- peekUBYTE (p+768)
tempo2' <- peekUBYTE (p+769)
pad1' <- mapM peekUBYTE $ pointerRange (p+770) 1 16
mastervol' <- peekUBYTE (p+786)
numsamples' <- peekUBYTE (p+787)
return $ MMD2Song
sample' numblocks' songlen' playseqtable' sectiontable' trackvols'
numtracks' numpseqs' trackpans' flags3' voladj' channels'
mix_echotype' mix_echodepth' mix_echolen' mix_stereosep' pad0'
deftempo' playtransp' flags' flags2' tempo2' pad1' mastervol'
numsamples'