module Sound.MED.Raw.MMD0NoteData where

import Sound.MED.Basic.Amiga

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

data MMD0NoteData = MMD0NoteData
  { MMD0NoteData -> UBYTE
note       :: UBYTE
  , MMD0NoteData -> UBYTE
instrument :: UBYTE
  , MMD0NoteData -> UBYTE
command    :: UBYTE
  , MMD0NoteData -> UBYTE
databyte   :: UBYTE
  }
  deriving (Int -> MMD0NoteData -> ShowS
[MMD0NoteData] -> ShowS
MMD0NoteData -> String
(Int -> MMD0NoteData -> ShowS)
-> (MMD0NoteData -> String)
-> ([MMD0NoteData] -> ShowS)
-> Show MMD0NoteData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMD0NoteData] -> ShowS
$cshowList :: [MMD0NoteData] -> ShowS
show :: MMD0NoteData -> String
$cshow :: MMD0NoteData -> String
showsPrec :: Int -> MMD0NoteData -> ShowS
$cshowsPrec :: Int -> MMD0NoteData -> ShowS
Show)

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