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