packages feed

lilypond 1.8.1 → 1.9.0

raw patch · 11 files changed

+1223/−1223 lines, 11 filesdep ~music-dynamics-literaldep ~music-pitch-literaldep ~vector-spacePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: music-dynamics-literal, music-pitch-literal, vector-space

API changes (from Hackage documentation)

- Music.Lilypond: A :: PitchName
- Music.Lilypond: Above :: Direction
- Music.Lilypond: Accent :: Articulation
- Music.Lilypond: Alto :: Clef
- Music.Lilypond: Articulation :: Direction -> Articulation -> PostEvent
- Music.Lilypond: B :: PitchName
- Music.Lilypond: Baritone :: Clef
- Music.Lilypond: Bass :: Clef
- Music.Lilypond: BeginBeam :: PostEvent
- Music.Lilypond: BeginCresc :: PostEvent
- Music.Lilypond: BeginDim :: PostEvent
- Music.Lilypond: BeginPhraseSlur :: PostEvent
- Music.Lilypond: BeginSlur :: PostEvent
- Music.Lilypond: Below :: Direction
- Music.Lilypond: Bold :: Markup -> Markup
- Music.Lilypond: Box :: Markup -> Markup
- Music.Lilypond: Breathe :: (Maybe BreathingSign) -> Music
- Music.Lilypond: C :: PitchName
- Music.Lilypond: Caps :: Markup -> Markup
- Music.Lilypond: Chord :: [(Note, [ChordPostEvent])] -> (Maybe Duration) -> [PostEvent] -> Music
- Music.Lilypond: Clef :: Clef -> Music
- Music.Lilypond: Coda :: Articulation
- Music.Lilypond: Context :: String -> (Maybe String) -> Music -> Music
- Music.Lilypond: CurvedCaesura :: BreathingSign
- Music.Lilypond: D :: PitchName
- Music.Lilypond: Default :: Direction
- Music.Lilypond: DownMordent :: Articulation
- Music.Lilypond: DownPrall :: Articulation
- Music.Lilypond: Downbow :: Articulation
- Music.Lilypond: DrumNotePitch :: (Maybe Duration) -> Note
- Music.Lilypond: Duration :: Rational -> Duration
- Music.Lilypond: Dynamics :: Direction -> Dynamics -> PostEvent
- Music.Lilypond: DynamicsFont :: Markup -> Markup
- Music.Lilypond: E :: PitchName
- Music.Lilypond: EndBeam :: PostEvent
- Music.Lilypond: EndCrescDim :: PostEvent
- Music.Lilypond: EndPhraseSlur :: PostEvent
- Music.Lilypond: EndSlur :: PostEvent
- Music.Lilypond: Espressivo :: Articulation
- Music.Lilypond: F :: PitchName
- Music.Lilypond: Fermata :: Articulation
- Music.Lilypond: FingeringFont :: Markup -> Markup
- Music.Lilypond: Flageolet :: Articulation
- Music.Lilypond: Fontsize :: Double -> Markup -> Markup
- Music.Lilypond: French :: Clef
- Music.Lilypond: G :: PitchName
- Music.Lilypond: Glissando :: PostEvent
- Music.Lilypond: Harmonic :: ChordPostEvent
- Music.Lilypond: Huge :: Markup -> Markup
- Music.Lilypond: Italic :: Markup -> Markup
- Music.Lilypond: Key :: Pitch -> Mode -> Music
- Music.Lilypond: Large :: Markup -> Markup
- Music.Lilypond: Larger :: Markup -> Markup
- Music.Lilypond: LeftHeel :: Articulation
- Music.Lilypond: LeftToe :: Articulation
- Music.Lilypond: LinePrall :: Articulation
- Music.Lilypond: LongFermata :: Articulation
- Music.Lilypond: Magnify :: Markup -> Markup
- Music.Lilypond: Major :: Mode
- Music.Lilypond: Marcato :: Articulation
- Music.Lilypond: Markup :: Direction -> Markup -> PostEvent
- Music.Lilypond: MarkupList :: [Markup] -> Markup
- Music.Lilypond: MarkupText :: String -> Markup
- Music.Lilypond: Medium :: Markup -> Markup
- Music.Lilypond: MezzoSoprano :: Clef
- Music.Lilypond: Minor :: Mode
- Music.Lilypond: Mordent :: Articulation
- Music.Lilypond: New :: String -> (Maybe String) -> Music -> Music
- Music.Lilypond: Note :: Note -> (Maybe Duration) -> [PostEvent] -> Music
- Music.Lilypond: NotePitch :: Pitch -> (Maybe OctaveCheck) -> Note
- Music.Lilypond: OctaveCheck :: OctaveCheck
- Music.Lilypond: Open :: Articulation
- Music.Lilypond: Override :: String -> Value -> Music
- Music.Lilypond: Percussion :: Clef
- Music.Lilypond: Pitch :: (PitchName, Accidental, Octaves) -> Pitch
- Music.Lilypond: Portato :: Articulation
- Music.Lilypond: Prall :: Articulation
- Music.Lilypond: PrallDown :: Articulation
- Music.Lilypond: PrallMordent :: Articulation
- Music.Lilypond: PrallPrall :: Articulation
- Music.Lilypond: PrallUp :: Articulation
- Music.Lilypond: Relative :: Pitch -> Music -> Music
- Music.Lilypond: Repeat :: Bool -> Int -> Music -> (Maybe (Music, Music)) -> Music
- Music.Lilypond: Rest :: (Maybe Duration) -> [PostEvent] -> Music
- Music.Lilypond: ReverseTurn :: Articulation
- Music.Lilypond: Revert :: String -> Music
- Music.Lilypond: RightHeel :: Articulation
- Music.Lilypond: RightToe :: Articulation
- Music.Lilypond: RightVarComma :: BreathingSign
- Music.Lilypond: Roman :: Markup -> Markup
- Music.Lilypond: Sans :: Markup -> Markup
- Music.Lilypond: Segno :: Articulation
- Music.Lilypond: Sequential :: [Music] -> Music
- Music.Lilypond: Set :: String -> Value -> Music
- Music.Lilypond: ShortFermata :: Articulation
- Music.Lilypond: SignumCongruentiae :: Articulation
- Music.Lilypond: Simultaneous :: Bool -> [Music] -> Music
- Music.Lilypond: Soprano :: Clef
- Music.Lilypond: Staccatissimo :: Articulation
- Music.Lilypond: Staccato :: Articulation
- Music.Lilypond: Stopped :: Articulation
- Music.Lilypond: StraightCaesura :: BreathingSign
- Music.Lilypond: Sub :: Markup -> Markup
- Music.Lilypond: SubBass :: Clef
- Music.Lilypond: Super :: Markup -> Markup
- Music.Lilypond: Tab :: Clef
- Music.Lilypond: Tempo :: (Maybe String) -> (Maybe (Duration, Integer)) -> Music
- Music.Lilypond: Tenor :: Clef
- Music.Lilypond: Tenuto :: Articulation
- Music.Lilypond: Text :: Direction -> String -> PostEvent
- Music.Lilypond: TextFont :: Markup -> Markup
- Music.Lilypond: Thumb :: Articulation
- Music.Lilypond: Tie :: PostEvent
- Music.Lilypond: Time :: Integer -> Integer -> Music
- Music.Lilypond: Times :: Rational -> Music -> Music
- Music.Lilypond: Tiny :: Markup -> Markup
- Music.Lilypond: Transpose :: Pitch -> Pitch -> Music -> Music
- Music.Lilypond: Treble :: Clef
- Music.Lilypond: Tremolo :: Int -> Music -> Music
- Music.Lilypond: Trill :: Articulation
- Music.Lilypond: Turn :: Articulation
- Music.Lilypond: TypewriterFont :: Markup -> Markup
- Music.Lilypond: UpMordent :: Articulation
- Music.Lilypond: UpPrall :: Articulation
- Music.Lilypond: Upbow :: Articulation
- Music.Lilypond: Upright :: Markup -> Markup
- Music.Lilypond: VarBaritone :: Clef
- Music.Lilypond: VarCoda :: Articulation
- Music.Lilypond: VeryLongFermata :: Articulation
- Music.Lilypond: addAccent :: Music -> Music
- Music.Lilypond: addArticulation :: Articulation -> Music -> Music
- Music.Lilypond: addArticulation' :: Direction -> Articulation -> Music -> Music
- Music.Lilypond: addCoda :: Music -> Music
- Music.Lilypond: addDownMordent :: Music -> Music
- Music.Lilypond: addDownPrall :: Music -> Music
- Music.Lilypond: addDownbow :: Music -> Music
- Music.Lilypond: addDynamics :: Dynamics -> Music -> Music
- Music.Lilypond: addDynamics' :: Direction -> Dynamics -> Music -> Music
- Music.Lilypond: addEspressivo :: Music -> Music
- Music.Lilypond: addFermata :: Music -> Music
- Music.Lilypond: addFlageolet :: Music -> Music
- Music.Lilypond: addLeftHeel :: Music -> Music
- Music.Lilypond: addLeftToe :: Music -> Music
- Music.Lilypond: addLinePrall :: Music -> Music
- Music.Lilypond: addLongFermata :: Music -> Music
- Music.Lilypond: addMarcato :: Music -> Music
- Music.Lilypond: addMarkup :: HasMarkup a => a -> Music -> Music
- Music.Lilypond: addMarkup' :: HasMarkup a => Direction -> a -> Music -> Music
- Music.Lilypond: addMordent :: Music -> Music
- Music.Lilypond: addOpen :: Music -> Music
- Music.Lilypond: addPortato :: Music -> Music
- Music.Lilypond: addPost :: PostEvent -> Music -> Music
- Music.Lilypond: addPrall :: Music -> Music
- Music.Lilypond: addPrallDown :: Music -> Music
- Music.Lilypond: addPrallMordent :: Music -> Music
- Music.Lilypond: addPrallPrall :: Music -> Music
- Music.Lilypond: addPrallUp :: Music -> Music
- Music.Lilypond: addReverseTurn :: Music -> Music
- Music.Lilypond: addRightHeel :: Music -> Music
- Music.Lilypond: addRightToe :: Music -> Music
- Music.Lilypond: addSegno :: Music -> Music
- Music.Lilypond: addShortFermata :: Music -> Music
- Music.Lilypond: addSignumCongruentiae :: Music -> Music
- Music.Lilypond: addStaccatissimo :: Music -> Music
- Music.Lilypond: addStaccato :: Music -> Music
- Music.Lilypond: addStopped :: Music -> Music
- Music.Lilypond: addTenuto :: Music -> Music
- Music.Lilypond: addText :: String -> Music -> Music
- Music.Lilypond: addText' :: Direction -> String -> Music -> Music
- Music.Lilypond: addThumb :: Music -> Music
- Music.Lilypond: addTrill :: Music -> Music
- Music.Lilypond: addTurn :: Music -> Music
- Music.Lilypond: addUpMordent :: Music -> Music
- Music.Lilypond: addUpPrall :: Music -> Music
- Music.Lilypond: addUpbow :: Music -> Music
- Music.Lilypond: addVarCoda :: Music -> Music
- Music.Lilypond: addVeryLongFermata :: Music -> Music
- Music.Lilypond: beginBeam :: Music -> Music
- Music.Lilypond: beginCresc :: Music -> Music
- Music.Lilypond: beginDim :: Music -> Music
- Music.Lilypond: beginGlissando :: Music -> Music
- Music.Lilypond: beginPhraseSlur :: Music -> Music
- Music.Lilypond: beginSlur :: Music -> Music
- Music.Lilypond: beginTie :: Music -> Music
- Music.Lilypond: chord :: [Note] -> Music
- Music.Lilypond: chordHarm :: [(Note, Bool)] -> Music
- Music.Lilypond: chordWithPost :: [(Note, [ChordPostEvent])] -> Music
- Music.Lilypond: class HasMarkup a
- Music.Lilypond: data Articulation
- Music.Lilypond: data BreathingSign
- Music.Lilypond: data ChordPostEvent
- Music.Lilypond: data Clef
- Music.Lilypond: data Direction
- Music.Lilypond: data Markup
- Music.Lilypond: data Mode
- Music.Lilypond: data Music
- Music.Lilypond: data Note
- Music.Lilypond: data OctaveCheck
- Music.Lilypond: data PitchName
- Music.Lilypond: data PostEvent
- Music.Lilypond: data Value
- Music.Lilypond: endBeam :: Music -> Music
- Music.Lilypond: endCresc :: Music -> Music
- Music.Lilypond: endDim :: Music -> Music
- Music.Lilypond: endPhraseSlur :: Music -> Music
- Music.Lilypond: endSlur :: Music -> Music
- Music.Lilypond: foldMusic :: (Music -> Music) -> Music -> Music
- Music.Lilypond: getDuration :: Duration -> Rational
- Music.Lilypond: getPitch :: Pitch -> (PitchName, Accidental, Octaves)
- Music.Lilypond: instance AdditiveGroup Music
- Music.Lilypond: instance Default Direction
- Music.Lilypond: instance Enum Duration
- Music.Lilypond: instance Eq Articulation
- Music.Lilypond: instance Eq BreathingSign
- Music.Lilypond: instance Eq ChordPostEvent
- Music.Lilypond: instance Eq Clef
- Music.Lilypond: instance Eq Direction
- Music.Lilypond: instance Eq Duration
- Music.Lilypond: instance Eq Markup
- Music.Lilypond: instance Eq Music
- Music.Lilypond: instance Eq Note
- Music.Lilypond: instance Eq PostEvent
- Music.Lilypond: instance Fractional Duration
- Music.Lilypond: instance HasMarkup Markup
- Music.Lilypond: instance HasMarkup a => HasMarkup [a]
- Music.Lilypond: instance IsPitch Music
- Music.Lilypond: instance IsPitch Note
- Music.Lilypond: instance IsString Markup
- Music.Lilypond: instance Num Duration
- Music.Lilypond: instance Ord Direction
- Music.Lilypond: instance Ord Duration
- Music.Lilypond: instance Pretty Articulation
- Music.Lilypond: instance Pretty ChordPostEvent
- Music.Lilypond: instance Pretty Clef
- Music.Lilypond: instance Pretty Direction
- Music.Lilypond: instance Pretty Duration
- Music.Lilypond: instance Pretty Markup
- Music.Lilypond: instance Pretty Music
- Music.Lilypond: instance Pretty Note
- Music.Lilypond: instance Pretty PostEvent
- Music.Lilypond: instance Real Duration
- Music.Lilypond: instance RealFrac Duration
- Music.Lilypond: instance Show Articulation
- Music.Lilypond: instance Show BreathingSign
- Music.Lilypond: instance Show ChordPostEvent
- Music.Lilypond: instance Show Clef
- Music.Lilypond: instance Show Direction
- Music.Lilypond: instance Show Duration
- Music.Lilypond: instance Show Markup
- Music.Lilypond: instance Show Music
- Music.Lilypond: instance Show Note
- Music.Lilypond: instance Show PostEvent
- Music.Lilypond: instance VectorSpace Music
- Music.Lilypond: markup :: HasMarkup a => a -> Markup
- Music.Lilypond: newtype Duration
- Music.Lilypond: newtype Pitch
- Music.Lilypond: note :: Note -> Music
- Music.Lilypond: removeSingleChords :: Music -> Music
- Music.Lilypond: rest :: Music
- Music.Lilypond: sequential :: Music -> Music -> Music
- Music.Lilypond: simultaneous :: Music -> Music -> Music
- Music.Lilypond: toLiteralValue :: String -> Value
- Music.Lilypond: toValue :: Show a => a -> Value
- Music.Lilypond: type Accidental = Int
- Music.Lilypond: type Octaves = Int
- Music.Lilypond.Dynamics: F :: Dynamics
- Music.Lilypond.Dynamics: FF :: Dynamics
- Music.Lilypond.Dynamics: FFF :: Dynamics
- Music.Lilypond.Dynamics: FFFF :: Dynamics
- Music.Lilypond.Dynamics: MF :: Dynamics
- Music.Lilypond.Dynamics: MP :: Dynamics
- Music.Lilypond.Dynamics: P :: Dynamics
- Music.Lilypond.Dynamics: PP :: Dynamics
- Music.Lilypond.Dynamics: PPP :: Dynamics
- Music.Lilypond.Dynamics: PPPP :: Dynamics
- Music.Lilypond.Dynamics: PPPPP :: Dynamics
- Music.Lilypond.Dynamics: RFZ :: Dynamics
- Music.Lilypond.Dynamics: SF :: Dynamics
- Music.Lilypond.Dynamics: SFF :: Dynamics
- Music.Lilypond.Dynamics: SFZ :: Dynamics
- Music.Lilypond.Dynamics: SP :: Dynamics
- Music.Lilypond.Dynamics: SPP :: Dynamics
- Music.Lilypond.Dynamics: data Dynamics
- Music.Lilypond.Dynamics: instance Bounded Dynamics
- Music.Lilypond.Dynamics: instance Enum Dynamics
- Music.Lilypond.Dynamics: instance Eq Dynamics
- Music.Lilypond.Dynamics: instance IsDynamics Dynamics
- Music.Lilypond.Dynamics: instance Ord Dynamics
- Music.Lilypond.Dynamics: instance Pretty Dynamics
- Music.Lilypond.Dynamics: instance Show Dynamics
- Music.Lilypond.IO: EngraveOptions :: Format -> FilePath -> FilePath -> FilePath -> Int -> EngraveOptions
- Music.Lilypond.IO: PDF :: Format
- Music.Lilypond.IO: PNG :: Format
- Music.Lilypond.IO: PS :: Format
- Music.Lilypond.IO: data EngraveOptions
- Music.Lilypond.IO: data Format
- Music.Lilypond.IO: format :: EngraveOptions -> Format
- Music.Lilypond.IO: include :: EngraveOptions -> FilePath
- Music.Lilypond.IO: initFile :: EngraveOptions -> FilePath
- Music.Lilypond.IO: logFile :: EngraveOptions -> FilePath
- Music.Lilypond.IO: logLevel :: EngraveOptions -> Int
- Music.Lilypond.IO: writeAndEngraveMusic :: FilePath -> EngraveOptions -> Music -> IO ()
- Music.Lilypond.IO: writeMusic :: FilePath -> Music -> IO ()
- Music.Lilypond.Pitch: A :: PitchName
- Music.Lilypond.Pitch: B :: PitchName
- Music.Lilypond.Pitch: C :: PitchName
- Music.Lilypond.Pitch: D :: PitchName
- Music.Lilypond.Pitch: E :: PitchName
- Music.Lilypond.Pitch: F :: PitchName
- Music.Lilypond.Pitch: G :: PitchName
- Music.Lilypond.Pitch: Major :: Mode
- Music.Lilypond.Pitch: Minor :: Mode
- Music.Lilypond.Pitch: OctaveCheck :: OctaveCheck
- Music.Lilypond.Pitch: Pitch :: (PitchName, Accidental, Octaves) -> Pitch
- Music.Lilypond.Pitch: data Mode
- Music.Lilypond.Pitch: data OctaveCheck
- Music.Lilypond.Pitch: data PitchName
- Music.Lilypond.Pitch: getPitch :: Pitch -> (PitchName, Accidental, Octaves)
- Music.Lilypond.Pitch: instance Enum PitchName
- Music.Lilypond.Pitch: instance Eq Mode
- Music.Lilypond.Pitch: instance Eq OctaveCheck
- Music.Lilypond.Pitch: instance Eq Pitch
- Music.Lilypond.Pitch: instance Eq PitchName
- Music.Lilypond.Pitch: instance IsPitch Pitch
- Music.Lilypond.Pitch: instance Ord Pitch
- Music.Lilypond.Pitch: instance Ord PitchName
- Music.Lilypond.Pitch: instance Pretty Mode
- Music.Lilypond.Pitch: instance Pretty Pitch
- Music.Lilypond.Pitch: instance Show Mode
- Music.Lilypond.Pitch: instance Show OctaveCheck
- Music.Lilypond.Pitch: instance Show Pitch
- Music.Lilypond.Pitch: instance Show PitchName
- Music.Lilypond.Pitch: newtype Pitch
- Music.Lilypond.Pitch: type Accidental = Int
- Music.Lilypond.Pitch: type Octaves = Int
- Music.Lilypond.Value: data Value
- Music.Lilypond.Value: instance Eq Value
- Music.Lilypond.Value: instance Fractional Value
- Music.Lilypond.Value: instance IsString Value
- Music.Lilypond.Value: instance Num Value
- Music.Lilypond.Value: instance Pretty Value
- Music.Lilypond.Value: instance Show Value
- Music.Lilypond.Value: toLiteralValue :: String -> Value
- Music.Lilypond.Value: toValue :: Show a => a -> Value
+ Data.Music.Lilypond: A :: PitchName
+ Data.Music.Lilypond: Above :: Direction
+ Data.Music.Lilypond: Accent :: Articulation
+ Data.Music.Lilypond: Alto :: Clef
+ Data.Music.Lilypond: Articulation :: Direction -> Articulation -> PostEvent
+ Data.Music.Lilypond: B :: PitchName
+ Data.Music.Lilypond: Baritone :: Clef
+ Data.Music.Lilypond: Bass :: Clef
+ Data.Music.Lilypond: BeginBeam :: PostEvent
+ Data.Music.Lilypond: BeginCresc :: PostEvent
+ Data.Music.Lilypond: BeginDim :: PostEvent
+ Data.Music.Lilypond: BeginPhraseSlur :: PostEvent
+ Data.Music.Lilypond: BeginSlur :: PostEvent
+ Data.Music.Lilypond: Below :: Direction
+ Data.Music.Lilypond: Bold :: Markup -> Markup
+ Data.Music.Lilypond: Box :: Markup -> Markup
+ Data.Music.Lilypond: Breathe :: (Maybe BreathingSign) -> Music
+ Data.Music.Lilypond: C :: PitchName
+ Data.Music.Lilypond: Caps :: Markup -> Markup
+ Data.Music.Lilypond: Chord :: [(Note, [ChordPostEvent])] -> (Maybe Duration) -> [PostEvent] -> Music
+ Data.Music.Lilypond: Clef :: Clef -> Music
+ Data.Music.Lilypond: Coda :: Articulation
+ Data.Music.Lilypond: Context :: String -> (Maybe String) -> Music -> Music
+ Data.Music.Lilypond: CurvedCaesura :: BreathingSign
+ Data.Music.Lilypond: D :: PitchName
+ Data.Music.Lilypond: Default :: Direction
+ Data.Music.Lilypond: DownMordent :: Articulation
+ Data.Music.Lilypond: DownPrall :: Articulation
+ Data.Music.Lilypond: Downbow :: Articulation
+ Data.Music.Lilypond: DrumNotePitch :: (Maybe Duration) -> Note
+ Data.Music.Lilypond: Duration :: Rational -> Duration
+ Data.Music.Lilypond: Dynamics :: Direction -> Dynamics -> PostEvent
+ Data.Music.Lilypond: DynamicsFont :: Markup -> Markup
+ Data.Music.Lilypond: E :: PitchName
+ Data.Music.Lilypond: EndBeam :: PostEvent
+ Data.Music.Lilypond: EndCrescDim :: PostEvent
+ Data.Music.Lilypond: EndPhraseSlur :: PostEvent
+ Data.Music.Lilypond: EndSlur :: PostEvent
+ Data.Music.Lilypond: Espressivo :: Articulation
+ Data.Music.Lilypond: F :: PitchName
+ Data.Music.Lilypond: Fermata :: Articulation
+ Data.Music.Lilypond: FingeringFont :: Markup -> Markup
+ Data.Music.Lilypond: Flageolet :: Articulation
+ Data.Music.Lilypond: Fontsize :: Double -> Markup -> Markup
+ Data.Music.Lilypond: French :: Clef
+ Data.Music.Lilypond: G :: PitchName
+ Data.Music.Lilypond: Glissando :: PostEvent
+ Data.Music.Lilypond: Harmonic :: ChordPostEvent
+ Data.Music.Lilypond: Huge :: Markup -> Markup
+ Data.Music.Lilypond: Italic :: Markup -> Markup
+ Data.Music.Lilypond: Key :: Pitch -> Mode -> Music
+ Data.Music.Lilypond: Large :: Markup -> Markup
+ Data.Music.Lilypond: Larger :: Markup -> Markup
+ Data.Music.Lilypond: LeftHeel :: Articulation
+ Data.Music.Lilypond: LeftToe :: Articulation
+ Data.Music.Lilypond: LinePrall :: Articulation
+ Data.Music.Lilypond: LongFermata :: Articulation
+ Data.Music.Lilypond: Magnify :: Markup -> Markup
+ Data.Music.Lilypond: Major :: Mode
+ Data.Music.Lilypond: Marcato :: Articulation
+ Data.Music.Lilypond: Markup :: Direction -> Markup -> PostEvent
+ Data.Music.Lilypond: MarkupList :: [Markup] -> Markup
+ Data.Music.Lilypond: MarkupText :: String -> Markup
+ Data.Music.Lilypond: Medium :: Markup -> Markup
+ Data.Music.Lilypond: MezzoSoprano :: Clef
+ Data.Music.Lilypond: Minor :: Mode
+ Data.Music.Lilypond: Mordent :: Articulation
+ Data.Music.Lilypond: New :: String -> (Maybe String) -> Music -> Music
+ Data.Music.Lilypond: Note :: Note -> (Maybe Duration) -> [PostEvent] -> Music
+ Data.Music.Lilypond: NotePitch :: Pitch -> (Maybe OctaveCheck) -> Note
+ Data.Music.Lilypond: OctaveCheck :: OctaveCheck
+ Data.Music.Lilypond: Open :: Articulation
+ Data.Music.Lilypond: Override :: String -> Value -> Music
+ Data.Music.Lilypond: Percussion :: Clef
+ Data.Music.Lilypond: Pitch :: (PitchName, Accidental, Octaves) -> Pitch
+ Data.Music.Lilypond: Portato :: Articulation
+ Data.Music.Lilypond: Prall :: Articulation
+ Data.Music.Lilypond: PrallDown :: Articulation
+ Data.Music.Lilypond: PrallMordent :: Articulation
+ Data.Music.Lilypond: PrallPrall :: Articulation
+ Data.Music.Lilypond: PrallUp :: Articulation
+ Data.Music.Lilypond: Relative :: Pitch -> Music -> Music
+ Data.Music.Lilypond: Repeat :: Bool -> Int -> Music -> (Maybe (Music, Music)) -> Music
+ Data.Music.Lilypond: Rest :: (Maybe Duration) -> [PostEvent] -> Music
+ Data.Music.Lilypond: ReverseTurn :: Articulation
+ Data.Music.Lilypond: Revert :: String -> Music
+ Data.Music.Lilypond: RightHeel :: Articulation
+ Data.Music.Lilypond: RightToe :: Articulation
+ Data.Music.Lilypond: RightVarComma :: BreathingSign
+ Data.Music.Lilypond: Roman :: Markup -> Markup
+ Data.Music.Lilypond: Sans :: Markup -> Markup
+ Data.Music.Lilypond: Segno :: Articulation
+ Data.Music.Lilypond: Sequential :: [Music] -> Music
+ Data.Music.Lilypond: Set :: String -> Value -> Music
+ Data.Music.Lilypond: ShortFermata :: Articulation
+ Data.Music.Lilypond: SignumCongruentiae :: Articulation
+ Data.Music.Lilypond: Simultaneous :: Bool -> [Music] -> Music
+ Data.Music.Lilypond: Soprano :: Clef
+ Data.Music.Lilypond: Staccatissimo :: Articulation
+ Data.Music.Lilypond: Staccato :: Articulation
+ Data.Music.Lilypond: Stopped :: Articulation
+ Data.Music.Lilypond: StraightCaesura :: BreathingSign
+ Data.Music.Lilypond: Sub :: Markup -> Markup
+ Data.Music.Lilypond: SubBass :: Clef
+ Data.Music.Lilypond: Super :: Markup -> Markup
+ Data.Music.Lilypond: Tab :: Clef
+ Data.Music.Lilypond: Tempo :: (Maybe String) -> (Maybe (Duration, Integer)) -> Music
+ Data.Music.Lilypond: Tenor :: Clef
+ Data.Music.Lilypond: Tenuto :: Articulation
+ Data.Music.Lilypond: Text :: Direction -> String -> PostEvent
+ Data.Music.Lilypond: TextFont :: Markup -> Markup
+ Data.Music.Lilypond: Thumb :: Articulation
+ Data.Music.Lilypond: Tie :: PostEvent
+ Data.Music.Lilypond: Time :: Integer -> Integer -> Music
+ Data.Music.Lilypond: Times :: Rational -> Music -> Music
+ Data.Music.Lilypond: Tiny :: Markup -> Markup
+ Data.Music.Lilypond: Transpose :: Pitch -> Pitch -> Music -> Music
+ Data.Music.Lilypond: Treble :: Clef
+ Data.Music.Lilypond: Tremolo :: Int -> Music -> Music
+ Data.Music.Lilypond: Trill :: Articulation
+ Data.Music.Lilypond: Turn :: Articulation
+ Data.Music.Lilypond: TypewriterFont :: Markup -> Markup
+ Data.Music.Lilypond: UpMordent :: Articulation
+ Data.Music.Lilypond: UpPrall :: Articulation
+ Data.Music.Lilypond: Upbow :: Articulation
+ Data.Music.Lilypond: Upright :: Markup -> Markup
+ Data.Music.Lilypond: VarBaritone :: Clef
+ Data.Music.Lilypond: VarCoda :: Articulation
+ Data.Music.Lilypond: VeryLongFermata :: Articulation
+ Data.Music.Lilypond: addAccent :: Music -> Music
+ Data.Music.Lilypond: addArticulation :: Articulation -> Music -> Music
+ Data.Music.Lilypond: addArticulation' :: Direction -> Articulation -> Music -> Music
+ Data.Music.Lilypond: addCoda :: Music -> Music
+ Data.Music.Lilypond: addDownMordent :: Music -> Music
+ Data.Music.Lilypond: addDownPrall :: Music -> Music
+ Data.Music.Lilypond: addDownbow :: Music -> Music
+ Data.Music.Lilypond: addDynamics :: Dynamics -> Music -> Music
+ Data.Music.Lilypond: addDynamics' :: Direction -> Dynamics -> Music -> Music
+ Data.Music.Lilypond: addEspressivo :: Music -> Music
+ Data.Music.Lilypond: addFermata :: Music -> Music
+ Data.Music.Lilypond: addFlageolet :: Music -> Music
+ Data.Music.Lilypond: addLeftHeel :: Music -> Music
+ Data.Music.Lilypond: addLeftToe :: Music -> Music
+ Data.Music.Lilypond: addLinePrall :: Music -> Music
+ Data.Music.Lilypond: addLongFermata :: Music -> Music
+ Data.Music.Lilypond: addMarcato :: Music -> Music
+ Data.Music.Lilypond: addMarkup :: HasMarkup a => a -> Music -> Music
+ Data.Music.Lilypond: addMarkup' :: HasMarkup a => Direction -> a -> Music -> Music
+ Data.Music.Lilypond: addMordent :: Music -> Music
+ Data.Music.Lilypond: addOpen :: Music -> Music
+ Data.Music.Lilypond: addPortato :: Music -> Music
+ Data.Music.Lilypond: addPost :: PostEvent -> Music -> Music
+ Data.Music.Lilypond: addPrall :: Music -> Music
+ Data.Music.Lilypond: addPrallDown :: Music -> Music
+ Data.Music.Lilypond: addPrallMordent :: Music -> Music
+ Data.Music.Lilypond: addPrallPrall :: Music -> Music
+ Data.Music.Lilypond: addPrallUp :: Music -> Music
+ Data.Music.Lilypond: addReverseTurn :: Music -> Music
+ Data.Music.Lilypond: addRightHeel :: Music -> Music
+ Data.Music.Lilypond: addRightToe :: Music -> Music
+ Data.Music.Lilypond: addSegno :: Music -> Music
+ Data.Music.Lilypond: addShortFermata :: Music -> Music
+ Data.Music.Lilypond: addSignumCongruentiae :: Music -> Music
+ Data.Music.Lilypond: addStaccatissimo :: Music -> Music
+ Data.Music.Lilypond: addStaccato :: Music -> Music
+ Data.Music.Lilypond: addStopped :: Music -> Music
+ Data.Music.Lilypond: addTenuto :: Music -> Music
+ Data.Music.Lilypond: addText :: String -> Music -> Music
+ Data.Music.Lilypond: addText' :: Direction -> String -> Music -> Music
+ Data.Music.Lilypond: addThumb :: Music -> Music
+ Data.Music.Lilypond: addTrill :: Music -> Music
+ Data.Music.Lilypond: addTurn :: Music -> Music
+ Data.Music.Lilypond: addUpMordent :: Music -> Music
+ Data.Music.Lilypond: addUpPrall :: Music -> Music
+ Data.Music.Lilypond: addUpbow :: Music -> Music
+ Data.Music.Lilypond: addVarCoda :: Music -> Music
+ Data.Music.Lilypond: addVeryLongFermata :: Music -> Music
+ Data.Music.Lilypond: beginBeam :: Music -> Music
+ Data.Music.Lilypond: beginCresc :: Music -> Music
+ Data.Music.Lilypond: beginDim :: Music -> Music
+ Data.Music.Lilypond: beginGlissando :: Music -> Music
+ Data.Music.Lilypond: beginPhraseSlur :: Music -> Music
+ Data.Music.Lilypond: beginSlur :: Music -> Music
+ Data.Music.Lilypond: beginTie :: Music -> Music
+ Data.Music.Lilypond: chord :: [Note] -> Music
+ Data.Music.Lilypond: chordHarm :: [(Note, Bool)] -> Music
+ Data.Music.Lilypond: chordWithPost :: [(Note, [ChordPostEvent])] -> Music
+ Data.Music.Lilypond: class HasMarkup a
+ Data.Music.Lilypond: data Articulation
+ Data.Music.Lilypond: data BreathingSign
+ Data.Music.Lilypond: data ChordPostEvent
+ Data.Music.Lilypond: data Clef
+ Data.Music.Lilypond: data Direction
+ Data.Music.Lilypond: data Markup
+ Data.Music.Lilypond: data Mode
+ Data.Music.Lilypond: data Music
+ Data.Music.Lilypond: data Note
+ Data.Music.Lilypond: data OctaveCheck
+ Data.Music.Lilypond: data PitchName
+ Data.Music.Lilypond: data PostEvent
+ Data.Music.Lilypond: data Value
+ Data.Music.Lilypond: endBeam :: Music -> Music
+ Data.Music.Lilypond: endCresc :: Music -> Music
+ Data.Music.Lilypond: endDim :: Music -> Music
+ Data.Music.Lilypond: endPhraseSlur :: Music -> Music
+ Data.Music.Lilypond: endSlur :: Music -> Music
+ Data.Music.Lilypond: foldMusic :: (Music -> Music) -> Music -> Music
+ Data.Music.Lilypond: getDuration :: Duration -> Rational
+ Data.Music.Lilypond: getPitch :: Pitch -> (PitchName, Accidental, Octaves)
+ Data.Music.Lilypond: instance AdditiveGroup Music
+ Data.Music.Lilypond: instance Default Direction
+ Data.Music.Lilypond: instance Enum Duration
+ Data.Music.Lilypond: instance Eq Articulation
+ Data.Music.Lilypond: instance Eq BreathingSign
+ Data.Music.Lilypond: instance Eq ChordPostEvent
+ Data.Music.Lilypond: instance Eq Clef
+ Data.Music.Lilypond: instance Eq Direction
+ Data.Music.Lilypond: instance Eq Duration
+ Data.Music.Lilypond: instance Eq Markup
+ Data.Music.Lilypond: instance Eq Music
+ Data.Music.Lilypond: instance Eq Note
+ Data.Music.Lilypond: instance Eq PostEvent
+ Data.Music.Lilypond: instance Fractional Duration
+ Data.Music.Lilypond: instance HasMarkup Markup
+ Data.Music.Lilypond: instance HasMarkup a => HasMarkup [a]
+ Data.Music.Lilypond: instance IsPitch Music
+ Data.Music.Lilypond: instance IsPitch Note
+ Data.Music.Lilypond: instance IsString Markup
+ Data.Music.Lilypond: instance Num Duration
+ Data.Music.Lilypond: instance Ord Direction
+ Data.Music.Lilypond: instance Ord Duration
+ Data.Music.Lilypond: instance Pretty Articulation
+ Data.Music.Lilypond: instance Pretty ChordPostEvent
+ Data.Music.Lilypond: instance Pretty Clef
+ Data.Music.Lilypond: instance Pretty Direction
+ Data.Music.Lilypond: instance Pretty Duration
+ Data.Music.Lilypond: instance Pretty Markup
+ Data.Music.Lilypond: instance Pretty Music
+ Data.Music.Lilypond: instance Pretty Note
+ Data.Music.Lilypond: instance Pretty PostEvent
+ Data.Music.Lilypond: instance Real Duration
+ Data.Music.Lilypond: instance RealFrac Duration
+ Data.Music.Lilypond: instance Show Articulation
+ Data.Music.Lilypond: instance Show BreathingSign
+ Data.Music.Lilypond: instance Show ChordPostEvent
+ Data.Music.Lilypond: instance Show Clef
+ Data.Music.Lilypond: instance Show Direction
+ Data.Music.Lilypond: instance Show Duration
+ Data.Music.Lilypond: instance Show Markup
+ Data.Music.Lilypond: instance Show Music
+ Data.Music.Lilypond: instance Show Note
+ Data.Music.Lilypond: instance Show PostEvent
+ Data.Music.Lilypond: instance VectorSpace Music
+ Data.Music.Lilypond: markup :: HasMarkup a => a -> Markup
+ Data.Music.Lilypond: newtype Duration
+ Data.Music.Lilypond: newtype Pitch
+ Data.Music.Lilypond: note :: Note -> Music
+ Data.Music.Lilypond: removeSingleChords :: Music -> Music
+ Data.Music.Lilypond: rest :: Music
+ Data.Music.Lilypond: sequential :: Music -> Music -> Music
+ Data.Music.Lilypond: simultaneous :: Music -> Music -> Music
+ Data.Music.Lilypond: toLiteralValue :: String -> Value
+ Data.Music.Lilypond: toValue :: Show a => a -> Value
+ Data.Music.Lilypond: type Accidental = Int
+ Data.Music.Lilypond: type Octaves = Int
+ Data.Music.Lilypond.Dynamics: F :: Dynamics
+ Data.Music.Lilypond.Dynamics: FF :: Dynamics
+ Data.Music.Lilypond.Dynamics: FFF :: Dynamics
+ Data.Music.Lilypond.Dynamics: FFFF :: Dynamics
+ Data.Music.Lilypond.Dynamics: MF :: Dynamics
+ Data.Music.Lilypond.Dynamics: MP :: Dynamics
+ Data.Music.Lilypond.Dynamics: P :: Dynamics
+ Data.Music.Lilypond.Dynamics: PP :: Dynamics
+ Data.Music.Lilypond.Dynamics: PPP :: Dynamics
+ Data.Music.Lilypond.Dynamics: PPPP :: Dynamics
+ Data.Music.Lilypond.Dynamics: PPPPP :: Dynamics
+ Data.Music.Lilypond.Dynamics: RFZ :: Dynamics
+ Data.Music.Lilypond.Dynamics: SF :: Dynamics
+ Data.Music.Lilypond.Dynamics: SFF :: Dynamics
+ Data.Music.Lilypond.Dynamics: SFZ :: Dynamics
+ Data.Music.Lilypond.Dynamics: SP :: Dynamics
+ Data.Music.Lilypond.Dynamics: SPP :: Dynamics
+ Data.Music.Lilypond.Dynamics: data Dynamics
+ Data.Music.Lilypond.Dynamics: instance Bounded Dynamics
+ Data.Music.Lilypond.Dynamics: instance Enum Dynamics
+ Data.Music.Lilypond.Dynamics: instance Eq Dynamics
+ Data.Music.Lilypond.Dynamics: instance IsDynamics Dynamics
+ Data.Music.Lilypond.Dynamics: instance Ord Dynamics
+ Data.Music.Lilypond.Dynamics: instance Pretty Dynamics
+ Data.Music.Lilypond.Dynamics: instance Show Dynamics
+ Data.Music.Lilypond.IO: EngraveOptions :: Format -> FilePath -> FilePath -> FilePath -> Int -> EngraveOptions
+ Data.Music.Lilypond.IO: PDF :: Format
+ Data.Music.Lilypond.IO: PNG :: Format
+ Data.Music.Lilypond.IO: PS :: Format
+ Data.Music.Lilypond.IO: data EngraveOptions
+ Data.Music.Lilypond.IO: data Format
+ Data.Music.Lilypond.IO: format :: EngraveOptions -> Format
+ Data.Music.Lilypond.IO: include :: EngraveOptions -> FilePath
+ Data.Music.Lilypond.IO: initFile :: EngraveOptions -> FilePath
+ Data.Music.Lilypond.IO: logFile :: EngraveOptions -> FilePath
+ Data.Music.Lilypond.IO: logLevel :: EngraveOptions -> Int
+ Data.Music.Lilypond.IO: writeAndEngraveMusic :: FilePath -> EngraveOptions -> Music -> IO ()
+ Data.Music.Lilypond.IO: writeMusic :: FilePath -> Music -> IO ()
+ Data.Music.Lilypond.Pitch: A :: PitchName
+ Data.Music.Lilypond.Pitch: B :: PitchName
+ Data.Music.Lilypond.Pitch: C :: PitchName
+ Data.Music.Lilypond.Pitch: D :: PitchName
+ Data.Music.Lilypond.Pitch: E :: PitchName
+ Data.Music.Lilypond.Pitch: F :: PitchName
+ Data.Music.Lilypond.Pitch: G :: PitchName
+ Data.Music.Lilypond.Pitch: Major :: Mode
+ Data.Music.Lilypond.Pitch: Minor :: Mode
+ Data.Music.Lilypond.Pitch: OctaveCheck :: OctaveCheck
+ Data.Music.Lilypond.Pitch: Pitch :: (PitchName, Accidental, Octaves) -> Pitch
+ Data.Music.Lilypond.Pitch: data Mode
+ Data.Music.Lilypond.Pitch: data OctaveCheck
+ Data.Music.Lilypond.Pitch: data PitchName
+ Data.Music.Lilypond.Pitch: getPitch :: Pitch -> (PitchName, Accidental, Octaves)
+ Data.Music.Lilypond.Pitch: instance Enum PitchName
+ Data.Music.Lilypond.Pitch: instance Eq Mode
+ Data.Music.Lilypond.Pitch: instance Eq OctaveCheck
+ Data.Music.Lilypond.Pitch: instance Eq Pitch
+ Data.Music.Lilypond.Pitch: instance Eq PitchName
+ Data.Music.Lilypond.Pitch: instance IsPitch Pitch
+ Data.Music.Lilypond.Pitch: instance Ord Pitch
+ Data.Music.Lilypond.Pitch: instance Ord PitchName
+ Data.Music.Lilypond.Pitch: instance Pretty Mode
+ Data.Music.Lilypond.Pitch: instance Pretty Pitch
+ Data.Music.Lilypond.Pitch: instance Show Mode
+ Data.Music.Lilypond.Pitch: instance Show OctaveCheck
+ Data.Music.Lilypond.Pitch: instance Show Pitch
+ Data.Music.Lilypond.Pitch: instance Show PitchName
+ Data.Music.Lilypond.Pitch: newtype Pitch
+ Data.Music.Lilypond.Pitch: type Accidental = Int
+ Data.Music.Lilypond.Pitch: type Octaves = Int
+ Data.Music.Lilypond.Value: data Value
+ Data.Music.Lilypond.Value: instance Eq Value
+ Data.Music.Lilypond.Value: instance Fractional Value
+ Data.Music.Lilypond.Value: instance IsString Value
+ Data.Music.Lilypond.Value: instance Num Value
+ Data.Music.Lilypond.Value: instance Pretty Value
+ Data.Music.Lilypond.Value: instance Show Value
+ Data.Music.Lilypond.Value: toLiteralValue :: String -> Value
+ Data.Music.Lilypond.Value: toValue :: Show a => a -> Value

