abcnotation (empty) → 0.5
raw patch · 5 files changed
+495/−0 lines, 5 filesdep +basedep +networkdep +parsecsetup-changed
Dependencies added: base, network, parsec, prettify, semigroups
Files
- COPYING +26/−0
- Setup.lhs +4/−0
- abcnotation.cabal +32/−0
- src/Music/Abc.hs +292/−0
- src/Music/Abc/Parser.hs +141/−0
+ COPYING view
@@ -0,0 +1,26 @@++Copyright (c) 2013, Hans Höglund+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:+ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ * Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+ * Neither the name of the <organization> nor the+ names of its contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+
+ Setup.lhs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++> import Distribution.Simple+> main = defaultMain
+ abcnotation.cabal view
@@ -0,0 +1,32 @@++name: abcnotation+version: 0.5+cabal-version: >= 1.2+author: Hans Hoglund+maintainer: Hans Hoglund+license: BSD3+license-file: COPYING+synopsis: Haskell representation and parser for ABC notation.+category: Music+tested-with: GHC+build-type: Simple++description: + This package contains a Haskell representation and parser for ABC notation. + .+ ABC notation is a text-based music notation system designed to be comprehensible by both people and + computers. For more information see <http://abcnotation.com>.+ .+ Based on the 2.1 standard.++library + build-depends: + base >= 4 && < 5,+ semigroups,+ prettify,+ network,+ parsec+ hs-source-dirs: src+ exposed-modules:+ Music.Abc+ Music.Abc.Parser
+ src/Music/Abc.hs view
@@ -0,0 +1,292 @@++{-# LANGUAGE TypeOperators, 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>.+--+-------------------------------------------------------------------------------------++module Music.Abc (+ -- * Abc format+ -- ** Files+ AbcFile(..), ++ -- *** File header+ FileHeader(..),+ Element(..),++ -- ** Tunes+ AbcTune(..),+ TuneHeader(..), + TuneBody(..), ++ -- * Music+ Music(..),+ + -- ** Note stack+ Note(..),++ DecorationT(..),+ SlurT(..),+ BeamT(..),+ GraceT(..),+ TupletT(..),+ DurationT(..),+ RestT(..),+ (:|:),+ + -- * Basic types+ -- ** Time+ Duration(..),++ -- ** Pitch+ PitchClass(..),+ Accidental(..),+ Octave(..),+ Pitch(..),++ -- ** Decorations (articulation, dynamics etc)+ Decoration(..),++ -- ** Structure+ Barline(..),+ MultiRest(..),++ -- ** Information etc+ Information(..),+ Directive(..),++ -- * Import and export+ readAbc,+ showAbc+ ) where++import Network.URI (URI)++-- | A full ABC file (2.2).+data AbcFile+ = AbcFile+ (Maybe String)+ (Maybe FileHeader)+ [Element]++-- | File header (2.2.2).+data FileHeader+ = FileHeader + [Information] + [Directive]+ deriving (Eq, Ord, Show)++-- | 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)++data AbcTune + = AbcTune + TuneHeader + TuneBody+ deriving (Eq, Ord, Show)++-- TODO verify X, T and K fields+data TuneHeader + = TuneHeader + [Information]+ deriving (Eq, Ord, Show)++type TuneBody = [Music]++-- One line of music code.+data Music + = Music [Note :|: MultiRest :|: Barline :|: ()]+ deriving (Eq, Ord, Show)++newtype MultiRest = MultiRest { getMultiRest :: Int }+ deriving (Eq, Ord, Show)++type Note = DecorationT (SlurT (BeamT (GraceT (TupletT (DurationT (RestT Pitch))))))++type DecorationT a = ([Decoration], a)+type SlurT a = (Bool, a, Bool)+type BeamT a = (Bool, a, Bool)+type GraceT a = (Bool, a)+type TupletT a = (Duration, a)+type DurationT a = (a, Duration)+type RestT a = Maybe (Maybe a) -- invisible/visible++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+ -- !pppp! !ppp! !pp! !p! dynamics marks+ -- !mp! !mf! !f! !ff! more dynamics marks+ -- !fff! !ffff! !sfz! more dynamics marks+ | 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)+++-- Base types++newtype Duration = Duration { getDuration :: Rational }+ deriving (Eq, Ord, Show, Enum, Num, Real, Fractional, RealFrac)++data PitchClass = C | D | E | F | G | A | B+ deriving (Eq, Ord, Show, Enum, Bounded)++data Accidental = DoubleFlat | Flat | Natural | Sharp | DoubleSharp+ deriving (Eq, Ord, Show, Enum, Bounded)++newtype Octave = Octave { getOctave :: Int }+ deriving (Eq, Ord, Show, Enum, Num, Real, Integral)++newtype Pitch = Pitch { getPitch :: (PitchClass, Accidental, Octave) }+ deriving (Eq, Ord, Show)++data StemDirection = Up | Down+ deriving (Eq, Ord, Show, Enum, Bounded)++data Clef = NoClef | Treble | Alto | Tenor | Bass | Perc+ deriving (Eq, Ord, Show, Enum, Bounded)++-- | Barline, including special barlines and repeats.+data Barline+ = Barline+ | DoubleBarline Bool Bool -- thick? thick?+ | Repeat Int Bool Bool -- times end? begin?+ | DottedBarline Barline+ | InvisibleBarline Barline+ deriving (Eq, Ord, Show)++-- TODO add elements+data Information+ = Area String+ | Book String+ | Composer String+ | Discography String+ | FileUrl String URI+ | Group String+ | History String++ | Instruction Directive+ | Key Key+ | UnitNoteLength Duration++ | Meter Meter+ -- Macros not supported+ | Notes String+ | Origin String+ | Parts -- TODO++ | Tempo Tempo+ | Rhythm String -- Polska, marsch etc.+ -- Remarks are discarded+ | Source String -- Uppland etc.++ | SymbolLine Symbol + | TuneTitle String+ -- User defined not supported++ | Voice VoiceProps+ | Words String -- TODO include separators+ | ReferenceNumber Integer+ | Transcription String+ deriving (Eq, Ord, Show)++type Key = (PitchClass, Mode) ++-- | Optional string, beats, frequency (3.1.8)+type Tempo = (Maybe String, [Duration], Duration)++type Symbol = ()++data VoiceProps+ = VoiceProps+ (Maybe String)+ (Maybe String)+ (Maybe StemDirection)+ (Maybe Clef)+ deriving (Eq, Ord, Show)++data Meter+ = NoMeter+ | Common+ | Cut+ | Simple Rational+ | Compound [Integer] Integer+ deriving (Eq, Ord, Show)++data Mode+ = Major+ | Minor+ | Ionian+ | Dorian+ | Phrygian+ | Lydian+ | Mixolydian+ | Aeolian+ | Locrian+ deriving (Eq, Ord, Show)++-- | Abc directive.+type Directive = (String, String)+ + ++readAbc :: String -> AbcFile+readAbc = error "Not impl"++showAbc :: AbcFile -> String+showAbc = error "Not impl"++infixr 5 :|:+type a :|: b = Either a b+
+ src/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 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+