module Sound.MED.Raw.InstrExt where

import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility

import Foreign.Storable (Storable, sizeOf)

data InstrExt = InstrExt
  { InstrExt -> Maybe UBYTE
hold               :: Maybe UBYTE
  , InstrExt -> Maybe UBYTE
decay              :: Maybe UBYTE
  , InstrExt -> Maybe UBYTE
suppress_midi_off  :: Maybe UBYTE
  , InstrExt -> Maybe BYTE
finetune           :: Maybe BYTE
  , InstrExt -> Maybe UBYTE
default_pitch      :: Maybe UBYTE
  , InstrExt -> Maybe UBYTE
instr_flags        :: Maybe UBYTE
  , InstrExt -> Maybe UWORD
long_midi_preset   :: Maybe UWORD
  , InstrExt -> Maybe UBYTE
output_device      :: Maybe UBYTE
  , InstrExt -> Maybe UBYTE
reserved           :: Maybe UBYTE
  , InstrExt -> Maybe ULONG
long_repeat        :: Maybe ULONG
  , InstrExt -> Maybe ULONG
long_replen        :: Maybe ULONG
  }
  deriving (Int -> InstrExt -> ShowS
[InstrExt] -> ShowS
InstrExt -> String
(Int -> InstrExt -> ShowS)
-> (InstrExt -> String) -> ([InstrExt] -> ShowS) -> Show InstrExt
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InstrExt] -> ShowS
$cshowList :: [InstrExt] -> ShowS
show :: InstrExt -> String
$cshow :: InstrExt -> String
showsPrec :: Int -> InstrExt -> ShowS
$cshowsPrec :: Int -> InstrExt -> ShowS
Show)

{-# SPECIALISE peek :: UWORD -> PTR -> StorableReader InstrExt #-}
{-# SPECIALISE peek :: UWORD -> PTR -> ByteStringReader InstrExt #-}
peek :: (Reader m) => UWORD -> PTR -> m InstrExt
peek :: UWORD -> ULONG -> m InstrExt
peek UWORD
size ULONG
p = do
  let peekHelp ::
        (Reader m, Storable a) => a -> Peek m a -> UWORD -> m (Maybe a)
      peekHelp :: a -> Peek m a -> UWORD -> m (Maybe a)
peekHelp a
elm Peek m a
peeker UWORD
offset =
        Bool -> m a -> m (Maybe a)
forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (UWORD
offset UWORD -> UWORD -> UWORD
forall a. Num a => a -> a -> a
+ Int -> UWORD
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Int
forall a. Storable a => a -> Int
sizeOf a
elm) UWORD -> UWORD -> Bool
forall a. Ord a => a -> a -> Bool
> UWORD
size) (m a -> m (Maybe a)) -> m a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$
        Peek m a
peeker (ULONG
p ULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ UWORD -> ULONG
forall a b. (Integral a, Num b) => a -> b
fromIntegral UWORD
offset)
      Peek m a
peeker $?? :: Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
offset = a -> Peek m a -> UWORD -> m (Maybe a)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
a -> Peek m a -> UWORD -> m (Maybe a)
peekHelp a
forall a. HasCallStack => a
undefined Peek m a
peeker UWORD
offset
  Maybe UBYTE
hold' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
0
  Maybe UBYTE
decay' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
1
  Maybe UBYTE
suppress_midi_off' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
2
  Maybe BYTE
finetune' <- Peek m BYTE
forall (m :: * -> *). Reader m => Peek m BYTE
peekBYTE Peek m BYTE -> UWORD -> m (Maybe BYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
3
  Maybe UBYTE
default_pitch' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
4
  Maybe UBYTE
instr_flags' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
5
  Maybe UWORD
long_midi_preset' <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD Peek m UWORD -> UWORD -> m (Maybe UWORD)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
6
  Maybe UBYTE
output_device' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
8
  Maybe UBYTE
reserved' <- Peek m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE Peek m UBYTE -> UWORD -> m (Maybe UBYTE)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
9
  Maybe ULONG
long_repeat' <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG Peek m ULONG -> UWORD -> m (Maybe ULONG)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
10
  Maybe ULONG
long_replen' <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG Peek m ULONG -> UWORD -> m (Maybe ULONG)
forall (m :: * -> *) a.
(Reader m, Storable a) =>
Peek m a -> UWORD -> m (Maybe a)
$?? UWORD
14
  InstrExt -> m InstrExt
forall (m :: * -> *) a. Monad m => a -> m a
return (InstrExt -> m InstrExt) -> InstrExt -> m InstrExt
forall a b. (a -> b) -> a -> b
$ Maybe UBYTE
-> Maybe UBYTE
-> Maybe UBYTE
-> Maybe BYTE
-> Maybe UBYTE
-> Maybe UBYTE
-> Maybe UWORD
-> Maybe UBYTE
-> Maybe UBYTE
-> Maybe ULONG
-> Maybe ULONG
-> InstrExt
InstrExt
    Maybe UBYTE
hold' Maybe UBYTE
decay' Maybe UBYTE
suppress_midi_off' Maybe BYTE
finetune' Maybe UBYTE
default_pitch'
    Maybe UBYTE
instr_flags' Maybe UWORD
long_midi_preset' Maybe UBYTE
output_device' Maybe UBYTE
reserved'
    Maybe ULONG
long_repeat' Maybe ULONG
long_replen'