music-score-1.8: src/Music/Score/Text.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
-------------------------------------------------------------------------------------
-- |
-- Copyright : (c) Hans Hoglund 2012-2014
--
-- License : BSD-style
--
-- Maintainer : hans@hanshoglund.se
-- Stability : experimental
-- Portability : non-portable (TF,GNTD)
--
-- Provides a way of adding text to notes.
--
-------------------------------------------------------------------------------------
module Music.Score.Text (
-- * Text
HasText(..),
TextT(..),
text,
textLast,
) where
import Control.Applicative
import Control.Comonad
import Control.Lens hiding (transform)
import Data.Foldable
import Data.Foldable
import Data.Functor.Couple
import Data.Ratio
import Data.Semigroup
import Data.Typeable
import Data.Word
import Music.Dynamics.Literal
import Music.Pitch.Alterable
import Music.Pitch.Augmentable
import Music.Pitch.Literal
import Music.Score.Part
import Music.Score.Phrases
import Music.Time
class HasText a where
addText :: String -> a -> a
newtype TextT a = TextT { getTextT :: Couple [String] a }
deriving (
Eq, Show, Ord, Functor, Foldable, Typeable,
Applicative, Monad, Comonad
)
instance HasText a => HasText (b, a) where
addText s = fmap (addText s)
instance HasText a => HasText (Couple b a) where
addText s = fmap (addText s)
instance HasText a => HasText [a] where
addText s = fmap (addText s)
instance HasText a => HasText (Note a) where
addText s = fmap (addText s)
instance HasText a => HasText (Voice a) where
addText s = fmap (addText s)
instance HasText a => HasText (Score a) where
addText s = fmap (addText s)
instance Wrapped (TextT a) where
type Unwrapped (TextT a) = Couple [String] a
_Wrapped' = iso getTextT TextT
instance Rewrapped (TextT a) (TextT b)
instance HasText (TextT a) where
addText s (TextT (Couple (t,x))) = TextT (Couple (t ++ [s],x))
-- Lifted instances
deriving instance Num a => Num (TextT a)
deriving instance Fractional a => Fractional (TextT a)
deriving instance Floating a => Floating (TextT a)
deriving instance Enum a => Enum (TextT a)
deriving instance Bounded a => Bounded (TextT a)
deriving instance (Num a, Ord a, Real a) => Real (TextT a)
deriving instance (Real a, Enum a, Integral a) => Integral (TextT a)
-- |
-- Attach the given text to the first note.
--
text :: (HasPhrases' s a, HasText a) => String -> s -> s
text s = over (phrases' . _head) (addText s)
-- |
-- Attach the given text to the last note.
--
textLast :: (HasPhrases' s a, HasText a) => String -> s -> s
textLast s = over (phrases' . _last) (addText s)