module Sound.MED.Raw.MMD0NoteData where

import Sound.MED.Basic.Amiga

import Data.Bits (shiftR, shiftL, (.&.), (.|.))

data MMD0NoteData = MMD0NoteData
  { note       :: UBYTE
  , instrument :: UBYTE
  , command    :: UBYTE
  , databyte   :: UBYTE
  }
  deriving (Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMD0NoteData #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMD0NoteData #-}
peek :: (Reader m) => PTR -> m MMD0NoteData
peek p = do
  byte1 <- peekUBYTE (p + 0)
  byte2 <- peekUBYTE (p + 1)
  byte3 <- peekUBYTE (p + 2)
  let x           = (byte1 .&. 0x80) `shiftR` 7
  let y           = (byte1 .&. 0x40) `shiftR` 6
  let nnnnnn      = (byte1 .&. 0x3F)
  let iiii        = (byte2 .&. 0xF0) `shiftR` 4
  let cccc        = (byte2 .&. 0x0F)
  let dddddddd    = (byte3 .&. 0xFF)
  let note'       = nnnnnn
  let instrument' = (y `shiftL` 6) .|. (x `shiftL` 5) .|. iiii
  let command'    = cccc
  let databyte'   = dddddddd
  return $ MMD0NoteData
    note' instrument' command' databyte'