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 +3/−3
- src/Data/Music/Abc.hs +593/−0
- src/Data/Music/Abc/Parser.hs +141/−0
- src/Music/Abc.hs +0/−593
- src/Music/Abc/Parser.hs +0/−141
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-