unmed2-0.0: src/InstrHdr.hs
module InstrHdr where
import Data.Bits ((.&.))
import Amiga
import qualified HybridInstr
import HybridInstr(HybridInstr)
import qualified SynthInstr
import SynthInstr(SynthInstr)
import qualified SampleInstr
import SampleInstr(SampleInstr)
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 :: MEM -> PTR -> IO InstrHdr
peek m p = do
len' <- peekULONG m p
itype' <- peekWORD m (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 m p
return $ Hybrid hybridinstr'
(-1) -> do
synthinstr' <- SynthInstr.peek m p
return $ Synthetic synthinstr'
_ -> if stype' < 0 || 7 < stype' then return Unknown else do
sampleinstr' <- SampleInstr.peek len' stype' s16' stereo' m p
return $ Sample sampleinstr'
return $ InstrHdr
len' stype' s16' stereo' md16' dat'