unmed2-0.0: src/MEDInstrument.hs
module MEDInstrument where
import qualified MMD0Sample
import qualified InstrHdr
import qualified MMDInstrInfo
import qualified InstrExt
import Human
import Amiga (stringFromBytes)
import qualified Data.List as List
data MEDInstrument = MEDInstrument
{ rep :: Maybe Int
, replen :: Maybe Int
, midich :: Maybe Int
, midipreset :: Maybe Int
, svol :: Maybe Int
, strans :: Maybe Int
, hold :: Maybe Int
, decay :: Maybe Int
, suppress_midi_off :: Maybe Int
, finetune :: Maybe Int
, default_pitch :: Maybe Int
, instr_flags :: Maybe Int
, long_midi_preset :: Maybe Int
, output_device :: Maybe Int
, long_repeat :: Maybe Int
, long_replen :: Maybe Int
, name :: Maybe String
}
deriving (Show)
medinstruments ::
[Maybe InstrHdr.InstrHdr] -> [MMD0Sample.MMD0Sample] ->
[MMDInstrInfo.MMDInstrInfo] -> [InstrExt.InstrExt] ->
[MEDInstrument]
medinstruments hdrs samples infos exts =
let pad xs = map Just xs ++ repeat Nothing
in take (maximum [length hdrs, length samples, length infos, length exts]) $
List.zipWith4 medinstrument
(hdrs ++ repeat Nothing) (pad samples) (pad infos) (pad exts)
medinstrument ::
Maybe InstrHdr.InstrHdr -> Maybe MMD0Sample.MMD0Sample ->
Maybe MMDInstrInfo.MMDInstrInfo -> Maybe InstrExt.InstrExt -> MEDInstrument
medinstrument _h s i e =
let rep' = fmap (fromIntegral . MMD0Sample.rep) s
replen' = fmap (fromIntegral . MMD0Sample.replen) s
midich' = fmap (fromIntegral . MMD0Sample.midich) s
midipreset' = fmap (fromIntegral . MMD0Sample.midipreset) s
svol' = fmap (fromIntegral . MMD0Sample.svol) s
strans' = fmap (fromIntegral . MMD0Sample.strans) s
hold' = fmap fromIntegral . InstrExt.hold =<< e
decay' = fmap fromIntegral . InstrExt.decay =<< e
suppress_midi_off' = fmap fromIntegral . InstrExt.suppress_midi_off =<< e
finetune' = fmap fromIntegral . InstrExt.finetune =<< e
default_pitch' = fmap fromIntegral . InstrExt.default_pitch =<< e
instr_flags' = fmap fromIntegral . InstrExt.instr_flags =<< e
long_midi_preset' = fmap fromIntegral . InstrExt.long_midi_preset =<< e
output_device' = fmap fromIntegral . InstrExt.output_device =<< e
long_repeat' = fmap fromIntegral . InstrExt.long_repeat =<< e
long_replen' = fmap fromIntegral . InstrExt.long_replen =<< e
name' = fmap stringFromBytes . MMDInstrInfo.name =<< i
in MEDInstrument
rep' replen' midich' midipreset' svol' strans' hold' decay'
suppress_midi_off' finetune' default_pitch' instr_flags'
long_midi_preset' output_device' long_repeat' long_replen' name'
instance Human MEDInstrument where
human i = show i ++ "\n"