music-score-1.7.2: src/Music/Score/Meta/Extract.hs
{-# LANGUAGE FlexibleContexts #-}
-- Utility to extract meta-data at a specific point in time.
module Music.Score.Meta.Extract where
import Control.Lens
import Control.Monad
import Music.Score.Meta.Attribution
import Music.Score.Meta.Title
import Music.Score.Meta.Time
import Music.Score.Meta.Key
-- import Music.Score.Meta.Pickup
import Music.Score.Meta.Tempo
import Music.Score.Part
import Music.Time
import Music.Time.Meta
attributionAt :: HasMeta a => Time -> String -> a -> Maybe String
attributionAt t n x = join
$ fmap (`getAttribution` n)
$ fmap (`atTime` t)
$ unwrapMeta
$ x^.meta
-- TODO get all *set* attributions
attributionsAt :: HasMeta a => Time -> a -> [(String, Maybe String)]
attributionsAt t x = [
("composer", attributionAt t "composer" x),
("lyricist", attributionAt t "lyricist" x)
-- TODO etc
]
-- TODO rename getTitleAt etc in Meta.Title to prevent confunsion
titleAt :: HasMeta a => Time -> a -> Maybe Title
titleAt _ _ = Nothing
-- TODO key
-- TODO time
-- TODO tempo
partNames :: (HasParts' a, Show (Part a)) => a -> [String]
partNames = fmap show . toListOf parts'
commonMetaAt :: HasMeta a => Time -> a -> [(String, Maybe String)]
commonMetaAt t x =
("title", join $ fmap getTitle1 $ titleAt t x)
: ("subtitle", join $ fmap getTitle2 $ titleAt t x)
: ("subsubtitle", join $ fmap getTitle3 $ titleAt t x)
: attributionsAt t x
where
getTitle1 = (`getTitleAt` 0)
getTitle2 = (`getTitleAt` 1)
getTitle3 = (`getTitleAt` 2)
-- >>> commonMetaAt 0 $ asScore $ composer "Hans" $ lyricist "Sondheim" c
-- [("title",Nothing),("subtitle",Nothing),("subsubtitle",Nothing),("composer",Just "Hans"),("lyricist",Just "Sondheim")]