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
  { MMD2Song -> [MMD0Sample]
sample        :: [ MMD0Sample ]
  , MMD2Song -> UWORD
numblocks     :: UWORD
  , MMD2Song -> UWORD
songlen       :: UWORD
  , MMD2Song -> [PlaySeq]
playseqtable  :: [ PlaySeq ]
  , MMD2Song -> [UWORD]
sectiontable  :: [ UWORD ]
  , MMD2Song -> [UBYTE]
trackvols     :: [ UBYTE ]
  , MMD2Song -> UWORD
numtracks     :: UWORD
  , MMD2Song -> UWORD
numpseqs      :: UWORD
  , MMD2Song -> [BYTE]
trackpans     :: [ BYTE ]
  , MMD2Song -> ULONG
flags3        :: ULONG
  , MMD2Song -> UWORD
voladj        :: UWORD
  , MMD2Song -> UWORD
channels      :: UWORD
  , MMD2Song -> UBYTE
mix_echotype  :: UBYTE
  , MMD2Song -> UBYTE
mix_echodepth :: UBYTE
  , MMD2Song -> UWORD
mix_echolen   :: UWORD
  , MMD2Song -> BYTE
mix_stereosep :: BYTE
  , MMD2Song -> [UBYTE]
pad0          :: [ UBYTE ]
  , MMD2Song -> UWORD
deftempo      :: UWORD
  , MMD2Song -> BYTE
playtransp    :: BYTE
  , MMD2Song -> UBYTE
flags         :: UBYTE
  , MMD2Song -> UBYTE
flags2        :: UBYTE
  , MMD2Song -> UBYTE
tempo2        :: UBYTE
  , MMD2Song -> [UBYTE]
pad1          :: [ UBYTE ]
  , MMD2Song -> UBYTE
mastervol     :: UBYTE
  , MMD2Song -> UBYTE
numsamples    :: UBYTE
  }
  deriving (Int -> MMD2Song -> ShowS
[MMD2Song] -> ShowS
MMD2Song -> String
(Int -> MMD2Song -> ShowS)
-> (MMD2Song -> String) -> ([MMD2Song] -> ShowS) -> Show MMD2Song
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMD2Song] -> ShowS
$cshowList :: [MMD2Song] -> ShowS
show :: MMD2Song -> String
$cshow :: MMD2Song -> String
showsPrec :: Int -> MMD2Song -> ShowS
$cshowsPrec :: Int -> MMD2Song -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMD2Song #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD2Song #-}
peek :: (Reader m) => PTR -> m MMD2Song
peek :: ULONG -> m MMD2Song
peek ULONG
p = do
  [MMD0Sample]
sample'         <- (ULONG -> m MMD0Sample) -> [ULONG] -> m [MMD0Sample]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m MMD0Sample
forall (m :: * -> *). Reader m => ULONG -> m MMD0Sample
MMD0Sample.peek ([ULONG] -> m [MMD0Sample]) -> [ULONG] -> m [MMD0Sample]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> Int -> [ULONG]
pointerRange ULONG
p ULONG
8 Int
63
  UWORD
numblocks'      <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
504)
  UWORD
songlen'        <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
506)
  UWORD
numpseqs'       <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
522)
  ULONG
playseqtable''' <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
508)
  [ULONG]
playseqtable''  <- 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
playseqtable''' ULONG
4 UWORD
numpseqs'
  [PlaySeq]
playseqtable'   <- (ULONG -> m PlaySeq) -> [ULONG] -> m [PlaySeq]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m PlaySeq
forall (m :: * -> *). Reader m => ULONG -> m PlaySeq
PlaySeq.peek [ULONG]
playseqtable''
  ULONG
sectiontable''  <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
512)
  [UWORD]
sectiontable'   <- Peek m UWORD -> [ULONG] -> m [UWORD]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD ([ULONG] -> m [UWORD]) -> [ULONG] -> m [UWORD]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> UWORD -> [ULONG]
forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
sectiontable'' ULONG
2 UWORD
songlen'
  UWORD
numtracks'      <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
520)
  ULONG
trackvols''     <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
516)
  [UBYTE]
