packages feed

abcnotation 1.8.1 → 1.9.0

raw patch · 5 files changed

+737/−737 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Music.Abc: A :: PitchClass
- Music.Abc: AbcFile :: (Maybe String) -> (Maybe FileHeader) -> [Element] -> AbcFile
- Music.Abc: AbcTune :: TuneHeader -> TuneBody -> AbcTune
- Music.Abc: Accent :: Decoration
- Music.Abc: Aeolian :: Mode
- Music.Abc: Alto :: Clef
- Music.Abc: Annotate :: Annotation -> Music -> Music
- Music.Abc: AnnotateAbove :: String -> Annotation
- Music.Abc: AnnotateBelow :: String -> Annotation
- Music.Abc: AnnotateLeft :: String -> Annotation
- Music.Abc: AnnotateRight :: String -> Annotation
- Music.Abc: AnnotateUnspecified :: String -> Annotation
- Music.Abc: Area :: String -> Information
- Music.Abc: Arpeggio :: Decoration
- Music.Abc: B :: PitchClass
- Music.Abc: Barline :: Barline -> Music
- Music.Abc: Bass :: Clef
- Music.Abc: Beam :: Music -> Music
- Music.Abc: Book :: String -> Information
- Music.Abc: Breath :: Decoration
- Music.Abc: C :: PitchClass
- Music.Abc: Chord :: Chord -> Music
- Music.Abc: ChordSymbol :: ChordSymbol -> Music -> Music
- Music.Abc: Chord_ :: ([Pitch], Maybe Duration) -> Chord
- Music.Abc: Coda :: Decoration
- Music.Abc: Common :: Meter
- Music.Abc: Composer :: String -> Information
- Music.Abc: Compound :: [Integer] -> Integer -> Meter
- Music.Abc: Crescendo :: Decoration
- Music.Abc: Cut :: Meter
- Music.Abc: D :: PitchClass
- Music.Abc: DaCapo :: Decoration
- Music.Abc: DaSegno :: Decoration
- Music.Abc: Dacoda :: Decoration
- Music.Abc: Decorate :: Decoration -> Music -> Music
- Music.Abc: Diminuendo :: Decoration
- Music.Abc: Directive :: (String, String) -> Directive
- Music.Abc: Discography :: String -> Information
- Music.Abc: Dorian :: Mode
- Music.Abc: DottedBarline :: Barline -> Barline
- Music.Abc: DoubleBarline :: Bool -> Bool -> Barline
- Music.Abc: DoubleFlat :: Accidental
- Music.Abc: DoubleSharp :: Accidental
- Music.Abc: Down :: StemDirection
- Music.Abc: Downbow :: Decoration
- Music.Abc: Duration :: Rational -> Duration
- Music.Abc: Dynamic :: Dynamic -> Decoration
- Music.Abc: E :: PitchClass
- Music.Abc: EndCrescendo :: Decoration
- Music.Abc: EndDiminuendo :: Decoration
- Music.Abc: F :: PitchClass
- Music.Abc: FF :: Dynamic
- Music.Abc: FFF :: Dynamic
- Music.Abc: FFFF :: Dynamic
- Music.Abc: F_ :: Dynamic
- Music.Abc: Fermata :: Bool -> Decoration
- Music.Abc: FileHeader :: [Information] -> [Directive] -> FileHeader
- Music.Abc: FileUrl :: String -> Information
- Music.Abc: Fine :: Decoration
- Music.Abc: Fingering :: Int -> Decoration
- Music.Abc: Flat :: Accidental
- Music.Abc: FreeText :: String -> Element
- Music.Abc: G :: PitchClass
- Music.Abc: Grace :: Music -> Music
- Music.Abc: Group :: String -> Information
- Music.Abc: History :: String -> Information
- Music.Abc: Instruction :: Directive -> Information
- Music.Abc: Invertedturn :: Decoration
- Music.Abc: Invertedturnx :: Decoration
- Music.Abc: InvisibleBarline :: Barline -> Barline
- Music.Abc: Ionian :: Mode
- Music.Abc: Key :: Key -> Information
- Music.Abc: Key_ :: (Integer, Mode) -> Key
- Music.Abc: Locrian :: Mode
- Music.Abc: Longphrase :: Decoration
- Music.Abc: Lowermordent :: Decoration
- Music.Abc: Lydian :: Mode
- Music.Abc: MF :: Dynamic
- Music.Abc: MP :: Dynamic
- Music.Abc: Macro :: Information
- Music.Abc: Major :: Mode
- Music.Abc: Mediumphrase :: Decoration
- Music.Abc: Meter :: Meter -> Information
- Music.Abc: Minor :: Mode
- Music.Abc: Mixolydian :: Mode
- Music.Abc: Natural :: Accidental
- Music.Abc: NoClef :: Clef
- Music.Abc: NoMeter :: Meter
- Music.Abc: Notes :: String -> Information
- Music.Abc: Octave :: Int -> Octave
- Music.Abc: Open :: Decoration
- Music.Abc: Origin :: String -> Information
- Music.Abc: PP :: Dynamic
- Music.Abc: PPP :: Dynamic
- Music.Abc: PPPP :: Dynamic
- Music.Abc: P_ :: Dynamic
- Music.Abc: Parts :: Information
- Music.Abc: Perc :: Clef
- Music.Abc: Phrygian :: Mode
- Music.Abc: Pitch :: (PitchClass, Maybe Accidental, Octave) -> Pitch
- Music.Abc: Plus :: Decoration
- Music.Abc: ReferenceNumber :: Integer -> Information
- Music.Abc: Remark :: Information
- Music.Abc: Repeat :: Int -> Bool -> Bool -> Barline
- Music.Abc: Rhythm :: String -> Information
- Music.Abc: Roll :: Decoration
- Music.Abc: SFZ :: Dynamic
- Music.Abc: Segno :: Decoration
- Music.Abc: Sequence :: [Music] -> Music
- Music.Abc: Sharp :: Accidental
- Music.Abc: Shortphrase :: Decoration
- Music.Abc: Simple :: Rational -> Meter
- Music.Abc: SingleBarline :: Barline
- Music.Abc: Slide :: Decoration
- Music.Abc: Slur :: Music -> Music
- Music.Abc: Snap :: Decoration
- Music.Abc: Source :: String -> Information
- Music.Abc: SymbolLine :: Information
- Music.Abc: Tempo :: Tempo -> Information
- Music.Abc: Tempo_ :: (Maybe String, [Duration], Duration) -> Tempo
- Music.Abc: Tenor :: Clef
- Music.Abc: Tenuto :: Decoration
- Music.Abc: Thumb :: Decoration
- Music.Abc: Tie :: Music -> Music
- Music.Abc: Title :: String -> Information
- Music.Abc: Transcription :: String -> Information
- Music.Abc: Treble :: Clef
- Music.Abc: Trill :: Decoration
- Music.Abc: TrillBegin :: Decoration
- Music.Abc: TrillEnd :: Decoration
- Music.Abc: Tune :: AbcTune -> Element
- Music.Abc: TuneHeader :: [Information] -> TuneHeader
- Music.Abc: Tuplet :: Duration -> Music -> Music
- Music.Abc: Turn :: Decoration
- Music.Abc: Turnx :: Decoration
- Music.Abc: TypesetText :: String -> Element
- Music.Abc: UnitNoteLength :: Duration -> Information
- Music.Abc: Up :: StemDirection
- Music.Abc: Upbow :: Decoration
- Music.Abc: Uppermordent :: Decoration
- Music.Abc: UserDefined :: Information
- Music.Abc: Voice :: VoiceProperties -> Information
- Music.Abc: VoiceProperties :: (Maybe String) -> (Maybe String) -> (Maybe StemDirection) -> (Maybe Clef) -> VoiceProperties
- Music.Abc: Wedge :: Decoration
- Music.Abc: Words :: String -> Information
- Music.Abc: data AbcFile
- Music.Abc: data AbcTune
- Music.Abc: data Accidental
- Music.Abc: data Annotation
- Music.Abc: data Barline
- Music.Abc: data Clef
- Music.Abc: data Decoration
- Music.Abc: data Dynamic
- Music.Abc: data Element
- Music.Abc: data FileHeader
- Music.Abc: data Information
- Music.Abc: data Meter
- Music.Abc: data Mode
- Music.Abc: data Music
- Music.Abc: data PitchClass
- Music.Abc: data StemDirection
- Music.Abc: data TuneHeader
- Music.Abc: data VoiceProperties
- Music.Abc: getChord :: Chord -> ([Pitch], Maybe Duration)
- Music.Abc: getDirective :: Directive -> (String, String)
- Music.Abc: getDuration :: Duration -> Rational
- Music.Abc: getOctave :: Octave -> Int
- Music.Abc: getPitch :: Pitch -> (PitchClass, Maybe Accidental, Octave)
- Music.Abc: getTempo :: Tempo -> (Maybe String, [Duration], Duration)
- Music.Abc: instance Bounded Accidental
- Music.Abc: instance Bounded Clef
- Music.Abc: instance Bounded PitchClass
- Music.Abc: instance Bounded StemDirection
- Music.Abc: instance Enum Accidental
- Music.Abc: instance Enum Clef
- Music.Abc: instance Enum Duration
- Music.Abc: instance Enum Octave
- Music.Abc: instance Enum PitchClass
- Music.Abc: instance Enum StemDirection
- Music.Abc: instance Eq AbcFile
- Music.Abc: instance Eq AbcTune
- Music.Abc: instance Eq Accidental
- Music.Abc: instance Eq Annotation
- Music.Abc: instance Eq Barline
- Music.Abc: instance Eq Chord
- Music.Abc: instance Eq Clef
- Music.Abc: instance Eq Decoration
- Music.Abc: instance Eq Directive
- Music.Abc: instance Eq Duration
- Music.Abc: instance Eq Dynamic
- Music.Abc: instance Eq Element
- Music.Abc: instance Eq FileHeader
- Music.Abc: instance Eq Information
- Music.Abc: instance Eq Key
- Music.Abc: instance Eq Meter
- Music.Abc: instance Eq Mode
- Music.Abc: instance Eq Music
- Music.Abc: instance Eq Octave
- Music.Abc: instance Eq Pitch
- Music.Abc: instance Eq PitchClass
- Music.Abc: instance Eq StemDirection
- Music.Abc: instance Eq Tempo
- Music.Abc: instance Eq TuneHeader
- Music.Abc: instance Eq VoiceProperties
- Music.Abc: instance Fractional Duration
- Music.Abc: instance Integral Octave
- Music.Abc: instance Num Duration
- Music.Abc: instance Num Octave
- Music.Abc: instance Ord AbcFile
- Music.Abc: instance Ord AbcTune
- Music.Abc: instance Ord Accidental
- Music.Abc: instance Ord Annotation
- Music.Abc: instance Ord Barline
- Music.Abc: instance Ord Chord
- Music.Abc: instance Ord Clef
- Music.Abc: instance Ord Decoration
- Music.Abc: instance Ord Directive
- Music.Abc: instance Ord Duration
- Music.Abc: instance Ord Dynamic
- Music.Abc: instance Ord Element
- Music.Abc: instance Ord FileHeader
- Music.Abc: instance Ord Information
- Music.Abc: instance Ord Key
- Music.Abc: instance Ord Meter
- Music.Abc: instance Ord Mode
- Music.Abc: instance Ord Music
- Music.Abc: instance Ord Octave
- Music.Abc: instance Ord Pitch
- Music.Abc: instance Ord PitchClass
- Music.Abc: instance Ord StemDirection
- Music.Abc: instance Ord Tempo
- Music.Abc: instance Ord TuneHeader
- Music.Abc: instance Ord VoiceProperties
- Music.Abc: instance Pretty AbcFile
- Music.Abc: instance Pretty AbcTune
- Music.Abc: instance Pretty Accidental
- Music.Abc: instance Pretty Chord
- Music.Abc: instance Pretty Directive
- Music.Abc: instance Pretty Duration
- Music.Abc: instance Pretty Element
- Music.Abc: instance Pretty FileHeader
- Music.Abc: instance Pretty Information
- Music.Abc: instance Pretty Key
- Music.Abc: instance Pretty Meter
- Music.Abc: instance Pretty Mode
- Music.Abc: instance Pretty Music
- Music.Abc: instance Pretty Pitch
- Music.Abc: instance Pretty Tempo
- Music.Abc: instance Pretty TuneHeader
- Music.Abc: instance Pretty VoiceProperties
- Music.Abc: instance Real Duration
- Music.Abc: instance Real Octave
- Music.Abc: instance RealFrac Duration
- Music.Abc: instance Show AbcFile
- Music.Abc: instance Show AbcTune
- Music.Abc: instance Show Accidental
- Music.Abc: instance Show Annotation
- Music.Abc: instance Show Barline
- Music.Abc: instance Show Chord
- Music.Abc: instance Show Clef
- Music.Abc: instance Show Decoration
- Music.Abc: instance Show Directive
- Music.Abc: instance Show Duration
- Music.Abc: instance Show Dynamic
- Music.Abc: instance Show Element
- Music.Abc: instance Show FileHeader
- Music.Abc: instance Show Information
- Music.Abc: instance Show Key
- Music.Abc: instance Show Meter
- Music.Abc: instance Show Mode
- Music.Abc: instance Show Music
- Music.Abc: instance Show Octave
- Music.Abc: instance Show Pitch
- Music.Abc: instance Show PitchClass
- Music.Abc: instance Show StemDirection
- Music.Abc: instance Show Tempo
- Music.Abc: instance Show TuneHeader
- Music.Abc: instance Show VoiceProperties
- Music.Abc: newtype Chord
- Music.Abc: newtype Directive
- Music.Abc: newtype Duration
- Music.Abc: newtype Key
- Music.Abc: newtype Octave
- Music.Abc: newtype Pitch
- Music.Abc: newtype Tempo
- Music.Abc: readAbc :: String -> AbcFile
- Music.Abc: showAbc :: AbcFile -> String
- Music.Abc: type ChordSymbol = String
- Music.Abc: type TuneBody = [Music]
- Music.Abc.Parser: parse :: String -> Either ParseError AbcFile
+ Data.Music.Abc: A :: PitchClass
+ Data.Music.Abc: AbcFile :: (Maybe String) -> (Maybe FileHeader) -> [Element] -> AbcFile
+ Data.Music.Abc: AbcTune :: TuneHeader -> TuneBody -> AbcTune
+ Data.Music.Abc: Accent :: Decoration
+ Data.Music.Abc: Aeolian :: Mode
+ Data.Music.Abc: Alto :: Clef
+ Data.Music.Abc: Annotate :: Annotation -> Music -> Music
+ Data.Music.Abc: AnnotateAbove :: String -> Annotation
+ Data.Music.Abc: AnnotateBelow :: String -> Annotation
+ Data.Music.Abc: AnnotateLeft :: String -> Annotation
+ Data.Music.Abc: AnnotateRight :: String -> Annotation
+ Data.Music.Abc: AnnotateUnspecified :: String -> Annotation
+ Data.Music.Abc: Area :: String -> Information
+ Data.Music.Abc: Arpeggio :: Decoration
+ Data.Music.Abc: B :: PitchClass
+ Data.Music.Abc: Barline :: Barline -> Music
+ Data.Music.Abc: Bass :: Clef
+ Data.Music.Abc: Beam :: Music -> Music
+ Data.Music.Abc: Book :: String -> Information
+ Data.Music.Abc: Breath :: Decoration
+ Data.Music.Abc: C :: PitchClass
+ Data.Music.Abc: Chord :: Chord -> Music
+ Data.Music.Abc: ChordSymbol :: ChordSymbol -> Music -> Music
+ Data.Music.Abc: Chord_ :: ([Pitch], Maybe Duration) -> Chord
+ Data.Music.Abc: Coda :: Decoration
+ Data.Music.Abc: Common :: Meter
+ Data.Music.Abc: Composer :: String -> Information
+ Data.Music.Abc: Compound :: [Integer] -> Integer -> Meter
+ Data.Music.Abc: Crescendo :: Decoration
+ Data.Music.Abc: Cut :: Meter
+ Data.Music.Abc: D :: PitchClass
+ Data.Music.Abc: DaCapo :: Decoration
+ Data.Music.Abc: DaSegno :: Decoration
+ Data.Music.Abc: Dacoda :: Decoration
+ Data.Music.Abc: Decorate :: Decoration -> Music -> Music
+ Data.Music.Abc: Diminuendo :: Decoration
+ Data.Music.Abc: Directive :: (String, String) -> Directive
+ Data.Music.Abc: Discography :: String -> Information
+ Data.Music.Abc: Dorian :: Mode
+ Data.Music.Abc: DottedBarline :: Barline -> Barline
+ Data.Music.Abc: DoubleBarline :: Bool -> Bool -> Barline
+ Data.Music.Abc: DoubleFlat :: Accidental
+ Data.Music.Abc: DoubleSharp :: Accidental
+ Data.Music.Abc: Down :: StemDirection
+ Data.Music.Abc: Downbow :: Decoration
+ Data.Music.Abc: Duration :: Rational -> Duration
+ Data.Music.Abc: Dynamic :: Dynamic -> Decoration
+ Data.Music.Abc: E :: PitchClass
+ Data.Music.Abc: EndCrescendo :: Decoration
+ Data.Music.Abc: EndDiminuendo :: Decoration
+ Data.Music.Abc: F :: PitchClass
+ Data.Music.Abc: FF :: Dynamic
+ Data.Music.Abc: FFF :: Dynamic
+ Data.Music.Abc: FFFF :: Dynamic
+ Data.Music.Abc: F_ :: Dynamic
+ Data.Music.Abc: Fermata :: Bool -> Decoration
+ Data.Music.Abc: FileHeader :: [Information] -> [Directive] -> FileHeader
+ Data.Music.Abc: FileUrl :: String -> Information
+ Data.Music.Abc: Fine :: Decoration
+ Data.Music.Abc: Fingering :: Int -> Decoration
+ Data.Music.Abc: Flat :: Accidental
+ Data.Music.Abc: FreeText :: String -> Element
+ Data.Music.Abc: G :: PitchClass
+ Data.Music.Abc: Grace :: Music -> Music
+ Data.Music.Abc: Group :: String -> Information
+ Data.Music.Abc: History :: String -> Information
+ Data.Music.Abc: Instruction :: Directive -> Information
+ Data.Music.Abc: Invertedturn :: Decoration
+ Data.Music.Abc: Invertedturnx :: Decoration
+ Data.Music.Abc: InvisibleBarline :: Barline -> Barline
+ Data.Music.Abc: Ionian :: Mode
+ Data.Music.Abc: Key :: Key -> Information
+ Data.Music.Abc: Key_ :: (Integer, Mode) -> Key
+ Data.Music.Abc: Locrian :: Mode
+ Data.Music.Abc: Longphrase :: Decoration
+ Data.Music.Abc: Lowermordent :: Decoration
+ Data.Music.Abc: Lydian :: Mode
+ Data.Music.Abc: MF :: Dynamic
+ Data.Music.Abc: MP :: Dynamic
+ Data.Music.Abc: Macro :: Information
+ Data.Music.Abc: Major :: Mode
+ Data.Music.Abc: Mediumphrase :: Decoration
+ Data.Music.Abc: Meter :: Meter -> Information
+ Data.Music.Abc: Minor :: Mode
+ Data.Music.Abc: Mixolydian :: Mode
+ Data.Music.Abc: Natural :: Accidental
+ Data.Music.Abc: NoClef :: Clef
+ Data.Music.Abc: NoMeter :: Meter
+ Data.Music.Abc: Notes :: String -> Information
+ Data.Music.Abc: Octave :: Int -> Octave
+ Data.Music.Abc: Open :: Decoration
+ Data.Music.Abc: Origin :: String -> Information
+ Data.Music.Abc: PP :: Dynamic
+ Data.Music.Abc: PPP :: Dynamic
+ Data.Music.Abc: PPPP :: Dynamic
+ Data.Music.Abc: P_ :: Dynamic
+ Data.Music.Abc: Parts :: Information
+ Data.Music.Abc: Perc :: Clef
+ Data.Music.Abc: Phrygian :: Mode
+ Data.Music.Abc: Pitch :: (PitchClass, Maybe Accidental, Octave) -> Pitch
+ Data.Music.Abc: Plus :: Decoration
+ Data.Music.Abc: ReferenceNumber :: Integer -> Information
+ Data.Music.Abc: Remark :: Information
+ Data.Music.Abc: Repeat :: Int -> Bool -> Bool -> Barline
+ Data.Music.Abc: Rhythm :: String -> Information
+ Data.Music.Abc: Roll :: Decoration
+ Data.Music.Abc: SFZ :: Dynamic
+ Data.Music.Abc: Segno :: Decoration
+ Data.Music.Abc: Sequence :: [Music] -> Music
+ Data.Music.Abc: Sharp :: Accidental
+ Data.Music.Abc: Shortphrase :: Decoration
+ Data.Music.Abc: Simple :: Rational -> Meter
+ Data.Music.Abc: SingleBarline :: Barline
+ Data.Music.Abc: Slide :: Decoration
+ Data.Music.Abc: Slur :: Music -> Music
+ Data.Music.Abc: Snap :: Decoration
+ Data.Music.Abc: Source :: String -> Information
+ Data.Music.Abc: SymbolLine :: Information
+ Data.Music.Abc: Tempo :: Tempo -> Information
+ Data.Music.Abc: Tempo_ :: (Maybe String, [Duration], Duration) -> Tempo
+ Data.Music.Abc: Tenor :: Clef
+ Data.Music.Abc: Tenuto :: Decoration
+ Data.Music.Abc: Thumb :: Decoration
+ Data.Music.Abc: Tie :: Music -> Music
+ Data.Music.Abc: Title :: String -> Information
+ Data.Music.Abc: Transcription :: String -> Information
+ Data.Music.Abc: Treble :: Clef
+ Data.Music.Abc: Trill :: Decoration
+ Data.Music.Abc: TrillBegin :: Decoration
+ Data.Music.Abc: TrillEnd :: Decoration
+ Data.Music.Abc: Tune :: AbcTune -> Element
+ Data.Music.Abc: TuneHeader :: [Information] -> TuneHeader
+ Data.Music.Abc: Tuplet :: Duration -> Music -> Music
+ Data.Music.Abc: Turn :: Decoration
+ Data.Music.Abc: Turnx :: Decoration
+ Data.Music.Abc: TypesetText :: String -> Element
+ Data.Music.Abc: UnitNoteLength :: Duration -> Information
+ Data.Music.Abc: Up :: StemDirection
+ Data.Music.Abc: Upbow :: Decoration
+ Data.Music.Abc: Uppermordent :: Decoration
+ Data.Music.Abc: UserDefined :: Information
+ Data.Music.Abc: Voice :: VoiceProperties -> Information
+ Data.Music.Abc: VoiceProperties :: (Maybe String) -> (Maybe String) -> (Maybe StemDirection) -> (Maybe Clef) -> VoiceProperties
+ Data.Music.Abc: Wedge :: Decoration
+ Data.Music.Abc: Words :: String -> Information
+ Data.Music.Abc: data AbcFile
+ Data.Music.Abc: data AbcTune
+ Data.Music.Abc: data Accidental
+ Data.Music.Abc: data Annotation
+ Data.Music.Abc: data Barline
+ Data.Music.Abc: data Clef
+ Data.Music.Abc: data Decoration
+ Data.Music.Abc: data Dynamic
+ Data.Music.Abc: data Element
+ Data.Music.Abc: data FileHeader
+ Data.Music.Abc: data Information
+ Data.Music.Abc: data Meter
+ Data.Music.Abc: data Mode
+ Data.Music.Abc: data Music
+ Data.Music.Abc: data PitchClass
+ Data.Music.Abc: data StemDirection
+ Data.Music.Abc: data TuneHeader
+ Data.Music.Abc: data VoiceProperties
+ Data.Music.Abc: getChord :: Chord -> ([Pitch], Maybe Duration)
+ Data.Music.Abc: getDirective :: Directive -> (String, String)
+ Data.Music.Abc: getDuration :: Duration -> Rational
+ Data.Music.Abc: getOctave :: Octave -> Int
+ Data.Music.Abc: getPitch :: Pitch -> (PitchClass, Maybe Accidental, Octave)
+ Data.Music.Abc: getTempo :: Tempo -> (Maybe String, [Duration], Duration)
+ Data.Music.Abc: instance Bounded Accidental
+ Data.Music.Abc: instance Bounded Clef
+ Data.Music.Abc: instance Bounded PitchClass
+ Data.Music.Abc: instance Bounded StemDirection
+ Data.Music.Abc: instance Enum Accidental
+ Data.Music.Abc: instance Enum Clef
+ Data.Music.Abc: instance Enum Duration
+ Data.Music.Abc: instance Enum Octave
+ Data.Music.Abc: instance Enum PitchClass
+ Data.Music.Abc: instance Enum StemDirection
+ Data.Music.Abc: instance Eq AbcFile
+ Data.Music.Abc: instance Eq AbcTune
+ Data.Music.Abc: instance Eq Accidental
+ Data.Music.Abc: instance Eq Annotation
+ Data.Music.Abc: instance Eq Barline
+ Data.Music.Abc: instance Eq Chord
+ Data.Music.Abc: instance Eq Clef
+ Data.Music.Abc: instance Eq Decoration
+ Data.Music.Abc: instance Eq Directive
+ Data.Music.Abc: instance Eq Duration
+ Data.Music.Abc: instance Eq Dynamic
+ Data.Music.Abc: instance Eq Element
+ Data.Music.Abc: instance Eq FileHeader
+ Data.Music.Abc: instance Eq Information
+ Data.Music.Abc: instance Eq Key
+ Data.Music.Abc: instance Eq Meter
+ Data.Music.Abc: instance Eq Mode
+ Data.Music.Abc: instance Eq Music
+ Data.Music.Abc: instance Eq Octave
+ Data.Music.Abc: instance Eq Pitch
+ Data.Music.Abc: instance Eq PitchClass
+ Data.Music.Abc: instance Eq StemDirection
+ Data.Music.Abc: instance Eq Tempo
+ Data.Music.Abc: instance Eq TuneHeader
+ Data.Music.Abc: instance Eq VoiceProperties
+ Data.Music.Abc: instance Fractional Duration
+ Data.Music.Abc: instance Integral Octave
+ Data.Music.Abc: instance Num Duration
+ Data.Music.Abc: instance Num Octave
+ Data.Music.Abc: instance Ord AbcFile
+ Data.Music.Abc: instance Ord AbcTune
+ Data.Music.Abc: instance Ord Accidental
+ Data.Music.Abc: instance Ord Annotation
+ Data.Music.Abc: instance Ord Barline
+ Data.Music.Abc: instance Ord Chord
+ Data.Music.Abc: instance Ord Clef
+ Data.Music.Abc: instance Ord Decoration
+ Data.Music.Abc: instance Ord Directive
+ Data.Music.Abc: instance Ord Duration
+ Data.Music.Abc: instance Ord Dynamic
+ Data.Music.Abc: instance Ord Element
+ Data.Music.Abc: instance Ord FileHeader
+ Data.Music.Abc: instance Ord Information
+ Data.Music.Abc: instance Ord Key
+ Data.Music.Abc: instance Ord Meter
+ Data.Music.Abc: instance Ord Mode
+ Data.Music.Abc: instance Ord Music
+ Data.Music.Abc: instance Ord Octave
+ Data.Music.Abc: instance Ord Pitch
+ Data.Music.Abc: instance Ord PitchClass
+ Data.Music.Abc: instance Ord StemDirection
+ Data.Music.Abc: instance Ord Tempo
+ Data.Music.Abc: instance Ord TuneHeader
+ Data.Music.Abc: instance Ord VoiceProperties
+ Data.Music.Abc: instance Pretty AbcFile
+ Data.Music.Abc: instance Pretty AbcTune
+ Data.Music.Abc: instance Pretty Accidental
+ Data.Music.Abc: instance Pretty Chord
+ Data.Music.Abc: instance Pretty Directive
+ Data.Music.Abc: instance Pretty Duration
+ Data.Music.Abc: instance Pretty Element
+ Data.Music.Abc: instance Pretty FileHeader
+ Data.Music.Abc: instance Pretty Information
+ Data.Music.Abc: instance Pretty Key
+ Data.Music.Abc: instance Pretty Meter
+ Data.Music.Abc: instance Pretty Mode
+ Data.Music.Abc: instance Pretty Music
+ Data.Music.Abc: instance Pretty Pitch
+ Data.Music.Abc: instance Pretty Tempo
+ Data.Music.Abc: instance Pretty TuneHeader
+ Data.Music.Abc: instance Pretty VoiceProperties
+ Data.Music.Abc: instance Real Duration
+ Data.Music.Abc: instance Real Octave
+ Data.Music.Abc: instance RealFrac Duration
+ Data.Music.Abc: instance Show AbcFile
+ Data.Music.Abc: instance Show AbcTune
+ Data.Music.Abc: instance Show Accidental
+ Data.Music.Abc: instance Show Annotation
+ Data.Music.Abc: instance Show Barline
+ Data.Music.Abc: instance Show Chord
+ Data.Music.Abc: instance Show Clef
+ Data.Music.Abc: instance Show Decoration
+ Data.Music.Abc: instance Show Directive
+ Data.Music.Abc: instance Show Duration
+ Data.Music.Abc: instance Show Dynamic
+ Data.Music.Abc: instance Show Element
+ Data.Music.Abc: instance Show FileHeader
+ Data.Music.Abc: instance Show Information
+ Data.Music.Abc: instance Show Key
+ Data.Music.Abc: instance Show Meter
+ Data.Music.Abc: instance Show Mode
+ Data.Music.Abc: instance Show Music
+ Data.Music.Abc: instance Show Octave
+ Data.Music.Abc: instance Show Pitch
+ Data.Music.Abc: instance Show PitchClass
+ Data.Music.Abc: instance Show StemDirection
+ Data.Music.Abc: instance Show Tempo
+ Data.Music.Abc: instance Show TuneHeader
+ Data.Music.Abc: instance Show VoiceProperties
+ Data.Music.Abc: newtype Chord
+ Data.Music.Abc: newtype Directive
+ Data.Music.Abc: newtype Duration
+ Data.Music.Abc: newtype Key
+ Data.Music.Abc: newtype Octave
+ Data.Music.Abc: newtype Pitch
+ Data.Music.Abc: newtype Tempo
+ Data.Music.Abc: readAbc :: String -> AbcFile
+ Data.Music.Abc: showAbc :: AbcFile -> String
+ Data.Music.Abc: type ChordSymbol = String
+ Data.Music.Abc: type TuneBody = [Music]
+ Data.Music.Abc.Parser: parse :: String -> Either ParseError AbcFile

