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 (Int -> Instrument -> ShowS [Instrument] -> ShowS Instrument -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Instrument] -> ShowS $cshowList :: [Instrument] -> ShowS show :: Instrument -> String $cshow :: Instrument -> String showsPrec :: Int -> Instrument -> ShowS $cshowsPrec :: Int -> Instrument -> ShowS Show) data InstrHdr = InstrHdr { InstrHdr -> ULONG len :: ULONG , InstrHdr -> WORD stype :: WORD , InstrHdr -> Bool s16 :: Bool , InstrHdr -> Bool stereo :: Bool , InstrHdr -> Bool md16 :: Bool , InstrHdr -> Instrument dat :: Instrument } deriving (Int -> InstrHdr -> ShowS [InstrHdr] -> ShowS InstrHdr -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [InstrHdr] -> ShowS $cshowList :: [InstrHdr] -> ShowS show :: InstrHdr -> String $cshow :: InstrHdr -> String showsPrec :: Int -> InstrHdr -> ShowS $cshowsPrec :: Int -> InstrHdr -> ShowS Show) {-# SPECIALISE peek :: PTR -> StorableReader InstrHdr #-} {-# SPECIALISE peek :: PTR -> ByteStringReader InstrHdr #-} peek :: (Reader m) => PTR -> m InstrHdr peek :: forall (m :: * -> *). Reader m => ULONG -> m InstrHdr peek ULONG p = do ULONG len' <- forall (m :: * -> *). Reader m => Peek m ULONG peekULONG ULONG p WORD itype' <- forall (m :: * -> *). Reader m => Peek m WORD peekWORD (ULONG pforall a. Num a => a -> a -> a +ULONG 4) let s16' :: Bool s16' = (WORD itype' forall a. Bits a => a -> a -> a .&. WORD 0x10) forall a. Eq a => a -> a -> Bool == WORD 0x10 let stereo' :: Bool stereo' = (WORD itype' forall a. Bits a => a -> a -> a .&. WORD 0x20) forall a. Eq a => a -> a -> Bool == WORD 0x20 let md16' :: Bool md16' = WORD itype' forall a. Eq a => a -> a -> Bool == WORD 0x18 let stype' :: WORD stype' = if WORD itype' forall a. Ord a => a -> a -> Bool < WORD 0 then WORD itype' else WORD itype' forall a. Bits a => a -> a -> a .&. WORD 0x7 Instrument dat' <- case WORD stype' of (-2) -> do HybridInstr hybridinstr' <- forall (m :: * -> *). Reader m => ULONG -> m HybridInstr HybridInstr.peek ULONG p forall (m :: * -> *) a. Monad m => a -> m a return forall a b. (a -> b) -> a -> b $ HybridInstr -> Instrument Hybrid HybridInstr hybridinstr' (-1) -> do SynthInstr synthinstr' <- forall (m :: * -> *). Reader m => ULONG -> m SynthInstr SynthInstr.peek ULONG p forall (m :: * -> *) a. Monad m => a -> m a return forall a b. (a -> b) -> a -> b $ SynthInstr -> Instrument Synthetic SynthInstr synthinstr' WORD _ -> if WORD stype' forall a. Ord a => a -> a -> Bool < WORD 0 Bool -> Bool -> Bool || WORD 7 forall a. Ord a => a -> a -> Bool < WORD stype' then forall (m :: * -> *) a. Monad m => a -> m a return Instrument Unknown else do SampleInstr sampleinstr' <- forall (m :: * -> *). Reader m => ULONG -> WORD -> Bool -> Bool -> ULONG -> m SampleInstr SampleInstr.peek ULONG len' WORD stype' Bool s16' Bool stereo' ULONG p forall (m :: * -> *) a. Monad m => a -> m a return forall a b. (a -> b) -> a -> b $ SampleInstr -> Instrument Sample SampleInstr sampleinstr' forall (m :: * -> *) a. Monad m => a -> m a return forall a b. (a -> b) -> a -> b $ ULONG -> WORD -> Bool -> Bool -> Bool -> Instrument -> InstrHdr InstrHdr ULONG len' WORD stype' Bool s16' Bool stereo' Bool md16' Instrument dat'