Files

lilypond.cabal view
@@ -1,6 +1,6 @@  name:                   lilypond-version:                1.8.1+version:                1.9.0 author:                 Hans Hoglund maintainer:             Hans Hoglund <hans@hanshoglund.se> license:                BSD3@@ -24,16 +24,16 @@ library     build-depends:      base                    >= 4 && < 5,                         semigroups              >= 0.13.0.1 && < 1,-                        vector-space            >= 0.8.7 && < 0.9,+                        vector-space            >= 0.10.2 && < 1,                         process                 >= 1.2 && < 1.3,                         data-default,                         prettify,-                        music-pitch-literal     == 1.8.1,-                        music-dynamics-literal  == 1.8.1-    exposed-modules:    Music.Lilypond-                        Music.Lilypond.Pitch-                        Music.Lilypond.Dynamics-                        Music.Lilypond.Value-                        Music.Lilypond.IO+                        music-pitch-literal     == 1.9.0,+                        music-dynamics-literal  == 1.9.0+    exposed-modules:    Data.Music.Lilypond+                        Data.Music.Lilypond.Pitch+                        Data.Music.Lilypond.Dynamics+                        Data.Music.Lilypond.Value+                        Data.Music.Lilypond.IO     hs-source-dirs:     src     default-language:   Haskell2010
+ src/Data/Music/Lilypond.hs view
@@ -0,0 +1,963 @@++{-# LANGUAGE +    OverloadedStrings, +    GeneralizedNewtypeDeriving,+    StandaloneDeriving,+    TypeFamilies,+    ScopedTypeVariables,     +    ExistentialQuantification #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : GHC+--+-------------------------------------------------------------------------------------+module Data.Music.Lilypond (++        -- * Representation+        +        -- ** Music expressions+        Music(..),+        Note(..),+        Clef(..),+        Mode(..),+        +        -- ** Attributes+        Value,+        toValue,+        toLiteralValue,++        -- ** Articulation and dynamics+        PostEvent(..),+        ChordPostEvent(..),++        -- ** Text+        Articulation(..),+        Markup(..),+        HasMarkup(..),++        -- ** Miscellaneous types+        Direction(..),+        OctaveCheck(..),+        BreathingSign(..),++        -- ** Time+        Duration(..),+        -- ** Pitch+        Pitch(..),+        PitchName(..),+        Accidental(..),+        Octaves(..),++        -- * Constructing Lilypond expresions+        -- ** Notes and rests+        rest,+        note,+        chord,+        chordHarm,+        chordWithPost,+        +        -- ** Composition+        sequential,+        simultaneous,+        +        -- ** Post events+        addPost,+        addText,+        addMarkup,+        addDynamics,+        addArticulation,+        addText',+        addMarkup',+        addDynamics',+        addArticulation',++        -- ** Curves and lines+        beginTie,+        beginGlissando,+        beginBeam,+        endBeam,+        beginSlur,+        endSlur,+        beginPhraseSlur,+        endPhraseSlur,+        beginCresc,+        endCresc,+        beginDim,+        endDim,++        -- ** Marks+        addAccent,+        addMarcato,+        addStaccatissimo,+        addEspressivo,+        addStaccato,+        addTenuto,+        addPortato,+        addUpbow,+        addDownbow,+        addFlageolet,+        addThumb,+        addLeftHeel,+        addRightHeel,+        addLeftToe,+        addRightToe,+        addOpen,+        addStopped,+        addTurn,+        addReverseTurn,+        addTrill,+        addPrall,+        addMordent,+        addPrallPrall,+        addPrallMordent,+        addUpPrall,+        addDownPrall,+        addUpMordent,+        addDownMordent,+        addPrallDown,+        addPrallUp,+        addLinePrall,+        addSignumCongruentiae,+        addShortFermata,+        addFermata,+        addLongFermata,+        addVeryLongFermata,+        addSegno,+        addCoda,+        addVarCoda,++        -- * Utility+        foldMusic,+        removeSingleChords,+    )+where++import Control.Arrow ((<<<), (***), first, second)+import Data.Ratio+import Data.String+import Data.Default+import Data.Semigroup+import Data.VectorSpace+import Text.Pretty hiding (Mode)+import Music.Pitch.Literal++-- import System.Process -- TODO debug++import Data.Music.Lilypond.Pitch+import Data.Music.Lilypond.Dynamics+import Data.Music.Lilypond.Value+++{-+data Lilypond +    = Book      Id [BookBlock]+    | BookPart  Id [BookPartBlock]+    | Score     Id [ScoreBlock]++data BookBlock+    = Paper    OutputDef+    | Bookpart Id [BookPartBlock]+    | Score    Id [ScoreBlock]+    | Music    CompositeMusic+    -- full markup etc++data BookPartBlock+    = BookPartPaper    OutputDef+    | BookPartScore    Id [ScoreBlock]+    | BookPartMusic    CompositeMusic+    -- full markup etc+    +data ScoreBlock+    = ScoreMusic     Music+    -- full markup etc+-}++-- | A Lilypond music expression.+--   +--   Use the 'Pretty' instance to convert into Lilypond syntax.+--   +data Music    +    = Rest (Maybe Duration) [PostEvent]             -- ^ Single rest.+    | Note Note (Maybe Duration) [PostEvent]        -- ^ Single note.+    | Chord [(Note, [ChordPostEvent])] (Maybe Duration) [PostEvent]     -- ^ Single chord.+    | Sequential   [Music]                          -- ^ Sequential composition.+    | Simultaneous Bool [Music]                     -- ^ Parallel composition (split voices?).+    | Repeat Bool Int Music (Maybe (Music, Music))  -- ^ Repetition (unfold?, times, music, alternative).+    | Tremolo Int Music                             -- ^ Tremolo (multiplier).+    | Times Rational Music                          -- ^ Stretch music (multiplier).+    | Transpose Pitch Pitch Music                   -- ^ Transpose music (from to).+    | Relative Pitch Music                          -- ^ Use relative octave (octave).+    | Clef Clef                                     -- ^ Clef.+    | Key Pitch Mode                                -- ^ Key signature.+    | Time Integer Integer                          -- ^ Time signature.+    | Breathe (Maybe BreathingSign)                 -- ^ Breath mark (caesura)+    | Tempo (Maybe String) (Maybe (Duration,Integer)) -- ^ Tempo mark.+    | New String (Maybe String) Music               -- ^ New expression.+    | Context String (Maybe String) Music           -- ^ Context expression.+    | Set String Value                            +    | Override String Value+    | Revert String+    deriving (Eq, Show)++foldMusic :: (Music -> Music) -> Music -> Music+foldMusic f = go+    where+        go (Sequential ms)      = Sequential (fmap go ms)                          +        go (Simultaneous b ms)  = Simultaneous b (fmap go ms)                     +        go (Repeat b i m qmm)   = Repeat b i m (fmap (go *** go) qmm)  +        go (Tremolo n m)        = Tremolo n (go m)                             +        go (Times r m)          = Times r (go m)                          +        go (Transpose p p2 m)   = Transpose p p2 (go m)                   +        go (Relative p m)       = Relative p (go m)                          +        go (New s v m)          = New s v (go m)               +        go (Context s v m)      = Context s v (go m)+        go x = f x++foldMusic' :: (Music -> Music) -- Rest Note Chord+           -> (Music -> Music) -- Other non-recursive+           -> (Music -> Music) -- Recursive+           -> Music -> Music+foldMusic' f g h = go+    where               +        go m@(Rest _ _)           = f m+        go m@(Note _ _ _)         = f m+        go m@(Chord _ _ _)        = f m+        go m@(Clef _)             = g m+        go m@(Key _ _)            = g m+        go m@(Time _ _)           = g m+        go m@(Breathe _)          = g m+        go m@(Tempo _ _)          = g m+        go m@(Set _ _)            = g m+        go m@(Override _ _)       = g m+        go m@(Revert _)           = g m+        go (Sequential ms)      = Sequential (fmap h ms)                          +        go (Simultaneous b ms)  = Simultaneous b (fmap h ms)                     +        go (Repeat b i m qmm)   = Repeat b i m (fmap (h *** h) qmm)  +        go (Tremolo n m)        = Tremolo n (h m)                             +        go (Times r m)          = Times r (h m)                          +        go (Transpose p p2 m)   = Transpose p p2 (h m)                   +        go (Relative p m)       = Relative p (h m)                          +        go (New s v m)          = New s v (h m)               +        go (Context s v m)      = Context s v (h m)+++instance Pretty Music where+    pretty (Rest d p)       = "r" <> pretty d <> prettyList p++    pretty (Note n d p)     = pretty n <> pretty d <> prettyList p++    pretty (Chord ns d p)   = "<" <> nest 4 (sepByS "" $ fmap (uncurry (<>) <<< pretty *** pretty) ns) <> char '>' +                                  <> pretty d <> prettyList p++    pretty (Sequential xs)  = "{" <=> nest 4 ((hsep . fmap pretty) xs) <=> "}"++    pretty (Simultaneous False xs) = "<<" <//> nest 4 ((vcat . fmap pretty) xs)           <//> ">>"+    pretty (Simultaneous True xs)  = "<<" <//> nest 4 ((sepByS " \\\\" . fmap pretty) xs) <//> ">>"++    pretty (Repeat unfold times x alts) = +        "\\repeat" <=> unf unfold <=> int times <=> pretty x <=> alt alts+        where +            unf p = if p then "unfold" else "volta"+            alt Nothing      = empty+            alt (Just (x,y)) = "\\alternative" <> pretty x <> pretty y++    pretty (Tremolo n x) =+        "\\repeat tremolo" <+> pretty n <=> pretty x++    pretty (Times n x) = +        "\\times" <+> frac n <=> pretty x+        where+            frac n = pretty (numerator n) <> "/" <> pretty (denominator n)++    pretty (Transpose from to x) =+        "\\transpose" <+> pretty from <=> pretty to <=> pretty x++    pretty (Relative p x) =+        "\\relative" <=> pretty p <=> pretty x++    pretty (Clef c) = "\\clef" <+> pretty c++    pretty (Key p m) = "\\key" <+> pretty p <+> pretty m+    +    pretty (Time m n) = "\\time" <+> (pretty m <> "/" <> pretty n)+    +    pretty (Breathe Nothing) = "\\breathe"+    pretty (Breathe a)       = notImpl "Non-standard breath marks"++    pretty (Tempo Nothing Nothing)           = mempty+    pretty (Tempo (Just t) Nothing)          = "\\time" <+> pretty t+    pretty (Tempo Nothing (Just (d,bpm)))    = "\\time" <+> pretty d <+> "=" <+> pretty bpm+    pretty (Tempo (Just t) (Just (d,bpm)))   = "\\time" <+> pretty t <+> pretty d <+> "=" <+> pretty bpm++    -- TODO metronome+    -- TODO tempo    ++    pretty (New typ name x) = +        "\\new" <+> string typ <+> pretty name <+> pretty x++    pretty (Context typ name x) = +        "\\context" <+> string typ <+> pretty name <+> pretty x++    pretty (Set name val) =+        "\\set" <+> string name <+> "=" <+> pretty val++    pretty (Override name val) =+        "\\override" <+> string name <+> "=" <+> pretty val++    pretty (Revert name) =+        "\\revert" <+> string name++    -- pretty _                        = notImpl "Unknown music expression"++    prettyList                      = hsep . fmap pretty++instance IsPitch Music where+    fromPitch = (\p -> Note p (Just (1/4)) []) . fromPitch++instance AdditiveGroup Music where+    zeroV   = Rest (Just $ 1/4) []+    a ^+^ b = Sequential [a,b]+    negateV = error "No Data.Music.Lilypond.Music.negateV"++instance VectorSpace Music where+    type Scalar Music = Duration+    a *^ (Rest  (Just d) p)     = Rest (Just $ a*d) p+    a *^ (Note  n (Just d) p)   = Note n (Just $ a*d) p+    a *^ (Chord ns (Just d) p)  = Chord ns (Just $ a*d) p+    a *^ x                      = x+++data Note+    = NotePitch Pitch (Maybe OctaveCheck)+    | DrumNotePitch (Maybe Duration)+    deriving (Eq, Show)++instance Pretty Note where+    pretty (NotePitch p Nothing)   = pretty p+    pretty (NotePitch p _)         = notImpl "Non-standard pitch"+    pretty (DrumNotePitch _)       = notImpl "Non-standard pitch"+    prettyList                     = hsep . fmap pretty++instance IsPitch Note where+    fromPitch = (\p -> (NotePitch p Nothing)) . fromPitch++data Clef+    = Treble+    | Alto+    | Tenor+    | Bass+    | French+    | Soprano+    | MezzoSoprano+    | Baritone+    | VarBaritone+    | SubBass+    | Percussion+    | Tab+    deriving (Eq, Show)++instance Pretty Clef where+    pretty Treble       = "treble"+    pretty Alto         = "alto"+    pretty Tenor        = "tenor"+    pretty Bass         = "bass"+    pretty French       = "french"+    pretty Soprano      = "soprano"+    pretty MezzoSoprano = "mezzosoprano"+    pretty Baritone     = "baritone"+    pretty VarBaritone  = "varbaritone"+    pretty SubBass      = "subbass"+    pretty Percussion   = "percussion"+    pretty Tab          = "tab"++data BreathingSign+    = RightVarComma+    | StraightCaesura+    | CurvedCaesura+    deriving (Eq, Show)++data ChordPostEvent+    = Harmonic+    deriving (Eq, Show)++instance Pretty ChordPostEvent where+    pretty Harmonic = "\\harmonic"+    +data PostEvent+    = Articulation Direction Articulation+    | Dynamics Direction Dynamics+    | Tie      +    | Glissando+    | BeginBeam+    | EndBeam+    | BeginSlur+    | EndSlur+    | BeginPhraseSlur+    | EndPhraseSlur+    | BeginCresc+    | BeginDim+    | EndCrescDim+    | Text Direction String+    | Markup Direction Markup+    deriving (Eq, Show)++instance Pretty PostEvent where +    pretty (Articulation d a)   = pretty d <> pretty a+    pretty (Dynamics d a)       = pretty d <> pretty a+    pretty Tie                  = "~"+    pretty Glissando            = "\\glissando"+    pretty BeginBeam            = "["+    pretty EndBeam              = "]"+    pretty BeginSlur            = "("+    pretty EndSlur              = ")"+    pretty BeginPhraseSlur      = "\\("+    pretty EndPhraseSlur        = "\\)"+    pretty BeginCresc           = "\\<"+    pretty BeginDim             = "\\>"+    pretty EndCrescDim          = "\\!"+    pretty (Text d s)           = pretty d <> (string . show) s -- add quotes+    pretty (Markup d m)         = pretty d <> ("\\markup" <+> pretty m)+    prettyList                  = hcat . fmap pretty++data Markup+    = MarkupText String+    | MarkupList [Markup]+    | Bold Markup+    | Box Markup+    | Caps Markup+    | DynamicsFont Markup+    | FingeringFont Markup+    | Fontsize Double Markup+    | Huge Markup+    | Italic Markup+    | Large Markup+    | Larger Markup+    | Magnify Markup+    | Medium Markup+    | Roman Markup+    | Sans Markup+    | Sub Markup+    | Super Markup+    | TextFont Markup+    | Tiny Markup+    | TypewriterFont Markup+    | Upright Markup+    deriving (Eq, Show)++class HasMarkup a where+    markup :: a -> Markup++instance HasMarkup Markup where+    markup = id+instance HasMarkup a => HasMarkup [a] where+    markup = MarkupList . fmap markup+instance IsString Markup where+    fromString = MarkupText+    +instance Pretty Markup where+    pretty (MarkupText s)       = (string . show) s +    pretty (MarkupList as)      = "{" <+> hsep (fmap pretty as) <+> "}"+    pretty (Bold a)             = "\\bold" <+> pretty a+    pretty (Box a)              = "\\box" <+> pretty a+    pretty (Caps a)             = "\\caps" <+> pretty a+    pretty (DynamicsFont a)     = "\\dynamics" <+> pretty a+    pretty (FingeringFont a)    = "\\fingering" <+> pretty a+    pretty (Fontsize n a)       = "\\fontsize" <+> ("#" <> pretty n) <+> pretty a+    pretty (Huge a)             = "\\huge" <+> pretty a+    pretty (Italic a)           = "\\italic" <+> pretty a+    pretty (Large a)            = "\\large" <+> pretty a+    pretty (Larger a)           = "\\larger" <+> pretty a+    pretty (Magnify a)          = "\\magnify" <+> pretty a+    pretty (Medium a)           = "\\medium" <+> pretty a+    pretty (Roman a)            = "\\roman" <+> pretty a+    pretty (Sans a)             = "\\sans" <+> pretty a+    pretty (Sub a)              = "\\sub" <+> pretty a+    pretty (Super a)            = "\\super" <+> pretty a+    pretty (TextFont a)         = "\\text" <+> pretty a+    pretty (Tiny a)             = "\\tiny" <+> pretty a+    pretty (TypewriterFont a)   = "\\typewriter" <+> pretty a+    pretty (Upright a)          = "\\upright" <+> pretty a+++-- | Articulations. These include ornaments.+data Articulation+    = Accent+    | Marcato+    | Staccatissimo+    | Espressivo+    | Staccato+    | Tenuto+    | Portato+    | Upbow+    | Downbow+    | Flageolet+    | Thumb+    | LeftHeel+    | RightHeel+    | LeftToe+    | RightToe+    | Open+    | Stopped+    | Turn+    | ReverseTurn+    | Trill+    | Prall+    | Mordent+    | PrallPrall+    | PrallMordent+    | UpPrall+    | DownPrall+    | UpMordent+    | DownMordent+    | PrallDown+    | PrallUp+    | LinePrall+    | SignumCongruentiae+    | ShortFermata+    | Fermata+    | LongFermata+    | VeryLongFermata+    | Segno+    | Coda+    | VarCoda+    deriving (Eq, Show)++instance Pretty Articulation where +    -- pretty Accent             = "\\accent"+    -- pretty Marcato            = "\\marcato"+    -- pretty Staccatissimo      = "\\staccatissimo"+    pretty Accent             = ">"+    pretty Marcato            = "^"+    pretty Staccatissimo      = "|"+    pretty Espressivo         = "\\espressivo"+    -- pretty Staccato           = "\\staccato"+    -- pretty Tenuto             = "\\tenuto"+    -- pretty Portato            = "\\portato"+    pretty Staccato           = "."+    pretty Tenuto             = "-"+    pretty Portato            = "_"+    pretty Upbow              = "\\upbow"+    pretty Downbow            = "\\downbow"+    pretty Flageolet          = "\\flageolet"+    pretty Thumb              = "\\thumb"+    pretty LeftHeel           = "\\leftheel"+    pretty RightHeel          = "\\rightheel"+    pretty LeftToe            = "\\lefttoe"+    pretty RightToe           = "\\righttoe"+    pretty Open               = "\\open"+    -- pretty Stopped            = "\\stopped"+    pretty Stopped            = "+"+    pretty Turn               = "\\turn"+    pretty ReverseTurn        = "\\reverseturn"+    pretty Trill              = "\\trill"+    pretty Prall              = "\\prall"+    pretty Mordent            = "\\mordent"+    pretty PrallPrall         = "\\prallprall"+    pretty PrallMordent       = "\\prallmordent"+    pretty UpPrall            = "\\upprall"+    pretty DownPrall          = "\\downprall"+    pretty UpMordent          = "\\upmordent"+    pretty DownMordent        = "\\downmordent"+    pretty PrallDown          = "\\pralldown"+    pretty PrallUp            = "\\prallup"+    pretty LinePrall          = "\\lineprall"+    pretty SignumCongruentiae = "\\signumCongruentiae"+    pretty ShortFermata       = "\\shortfermata"+    pretty Fermata            = "\\fermata"+    pretty LongFermata        = "\\longfermata"+    pretty VeryLongFermata    = "\\verylongfermata"+    pretty Segno              = "\\segno"+    pretty Coda               = "\\coda"+    pretty VarCoda            = "\\varcoda"+    prettyList              = hcat . fmap pretty++data Direction+    = Above+    | Default+    | Below+    deriving (Eq, Ord, Show)++instance Default Direction where+    def = Default+    +instance Pretty Direction where+    pretty Above              = "^"+    pretty Default            = "-"+    pretty Below              = "_"+++-- | Notated time in fractions, in @[2^^i | i <- [-10..3]]@.+newtype Duration   = Duration { getDuration :: Rational }++deriving instance Eq            Duration+deriving instance Ord           Duration+deriving instance Num           Duration+deriving instance Enum          Duration+deriving instance Fractional    Duration+deriving instance Real          Duration+deriving instance RealFrac      Duration+deriving instance Show          Duration++instance Pretty Duration where+    pretty a = string $ pnv (toRational nv) ++ pds ds+        where+            pnv 4 = "\\longa"+            pnv 2 = "\\breve"+            pnv n = show (denominator n)             +            pds n = concat $ replicate n "."+            (nv, ds) = separateDots a++-- | Construct a rest of default duration @1/4@.+--   +--   Use the 'VectorSpace' methods to change duration.+--   +rest :: Music+rest = Rest (Just $ 1/4) []++-- | Construct a note of default duration @1/4@.+--   +--   Use the 'VectorSpace' methods to change duration.+--   +note :: Note -> Music+note n = Note n (Just $ 1/4) []++-- | Construct a chord of default duration @1/4@.+--   +--   Use the 'VectorSpace' methods to change duration.+--   +chord :: [Note] -> Music+chord ns = Chord (fmap (\x -> (x,[])) ns) (Just $ 1/4) []++chordHarm :: [(Note, Bool)] -> Music+chordHarm = chordWithPost . fmap (second $ \x -> if x then [Harmonic] else [])++chordWithPost :: [(Note, [ChordPostEvent])] -> Music+chordWithPost ns = Chord ns (Just $ 1/4) []+++sequential :: Music -> Music -> Music+Sequential as `sequential` Sequential bs = Sequential (as <> bs)+Sequential as `sequential` b             = Sequential (as <> [b])+a `sequential` Sequential bs             = Sequential ([a] <> bs)+a `sequential` b                         = Sequential ([a,b])++simultaneous :: Music -> Music -> Music+Simultaneous s as `simultaneous` Simultaneous t bs = Simultaneous True (as <> bs)+Simultaneous s as `simultaneous` b                 = Simultaneous s (as <> [b])+a `simultaneous` Simultaneous t bs                 = Simultaneous t ([a] <> bs)+a `simultaneous` b                                 = Simultaneous True ([a,b])++++addPost :: PostEvent -> Music -> Music+addPost a = foldMusic' (addPost' a) id (addPost a)+  where+    addPost' a (Rest d es)     = Rest d (es ++ [a])+    addPost' a (Note n d es)   = Note n d (es ++ [a])+    addPost' a (Chord ns d es) = Chord ns d (es ++ [a])++addText :: String -> Music -> Music+addText s = addPost (Text def s)++addText' :: Direction -> String -> Music -> Music+addText' d s = addPost (Text d s)++addMarkup :: HasMarkup a => a -> Music -> Music+addMarkup s = addPost (Markup def (markup s))++addMarkup' :: HasMarkup a => Direction -> a -> Music -> Music+addMarkup' d s = addPost (Markup d (markup s))++addArticulation :: Articulation -> Music -> Music+addArticulation a = addPost (Articulation def a)++addArticulation' :: Direction -> Articulation -> Music -> Music+addArticulation' d a = addPost (Articulation d a)++addDynamics :: Dynamics -> Music -> Music+addDynamics a = addPost (Dynamics def a)++addDynamics' :: Direction -> Dynamics -> Music -> Music+addDynamics' d a = addPost (Dynamics d a)++beginTie :: Music -> Music+beginTie = addPost Tie++beginGlissando :: Music -> Music+beginGlissando = addPost Glissando++beginBeam :: Music -> Music+beginBeam = addPost BeginBeam++endBeam :: Music -> Music+endBeam = addPost EndBeam++beginSlur :: Music -> Music+beginSlur = addPost BeginSlur++endSlur :: Music -> Music+endSlur = addPost EndSlur++beginPhraseSlur :: Music -> Music+beginPhraseSlur = addPost BeginPhraseSlur++endPhraseSlur :: Music -> Music+endPhraseSlur = addPost EndPhraseSlur++beginCresc :: Music -> Music+beginCresc = addPost BeginCresc++endCresc :: Music -> Music+endCresc = addPost EndCrescDim++beginDim :: Music -> Music+beginDim = addPost BeginDim++endDim :: Music -> Music+endDim = addPost EndCrescDim+++addAccent :: Music -> Music+addAccent = addArticulation Accent++addMarcato :: Music -> Music+addMarcato = addArticulation Marcato++addStaccatissimo :: Music -> Music+addStaccatissimo = addArticulation Staccatissimo++addEspressivo :: Music -> Music+addEspressivo = addArticulation Espressivo++addStaccato :: Music -> Music+addStaccato = addArticulation Staccato++addTenuto :: Music -> Music+addTenuto = addArticulation Tenuto++addPortato :: Music -> Music+addPortato = addArticulation Portato++addUpbow :: Music -> Music+addUpbow = addArticulation Upbow++addDownbow :: Music -> Music+addDownbow = addArticulation Downbow++addFlageolet :: Music -> Music+addFlageolet = addArticulation Flageolet++addThumb :: Music -> Music+addThumb = addArticulation Thumb++addLeftHeel :: Music -> Music+addLeftHeel = addArticulation LeftHeel++addRightHeel :: Music -> Music+addRightHeel = addArticulation RightHeel++addLeftToe :: Music -> Music+addLeftToe = addArticulation LeftToe++addRightToe :: Music -> Music+addRightToe = addArticulation RightToe++addOpen :: Music -> Music+addOpen = addArticulation Open++addStopped :: Music -> Music+addStopped = addArticulation Stopped++addTurn :: Music -> Music+addTurn = addArticulation Turn++addReverseTurn :: Music -> Music+addReverseTurn = addArticulation ReverseTurn++addTrill :: Music -> Music+addTrill = addArticulation Trill++addPrall :: Music -> Music+addPrall = addArticulation Prall++addMordent :: Music -> Music+addMordent = addArticulation Mordent++addPrallPrall :: Music -> Music+addPrallPrall = addArticulation PrallPrall++addPrallMordent :: Music -> Music+addPrallMordent = addArticulation PrallMordent++addUpPrall :: Music -> Music+addUpPrall = addArticulation UpPrall++addDownPrall :: Music -> Music+addDownPrall = addArticulation DownPrall++addUpMordent :: Music -> Music+addUpMordent = addArticulation UpMordent++addDownMordent :: Music -> Music+addDownMordent = addArticulation DownMordent++addPrallDown :: Music -> Music+addPrallDown = addArticulation PrallDown++addPrallUp :: Music -> Music+addPrallUp = addArticulation PrallUp++addLinePrall :: Music -> Music+addLinePrall = addArticulation LinePrall++addSignumCongruentiae :: Music -> Music+addSignumCongruentiae = addArticulation SignumCongruentiae++addShortFermata :: Music -> Music+addShortFermata = addArticulation ShortFermata++addFermata :: Music -> Music+addFermata = addArticulation Fermata++addLongFermata :: Music -> Music+addLongFermata = addArticulation LongFermata++addVeryLongFermata :: Music -> Music+addVeryLongFermata = addArticulation VeryLongFermata++addSegno :: Music -> Music+addSegno = addArticulation Segno++addCoda :: Music -> Music+addCoda = addArticulation Coda++addVarCoda :: Music -> Music+addVarCoda = addArticulation VarCoda++++removeSingleChords :: Music -> Music+removeSingleChords = foldMusic go+    where+        go (Chord [(n,_)] d p) = Note n d p+        go x                   = x++++++++++notImpl a = error $ "Not implemented: " ++ a+asPitch = id+asPitch :: Pitch -> Pitch++++++++++++separateDots :: Duration -> (Duration, Int)+separateDots = separateDots' [2/3, 6/7, 14/15, 30/31, 62/63]++separateDots' :: [Duration] -> Duration -> (Duration, Int)+separateDots' []         nv = error "separateDots: Strange"+separateDots' (div:divs) nv +    | isDivisibleBy 2 nv = (nv,  0)+    | otherwise          = (nv', dots' + 1)+    where                                                        +        (nv', dots')    = separateDots' divs (nv*div)++logBaseR :: forall a . (RealFloat a, Floating a) => Rational -> Rational -> a+logBaseR k n +    | isInfinite (fromRational n :: a)      = logBaseR k (n/k) + 1+logBaseR k n +    | isDenormalized (fromRational n :: a)  = logBaseR k (n*k) - 1+logBaseR k n                         = logBase (fromRational k) (fromRational n)++isDivisibleBy :: (Real a, Real b) => a -> b -> Bool+isDivisibleBy n = (equalTo 0.0) . snd . properFraction . logBaseR (toRational n) . toRational++equalTo :: Eq a => a -> a -> Bool+equalTo  = (==)++infixl <=>+a <=> b = sep [a,b]++++{-+Debug stuff++runLy = runCommand "lilypond -f pdf test.ly"++engrave :: Music -> IO ()+engrave e = do+    writeFile "test.ly" $ show $ pretty e+    runLy+    return ()+++main = engrave test+-}++test = Simultaneous False [+        New "StaffGroup" Nothing (Simultaneous False [+            New "Staff" Nothing (Relative c' $ Sequential [+                Set "Staff.instrumentName" (toValue "Violin I"),+                (addDynamics FF c), d, e+                ]),+            New "Staff" Nothing (Sequential [+                Set "Staff.instrumentName" (toValue "Violin II"),+                Clef Bass, c, g_, c])+        ])+    ]++-- test =+--     Simultaneous False +--         [ Relative g' (Sequential [+--             addMarkup ([Bold "Hello", Italic (markup [MarkupText "cruel", Bold $ MarkupText "world"])]) rest,+--             addArticulation Mordent $ chord [c,e,g]^*2,+--             d^*1,+--             e^*2,+--             c^*(3/2),+--             fs^*(1/2)+--             ])+--         , Sequential [Tremolo 4 (Sequential [c^/4,d^/4]), Tremolo 4 (Sequential [c^/4,d^/4])]+--         , Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)]+--         , Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)]+--         , Relative g (Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)])+--         , Sequential +--             [ Times (4/5) (Sequential +--                 [+--                     rest,+--                     addArticulation Accent $ addPost BeginSlur $ addPost BeginCresc $ c^*2,+--                     d^*1,+--                     addPost Tie $ e^*1+--                 ])+--             , Times (4/5) (Sequential +--                 [      +--                     addPost BeginDim $ addPost EndCrescDim $ e^*1,+--                     c^*(3/2),+--                     addPost EndSlur $ fs^*(1/2),+--                     addPost EndCrescDim $ c^*2+--                 ])+--             ]+--         ]              +        +        +    
+ src/Data/Music/Lilypond/Dynamics.hs view
@@ -0,0 +1,63 @@++{-# LANGUAGE OverloadedStrings #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : GHC+--+-------------------------------------------------------------------------------------++module Data.Music.Lilypond.Dynamics (+        Dynamics(..),+  ) where++import Text.Pretty hiding (Mode)+import Music.Dynamics.Literal+import qualified Data.Char as Char++data Dynamics +    = PPPPP +    | PPPP +    | PPP +    | PP +    | P +    | MP +    | MF +    | F +    | FF +    | FFF +    | FFFF +    | SF+    | SFF +    | SP +    | SPP+    | SFZ +    | RFZ +    deriving (Eq, Ord, Show, Enum, Bounded)++instance Pretty Dynamics where+    pretty = string . ("\\" ++) . fmap Char.toLower . show++instance IsDynamics Dynamics where+    fromDynamics (DynamicsL (Just x, Nothing)) = case x of+        (-5.5) -> PPPPP+        (-4.5) -> PPPP+        (-3.5) -> PPP+        (-2.5) -> PP+        (-1.5) -> P+        (-0.5) -> MP+        0.5    -> MF+        1.5    -> F+        2.5    -> FF+        3.5    -> FFF+        4.5    -> FFFF+        x      -> error $ "Lilypond.Dynamics: Strange value " ++ show x+    fromDynamics _ = error "Lilypond.Dynamics: Unsupported literal"++
+ src/Data/Music/Lilypond/IO.hs view
@@ -0,0 +1,37 @@++{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : GHC+--+-------------------------------------------------------------------------------------++module Data.Music.Lilypond.IO -- (+  -- )+where++import Data.Music.Lilypond++writeMusic :: FilePath -> Music -> IO ()+writeMusic = error "writeMusic: Not implemented"++data Format = PDF | PNG | PS++data EngraveOptions+    = EngraveOptions {+        format   :: Format,    +        include  :: FilePath,+        initFile :: FilePath,+        logFile  :: FilePath,+        logLevel :: Int+    }++writeAndEngraveMusic :: FilePath -> EngraveOptions -> Music -> IO ()+writeAndEngraveMusic = error "writeAndEngraveMusic: Not implemented"
+ src/Data/Music/Lilypond/Pitch.hs view
@@ -0,0 +1,67 @@++{-# LANGUAGE OverloadedStrings #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : GHC+--+-------------------------------------------------------------------------------------++module Data.Music.Lilypond.Pitch (+        Pitch(..),+        PitchName(..),+        Accidental(..),+        Octaves(..),+        Mode(..),+        OctaveCheck(..),+  ) where++import Text.Pretty hiding (Mode)+import Music.Pitch.Literal++data PitchName = C | D | E | F | G | A | B+    deriving (Eq, Ord, Show, Enum)++newtype Pitch = Pitch { getPitch :: (PitchName, Accidental, Octaves) }+    deriving (Eq, Ord, Show)++instance Pretty Pitch where+    pretty (Pitch (c,a,o)) = string $ pc c ++ acc a ++ oct (o-4)+        where+            pc C = "c" ; pc D = "d" ; pc E = "e" ; pc F = "f"+            pc G = "g" ; pc A = "a" ; pc B = "b"            +            acc n | n <  0  =  concat $ replicate (negate n) "es"+                  | n == 0  =  ""+                  | n >  0  =  concat $ replicate (n) "is"+            oct n | n <  0  =  concat $ replicate (negate n) ","+                  | n == 0  =  ""+                  | n >  0  =  concat $ replicate n "'"++instance IsPitch Pitch where+    fromPitch (PitchL (c, Nothing, o)) = Pitch (toEnum c, 0,       o)                 +    fromPitch (PitchL (c, Just a, o))  = Pitch (toEnum c, round a, o)+++-- | For double flat -2, flat -1, natural 0, sharp 1 and double sharp 2.+type Accidental = Int ++-- | Number of octaves raised (positive) or flattened (negative).+type Octaves    = Int ++-- | Mode (for key signatures).+data Mode = Major | Minor+    deriving (Eq, Show)++instance Pretty Mode where+    pretty Major = "\\major"+    pretty Minor = "\\minor"++data OctaveCheck = OctaveCheck+    deriving (Eq, Show)+
+ src/Data/Music/Lilypond/Value.hs view
@@ -0,0 +1,84 @@++{-# LANGUAGE +    OverloadedStrings,+    ExistentialQuantification+    #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : GHC+--+-------------------------------------------------------------------------------------++module Data.Music.Lilypond.Value (+        Value,+        toValue,+        toLiteralValue,+  ) where++import Data.String+import Text.Pretty hiding (Mode)+import Music.Pitch.Literal++-- | +-- Value of a @\\set@ command.+-- These are simply wrappers for showable things.+--+-- For example use (with @OverloadedStrings@)+--+-- > Set "Staff.instrumentName" "Violin I"+-- > Set "Staff.instrumentName" 2+--+-- to generate+--+-- > \set Staff.instrumentName = "Violin I"+-- > \set Staff.instrumentName = 2+--+data Value = forall a . Show a => Value a | Literal String++instance IsString Value where+    fromString = toValue++instance Num Value where+    (+)     = noOverloading "(+)"+    (*)     = noOverloading "(*)"+    (-)     = noOverloading "(-)"+    negate  = noOverloading "negate"+    abs     = noOverloading "abs"+    signum  = noOverloading "signum"+    fromInteger = toValue++instance Fractional Value where+    (/)     = noOverloading "(/)"+    recip   = noOverloading "recip"+    fromRational = (toValue . toDouble)++instance Show Value where+    show (Value a) = show a++instance Eq Value where+    a == b  = show a == show b++instance Pretty Value where+  pretty (Value x)   = (string . show) x+  pretty (Literal x) = string x++toValue :: Show a => a -> Value+toValue = Value++-- | As 'toValue', but not quoting strings. Handy for scheme literals such as @#red@.+toLiteralValue :: String -> Value+toLiteralValue = Literal+++noOverloading :: String -> a+noOverloading n = error $ "No overloading of " ++ n ++ " for Value"++toDouble :: Rational -> Double+toDouble = fromRational
− src/Music/Lilypond.hs
@@ -1,963 +0,0 @@--{-# LANGUAGE -    OverloadedStrings, -    GeneralizedNewtypeDeriving,-    StandaloneDeriving,-    TypeFamilies,-    ScopedTypeVariables,     -    ExistentialQuantification #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : GHC------------------------------------------------------------------------------------------module Music.Lilypond (--        -- * Representation-        -        -- ** Music expressions-        Music(..),-        Note(..),-        Clef(..),-        Mode(..),-        -        -- ** Attributes-        Value,-        toValue,-        toLiteralValue,--        -- ** Articulation and dynamics-        PostEvent(..),-        ChordPostEvent(..),--        -- ** Text-        Articulation(..),-        Markup(..),-        HasMarkup(..),--        -- ** Miscellaneous types-        Direction(..),-        OctaveCheck(..),-        BreathingSign(..),--        -- ** Time-        Duration(..),-        -- ** Pitch-        Pitch(..),-        PitchName(..),-        Accidental(..),-        Octaves(..),--        -- * Constructing Lilypond expresions-        -- ** Notes and rests-        rest,-        note,-        chord,-        chordHarm,-        chordWithPost,-        -        -- ** Composition-        sequential,-        simultaneous,-        -        -- ** Post events-        addPost,-        addText,-        addMarkup,-        addDynamics,-        addArticulation,-        addText',-        addMarkup',-        addDynamics',-        addArticulation',--        -- ** Curves and lines-        beginTie,-        beginGlissando,-        beginBeam,-        endBeam,-        beginSlur,-        endSlur,-        beginPhraseSlur,-        endPhraseSlur,-        beginCresc,-        endCresc,-        beginDim,-        endDim,--        -- ** Marks-        addAccent,-        addMarcato,-        addStaccatissimo,-        addEspressivo,-        addStaccato,-        addTenuto,-        addPortato,-        addUpbow,-        addDownbow,-        addFlageolet,-        addThumb,-        addLeftHeel,-        addRightHeel,-        addLeftToe,-        addRightToe,-        addOpen,-        addStopped,-        addTurn,-        addReverseTurn,-        addTrill,-        addPrall,-        addMordent,-        addPrallPrall,-        addPrallMordent,-        addUpPrall,-        addDownPrall,-        addUpMordent,-        addDownMordent,-        addPrallDown,-        addPrallUp,-        addLinePrall,-        addSignumCongruentiae,-        addShortFermata,-        addFermata,-        addLongFermata,-        addVeryLongFermata,-        addSegno,-        addCoda,-        addVarCoda,--        -- * Utility-        foldMusic,-        removeSingleChords,-    )-where--import Control.Arrow ((<<<), (***), first, second)-import Data.Ratio-import Data.String-import Data.Default-import Data.Semigroup-import Data.VectorSpace-import Text.Pretty hiding (Mode)-import Music.Pitch.Literal---- import System.Process -- TODO debug--import Music.Lilypond.Pitch-import Music.Lilypond.Dynamics-import Music.Lilypond.Value---{--data Lilypond -    = Book      Id [BookBlock]-    | BookPart  Id [BookPartBlock]-    | Score     Id [ScoreBlock]--data BookBlock-    = Paper    OutputDef-    | Bookpart Id [BookPartBlock]-    | Score    Id [ScoreBlock]-    | Music    CompositeMusic-    -- full markup etc--data BookPartBlock-    = BookPartPaper    OutputDef-    | BookPartScore    Id [ScoreBlock]-    | BookPartMusic    CompositeMusic-    -- full markup etc-    -data ScoreBlock-    = ScoreMusic     Music-    -- full markup etc--}---- | A Lilypond music expression.---   ---   Use the 'Pretty' instance to convert into Lilypond syntax.---   -data Music    -    = Rest (Maybe Duration) [PostEvent]             -- ^ Single rest.-    | Note Note (Maybe Duration) [PostEvent]        -- ^ Single note.-    | Chord [(Note, [ChordPostEvent])] (Maybe Duration) [PostEvent]     -- ^ Single chord.-    | Sequential   [Music]                          -- ^ Sequential composition.-    | Simultaneous Bool [Music]                     -- ^ Parallel composition (split voices?).-    | Repeat Bool Int Music (Maybe (Music, Music))  -- ^ Repetition (unfold?, times, music, alternative).-    | Tremolo Int Music                             -- ^ Tremolo (multiplier).-    | Times Rational Music                          -- ^ Stretch music (multiplier).-    | Transpose Pitch Pitch Music                   -- ^ Transpose music (from to).-    | Relative Pitch Music                          -- ^ Use relative octave (octave).-    | Clef Clef                                     -- ^ Clef.-    | Key Pitch Mode                                -- ^ Key signature.-    | Time Integer Integer                          -- ^ Time signature.-    | Breathe (Maybe BreathingSign)                 -- ^ Breath mark (caesura)-    | Tempo (Maybe String) (Maybe (Duration,Integer)) -- ^ Tempo mark.-    | New String (Maybe String) Music               -- ^ New expression.-    | Context String (Maybe String) Music           -- ^ Context expression.-    | Set String Value                            -    | Override String Value-    | Revert String-    deriving (Eq, Show)--foldMusic :: (Music -> Music) -> Music -> Music-foldMusic f = go-    where-        go (Sequential ms)      = Sequential (fmap go ms)                          -        go (Simultaneous b ms)  = Simultaneous b (fmap go ms)                     -        go (Repeat b i m qmm)   = Repeat b i m (fmap (go *** go) qmm)  -        go (Tremolo n m)        = Tremolo n (go m)                             -        go (Times r m)          = Times r (go m)                          -        go (Transpose p p2 m)   = Transpose p p2 (go m)                   -        go (Relative p m)       = Relative p (go m)                          -        go (New s v m)          = New s v (go m)               -        go (Context s v m)      = Context s v (go m)-        go x = f x--foldMusic' :: (Music -> Music) -- Rest Note Chord-           -> (Music -> Music) -- Other non-recursive-           -> (Music -> Music) -- Recursive-           -> Music -> Music-foldMusic' f g h = go-    where               -        go m@(Rest _ _)           = f m-        go m@(Note _ _ _)         = f m-        go m@(Chord _ _ _)        = f m-        go m@(Clef _)             = g m-        go m@(Key _ _)            = g m-        go m@(Time _ _)           = g m-        go m@(Breathe _)          = g m-        go m@(Tempo _ _)          = g m-        go m@(Set _ _)            = g m-        go m@(Override _ _)       = g m-        go m@(Revert _)           = g m-        go (Sequential ms)      = Sequential (fmap h ms)                          -        go (Simultaneous b ms)  = Simultaneous b (fmap h ms)                     -        go (Repeat b i m qmm)   = Repeat b i m (fmap (h *** h) qmm)  -        go (Tremolo n m)        = Tremolo n (h m)                             -        go (Times r m)          = Times r (h m)                          -        go (Transpose p p2 m)   = Transpose p p2 (h m)                   -        go (Relative p m)       = Relative p (h m)                          -        go (New s v m)          = New s v (h m)               -        go (Context s v m)      = Context s v (h m)---instance Pretty Music where-    pretty (Rest d p)       = "r" <> pretty d <> prettyList p--    pretty (Note n d p)     = pretty n <> pretty d <> prettyList p--    pretty (Chord ns d p)   = "<" <> nest 4 (sepByS "" $ fmap (uncurry (<>) <<< pretty *** pretty) ns) <> char '>' -                                  <> pretty d <> prettyList p--    pretty (Sequential xs)  = "{" <=> nest 4 ((hsep . fmap pretty) xs) <=> "}"--    pretty (Simultaneous False xs) = "<<" <//> nest 4 ((vcat . fmap pretty) xs)           <//> ">>"-    pretty (Simultaneous True xs)  = "<<" <//> nest 4 ((sepByS " \\\\" . fmap pretty) xs) <//> ">>"--    pretty (Repeat unfold times x alts) = -        "\\repeat" <=> unf unfold <=> int times <=> pretty x <=> alt alts-        where -            unf p = if p then "unfold" else "volta"-            alt Nothing      = empty-            alt (Just (x,y)) = "\\alternative" <> pretty x <> pretty y--    pretty (Tremolo n x) =-        "\\repeat tremolo" <+> pretty n <=> pretty x--    pretty (Times n x) = -        "\\times" <+> frac n <=> pretty x-        where-            frac n = pretty (numerator n) <> "/" <> pretty (denominator n)--    pretty (Transpose from to x) =-        "\\transpose" <+> pretty from <=> pretty to <=> pretty x--    pretty (Relative p x) =-        "\\relative" <=> pretty p <=> pretty x--    pretty (Clef c) = "\\clef" <+> pretty c--    pretty (Key p m) = "\\key" <+> pretty p <+> pretty m-    -    pretty (Time m n) = "\\time" <+> (pretty m <> "/" <> pretty n)-    -    pretty (Breathe Nothing) = "\\breathe"-    pretty (Breathe a)       = notImpl "Non-standard breath marks"--    pretty (Tempo Nothing Nothing)           = mempty-    pretty (Tempo (Just t) Nothing)          = "\\time" <+> pretty t-    pretty (Tempo Nothing (Just (d,bpm)))    = "\\time" <+> pretty d <+> "=" <+> pretty bpm-    pretty (Tempo (Just t) (Just (d,bpm)))   = "\\time" <+> pretty t <+> pretty d <+> "=" <+> pretty bpm--    -- TODO metronome-    -- TODO tempo    --    pretty (New typ name x) = -        "\\new" <+> string typ <+> pretty name <+> pretty x--    pretty (Context typ name x) = -        "\\context" <+> string typ <+> pretty name <+> pretty x--    pretty (Set name val) =-        "\\set" <+> string name <+> "=" <+> pretty val--    pretty (Override name val) =-        "\\override" <+> string name <+> "=" <+> pretty val--    pretty (Revert name) =-        "\\revert" <+> string name--    -- pretty _                        = notImpl "Unknown music expression"--    prettyList                      = hsep . fmap pretty--instance IsPitch Music where-    fromPitch = (\p -> Note p (Just (1/4)) []) . fromPitch--instance AdditiveGroup Music where-    zeroV   = Rest (Just $ 1/4) []-    a ^+^ b = Sequential [a,b]-    negateV = error "No Music.Lilypond.Music.negateV"--instance VectorSpace Music where-    type Scalar Music = Duration-    a *^ (Rest  (Just d) p)     = Rest (Just $ a*d) p-    a *^ (Note  n (Just d) p)   = Note n (Just $ a*d) p-    a *^ (Chord ns (Just d) p)  = Chord ns (Just $ a*d) p-    a *^ x                      = x---data Note-    = NotePitch Pitch (Maybe OctaveCheck)-    | DrumNotePitch (Maybe Duration)-    deriving (Eq, Show)--instance Pretty Note where-    pretty (NotePitch p Nothing)   = pretty p-    pretty (NotePitch p _)         = notImpl "Non-standard pitch"-    pretty (DrumNotePitch _)       = notImpl "Non-standard pitch"-    prettyList                     = hsep . fmap pretty--instance IsPitch Note where-    fromPitch = (\p -> (NotePitch p Nothing)) . fromPitch--data Clef-    = Treble-    | Alto-    | Tenor-    | Bass-    | French-    | Soprano-    | MezzoSoprano-    | Baritone-    | VarBaritone-    | SubBass-    | Percussion-    | Tab-    deriving (Eq, Show)--instance Pretty Clef where-    pretty Treble       = "treble"-    pretty Alto         = "alto"-    pretty Tenor        = "tenor"-    pretty Bass         = "bass"-    pretty French       = "french"-    pretty Soprano      = "soprano"-    pretty MezzoSoprano = "mezzosoprano"-    pretty Baritone     = "baritone"-    pretty VarBaritone  = "varbaritone"-    pretty SubBass      = "subbass"-    pretty Percussion   = "percussion"-    pretty Tab          = "tab"--data BreathingSign-    = RightVarComma-    | StraightCaesura-    | CurvedCaesura-    deriving (Eq, Show)--data ChordPostEvent-    = Harmonic-    deriving (Eq, Show)--instance Pretty ChordPostEvent where-    pretty Harmonic = "\\harmonic"-    -data PostEvent-    = Articulation Direction Articulation-    | Dynamics Direction Dynamics-    | Tie      -    | Glissando-    | BeginBeam-    | EndBeam-    | BeginSlur-    | EndSlur-    | BeginPhraseSlur-    | EndPhraseSlur-    | BeginCresc-    | BeginDim-    | EndCrescDim-    | Text Direction String-    | Markup Direction Markup-    deriving (Eq, Show)--instance Pretty PostEvent where -    pretty (Articulation d a)   = pretty d <> pretty a-    pretty (Dynamics d a)       = pretty d <> pretty a-    pretty Tie                  = "~"-    pretty Glissando            = "\\glissando"-    pretty BeginBeam            = "["-    pretty EndBeam              = "]"-    pretty BeginSlur            = "("-    pretty EndSlur              = ")"-    pretty BeginPhraseSlur      = "\\("-    pretty EndPhraseSlur        = "\\)"-    pretty BeginCresc           = "\\<"-    pretty BeginDim             = "\\>"-    pretty EndCrescDim          = "\\!"-    pretty (Text d s)           = pretty d <> (string . show) s -- add quotes-    pretty (Markup d m)         = pretty d <> ("\\markup" <+> pretty m)-    prettyList                  = hcat . fmap pretty--data Markup-    = MarkupText String-    | MarkupList [Markup]-    | Bold Markup-    | Box Markup-    | Caps Markup-    | DynamicsFont Markup-    | FingeringFont Markup-    | Fontsize Double Markup-    | Huge Markup-    | Italic Markup-    | Large Markup-    | Larger Markup-    | Magnify Markup-    | Medium Markup-    | Roman Markup-    | Sans Markup-    | Sub Markup-    | Super Markup-    | TextFont Markup-    | Tiny Markup-    | TypewriterFont Markup-    | Upright Markup-    deriving (Eq, Show)--class HasMarkup a where-    markup :: a -> Markup--instance HasMarkup Markup where-    markup = id-instance HasMarkup a => HasMarkup [a] where-    markup = MarkupList . fmap markup-instance IsString Markup where-    fromString = MarkupText-    -instance Pretty Markup where-    pretty (MarkupText s)       = (string . show) s -    pretty (MarkupList as)      = "{" <+> hsep (fmap pretty as) <+> "}"-    pretty (Bold a)             = "\\bold" <+> pretty a-    pretty (Box a)              = "\\box" <+> pretty a-    pretty (Caps a)             = "\\caps" <+> pretty a-    pretty (DynamicsFont a)     = "\\dynamics" <+> pretty a-    pretty (FingeringFont a)    = "\\fingering" <+> pretty a-    pretty (Fontsize n a)       = "\\fontsize" <+> ("#" <> pretty n) <+> pretty a-    pretty (Huge a)             = "\\huge" <+> pretty a-    pretty (Italic a)           = "\\italic" <+> pretty a-    pretty (Large a)            = "\\large" <+> pretty a-    pretty (Larger a)           = "\\larger" <+> pretty a-    pretty (Magnify a)          = "\\magnify" <+> pretty a-    pretty (Medium a)           = "\\medium" <+> pretty a-    pretty (Roman a)            = "\\roman" <+> pretty a-    pretty (Sans a)             = "\\sans" <+> pretty a-    pretty (Sub a)              = "\\sub" <+> pretty a-    pretty (Super a)            = "\\super" <+> pretty a-    pretty (TextFont a)         = "\\text" <+> pretty a-    pretty (Tiny a)             = "\\tiny" <+> pretty a-    pretty (TypewriterFont a)   = "\\typewriter" <+> pretty a-    pretty (Upright a)          = "\\upright" <+> pretty a----- | Articulations. These include ornaments.-data Articulation-    = Accent-    | Marcato-    | Staccatissimo-    | Espressivo-    | Staccato-    | Tenuto-    | Portato-    | Upbow-    | Downbow-    | Flageolet-    | Thumb-    | LeftHeel-    | RightHeel-    | LeftToe-    | RightToe-    | Open-    | Stopped-    | Turn-    | ReverseTurn-    | Trill-    | Prall-    | Mordent-    | PrallPrall-    | PrallMordent-    | UpPrall-    | DownPrall-    | UpMordent-    | DownMordent-    | PrallDown-    | PrallUp-    | LinePrall-    | SignumCongruentiae-    | ShortFermata-    | Fermata-    | LongFermata-    | VeryLongFermata-    | Segno-    | Coda-    | VarCoda-    deriving (Eq, Show)--instance Pretty Articulation where -    -- pretty Accent             = "\\accent"-    -- pretty Marcato            = "\\marcato"-    -- pretty Staccatissimo      = "\\staccatissimo"-    pretty Accent             = ">"-    pretty Marcato            = "^"-    pretty Staccatissimo      = "|"-    pretty Espressivo         = "\\espressivo"-    -- pretty Staccato           = "\\staccato"-    -- pretty Tenuto             = "\\tenuto"-    -- pretty Portato            = "\\portato"-    pretty Staccato           = "."-    pretty Tenuto             = "-"-    pretty Portato            = "_"-    pretty Upbow              = "\\upbow"-    pretty Downbow            = "\\downbow"-    pretty Flageolet          = "\\flageolet"-    pretty Thumb              = "\\thumb"-    pretty LeftHeel           = "\\leftheel"-    pretty RightHeel          = "\\rightheel"-    pretty LeftToe            = "\\lefttoe"-    pretty RightToe           = "\\righttoe"-    pretty Open               = "\\open"-    -- pretty Stopped            = "\\stopped"-    pretty Stopped            = "+"-    pretty Turn               = "\\turn"-    pretty ReverseTurn        = "\\reverseturn"-    pretty Trill              = "\\trill"-    pretty Prall              = "\\prall"-    pretty Mordent            = "\\mordent"-    pretty PrallPrall         = "\\prallprall"-    pretty PrallMordent       = "\\prallmordent"-    pretty UpPrall            = "\\upprall"-    pretty DownPrall          = "\\downprall"-    pretty UpMordent          = "\\upmordent"-    pretty DownMordent        = "\\downmordent"-    pretty PrallDown          = "\\pralldown"-    pretty PrallUp            = "\\prallup"-    pretty LinePrall          = "\\lineprall"-    pretty SignumCongruentiae = "\\signumCongruentiae"-    pretty ShortFermata       = "\\shortfermata"-    pretty Fermata            = "\\fermata"-    pretty LongFermata        = "\\longfermata"-    pretty VeryLongFermata    = "\\verylongfermata"-    pretty Segno              = "\\segno"-    pretty Coda               = "\\coda"-    pretty VarCoda            = "\\varcoda"-    prettyList              = hcat . fmap pretty--data Direction-    = Above-    | Default-    | Below-    deriving (Eq, Ord, Show)--instance Default Direction where-    def = Default-    -instance Pretty Direction where-    pretty Above              = "^"-    pretty Default            = "-"-    pretty Below              = "_"----- | Notated time in fractions, in @[2^^i | i <- [-10..3]]@.-newtype Duration   = Duration { getDuration :: Rational }--deriving instance Eq            Duration-deriving instance Ord           Duration-deriving instance Num           Duration-deriving instance Enum          Duration-deriving instance Fractional    Duration-deriving instance Real          Duration-deriving instance RealFrac      Duration-deriving instance Show          Duration--instance Pretty Duration where-    pretty a = string $ pnv (toRational nv) ++ pds ds-        where-            pnv 4 = "\\longa"-            pnv 2 = "\\breve"-            pnv n = show (denominator n)             -            pds n = concat $ replicate n "."-            (nv, ds) = separateDots a---- | Construct a rest of default duration @1/4@.---   ---   Use the 'VectorSpace' methods to change duration.---   -rest :: Music-rest = Rest (Just $ 1/4) []---- | Construct a note of default duration @1/4@.---   ---   Use the 'VectorSpace' methods to change duration.---   -note :: Note -> Music-note n = Note n (Just $ 1/4) []---- | Construct a chord of default duration @1/4@.---   ---   Use the 'VectorSpace' methods to change duration.---   -chord :: [Note] -> Music-chord ns = Chord (fmap (\x -> (x,[])) ns) (Just $ 1/4) []--chordHarm :: [(Note, Bool)] -> Music-chordHarm = chordWithPost . fmap (second $ \x -> if x then [Harmonic] else [])--chordWithPost :: [(Note, [ChordPostEvent])] -> Music-chordWithPost ns = Chord ns (Just $ 1/4) []---sequential :: Music -> Music -> Music-Sequential as `sequential` Sequential bs = Sequential (as <> bs)-Sequential as `sequential` b             = Sequential (as <> [b])-a `sequential` Sequential bs             = Sequential ([a] <> bs)-a `sequential` b                         = Sequential ([a,b])--simultaneous :: Music -> Music -> Music-Simultaneous s as `simultaneous` Simultaneous t bs = Simultaneous True (as <> bs)-Simultaneous s as `simultaneous` b                 = Simultaneous s (as <> [b])-a `simultaneous` Simultaneous t bs                 = Simultaneous t ([a] <> bs)-a `simultaneous` b                                 = Simultaneous True ([a,b])----addPost :: PostEvent -> Music -> Music-addPost a = foldMusic' (addPost' a) id (addPost a)-  where-    addPost' a (Rest d es)     = Rest d (es ++ [a])-    addPost' a (Note n d es)   = Note n d (es ++ [a])-    addPost' a (Chord ns d es) = Chord ns d (es ++ [a])--addText :: String -> Music -> Music-addText s = addPost (Text def s)--addText' :: Direction -> String -> Music -> Music-addText' d s = addPost (Text d s)--addMarkup :: HasMarkup a => a -> Music -> Music-addMarkup s = addPost (Markup def (markup s))--addMarkup' :: HasMarkup a => Direction -> a -> Music -> Music-addMarkup' d s = addPost (Markup d (markup s))--addArticulation :: Articulation -> Music -> Music-addArticulation a = addPost (Articulation def a)--addArticulation' :: Direction -> Articulation -> Music -> Music-addArticulation' d a = addPost (Articulation d a)--addDynamics :: Dynamics -> Music -> Music-addDynamics a = addPost (Dynamics def a)--addDynamics' :: Direction -> Dynamics -> Music -> Music-addDynamics' d a = addPost (Dynamics d a)--beginTie :: Music -> Music-beginTie = addPost Tie--beginGlissando :: Music -> Music-beginGlissando = addPost Glissando--beginBeam :: Music -> Music-beginBeam = addPost BeginBeam--endBeam :: Music -> Music-endBeam = addPost EndBeam--beginSlur :: Music -> Music-beginSlur = addPost BeginSlur--endSlur :: Music -> Music-endSlur = addPost EndSlur--beginPhraseSlur :: Music -> Music-beginPhraseSlur = addPost BeginPhraseSlur--endPhraseSlur :: Music -> Music-endPhraseSlur = addPost EndPhraseSlur--beginCresc :: Music -> Music-beginCresc = addPost BeginCresc--endCresc :: Music -> Music-endCresc = addPost EndCrescDim--beginDim :: Music -> Music-beginDim = addPost BeginDim--endDim :: Music -> Music-endDim = addPost EndCrescDim---addAccent :: Music -> Music-addAccent = addArticulation Accent--addMarcato :: Music -> Music-addMarcato = addArticulation Marcato--addStaccatissimo :: Music -> Music-addStaccatissimo = addArticulation Staccatissimo--addEspressivo :: Music -> Music-addEspressivo = addArticulation Espressivo--addStaccato :: Music -> Music-addStaccato = addArticulation Staccato--addTenuto :: Music -> Music-addTenuto = addArticulation Tenuto--addPortato :: Music -> Music-addPortato = addArticulation Portato--addUpbow :: Music -> Music-addUpbow = addArticulation Upbow--addDownbow :: Music -> Music-addDownbow = addArticulation Downbow--addFlageolet :: Music -> Music-addFlageolet = addArticulation Flageolet--addThumb :: Music -> Music-addThumb = addArticulation Thumb--addLeftHeel :: Music -> Music-addLeftHeel = addArticulation LeftHeel--addRightHeel :: Music -> Music-addRightHeel = addArticulation RightHeel--addLeftToe :: Music -> Music-addLeftToe = addArticulation LeftToe--addRightToe :: Music -> Music-addRightToe = addArticulation RightToe--addOpen :: Music -> Music-addOpen = addArticulation Open--addStopped :: Music -> Music-addStopped = addArticulation Stopped--addTurn :: Music -> Music-addTurn = addArticulation Turn--addReverseTurn :: Music -> Music-addReverseTurn = addArticulation ReverseTurn--addTrill :: Music -> Music-addTrill = addArticulation Trill--addPrall :: Music -> Music-addPrall = addArticulation Prall--addMordent :: Music -> Music-addMordent = addArticulation Mordent--addPrallPrall :: Music -> Music-addPrallPrall = addArticulation PrallPrall--addPrallMordent :: Music -> Music-addPrallMordent = addArticulation PrallMordent--addUpPrall :: Music -> Music-addUpPrall = addArticulation UpPrall--addDownPrall :: Music -> Music-addDownPrall = addArticulation DownPrall--addUpMordent :: Music -> Music-addUpMordent = addArticulation UpMordent--addDownMordent :: Music -> Music-addDownMordent = addArticulation DownMordent--addPrallDown :: Music -> Music-addPrallDown = addArticulation PrallDown--addPrallUp :: Music -> Music-addPrallUp = addArticulation PrallUp--addLinePrall :: Music -> Music-addLinePrall = addArticulation LinePrall--addSignumCongruentiae :: Music -> Music-addSignumCongruentiae = addArticulation SignumCongruentiae--addShortFermata :: Music -> Music-addShortFermata = addArticulation ShortFermata--addFermata :: Music -> Music-addFermata = addArticulation Fermata--addLongFermata :: Music -> Music-addLongFermata = addArticulation LongFermata--addVeryLongFermata :: Music -> Music-addVeryLongFermata = addArticulation VeryLongFermata--addSegno :: Music -> Music-addSegno = addArticulation Segno--addCoda :: Music -> Music-addCoda = addArticulation Coda--addVarCoda :: Music -> Music-addVarCoda = addArticulation VarCoda----removeSingleChords :: Music -> Music-removeSingleChords = foldMusic go-    where-        go (Chord [(n,_)] d p) = Note n d p-        go x                   = x----------notImpl a = error $ "Not implemented: " ++ a-asPitch = id-asPitch :: Pitch -> Pitch------------separateDots :: Duration -> (Duration, Int)-separateDots = separateDots' [2/3, 6/7, 14/15, 30/31, 62/63]--separateDots' :: [Duration] -> Duration -> (Duration, Int)-separateDots' []         nv = error "separateDots: Strange"-separateDots' (div:divs) nv -    | isDivisibleBy 2 nv = (nv,  0)-    | otherwise          = (nv', dots' + 1)-    where                                                        -        (nv', dots')    = separateDots' divs (nv*div)--logBaseR :: forall a . (RealFloat a, Floating a) => Rational -> Rational -> a-logBaseR k n -    | isInfinite (fromRational n :: a)      = logBaseR k (n/k) + 1-logBaseR k n -    | isDenormalized (fromRational n :: a)  = logBaseR k (n*k) - 1-logBaseR k n                         = logBase (fromRational k) (fromRational n)--isDivisibleBy :: (Real a, Real b) => a -> b -> Bool-isDivisibleBy n = (equalTo 0.0) . snd . properFraction . logBaseR (toRational n) . toRational--equalTo :: Eq a => a -> a -> Bool-equalTo  = (==)--infixl <=>-a <=> b = sep [a,b]----{--Debug stuff--runLy = runCommand "lilypond -f pdf test.ly"--engrave :: Music -> IO ()-engrave e = do-    writeFile "test.ly" $ show $ pretty e-    runLy-    return ()---main = engrave test--}--test = Simultaneous False [-        New "StaffGroup" Nothing (Simultaneous False [-            New "Staff" Nothing (Relative c' $ Sequential [-                Set "Staff.instrumentName" (toValue "Violin I"),-                (addDynamics FF c), d, e-                ]),-            New "Staff" Nothing (Sequential [-                Set "Staff.instrumentName" (toValue "Violin II"),-                Clef Bass, c, g_, c])-        ])-    ]---- test =---     Simultaneous False ---         [ Relative g' (Sequential [---             addMarkup ([Bold "Hello", Italic (markup [MarkupText "cruel", Bold $ MarkupText "world"])]) rest,---             addArticulation Mordent $ chord [c,e,g]^*2,---             d^*1,---             e^*2,---             c^*(3/2),---             fs^*(1/2)---             ])---         , Sequential [Tremolo 4 (Sequential [c^/4,d^/4]), Tremolo 4 (Sequential [c^/4,d^/4])]---         , Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)]---         , Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)]---         , Relative g (Sequential [rest,c^*2,d^*1,e^*2,c^*(3/2),fs^*(1/2)])---         , Sequential ---             [ Times (4/5) (Sequential ---                 [---                     rest,---                     addArticulation Accent $ addPost BeginSlur $ addPost BeginCresc $ c^*2,---                     d^*1,---                     addPost Tie $ e^*1---                 ])---             , Times (4/5) (Sequential ---                 [      ---                     addPost BeginDim $ addPost EndCrescDim $ e^*1,---                     c^*(3/2),---                     addPost EndSlur $ fs^*(1/2),---                     addPost EndCrescDim $ c^*2---                 ])---             ]---         ]              -        -        -    
− src/Music/Lilypond/Dynamics.hs
@@ -1,63 +0,0 @@--{-# LANGUAGE OverloadedStrings #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : GHC-------------------------------------------------------------------------------------------module Music.Lilypond.Dynamics (-        Dynamics(..),-  ) where--import Text.Pretty hiding (Mode)-import Music.Dynamics.Literal-import qualified Data.Char as Char--data Dynamics -    = PPPPP -    | PPPP -    | PPP -    | PP -    | P -    | MP -    | MF -    | F -    | FF -    | FFF -    | FFFF -    | SF-    | SFF -    | SP -    | SPP-    | SFZ -    | RFZ -    deriving (Eq, Ord, Show, Enum, Bounded)--instance Pretty Dynamics where-    pretty = string . ("\\" ++) . fmap Char.toLower . show--instance IsDynamics Dynamics where-    fromDynamics (DynamicsL (Just x, Nothing)) = case x of-        (-5.5) -> PPPPP-        (-4.5) -> PPPP-        (-3.5) -> PPP-        (-2.5) -> PP-        (-1.5) -> P-        (-0.5) -> MP-        0.5    -> MF-        1.5    -> F-        2.5    -> FF-        3.5    -> FFF-        4.5    -> FFFF-        x      -> error $ "Lilypond.Dynamics: Strange value " ++ show x-    fromDynamics _ = error "Lilypond.Dynamics: Unsupported literal"--
− src/Music/Lilypond/IO.hs
@@ -1,37 +0,0 @@--{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : GHC-------------------------------------------------------------------------------------------module Music.Lilypond.IO -- (-  -- )-where--import Music.Lilypond--writeMusic :: FilePath -> Music -> IO ()-writeMusic = error "writeMusic: Not implemented"--data Format = PDF | PNG | PS--data EngraveOptions-    = EngraveOptions {-        format   :: Format,    -        include  :: FilePath,-        initFile :: FilePath,-        logFile  :: FilePath,-        logLevel :: Int-    }--writeAndEngraveMusic :: FilePath -> EngraveOptions -> Music -> IO ()-writeAndEngraveMusic = error "writeAndEngraveMusic: Not implemented"
− src/Music/Lilypond/Pitch.hs
@@ -1,67 +0,0 @@--{-# LANGUAGE OverloadedStrings #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : GHC-------------------------------------------------------------------------------------------module Music.Lilypond.Pitch (-        Pitch(..),-        PitchName(..),-        Accidental(..),-        Octaves(..),-        Mode(..),-        OctaveCheck(..),-  ) where--import Text.Pretty hiding (Mode)-import Music.Pitch.Literal--data PitchName = C | D | E | F | G | A | B-    deriving (Eq, Ord, Show, Enum)--newtype Pitch = Pitch { getPitch :: (PitchName, Accidental, Octaves) }-    deriving (Eq, Ord, Show)--instance Pretty Pitch where-    pretty (Pitch (c,a,o)) = string $ pc c ++ acc a ++ oct (o-4)-        where-            pc C = "c" ; pc D = "d" ; pc E = "e" ; pc F = "f"-            pc G = "g" ; pc A = "a" ; pc B = "b"            -            acc n | n <  0  =  concat $ replicate (negate n) "es"-                  | n == 0  =  ""-                  | n >  0  =  concat $ replicate (n) "is"-            oct n | n <  0  =  concat $ replicate (negate n) ","-                  | n == 0  =  ""-                  | n >  0  =  concat $ replicate n "'"--instance IsPitch Pitch where-    fromPitch (PitchL (c, Nothing, o)) = Pitch (toEnum c, 0,       o)                 -    fromPitch (PitchL (c, Just a, o))  = Pitch (toEnum c, round a, o)----- | For double flat -2, flat -1, natural 0, sharp 1 and double sharp 2.-type Accidental = Int ---- | Number of octaves raised (positive) or flattened (negative).-type Octaves    = Int ---- | Mode (for key signatures).-data Mode = Major | Minor-    deriving (Eq, Show)--instance Pretty Mode where-    pretty Major = "\\major"-    pretty Minor = "\\minor"--data OctaveCheck = OctaveCheck-    deriving (Eq, Show)-
− src/Music/Lilypond/Value.hs
@@ -1,84 +0,0 @@--{-# LANGUAGE -    OverloadedStrings,-    ExistentialQuantification-    #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : GHC-------------------------------------------------------------------------------------------module Music.Lilypond.Value (-        Value,-        toValue,-        toLiteralValue,-  ) where--import Data.String-import Text.Pretty hiding (Mode)-import Music.Pitch.Literal---- | --- Value of a @\\set@ command.--- These are simply wrappers for showable things.------ For example use (with @OverloadedStrings@)------ > Set "Staff.instrumentName" "Violin I"--- > Set "Staff.instrumentName" 2------ to generate------ > \set Staff.instrumentName = "Violin I"--- > \set Staff.instrumentName = 2----data Value = forall a . Show a => Value a | Literal String--instance IsString Value where-    fromString = toValue--instance Num Value where-    (+)     = noOverloading "(+)"-    (*)     = noOverloading "(*)"-    (-)     = noOverloading "(-)"-    negate  = noOverloading "negate"-    abs     = noOverloading "abs"-    signum  = noOverloading "signum"-    fromInteger = toValue--instance Fractional Value where-    (/)     = noOverloading "(/)"-    recip   = noOverloading "recip"-    fromRational = (toValue . toDouble)--instance Show Value where-    show (Value a) = show a--instance Eq Value where-    a == b  = show a == show b--instance Pretty Value where-  pretty (Value x)   = (string . show) x-  pretty (Literal x) = string x--toValue :: Show a => a -> Value-toValue = Value---- | As 'toValue', but not quoting strings. Handy for scheme literals such as @#red@.-toLiteralValue :: String -> Value-toLiteralValue = Literal---noOverloading :: String -> a-noOverloading n = error $ "No overloading of " ++ n ++ " for Value"--toDouble :: Rational -> Double-toDouble = fromRational