trackvols'      <- (ULONG -> m UBYTE) -> [ULONG] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([ULONG] -> m [UBYTE]) -> [ULONG] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> UWORD -> [ULONG]
forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
trackvols'' ULONG
1 UWORD
numtracks'
  ULONG
trackpans''     <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
524)
  [BYTE]
trackpans'      <- if ULONG
trackpans'' ULONG -> ULONG -> Bool
forall a. Eq a => a -> a -> Bool
== ULONG
0 then [BYTE] -> m [BYTE]
forall (m :: * -> *) a. Monad m => a -> m a
return ([BYTE] -> m [BYTE]) -> [BYTE] -> m [BYTE]
forall a b. (a -> b) -> a -> b
$ Int -> BYTE -> [BYTE]
forall a. Int -> a -> [a]
replicate (UWORD -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral UWORD
numtracks') BYTE
0 else (ULONG -> m BYTE) -> [ULONG] -> m [BYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m BYTE
forall (m :: * -> *). Reader m => Peek m BYTE
peekBYTE ([ULONG] -> m [BYTE]) -> [ULONG] -> m [BYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> UWORD -> [ULONG]
forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen ULONG
trackpans'' ULONG
1 UWORD
numtracks'
  ULONG
flags3'         <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
528)
  UWORD
voladj'         <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
532)
  UWORD
channels'       <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
534)
  UBYTE
mix_echotype'   <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
536)
  UBYTE
mix_echodepth'  <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
537)
  UWORD
mix_echolen'    <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
538)
  BYTE
mix_stereosep'  <- ULONG -> m BYTE
forall (m :: * -> *). Reader m => Peek m BYTE
peekBYTE  (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
540)
  [UBYTE]
pad0'           <- (ULONG -> m UBYTE) -> [ULONG] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([ULONG] -> m [UBYTE]) -> [ULONG] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> Int -> [ULONG]
pointerRange (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
541) ULONG
1 Int
223
  UWORD
deftempo'       <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
764)
  BYTE
playtransp'     <- ULONG -> m BYTE
forall (m :: * -> *). Reader m => Peek m BYTE
peekBYTE  (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
766)
  UBYTE
flags'          <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
767)
  UBYTE
flags2'         <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
768)
  UBYTE
tempo2'         <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
769)
  [UBYTE]
pad1'           <- (ULONG -> m UBYTE) -> [ULONG] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([ULONG] -> m [UBYTE]) -> [ULONG] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> Int -> [ULONG]
pointerRange (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
770) ULONG
1 Int
16
  UBYTE
mastervol'      <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
786)
  UBYTE
numsamples'     <- ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
787)
  MMD2Song -> m MMD2Song
forall (m :: * -> *) a. Monad m => a -> m a
return (MMD2Song -> m MMD2Song) -> MMD2Song -> m MMD2Song
forall a b. (a -> b) -> a -> b
$ [MMD0Sample]
-> UWORD
-> UWORD
-> [PlaySeq]
-> [UWORD]
-> [UBYTE]
-> UWORD
-> UWORD
-> [BYTE]
-> ULONG
-> UWORD
-> UWORD
-> UBYTE
-> UBYTE
-> UWORD
-> BYTE
-> [UBYTE]
-> UWORD
-> BYTE
-> UBYTE
-> UBYTE
-> UBYTE
-> [UBYTE]
-> UBYTE
-> UBYTE
-> MMD2Song
MMD2Song
    [MMD0Sample]
sample' UWORD
numblocks' UWORD
songlen' [PlaySeq]
playseqtable' [UWORD]
sectiontable' [UBYTE]
trackvols'
    UWORD
numtracks' UWORD
numpseqs' [BYTE]
trackpans' ULONG
flags3' UWORD
voladj' UWORD
channels'
    UBYTE
mix_echotype' UBYTE
mix_echodepth' UWORD
mix_echolen' BYTE
mix_stereosep' [UBYTE]
pad0'
    UWORD
deftempo' BYTE
playtransp' UBYTE
flags' UBYTE
flags2' UBYTE
tempo2' [UBYTE]
pad1' UBYTE
mastervol'
    UBYTE
numsamples'