module Sound.MED.Raw.MMD1Block where
import qualified Sound.MED.Raw.BlockInfo as BlockInfo
import Sound.MED.Raw.BlockInfo(BlockInfo)
import qualified Sound.MED.Raw.MMD1NoteData as MMD1NoteData
import Sound.MED.Raw.MMD1NoteData(MMD1NoteData)
import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility
data MMD1Block = MMD1Block
{ numtracks :: UWORD
, lines :: UWORD
, info :: Maybe BlockInfo
, notedata :: [ [ MMD1NoteData ] ]
}
deriving (Show)
{-# SPECIALISE peek :: PTR -> StorableReader MMD1Block #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD1Block #-}
peek :: (Reader m) => PTR -> m MMD1Block
peek p = do
numtracks' <- peekUWORD (p + 0)
lines' <- peekUWORD (p + 2)
info''' <- peekPTR (p + 4)
info' <- BlockInfo.peek numtracks' (lines'+1) $? info'''
notedata'' <- mapM MMD1NoteData.peek $ pointerRangeGen2 (p+8) 4 numtracks' (lines'+1)
let notedata' = chunk numtracks' notedata''
return $ MMD1Block
numtracks' lines' info' notedata'