module Sound.MED.Raw.InstrExt where
import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility
import Foreign.Storable (Storable, sizeOf)
data InstrExt = InstrExt
{ hold :: Maybe UBYTE
, decay :: Maybe UBYTE
, suppress_midi_off :: Maybe UBYTE
, finetune :: Maybe BYTE
, default_pitch :: Maybe UBYTE
, instr_flags :: Maybe UBYTE
, long_midi_preset :: Maybe UWORD
, output_device :: Maybe UBYTE
, reserved :: Maybe UBYTE
, long_repeat :: Maybe ULONG
, long_replen :: Maybe ULONG
}
deriving (Show)
peek :: (Reader m) => UWORD -> PTR -> m InstrExt
peek size p = do
let peekHelp ::
(Reader m, Storable a) => a -> Peek m a -> UWORD -> m (Maybe a)
peekHelp elm peeker offset =
skipIf (offset + fromIntegral (sizeOf elm) > size) $
peeker (p + fromIntegral offset)
peeker $?? offset = peekHelp undefined peeker offset
hold' <- peekUBYTE $?? 0
decay' <- peekUBYTE $?? 1
suppress_midi_off' <- peekUBYTE $?? 2
finetune' <- peekBYTE $?? 3
default_pitch' <- peekUBYTE $?? 4
instr_flags' <- peekUBYTE $?? 5
long_midi_preset' <- peekUWORD $?? 6
output_device' <- peekUBYTE $?? 8
reserved' <- peekUBYTE $?? 9
long_repeat' <- peekULONG $?? 10
long_replen' <- peekULONG $?? 14
return $ InstrExt
hold' decay' suppress_midi_off' finetune' default_pitch'
instr_flags' long_midi_preset' output_device' reserved'
long_repeat' long_replen'