module Sound.MED.Generic.Instrument where

import qualified Sound.MED.Raw.MMD0Sample as MMD0Sample
import qualified Sound.MED.Raw.InstrHdr as InstrHdr
import qualified Sound.MED.Raw.MMDInstrInfo as MMDInstrInfo
import qualified Sound.MED.Raw.InstrExt as InstrExt

import Sound.MED.Basic.Human(Human(human))
import Sound.MED.Basic.Utility(stringFromBytes)

import qualified Data.List as List

data MEDInstrument = MEDInstrument
  { MEDInstrument -> Maybe Int
rep                :: Maybe Int
  , MEDInstrument -> Maybe Int
replen             :: Maybe Int
  , MEDInstrument -> Maybe Int
midich             :: Maybe Int
  , MEDInstrument -> Maybe Int
midipreset         :: Maybe Int
  , MEDInstrument -> Maybe Int
svol               :: Maybe Int
  , MEDInstrument -> Maybe Int
strans             :: Maybe Int
  , MEDInstrument -> Maybe Int
hold               :: Maybe Int
  , MEDInstrument -> Maybe Int
decay              :: Maybe Int
  , MEDInstrument -> Maybe Int
suppress_midi_off  :: Maybe Int
  , MEDInstrument -> Maybe Int
finetune           :: Maybe Int
  , MEDInstrument -> Maybe Int
default_pitch      :: Maybe Int
  , MEDInstrument -> Maybe Int
instr_flags        :: Maybe Int
  , MEDInstrument -> Maybe Int
long_midi_preset   :: Maybe Int
  , MEDInstrument -> Maybe Int
output_device      :: Maybe Int
  , MEDInstrument -> Maybe Int
long_repeat        :: Maybe Int
  , MEDInstrument -> Maybe Int
long_replen        :: Maybe Int
  , MEDInstrument -> Maybe String
name               :: Maybe String
  }
  deriving (Int -> MEDInstrument -> ShowS
[MEDInstrument] -> ShowS
MEDInstrument -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MEDInstrument] -> ShowS
$cshowList :: [MEDInstrument] -> ShowS
show :: MEDInstrument -> String
$cshow :: MEDInstrument -> String
showsPrec :: Int -> MEDInstrument -> ShowS
$cshowsPrec :: Int -> MEDInstrument -> ShowS
Show)

medinstruments ::
  [Maybe InstrHdr.InstrHdr] -> [MMD0Sample.MMD0Sample] ->
  [MMDInstrInfo.MMDInstrInfo] -> [InstrExt.InstrExt] ->
  [MEDInstrument]
medinstruments :: [Maybe InstrHdr]
-> [MMD0Sample] -> [MMDInstrInfo] -> [InstrExt] -> [MEDInstrument]
medinstruments [Maybe InstrHdr]
hdrs [MMD0Sample]
samples [MMDInstrInfo]
infos [InstrExt]
exts =
  let pad :: [a] -> [Maybe a]
pad [a]
xs = forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Maybe a
Just [a]
xs forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat forall a. Maybe a
Nothing
  in  forall a. Int -> [a] -> [a]
take (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [forall (t :: * -> *) a. Foldable t => t a -> Int
length [Maybe InstrHdr]
hdrs, forall (t :: * -> *) a. Foldable t => t a -> Int
length [MMD0Sample]
samples, forall (t :: * -> *) a. Foldable t => t a -> Int
length [MMDInstrInfo]
infos, forall (t :: * -> *) a. Foldable t => t a -> Int
length [InstrExt]
exts]) forall a b. (a -> b) -> a -> b
$
      forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
List.zipWith4 Maybe InstrHdr
-> Maybe MMD0Sample
-> Maybe MMDInstrInfo
-> Maybe InstrExt
-> MEDInstrument
medinstrument
        ([Maybe InstrHdr]
hdrs forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat forall a. Maybe a
Nothing) (forall {a}. [a] -> [Maybe a]
pad [MMD0Sample]
samples) (forall {a}. [a] -> [Maybe a]
pad [MMDInstrInfo]
infos) (forall {a}. [a] -> [Maybe a]
pad [InstrExt]
exts)

medinstrument ::
  Maybe InstrHdr.InstrHdr -> Maybe MMD0Sample.MMD0Sample ->
  Maybe MMDInstrInfo.MMDInstrInfo -> Maybe InstrExt.InstrExt -> MEDInstrument
medinstrument :: Maybe InstrHdr
-> Maybe MMD0Sample
-> Maybe MMDInstrInfo
-> Maybe InstrExt
-> MEDInstrument
medinstrument Maybe InstrHdr
_h Maybe MMD0Sample
s Maybe MMDInstrInfo
i Maybe InstrExt
e =
  let rep' :: Maybe Int
rep' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> UWORD
MMD0Sample.rep) Maybe MMD0Sample
s
      replen' :: Maybe Int
replen' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> UWORD
MMD0Sample.replen) Maybe MMD0Sample
s
      midich' :: Maybe Int
midich' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> UBYTE
MMD0Sample.midich) Maybe MMD0Sample
s
      midipreset' :: Maybe Int
midipreset' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> UBYTE
MMD0Sample.midipreset) Maybe MMD0Sample
s
      svol' :: Maybe Int
svol' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> UBYTE
MMD0Sample.svol) Maybe MMD0Sample
s
      strans' :: Maybe Int
strans' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMD0Sample -> BYTE
MMD0Sample.strans) Maybe MMD0Sample
s
      hold' :: Maybe Int
hold' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.hold forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      decay' :: Maybe Int
decay' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.decay forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      suppress_midi_off' :: Maybe Int
suppress_midi_off' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.suppress_midi_off forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      finetune' :: Maybe Int
finetune' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe BYTE
InstrExt.finetune forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      default_pitch' :: Maybe Int
default_pitch' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.default_pitch forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      instr_flags' :: Maybe Int
instr_flags' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.instr_flags forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      long_midi_preset' :: Maybe Int
long_midi_preset' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UWORD
InstrExt.long_midi_preset forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      output_device' :: Maybe Int
output_device' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe UBYTE
InstrExt.output_device forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      long_repeat' :: Maybe Int
long_repeat' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe ULONG
InstrExt.long_repeat forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      long_replen' :: Maybe Int
long_replen' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrExt -> Maybe ULONG
InstrExt.long_replen forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe InstrExt
e
      name' :: Maybe String
name' = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [UBYTE] -> String
stringFromBytes forall b c a. (b -> c) -> (a -> b) -> a -> c
. MMDInstrInfo -> Maybe [UBYTE]
MMDInstrInfo.name forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe MMDInstrInfo
i
  in Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe String
-> MEDInstrument
MEDInstrument
    Maybe Int
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 String
name'

instance Human MEDInstrument where
  human :: MEDInstrument -> String
human MEDInstrument
i = forall a. Show a => a -> String
show MEDInstrument
i forall a. [a] -> [a] -> [a]
++ String
"\n"