module Sound.MED.Raw.InstrHdr where
import qualified Sound.MED.Raw.HybridInstr as HybridInstr
import Sound.MED.Raw.HybridInstr(HybridInstr)
import qualified Sound.MED.Raw.SynthInstr as SynthInstr
import Sound.MED.Raw.SynthInstr(SynthInstr)
import qualified Sound.MED.Raw.SampleInstr as SampleInstr
import Sound.MED.Raw.SampleInstr(SampleInstr)
import Sound.MED.Basic.Amiga
import Data.Bits ((.&.))
data Instrument =
Unknown
| Hybrid HybridInstr
| Synthetic SynthInstr
| Sample SampleInstr
deriving (Show)
data InstrHdr = InstrHdr
{ len :: ULONG
, stype :: WORD
, s16 :: Bool
, stereo :: Bool
, md16 :: Bool
, dat :: Instrument
}
deriving (Show)
peek :: (Reader m) => PTR -> m InstrHdr
peek p = do
len' <- peekULONG p
itype' <- peekWORD (p+4)
let s16' = (itype' .&. 0x10) == 0x10
let stereo' = (itype' .&. 0x20) == 0x20
let md16' = itype' == 0x18
let stype' = if itype' < 0 then itype' else itype' .&. 0x7
dat' <- case stype' of
(2) -> do
hybridinstr' <- HybridInstr.peek p
return $ Hybrid hybridinstr'
(1) -> do
synthinstr' <- SynthInstr.peek p
return $ Synthetic synthinstr'
_ -> if stype' < 0 || 7 < stype' then return Unknown else do
sampleinstr' <- SampleInstr.peek len' stype' s16' stereo' p
return $ Sample sampleinstr'
return $ InstrHdr
len' stype' s16' stereo' md16' dat'