module Sound.MED.Generic.PlaySeq where

import qualified Sound.MED.Raw.MMD0Song as MMD0Song
import Sound.MED.Raw.MMD0Song(MMD0Song)

import qualified Sound.MED.Raw.PlaySeq as PlaySeq
import Sound.MED.Raw.PlaySeq(PlaySeq)

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

import qualified Data.List as List

data MEDPlaySeq = MEDPlaySeq
  { MEDPlaySeq -> String
name :: String
  , MEDPlaySeq -> [Int]
indices :: [Int] -- ^ block indices
  }

playSeq0 :: MMD0Song -> MEDPlaySeq
playSeq0 :: MMD0Song -> MEDPlaySeq
playSeq0 MMD0Song
song =
  String -> [Int] -> MEDPlaySeq
MEDPlaySeq String
"" forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [a]
take (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ MMD0Song -> UWORD
MMD0Song.songlen MMD0Song
song) forall a b. (a -> b) -> a -> b
$
  forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ MMD0Song -> [UBYTE]
MMD0Song.playseq MMD0Song
song

playSeq2 :: PlaySeq -> MEDPlaySeq
playSeq2 :: PlaySeq -> MEDPlaySeq
playSeq2 PlaySeq
pseq =
  MEDPlaySeq
    { name :: String
name = [UBYTE] -> String
stringFromBytes (PlaySeq -> [UBYTE]
PlaySeq.name PlaySeq
pseq)
    , indices :: [Int]
indices = forall a b. (a -> b) -> [a] -> [b]
map forall a b. (Integral a, Num b) => a -> b
fromIntegral (PlaySeq -> [UWORD]
PlaySeq.seq PlaySeq
pseq)
    }

instance Human MEDPlaySeq where
  human :: MEDPlaySeq -> String
human (MEDPlaySeq String
name' [Int]
indices') =
    (if forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
name' then String
"playseq" else String
name') forall a. [a] -> [a] -> [a]
++ String
": " forall a. [a] -> [a] -> [a]
++
    forall a. [a] -> [[a]] -> [a]
List.intercalate String
", " (forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> String
show [Int]
indices')