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'