Files

abcnotation.cabal view
@@ -1,6 +1,6 @@  name:                   abcnotation-version:                1.8.1+version:                1.9.0 synopsis:               Haskell representation and parser for ABC notation. author:                 Hans Hoglund maintainer:             Hans Hoglund@@ -24,8 +24,8 @@   location:             git://github.com/music-suite/abcnotation.git  library-    exposed-modules:    Music.Abc-                        Music.Abc.Parser+    exposed-modules:    Data.Music.Abc+                        Data.Music.Abc.Parser     build-depends:      base                >= 4 && < 5,                         semigroups          >= 0.13.0.1 && < 1,                         prettify,
+ src/Data/Music/Abc.hs view
@@ -0,0 +1,593 @@++{-# LANGUAGE TypeOperators, OverloadedStrings, GeneralizedNewtypeDeriving #-}++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : portable+--+-- A Haskell representation and parser for ABC notation. Based on the 2.1 standard.+--+-- For more information see <http://abcnotation.com>.+--+-------------------------------------------------------------------------------------++-- TODO compare https://github.com/sergi/abcnode/blob/master/parser.pegjs++module Data.Music.Abc (++        ----------------------------------------------------------------------++        -- * Abc format+        -- ** Files+        AbcFile(..),++        -- *** File header+        FileHeader(..),+        Element(..),++        -- ** Tunes+        AbcTune(..),+        TuneHeader(..),+        TuneBody(..),++        ----------------------------------------------------------------------++        -- * Music+        Music(..),+        Chord(..),+        Barline(..),+        Annotation(..),+        ChordSymbol(..),+        Decoration(..),+        Dynamic(..),++        -- ** Time+        Duration(..),+        Meter(..),+        Tempo(..),++        -- ** Pitch+        PitchClass(..),+        Accidental(..),+        Octave(..),+        Pitch(..),+        Key(..),+        StemDirection(..),+        Clef(..),+        Mode(..),++        ----------------------------------------------------------------------++        -- * Information+        Information(..),+        Directive(..),+        VoiceProperties(..),++        ----------------------------------------------------------------------++        -- * Import and export+        readAbc,+        showAbc+  ) where++import Data.Maybe+import Data.Ratio+import Data.Char+import Data.Semigroup+import Data.List (intersperse)+import Text.Pretty hiding (Mode)++--------------------------------------------------------------------------------++-- File structure+++-- | A full ABC file (2.2).+data AbcFile+    = AbcFile+        (Maybe String)+        (Maybe FileHeader)+        [Element]+    deriving (Eq, Ord, Show)++instance Pretty AbcFile where+    pretty (AbcFile version header elements) = mempty+        <> "%abc-" <> string (fromMaybe "2.1" version) <> "\n"+        <> pretty header <> "\n"+        <> sepBy "\n" (fmap pretty elements) <> "\n"+    +    +-- | File header (2.2.2).+data FileHeader+    = FileHeader+        [Information]+        [Directive]+    deriving (Eq, Ord, Show)++instance Pretty FileHeader where+    pretty (FileHeader info directives) = mempty+        <> sepBy "\n" (fmap pretty info) <> "\n"+        <> sepBy "\n" (fmap pretty directives)+++-- | Either a tune, free text or typeset text (2.2.3).+data Element+    = Tune+        AbcTune                         -- ^ An Abc tune.+    | FreeText+        String                          -- ^ Free text (2.2.3).+    | TypesetText+        String                          -- ^ Typeset text (2.2.3).+    deriving (Eq, Ord, Show)++instance Pretty Element where+    pretty (Tune a)         = pretty a+    pretty (FreeText a)     = string a+    pretty (TypesetText a)  = string a+++data AbcTune+    = AbcTune+        TuneHeader+        TuneBody+    deriving (Eq, Ord, Show)++instance Pretty AbcTune where+    pretty (AbcTune header elements) = mempty+        <> pretty header <> "\n"+        <> sepBy "\n" (fmap pretty elements) <> "\n"+++data TuneHeader+    = TuneHeader+        [Information]+    deriving (Eq, Ord, Show)++instance Pretty TuneHeader where+    pretty (TuneHeader info) =+        sepBy "\n" (fmap pretty info)+++-- | Lines of music code.+type TuneBody +    = [Music]+-- TODO voices, see http://www.barfly.dial.pipex.com/multivoice.txt+++--------------------------------------------------------------------------------++-- Music+++-- | One line of music code.+data Music+    = Chord Chord+    | Barline Barline+    | Tie Music+    | Slur Music+    | Beam Music+    | Grace Music+    | Tuplet Duration Music+    | Decorate Decoration Music+    | Annotate Annotation Music+    | ChordSymbol ChordSymbol Music+    | Sequence [Music] -- beam? music+    deriving (Eq, Ord, Show)++instance Pretty Music where+    pretty = go+        where+            go (Chord a) = pretty a+            go (Sequence as) = sepBy " " $ fmap pretty as+    -- FIXME+++data Annotation+    = AnnotateLeft String+    | AnnotateRight String+    | AnnotateAbove String+    | AnnotateBelow String+    | AnnotateUnspecified String+    deriving (Eq, Ord, Show)+    +-- TODO clefs and transposition (4.6)+-- TODO redifinable symbols (4.16)+-- TODO symbol lines (4.15)+-- TODO symbol lyrics++-- Note (4.20) +newtype Chord = Chord_ { getChord :: (+        [Pitch],+        (Maybe Duration)+    ) }+    deriving (Eq, Ord, Show)++instance Pretty Chord where+    -- TODO skip duration if zero+    pretty (Chord_ ([], dur))       = ""+    pretty (Chord_ ([pitch], dur))  =+        pretty pitch <> pretty dur+    pretty (Chord_ (pitches, dur))  =+        brackets (sepBy "" (fmap pretty pitches)) <> pretty dur+++type ChordSymbol +    = String++-- | Barline, including special barlines and repeats.+data Barline+    = SingleBarline+    | DoubleBarline Bool Bool           -- thick? thick?+    | Repeat Int Bool Bool              -- times end? begin?+    | DottedBarline Barline+    | InvisibleBarline Barline+    deriving (Eq, Ord, Show)++-- TODO first and second repeats (4.9)+-- TODO variant endings (4.10)+++-- | Decorations (4.14)+data Decoration+    = Trill                   -- "tr" (trill mark)+    | TrillBegin              -- start of an extended trill+    | TrillEnd                -- end of an extended trill+    | Lowermordent            -- short squiggle with a vertical line through it+    | Uppermordent            -- short squiggle+    | Roll                    -- a roll mark (arc) as used in Irish music+    | Turn                    -- a turn mark (also known as gruppetto)+    | Turnx                   -- a turn mark with a line through it+    | Invertedturn            -- an inverted turn mark+    | Invertedturnx           -- an inverted turn mark with a line through it+    | Arpeggio                -- vertical squiggle+    | Accent                  -- accent mark+    | Fermata Bool            -- fermata or hold (arc above dot), inverted?+    | Tenuto                  -- horizontal line to indicate holding note for full duration+    | Fingering Int           -- fingerings+    | Plus                    -- left-hand pizzicato, or rasp for French horns+    | Snap                    -- snap-pizzicato mark, visually similar to !thumb!+    | Slide                   -- slide up to a note, visually similar to a half slur+    | Wedge                   -- small filled-in wedge mark+    | Upbow                   -- V mark+    | Downbow                 -- squared n mark+    | Open                    -- small circle above note indicating open string or harmonic+    | Thumb                   -- cello thumb symbol+    | Breath                  -- a breath mark (apostrophe-like) after note+    | Dynamic Dynamic         -- Dynamics+    | Crescendo               -- start of a crescendo mark+    | EndCrescendo            -- end of a crescendo mark, placed after the last note+    | Diminuendo              -- start of a diminuendo mark+    | EndDiminuendo           -- end of a diminuendo mark, placed after the last note+    | Segno                   -- ornate s-like symbols separated by a diagonal line+    | Coda                    -- a ring with a cross in it+    | DaSegno                 -- the letters D.S. (=Da Segno)+    | DaCapo                  -- the letters D.C. (=either Da Coda or Da Capo)+    | Dacoda                  -- the word "Da" followed by a Coda sign+    | Fine                    -- the word "fine"+    | Shortphrase             -- vertical line on the upper part of the staff+    | Mediumphrase            -- same, but extending down to the centre line+    | Longphrase              -- same, but extending 3/4 of the way down+    deriving (Eq, Ord, Show)++data Dynamic+    = PPPP+    | PPP+    | PP+    | P_+    | MP+    | MF+    | F_+    | FF+    | FFF+    | FFFF+    | SFZ+    deriving (Eq, Ord, Show)+++--------------------------------------------------------------------------------++-- Information+++-- | An information field (3).+data Information+    = Area String+    | Book String+    | Composer String+    | Discography String+    | FileUrl String+    | Group String+    | History String+    | Instruction Directive+    | Key Key+    | UnitNoteLength Duration+    | Meter Meter            +    | Macro                             -- ^ Macro (not supported)+    | Notes String                      -- ^ Notes+    | Origin String                     -- ^ Origin of tune.+    | Parts+    | Tempo Tempo                       -- ^ Tempo of tune.+    | Rhythm String                     -- ^ Rhythm type of tune.+    | Remark                            -- ^ Remarks (not supported)+    | Source String                     -- ^ Source material.+    | SymbolLine+    | Title String                      -- ^ Title of tune.+    | UserDefined                       -- ^ User defined (not supported)+    | Voice VoiceProperties+    | Words String+    | ReferenceNumber Integer+    | Transcription String+    deriving (Eq, Ord, Show)++instance Pretty Information where+    pretty a = string $ fieldName a ++ ": " ++ showField a+++fieldName :: Information -> String+fieldName = go+    where+        go (Area _)                 = "A"+        go (Book _)                 = "B"+        go (Composer _)             = "C"+        go (Discography _)          = "D"+        go (FileUrl _)              = "F"+        go (Group _)                = "G"+        go (History _)              = "H"+        go (Instruction _)          = "I"+        go (Key _)                  = "K"+        go (UnitNoteLength _)       = "L"+        go (Meter _)                = "M"+        go Macro                    = "m"+        go (Notes _)                = "N"+        go (Origin _)               = "O"+        go Parts                    = "O"+        go (Tempo _)                = "Q"+        go (Rhythm _)               = "R"+        go Remark                   = "r"+        go (Source _)               = "S"+        go SymbolLine               = "s"+        go (Title _)                = "T"+        go UserDefined              = "U"+        go (Voice _)                = "V"+        go (Words _)                = "W"+        go (ReferenceNumber _)      = "X"+        go (Transcription _)        = "Z"++-- (file header, tune header, tune body, inline)+fieldAllowed :: Information -> (Bool, Bool, Bool, Bool)+fieldAllowed = go+    where+        go (Area _)                 = (True, True, False, False)+        go (Book _)                 = (True, True, False, False)+        go (Composer _)             = (True, True, False, False)+        go (Discography _)          = (True, True, False, False)+        go (FileUrl _)              = (True, True, False, False)+        go (Group _)                = (True, True, False, False)+        go (History _)              = (True, True, False, False)+        +        go (Instruction _)          = (True, True, True, True)+        go (Key _)                  = (False, True{-last-}, True, True)+        go (UnitNoteLength _)       = (True, True, True, True)+        go (Meter _)                = (True, True, True, True)+        go Macro                    = (True, True, True, True)+        go (Notes _)                = (True, True, True, True)+        +        go (Origin _)               = (True, True, False, False)+        go Parts                    = (False, True, True, True)+        go (Tempo _)                = (False, True, True, True)+        go (Rhythm _)               = (True, True, True, True)+        go Remark                   = (True, True, True, True)+        +        go (Source _)               = (True, True, False, False)+        go SymbolLine               = (False, False, True, False)+        go (Title _)                = (False, True{-second-}, True, False)+        +        go UserDefined              = (True, True, True, True)+        go (Voice _)                = (False, True, True, True)+        go (Words _)                = (False, True, True, False)+        go (ReferenceNumber _)      = (False, True{-first-}, True, False)+        go (Transcription _)        = (True, True, False, False)++fieldAllowedInFileHeader a = r where (r,_,_,_) = fieldAllowed a+fieldAllowedInTuneHeader a = r where (_,r,_,_) = fieldAllowed a+fieldAllowedInTuneBody   a = r where (_,_,r,_) = fieldAllowed a+fieldAllowedInline       a = r where (_,_,_,r) = fieldAllowed a++showField :: Information -> String+showField = go+    where+        go (Area a)                 = a+        go (Book a)                 = a+        go (Composer a)             = a+        go (Discography a)          = a+        go (FileUrl a)              = a+        go (Group a)                = a+        go (History a)              = a+        go (Instruction a)          = show $ pretty a+        go (Key a)                  = show $ pretty a+        go (UnitNoteLength a)       = show $ pretty a+        go (Meter a)                = show $ pretty a+        go Macro                    = ""+        go (Notes a)                = a+        go (Origin a)               = a+        go Parts                    = "" -- TODO+        go (Tempo a)                = show $ pretty a+        go (Rhythm a)               = a+        go Remark                   = "" -- TODO+        go (Source a)               = a+        go SymbolLine               = "" -- TODO+        go (Title a)                = a+        go UserDefined              = "" -- TODO+        go (Voice a)                = show $ pretty a+        go (Words a)                = a+        go (ReferenceNumber a)      = show a+        go (Transcription a)        = a+        ++--------------------------------------------------------------------------------++-- Base types++-- | Pitch (4.1, 4.2).+newtype Pitch = Pitch { getPitch :: (PitchClass, Maybe Accidental, Octave) }+    deriving (Eq, Ord, Show)++instance Pretty Pitch where+    pretty (Pitch (cl, acc, oct)) = pretty acc <> (string $+        (if oct <= 0 then id else fmap toLower) (show cl)+        ++ replicate (negate (fromIntegral oct) `max` 0) ','+        ++ replicate (fromIntegral (oct - 1) `max` 0) '\'')++-- | Pitch class (4.1).+data PitchClass = C | D | E | F | G | A | B+    deriving (Eq, Ord, Show, Enum, Bounded)++-- | Accidentals (4.2).+data Accidental = DoubleFlat | Flat | Natural | Sharp | DoubleSharp+    deriving (Eq, Ord, Show, Enum, Bounded)++instance Pretty Accidental where+    pretty = go+        where+            go DoubleFlat   = "__"+            go Flat         = "_"+            go Natural      = "="+            go Sharp        = "^"+            go DoubleSharp  = "^^"++-- | Octaves (4.1).+newtype Octave = Octave { getOctave :: Int }+    deriving (Eq, Ord, Show, Enum, Num, Real, Integral)+++++++-- | Duration (4.3).+newtype Duration = Duration { getDuration :: Rational }+    deriving (Eq, Ord, Show, Enum, Num, Real, Fractional, RealFrac)++instance Pretty Duration where+    pretty = string . showRatio . getDuration++            +data Meter+    = NoMeter+    | Common+    | Cut+    | Simple Rational+    | Compound [Integer] Integer+    deriving (Eq, Ord, Show)++instance Pretty Meter where+    pretty = go+        where+            go Common           = "C"+            go Cut              = "C|"+            go (Simple a)       = string $ showRatio a+            go (Compound as a)  = sepBy "+" (fmap integer as) <> "/" <> integer a+++++++++newtype Key = Key_ (Integer, Mode)+    deriving (Eq, Ord, Show)++instance Pretty Key where+    pretty (Key_ (tonic, mode)) = prettyTonic tonic <+> pretty mode+        where+            prettyTonic a = case a of+                0 -> "C"++data Mode+    = Major+    | Minor+    | Ionian+    | Dorian+    | Phrygian+    | Lydian+    | Mixolydian+    | Aeolian+    | Locrian+    deriving (Eq, Ord, Show)++instance Pretty Mode where+    pretty = go+        where+            go Major        = ""+            go Minor        = "minor"+            go Ionian       = "ionian"+            go Dorian       = "dorian"+            go Phrygian     = "phrygian"+            go Lydian       = "lydian"+            go Mixolydian   = "mixolydian"+            go Aeolian      = "aeolian"+            go Locrian      = "locrian"+++++-- | Optional string, numerators, frequency (3.1.8)+newtype Tempo = Tempo_ { getTempo :: (Maybe String, [Duration], Duration) }+    deriving (Eq, Ord, Show)++instance Pretty Tempo where+    pretty (Tempo_ (str, durs, bpm)) = +        pretty str <+> (hsep (fmap pretty durs) <> "=" <> pretty bpm)++data VoiceProperties+    = VoiceProperties+        (Maybe String)+        (Maybe String)+        (Maybe StemDirection)+        (Maybe Clef)+    deriving (Eq, Ord, Show)++instance Pretty VoiceProperties where+    pretty _ = "{VoiceProperties}"+    -- FIXME++data StemDirection = Up | Down+    deriving (Eq, Ord, Show, Enum, Bounded)++data Clef = NoClef | Treble | Alto | Tenor | Bass | Perc+    deriving (Eq, Ord, Show, Enum, Bounded)+++-- | Abc directive.+newtype Directive = Directive { getDirective :: (String, String) }+    deriving (Eq, Ord, Show)++instance Pretty Directive where+    pretty _ = "{Directive}"+    -- FIXME++++--------------------------------------------------------------------------------++-- Utility++readAbc :: String -> AbcFile+readAbc = error "Not impl"++showAbc :: AbcFile -> String+showAbc = error "Not impl"+++showRatio :: (Integral a, Show a) => Ratio a -> String+showRatio x+    | denominator x == 1  = show (numerator x)+    | otherwise           = (show $ numerator x) ++ "/" ++ (show $ denominator x)+
+ src/Data/Music/Abc/Parser.hs view
@@ -0,0 +1,141 @@++-------------------------------------------------------------------------------------+-- |+-- Copyright   : (c) Hans Hoglund 2012+--+-- License     : BSD-style+--+-- Maintainer  : hans@hanshoglund.se+-- Stability   : experimental+-- Portability : portable+--+-------------------------------------------------------------------------------------++module Data.Music.Abc.Parser (+    parse+  ) where++import Data.Monoid   +import Data.Either+import Control.Monad+import Control.Applicative hiding ((<|>), optional, many)++import Text.Parsec hiding (parse)+import Text.Parsec.Token+import Text.Parsec.String++import Data.Music.Abc++-- TODO information field verification (header/body)++-- ## Limitations:+--+--  * Limited support for *volatile* features+--  * Limited support for text strings (§8.2)+--    * No mnemonics+--    * No entities+--    * Unicode escapes are supported+--  * No support for macros (§9)+--  * No support for outdated syntax (§10)+--  * Stylesheet directives are ignored (§11)+--  * Typeset text is ignored (§2.2.3)+--  * Strict interpretation assumed (§12)+++-- |+-- Parse a module description, returning an error if unsuccessful.+--+parse :: String -> Either ParseError AbcFile+parse = runParser abcFile () ""+                 +-------------------------------------------------------------------------------------+-- Parsers+-------------------------------------------------------------------------------------++abcFile :: Parser AbcFile+abcFile = do                      +    -- optional byteOrderMark+    string "%abc"+    optional $ string "-" >> version+    optional $ fileHeader    +    fileBody+    return undefined++fileHeader :: Parser FileHeader+fileHeader = fmap (uncurry FileHeader . partitionEithers) $ many1 $ mzero +    <|> fmap Left informationField +    <|> fmap Right styleSheetDirective++fileBody :: Parser [Element]+fileBody = (flip sepBy) emptyLine $ mzero+    <|> fmap Tune abcTune+    <|> fmap FreeText freeText +    <|> fmap TypesetText typeSetText++informationField :: Parser Information+informationField = do+    letter+    char ':'+    -- TODO anything not \n+    char '\n'              +    return undefined++-- Not parsed, see Limitations+styleSheetDirective :: Parser Directive+styleSheetDirective = mzero++byteOrderMark :: Parser ()+byteOrderMark = do+    char '\xFFFE' <|> char '\xFEFF'+    return ()++version :: Parser Double+version = undefined++abcTune :: Parser AbcTune+abcTune = undefined++freeText :: Parser String+freeText = undefined++-- Not parsed, see Limitations+typeSetText :: Parser String+typeSetText = mzero+++-------------------------------------------------------------------------------------+-- Lexer+-------------------------------------------------------------------------------------++lexer :: TokenParser ()+lexer = makeTokenParser $ LanguageDef {+    commentStart    =  "[r:",+    commentEnd      =  "]",+    commentLine     =  "%",+    nestedComments  =  False,+    identStart      =  (letter <|> char '_'),+    identLetter     =  (alphaNum <|> char '_'),+    opStart         =  mzero,+    opLetter        =  mzero,+    reservedNames   =  reservedNames,+    reservedOpNames =  mzero,+    caseSensitive   =  True+    }+    where+        reservedNames = []++-- Convenient synonyms, not exported+llex   = lexeme lexer+lnat   = natural lexer+lstr   = stringLiteral lexer+lname  = identifier lexer+lres   = reserved lexer+lspace = whiteSpace lexer++emptyLine = newLine >> newLine+newLine = string "\r\n" <|> string "\n"++single x = [x]++notSupported x = error $ "Not supported yet: " ++ x+                                                         
− src/Music/Abc.hs
@@ -1,593 +0,0 @@--{-# LANGUAGE TypeOperators, OverloadedStrings, GeneralizedNewtypeDeriving #-}------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : portable------ A Haskell representation and parser for ABC notation. Based on the 2.1 standard.------ For more information see <http://abcnotation.com>.--------------------------------------------------------------------------------------------- TODO compare https://github.com/sergi/abcnode/blob/master/parser.pegjs--module Music.Abc (--        ------------------------------------------------------------------------        -- * Abc format-        -- ** Files-        AbcFile(..),--        -- *** File header-        FileHeader(..),-        Element(..),--        -- ** Tunes-        AbcTune(..),-        TuneHeader(..),-        TuneBody(..),--        ------------------------------------------------------------------------        -- * Music-        Music(..),-        Chord(..),-        Barline(..),-        Annotation(..),-        ChordSymbol(..),-        Decoration(..),-        Dynamic(..),--        -- ** Time-        Duration(..),-        Meter(..),-        Tempo(..),--        -- ** Pitch-        PitchClass(..),-        Accidental(..),-        Octave(..),-        Pitch(..),-        Key(..),-        StemDirection(..),-        Clef(..),-        Mode(..),--        ------------------------------------------------------------------------        -- * Information-        Information(..),-        Directive(..),-        VoiceProperties(..),--        ------------------------------------------------------------------------        -- * Import and export-        readAbc,-        showAbc-  ) where--import Data.Maybe-import Data.Ratio-import Data.Char-import Data.Semigroup-import Data.List (intersperse)-import Text.Pretty hiding (Mode)-------------------------------------------------------------------------------------- File structure----- | A full ABC file (2.2).-data AbcFile-    = AbcFile-        (Maybe String)-        (Maybe FileHeader)-        [Element]-    deriving (Eq, Ord, Show)--instance Pretty AbcFile where-    pretty (AbcFile version header elements) = mempty-        <> "%abc-" <> string (fromMaybe "2.1" version) <> "\n"-        <> pretty header <> "\n"-        <> sepBy "\n" (fmap pretty elements) <> "\n"-    -    --- | File header (2.2.2).-data FileHeader-    = FileHeader-        [Information]-        [Directive]-    deriving (Eq, Ord, Show)--instance Pretty FileHeader where-    pretty (FileHeader info directives) = mempty-        <> sepBy "\n" (fmap pretty info) <> "\n"-        <> sepBy "\n" (fmap pretty directives)----- | Either a tune, free text or typeset text (2.2.3).-data Element-    = Tune-        AbcTune                         -- ^ An Abc tune.-    | FreeText-        String                          -- ^ Free text (2.2.3).-    | TypesetText-        String                          -- ^ Typeset text (2.2.3).-    deriving (Eq, Ord, Show)--instance Pretty Element where-    pretty (Tune a)         = pretty a-    pretty (FreeText a)     = string a-    pretty (TypesetText a)  = string a---data AbcTune-    = AbcTune-        TuneHeader-        TuneBody-    deriving (Eq, Ord, Show)--instance Pretty AbcTune where-    pretty (AbcTune header elements) = mempty-        <> pretty header <> "\n"-        <> sepBy "\n" (fmap pretty elements) <> "\n"---data TuneHeader-    = TuneHeader-        [Information]-    deriving (Eq, Ord, Show)--instance Pretty TuneHeader where-    pretty (TuneHeader info) =-        sepBy "\n" (fmap pretty info)----- | Lines of music code.-type TuneBody -    = [Music]--- TODO voices, see http://www.barfly.dial.pipex.com/multivoice.txt--------------------------------------------------------------------------------------- Music----- | One line of music code.-data Music-    = Chord Chord-    | Barline Barline-    | Tie Music-    | Slur Music-    | Beam Music-    | Grace Music-    | Tuplet Duration Music-    | Decorate Decoration Music-    | Annotate Annotation Music-    | ChordSymbol ChordSymbol Music-    | Sequence [Music] -- beam? music-    deriving (Eq, Ord, Show)--instance Pretty Music where-    pretty = go-        where-            go (Chord a) = pretty a-            go (Sequence as) = sepBy " " $ fmap pretty as-    -- FIXME---data Annotation-    = AnnotateLeft String-    | AnnotateRight String-    | AnnotateAbove String-    | AnnotateBelow String-    | AnnotateUnspecified String-    deriving (Eq, Ord, Show)-    --- TODO clefs and transposition (4.6)--- TODO redifinable symbols (4.16)--- TODO symbol lines (4.15)--- TODO symbol lyrics---- Note (4.20) -newtype Chord = Chord_ { getChord :: (-        [Pitch],-        (Maybe Duration)-    ) }-    deriving (Eq, Ord, Show)--instance Pretty Chord where-    -- TODO skip duration if zero-    pretty (Chord_ ([], dur))       = ""-    pretty (Chord_ ([pitch], dur))  =-        pretty pitch <> pretty dur-    pretty (Chord_ (pitches, dur))  =-        brackets (sepBy "" (fmap pretty pitches)) <> pretty dur---type ChordSymbol -    = String---- | Barline, including special barlines and repeats.-data Barline-    = SingleBarline-    | DoubleBarline Bool Bool           -- thick? thick?-    | Repeat Int Bool Bool              -- times end? begin?-    | DottedBarline Barline-    | InvisibleBarline Barline-    deriving (Eq, Ord, Show)---- TODO first and second repeats (4.9)--- TODO variant endings (4.10)----- | Decorations (4.14)-data Decoration-    = Trill                   -- "tr" (trill mark)-    | TrillBegin              -- start of an extended trill-    | TrillEnd                -- end of an extended trill-    | Lowermordent            -- short squiggle with a vertical line through it-    | Uppermordent            -- short squiggle-    | Roll                    -- a roll mark (arc) as used in Irish music-    | Turn                    -- a turn mark (also known as gruppetto)-    | Turnx                   -- a turn mark with a line through it-    | Invertedturn            -- an inverted turn mark-    | Invertedturnx           -- an inverted turn mark with a line through it-    | Arpeggio                -- vertical squiggle-    | Accent                  -- accent mark-    | Fermata Bool            -- fermata or hold (arc above dot), inverted?-    | Tenuto                  -- horizontal line to indicate holding note for full duration-    | Fingering Int           -- fingerings-    | Plus                    -- left-hand pizzicato, or rasp for French horns-    | Snap                    -- snap-pizzicato mark, visually similar to !thumb!-    | Slide                   -- slide up to a note, visually similar to a half slur-    | Wedge                   -- small filled-in wedge mark-    | Upbow                   -- V mark-    | Downbow                 -- squared n mark-    | Open                    -- small circle above note indicating open string or harmonic-    | Thumb                   -- cello thumb symbol-    | Breath                  -- a breath mark (apostrophe-like) after note-    | Dynamic Dynamic         -- Dynamics-    | Crescendo               -- start of a crescendo mark-    | EndCrescendo            -- end of a crescendo mark, placed after the last note-    | Diminuendo              -- start of a diminuendo mark-    | EndDiminuendo           -- end of a diminuendo mark, placed after the last note-    | Segno                   -- ornate s-like symbols separated by a diagonal line-    | Coda                    -- a ring with a cross in it-    | DaSegno                 -- the letters D.S. (=Da Segno)-    | DaCapo                  -- the letters D.C. (=either Da Coda or Da Capo)-    | Dacoda                  -- the word "Da" followed by a Coda sign-    | Fine                    -- the word "fine"-    | Shortphrase             -- vertical line on the upper part of the staff-    | Mediumphrase            -- same, but extending down to the centre line-    | Longphrase              -- same, but extending 3/4 of the way down-    deriving (Eq, Ord, Show)--data Dynamic-    = PPPP-    | PPP-    | PP-    | P_-    | MP-    | MF-    | F_-    | FF-    | FFF-    | FFFF-    | SFZ-    deriving (Eq, Ord, Show)--------------------------------------------------------------------------------------- Information----- | An information field (3).-data Information-    = Area String-    | Book String-    | Composer String-    | Discography String-    | FileUrl String-    | Group String-    | History String-    | Instruction Directive-    | Key Key-    | UnitNoteLength Duration-    | Meter Meter            -    | Macro                             -- ^ Macro (not supported)-    | Notes String                      -- ^ Notes-    | Origin String                     -- ^ Origin of tune.-    | Parts-    | Tempo Tempo                       -- ^ Tempo of tune.-    | Rhythm String                     -- ^ Rhythm type of tune.-    | Remark                            -- ^ Remarks (not supported)-    | Source String                     -- ^ Source material.-    | SymbolLine-    | Title String                      -- ^ Title of tune.-    | UserDefined                       -- ^ User defined (not supported)-    | Voice VoiceProperties-    | Words String-    | ReferenceNumber Integer-    | Transcription String-    deriving (Eq, Ord, Show)--instance Pretty Information where-    pretty a = string $ fieldName a ++ ": " ++ showField a---fieldName :: Information -> String-fieldName = go-    where-        go (Area _)                 = "A"-        go (Book _)                 = "B"-        go (Composer _)             = "C"-        go (Discography _)          = "D"-        go (FileUrl _)              = "F"-        go (Group _)                = "G"-        go (History _)              = "H"-        go (Instruction _)          = "I"-        go (Key _)                  = "K"-        go (UnitNoteLength _)       = "L"-        go (Meter _)                = "M"-        go Macro                    = "m"-        go (Notes _)                = "N"-        go (Origin _)               = "O"-        go Parts                    = "O"-        go (Tempo _)                = "Q"-        go (Rhythm _)               = "R"-        go Remark                   = "r"-        go (Source _)               = "S"-        go SymbolLine               = "s"-        go (Title _)                = "T"-        go UserDefined              = "U"-        go (Voice _)                = "V"-        go (Words _)                = "W"-        go (ReferenceNumber _)      = "X"-        go (Transcription _)        = "Z"---- (file header, tune header, tune body, inline)-fieldAllowed :: Information -> (Bool, Bool, Bool, Bool)-fieldAllowed = go-    where-        go (Area _)                 = (True, True, False, False)-        go (Book _)                 = (True, True, False, False)-        go (Composer _)             = (True, True, False, False)-        go (Discography _)          = (True, True, False, False)-        go (FileUrl _)              = (True, True, False, False)-        go (Group _)                = (True, True, False, False)-        go (History _)              = (True, True, False, False)-        -        go (Instruction _)          = (True, True, True, True)-        go (Key _)                  = (False, True{-last-}, True, True)-        go (UnitNoteLength _)       = (True, True, True, True)-        go (Meter _)                = (True, True, True, True)-        go Macro                    = (True, True, True, True)-        go (Notes _)                = (True, True, True, True)-        -        go (Origin _)               = (True, True, False, False)-        go Parts                    = (False, True, True, True)-        go (Tempo _)                = (False, True, True, True)-        go (Rhythm _)               = (True, True, True, True)-        go Remark                   = (True, True, True, True)-        -        go (Source _)               = (True, True, False, False)-        go SymbolLine               = (False, False, True, False)-        go (Title _)                = (False, True{-second-}, True, False)-        -        go UserDefined              = (True, True, True, True)-        go (Voice _)                = (False, True, True, True)-        go (Words _)                = (False, True, True, False)-        go (ReferenceNumber _)      = (False, True{-first-}, True, False)-        go (Transcription _)        = (True, True, False, False)--fieldAllowedInFileHeader a = r where (r,_,_,_) = fieldAllowed a-fieldAllowedInTuneHeader a = r where (_,r,_,_) = fieldAllowed a-fieldAllowedInTuneBody   a = r where (_,_,r,_) = fieldAllowed a-fieldAllowedInline       a = r where (_,_,_,r) = fieldAllowed a--showField :: Information -> String-showField = go-    where-        go (Area a)                 = a-        go (Book a)                 = a-        go (Composer a)             = a-        go (Discography a)          = a-        go (FileUrl a)              = a-        go (Group a)                = a-        go (History a)              = a-        go (Instruction a)          = show $ pretty a-        go (Key a)                  = show $ pretty a-        go (UnitNoteLength a)       = show $ pretty a-        go (Meter a)                = show $ pretty a-        go Macro                    = ""-        go (Notes a)                = a-        go (Origin a)               = a-        go Parts                    = "" -- TODO-        go (Tempo a)                = show $ pretty a-        go (Rhythm a)               = a-        go Remark                   = "" -- TODO-        go (Source a)               = a-        go SymbolLine               = "" -- TODO-        go (Title a)                = a-        go UserDefined              = "" -- TODO-        go (Voice a)                = show $ pretty a-        go (Words a)                = a-        go (ReferenceNumber a)      = show a-        go (Transcription a)        = a-        -------------------------------------------------------------------------------------- Base types---- | Pitch (4.1, 4.2).-newtype Pitch = Pitch { getPitch :: (PitchClass, Maybe Accidental, Octave) }-    deriving (Eq, Ord, Show)--instance Pretty Pitch where-    pretty (Pitch (cl, acc, oct)) = pretty acc <> (string $-        (if oct <= 0 then id else fmap toLower) (show cl)-        ++ replicate (negate (fromIntegral oct) `max` 0) ','-        ++ replicate (fromIntegral (oct - 1) `max` 0) '\'')---- | Pitch class (4.1).-data PitchClass = C | D | E | F | G | A | B-    deriving (Eq, Ord, Show, Enum, Bounded)---- | Accidentals (4.2).-data Accidental = DoubleFlat | Flat | Natural | Sharp | DoubleSharp-    deriving (Eq, Ord, Show, Enum, Bounded)--instance Pretty Accidental where-    pretty = go-        where-            go DoubleFlat   = "__"-            go Flat         = "_"-            go Natural      = "="-            go Sharp        = "^"-            go DoubleSharp  = "^^"---- | Octaves (4.1).-newtype Octave = Octave { getOctave :: Int }-    deriving (Eq, Ord, Show, Enum, Num, Real, Integral)--------- | Duration (4.3).-newtype Duration = Duration { getDuration :: Rational }-    deriving (Eq, Ord, Show, Enum, Num, Real, Fractional, RealFrac)--instance Pretty Duration where-    pretty = string . showRatio . getDuration--            -data Meter-    = NoMeter-    | Common-    | Cut-    | Simple Rational-    | Compound [Integer] Integer-    deriving (Eq, Ord, Show)--instance Pretty Meter where-    pretty = go-        where-            go Common           = "C"-            go Cut              = "C|"-            go (Simple a)       = string $ showRatio a-            go (Compound as a)  = sepBy "+" (fmap integer as) <> "/" <> integer a---------newtype Key = Key_ (Integer, Mode)-    deriving (Eq, Ord, Show)--instance Pretty Key where-    pretty (Key_ (tonic, mode)) = prettyTonic tonic <+> pretty mode-        where-            prettyTonic a = case a of-                0 -> "C"--data Mode-    = Major-    | Minor-    | Ionian-    | Dorian-    | Phrygian-    | Lydian-    | Mixolydian-    | Aeolian-    | Locrian-    deriving (Eq, Ord, Show)--instance Pretty Mode where-    pretty = go-        where-            go Major        = ""-            go Minor        = "minor"-            go Ionian       = "ionian"-            go Dorian       = "dorian"-            go Phrygian     = "phrygian"-            go Lydian       = "lydian"-            go Mixolydian   = "mixolydian"-            go Aeolian      = "aeolian"-            go Locrian      = "locrian"------- | Optional string, numerators, frequency (3.1.8)-newtype Tempo = Tempo_ { getTempo :: (Maybe String, [Duration], Duration) }-    deriving (Eq, Ord, Show)--instance Pretty Tempo where-    pretty (Tempo_ (str, durs, bpm)) = -        pretty str <+> (hsep (fmap pretty durs) <> "=" <> pretty bpm)--data VoiceProperties-    = VoiceProperties-        (Maybe String)-        (Maybe String)-        (Maybe StemDirection)-        (Maybe Clef)-    deriving (Eq, Ord, Show)--instance Pretty VoiceProperties where-    pretty _ = "{VoiceProperties}"-    -- FIXME--data StemDirection = Up | Down-    deriving (Eq, Ord, Show, Enum, Bounded)--data Clef = NoClef | Treble | Alto | Tenor | Bass | Perc-    deriving (Eq, Ord, Show, Enum, Bounded)----- | Abc directive.-newtype Directive = Directive { getDirective :: (String, String) }-    deriving (Eq, Ord, Show)--instance Pretty Directive where-    pretty _ = "{Directive}"-    -- FIXME---------------------------------------------------------------------------------------- Utility--readAbc :: String -> AbcFile-readAbc = error "Not impl"--showAbc :: AbcFile -> String-showAbc = error "Not impl"---showRatio :: (Integral a, Show a) => Ratio a -> String-showRatio x-    | denominator x == 1  = show (numerator x)-    | otherwise           = (show $ numerator x) ++ "/" ++ (show $ denominator x)-
− src/Music/Abc/Parser.hs
@@ -1,141 +0,0 @@------------------------------------------------------------------------------------------ |--- Copyright   : (c) Hans Hoglund 2012------ License     : BSD-style------ Maintainer  : hans@hanshoglund.se--- Stability   : experimental--- Portability : portable-------------------------------------------------------------------------------------------module Music.Abc.Parser (-    parse-  ) where--import Data.Monoid   -import Data.Either-import Control.Monad-import Control.Applicative hiding ((<|>), optional, many)--import Text.Parsec hiding (parse)-import Text.Parsec.Token-import Text.Parsec.String--import Music.Abc---- TODO information field verification (header/body)---- ## Limitations:------  * Limited support for *volatile* features---  * Limited support for text strings (§8.2)---    * No mnemonics---    * No entities---    * Unicode escapes are supported---  * No support for macros (§9)---  * No support for outdated syntax (§10)---  * Stylesheet directives are ignored (§11)---  * Typeset text is ignored (§2.2.3)---  * Strict interpretation assumed (§12)----- |--- Parse a module description, returning an error if unsuccessful.----parse :: String -> Either ParseError AbcFile-parse = runParser abcFile () ""-                 ----------------------------------------------------------------------------------------- Parsers----------------------------------------------------------------------------------------abcFile :: Parser AbcFile-abcFile = do                      -    -- optional byteOrderMark-    string "%abc"-    optional $ string "-" >> version-    optional $ fileHeader    -    fileBody-    return undefined--fileHeader :: Parser FileHeader-fileHeader = fmap (uncurry FileHeader . partitionEithers) $ many1 $ mzero -    <|> fmap Left informationField -    <|> fmap Right styleSheetDirective--fileBody :: Parser [Element]-fileBody = (flip sepBy) emptyLine $ mzero-    <|> fmap Tune abcTune-    <|> fmap FreeText freeText -    <|> fmap TypesetText typeSetText--informationField :: Parser Information-informationField = do-    letter-    char ':'-    -- TODO anything not \n-    char '\n'              -    return undefined---- Not parsed, see Limitations-styleSheetDirective :: Parser Directive-styleSheetDirective = mzero--byteOrderMark :: Parser ()-byteOrderMark = do-    char '\xFFFE' <|> char '\xFEFF'-    return ()--version :: Parser Double-version = undefined--abcTune :: Parser AbcTune-abcTune = undefined--freeText :: Parser String-freeText = undefined---- Not parsed, see Limitations-typeSetText :: Parser String-typeSetText = mzero------------------------------------------------------------------------------------------- Lexer----------------------------------------------------------------------------------------lexer :: TokenParser ()-lexer = makeTokenParser $ LanguageDef {-    commentStart    =  "[r:",-    commentEnd      =  "]",-    commentLine     =  "%",-    nestedComments  =  False,-    identStart      =  (letter <|> char '_'),-    identLetter     =  (alphaNum <|> char '_'),-    opStart         =  mzero,-    opLetter        =  mzero,-    reservedNames   =  reservedNames,-    reservedOpNames =  mzero,-    caseSensitive   =  True-    }-    where-        reservedNames = []---- Convenient synonyms, not exported-llex   = lexeme lexer-lnat   = natural lexer-lstr   = stringLiteral lexer-lname  = identifier lexer-lres   = reserved lexer-lspace = whiteSpace lexer--emptyLine = newLine >> newLine-newLine = string "\r\n" <|> string "\n"--single x = [x]--notSupported x = error $ "Not supported yet: " ++ x-