{-# LANGUAGE DataKinds                #-}

--------------------------------------------------------------------------------
-- |
-- Module      :  HarmTrace.Models.Simple.Main
-- Copyright   :  (c) 2010-2012 Universiteit Utrecht, 2012 University of Oxford
-- License     :  GPL3
--
-- Maintainer  :  bash@cs.uu.nl, jpm@cs.ox.ac.uk
-- Stability   :  experimental
-- Portability :  non-portable
--
-- Summary: The Simple parser
--------------------------------------------------------------------------------

module HarmTrace.Models.Simple.Main ( 
    pSimple, genPiece, getChords
  , module HarmTrace.Models.Simple.Model
  ) where

-- Parser stuff
import Text.ParserCombinators.UU

-- Music stuff
import HarmTrace.Base.MusicRep
import HarmTrace.Models.Collect
import HarmTrace.Models.Parser
import HarmTrace.Models.Generator
import HarmTrace.Models.Simple.Model
import HarmTrace.Models.Simple.Instances ()
import HarmTrace.Models.ChordTokens ( ChordToken )

--------------------------------------------------------------------------------
-- From tokens to structured music pieces
--------------------------------------------------------------------------------

pPieceMaj, pPieceMin :: PMusic [Piece]
pPieceMaj = map Piece <$> amb (parseG :: PMusic [Phrase MajMode])
pPieceMin = map Piece <$> amb (parseG :: PMusic [Phrase MinMode])

pSimple :: Key -> PMusic [Piece]
pSimple (Key _ MajMode) = pPieceMaj
pSimple (Key _ MinMode) = pPieceMin

--------------------------------------------------------------------------------
-- From structured music pieces back to tokens
--------------------------------------------------------------------------------

getChords :: Piece -> [ChordToken]
getChords (Piece phrases) = collectG phrases

--------------------------------------------------------------------------------
-- Generating simple pieces
--------------------------------------------------------------------------------

genPiece :: Key -> Gen Piece
genPiece (Key _ MajMode) = fmap Piece (arbitrary :: Gen [Phrase MajMode])
genPiece (Key _ MinMode) = fmap Piece (arbitrary :: Gen [Phrase MinMode])