hly 0.11 → 0.12
raw patch · 15 files changed
+1564/−1289 lines, 15 filesdep +directorydep +filepathdep +processdep ~hmt
Dependencies added: directory, filepath, process
Dependency ranges changed: hmt
Files
- Music/LilyPond/Light.hs +4/−635
- Music/LilyPond/Light/Analysis.hs +32/−82
- Music/LilyPond/Light/Annotation.hs +215/−0
- Music/LilyPond/Light/Constant.hs +105/−71
- Music/LilyPond/Light/Constant/Dynamic.hs +26/−0
- Music/LilyPond/Light/Constant/Note.hs +398/−0
- Music/LilyPond/Light/Constant/NoteName.hs +0/−396
- Music/LilyPond/Light/Literal.hs +18/−0
- Music/LilyPond/Light/Measure.hs +34/−0
- Music/LilyPond/Light/Model.hs +63/−30
- Music/LilyPond/Light/Notation.hs +534/−0
- Music/LilyPond/Light/Output/LilyPond.hs +94/−61
- README +8/−7
- help/hly.help.lhs +17/−0
- hly.cabal +16/−7
Music/LilyPond/Light.hs view
@@ -1,639 +1,8 @@-module Music.LilyPond.Light (module Music.LilyPond.Light- ,module L) where+module Music.LilyPond.Light (module L) where -import Data.List-import Data.Monoid-import Data.Ratio+import Music.LilyPond.Light.Annotation as L import Music.LilyPond.Light.Constant as L-import Music.LilyPond.Light.Constant.NoteName as L+import Music.LilyPond.Light.Measure as L import Music.LilyPond.Light.Model as L+import Music.LilyPond.Light.Notation as L import Music.LilyPond.Light.Output.LilyPond as L-import Music.Theory.Duration as L-import Music.Theory.Duration.Name as L-import Music.Theory.Key as L-import Music.Theory.Pitch as L-import Music.Theory.Pitch.Spelling---- * Music category predicates--is_music_c :: Music_C -> Music -> Bool-is_music_c c = (==) c . music_c--is_note :: Music -> Bool-is_note = is_music_c Note_C--is_chord :: Music -> Bool-is_chord = is_music_c Chord_C--is_rest :: Music -> Bool-is_rest = is_music_c Rest_C--is_mm_rest :: Music -> Bool-is_mm_rest = is_music_c MMRest_C--is_grace :: Music -> Bool-is_grace = is_music_c Grace_C--is_after_grace :: Music -> Bool-is_after_grace = is_music_c AfterGrace_C---- | These are required to avoid issues in lilypond (see manual)-is_grace_skip :: Music -> Bool-is_grace_skip m =- case m of- Grace (Skip _) -> True- _ -> False--is_clef :: Music -> Bool-is_clef = is_music_c Clef_C--is_time :: Music -> Bool-is_time = is_music_c Time_C--is_tempo :: Music -> Bool-is_tempo = is_music_c Tempo_C--is_barlinecheck :: Music -> Bool-is_barlinecheck m =- case m of- Command BarlineCheck -> True- _ -> False--is_tied :: Music -> Bool-is_tied m =- case m of- Note _ _ xs -> Begin_Tie `elem` xs- Chord _ _ xs -> Begin_Tie `elem` xs- _ -> False--is_tuplet :: Music -> Bool-is_tuplet = is_music_c Tuplet_C---- * Pitch---- | Add reminder accidental to note.-r_acc :: Music -> Music-r_acc x = x &rAcc---- | Add cautionary accidental to note.-c_acc :: Music -> Music-c_acc x = x &cAcc---- | Remove any reminder or cautionary accidentals at note or chord.-clr_acc :: Music -> Music-clr_acc m =- let rl = [rAcc,cAcc]- in case m of- Note x d a -> Note x d (a \\ rl)- Chord xs d a -> Chord (map clr_acc xs) d a- _ -> error ("clr_acc at non-note/chord: " ++ ly_music_elem m)--octpc_to_note :: (Octave, PitchClass) -> Music-octpc_to_note x = Note (octpc_to_pitch pc_spell_ks x) Nothing []---- * Rests---- | Construct rests.-r :: Duration -> Music-r x = Rest x []---- | Multi-measure variant of 'r'.-r' :: TimeSignature -> Music-r' x = MMRest 1 x []---- | Create an empty measure for the specified time signature.-empty_measure :: Integer -> Integer -> Music-empty_measure n d = mconcat [MMRest 1 (n,d) [], l]---- | Like 'empty_measure', but with an invisible rest.-null_measure :: Integer -> Integer -> Music-null_measure n d =- let x = Duration d 0 1- in mconcat (map Skip (genericReplicate n x) ++ [l])---- | Like 'empty_measure' but write time signature.-measure_rest :: Integer -> Integer -> Music-measure_rest n d = mconcat [time_signature (n,d), empty_measure n d]---- | Like 'measure_rest' but write time signature.-measure_null :: Integer -> Integer -> Music-measure_null n d = mconcat [time_signature (n,d), null_measure n d]---- * Measures--type M_Annotation = Music-data Measure = Measure [M_Annotation] [Music]--m_annotate :: M_Annotation -> Measure -> Measure-m_annotate a (Measure as xs) = Measure (as++[a]) xs--m_annotate' :: [M_Annotation] -> Measure -> Measure-m_annotate' as' (Measure as xs) = Measure (as++as') xs--m_annotate_first' :: [M_Annotation] -> [Measure] -> [Measure]-m_annotate_first' as xs =- case xs of- (x:xs') -> m_annotate' as x : xs'- [] -> error "m_annotate_first'"--m_annotate_last' :: [M_Annotation] -> [Measure] -> [Measure]-m_annotate_last' as xs =- case xs of- [] -> []- [x] -> [m_annotate' as x]- (x:xs') -> x : m_annotate_last' as xs'--m_append :: [Music] -> Measure -> Measure-m_append c (Measure as xs) = Measure as (xs++c)--m_elements :: Measure -> [Music]-m_elements (Measure as xs) = as ++ xs--mm_elements :: [Measure] -> [Music]-mm_elements = concat . map m_elements---- * Tuplets---- | Apply a 'Duration' function to a 'Music' node, if it has a duration.-edit_dur :: (Duration -> Duration) -> Music -> Music-edit_dur fn x =- case x of- Note _ Nothing _ -> x- Note n (Just d) a -> Note n (Just (fn d)) a- Chord n d a -> Chord n (fn d) a- Rest d a -> Rest (fn d) a- Skip d -> Skip (fn d)- _ -> x---- | Temporal scaling of music (tuplets).-tuplet :: Tuplet_T -> [Music] -> Music-tuplet (d,n) =- let fn x = x { multiplier = n%d }- in Tuplet Normal_Tuplet (n,d) . mconcat . map (edit_dur fn)---- | Tuplet variants that set location, and then restore to neutral.-tuplet_above,tuplet_below :: Tuplet_T -> [Music] -> Music-tuplet_above n xs = mconcat [tuplet_up, tuplet n xs, tuplet_neutral]-tuplet_below n xs = mconcat [tuplet_down, tuplet n xs, tuplet_neutral]---- | Like tuplet but does not annotate music, see also--- 'ts_set_fraction'.-scale_durations :: Tuplet_T -> [Music] -> Music-scale_durations (n,d) =- let fn x = x { multiplier = d%n }- in Tuplet Scale_Durations (n,d) . mconcat . map (edit_dur fn)---- * Time signatures---- | Construct time signature.-time_signature :: TimeSignature -> Music-time_signature = Time---- | Allow proper auto-indenting of multiple measures with the same--- time signature.-with_time_signature :: TimeSignature -> [Music] -> Music-with_time_signature ts xs = mconcat (time_signature ts : xs)--{---- | Make a duration to fill a whole measure.-ts_dur :: TimeSignature -> Duration-ts_dur (n,d) = Duration d 0 (fromIntegral n)--}---- | Tied, non-multiplied durations to fill a whole measure.-ts_whole_note :: TimeSignature -> [Duration]-ts_whole_note t =- case t of- (1,2) -> [half_note]- (2,16) -> [eighth_note]- (2,8) -> [quarter_note]- (2,4) -> [half_note]- (2,2) -> [whole_note]- (3,16) -> [dotted_eighth_note]- (3,8) -> [dotted_quarter_note]- (3,4) -> [dotted_half_note]- (3,2) -> [dotted_whole_note]- (4,16) -> [quarter_note]- (4,8) -> [half_note]- (4,4) -> [whole_note]- (4,2) -> [breve]- (5,16) -> [quarter_note,sixteenth_note]- (5,8) -> [half_note,eighth_note]- (5,4) -> [whole_note,quarter_note]- (6,2) -> [dotted_breve]- _ -> error ("ts_whole_note: " ++ show t)---- | Command to request that @4\/4@ and @2\/2@ etc. are typeset as--- fractions.-ts_use_fractions :: Music-ts_use_fractions =- let x = "\\override Staff.TimeSignature #'style = #'()"- in Command (User x)---- | Set the printed time-signature fraction.-ts_set_fraction :: Integer -> Integer -> Music-ts_set_fraction n d =- let x = "#'(" ++ show n ++ " . " ++ show d ++ ")"- y = "\\set Staff.timeSignatureFraction = " ++ x- in Command (User y)--numeric_time_signature :: Music-numeric_time_signature = Command (User "\\numericTimeSignature")--ts_parentheses :: Music-ts_parentheses =- let x = "\\override Staff.TimeSignature #'stencil = #(lambda (grob) (bracketify-stencil (ly:time-signature::print grob) Y 0.1 0.2 0.1))"- in Command (User x)---- * Key signatures---- | Construct key signature.-key :: Music -> Mode_T -> Music-key (Note (Pitch n a _) _ _) md = Key n (Just a) md-key _ _ = error "key"---- * Repetition---- | Construct standard (two times) repeat.-std_repeat :: Integer -> [Music] -> Music-std_repeat n = Repeat n . mconcat---- * Annotations---- | Can a 'Music' element be annotated?-allows_annotations :: Music -> Bool-allows_annotations m =- is_note m ||- is_chord m ||- is_rest m ||- is_mm_rest m---- | Attempt to add an 'Annotation' to a 'Music' element.-add_annotation :: Annotation -> Music -> Maybe Music-add_annotation a m =- case m of- Note n d as -> Just (Note n d (as ++ [a]))- Chord n d as -> Just (Chord n d (as ++ [a]))- Rest d as -> Just (Rest d (as ++ [a]))- MMRest i j as -> Just (MMRest i j (as ++ [a]))- _ -> Nothing---- | Add an 'Annotation' to a 'Music' element or 'error'.-add_annotation_err :: Annotation -> Music -> Music-add_annotation_err a m =- case add_annotation a m of- Just m' -> m'- Nothing -> error ("add_annotation failed: " ++ show (a,ly_music_elem m))---- | Infix form of 'add_annotation_err'.-(&) :: Music -> Annotation -> Music-m & a = add_annotation_err a m---- | Add an 'Annotation' to a 'Pitch'.-(&#) :: Pitch -> Annotation -> Music-x &# y = Note x Nothing [y]---- | Add an 'Annotation' to a 'Music' element.-perhaps_annotate :: Annotation -> Music -> Music-perhaps_annotate a m = maybe m id (add_annotation a m)--bracket_annotation_fn :: (Annotation -> Music -> Music) ->- (Annotation,Annotation) -> [Music] -> [Music]-bracket_annotation_fn fn (begin, end) xs =- let x0 = head xs- xn = last xs- xs' = drop 1 (reverse (drop 1 (reverse xs)))- xs_e = show (map ly_music_elem xs)- in if length xs >= 2- then [fn begin x0] ++ xs' ++ [fn end xn]- else error ("bracket_annotation failed: " ++ xs_e)--bracket_annotation :: (Annotation,Annotation) -> [Music] -> [Music]-bracket_annotation = bracket_annotation_fn add_annotation_err--bracket_annotation' :: (Annotation,Annotation) -> [Music] -> [Music]-bracket_annotation' a x =- case x of- (_:_:_) -> bracket_annotation_fn perhaps_annotate a x- _ -> x--beam' :: [Music] -> [Music]-beam' = bracket_annotation (begin_beam, end_beam)---- | Manual beaming.-beam :: [Music] -> Music-beam = mconcat . beam'--slur' :: [Music] -> [Music]-slur' = bracket_annotation (begin_slur, end_slur)--slur :: [Music] -> Music-slur = mconcat . slur'--phrasing_slur' :: [Music] -> [Music]-phrasing_slur' =- let a = (begin_phrasing_slur, end_phrasing_slur)- in bracket_annotation a--phrasing_slur :: [Music] -> Music-phrasing_slur = mconcat . phrasing_slur'--text_above,text_below :: String -> Annotation-text_above x = CompositeAnnotation [Above, Text x]-text_below x = CompositeAnnotation [Below, Text x]--arco,pizz :: Annotation-arco = text_above "arco"-pizz = text_above "pizz."--stem_tremolo :: Integer -> Annotation-stem_tremolo = Articulation . StemTremolo--place_above,place_below :: Annotation -> Annotation-place_above x = CompositeAnnotation [Above, x]-place_below x = CompositeAnnotation [Below, x]---- | Add an 'Annotation' to a @Note@ 'Music' element, else identity.-note_annotate :: Annotation -> Music -> Music-note_annotate a m =- case m of- Note n d xs -> Note n d (xs++[a])- _ -> m---- | Annotate the first note/chord element.-initial_note_chord_annotate :: Annotation -> [Music] -> [Music]-initial_note_chord_annotate a m =- case m of- [] -> []- (x:xs) -> if is_note x || is_chord x- then x & a : xs- else x : initial_note_chord_annotate a xs---- * Indirect annotations--allows_indirect_annotation :: Music -> Bool-allows_indirect_annotation m =- case m of- Grace x -> allows_indirect_annotation x- AfterGrace x _ -> allows_indirect_annotation x- Tuplet _ _ x -> allows_indirect_annotation x- Join (x:_) -> allows_indirect_annotation x- _ -> allows_annotations m--indirect_annotation :: Annotation -> Music -> Music-indirect_annotation a m =- case m of- Grace x -> Grace (indirect_annotation a x)- AfterGrace x1 x2 -> AfterGrace (indirect_annotation a x1) x2- Tuplet tm tt x -> Tuplet tm tt (indirect_annotation a x)- Join (x:xs) -> Join (indirect_annotation a x : xs)- _ -> m & a--attach_indirect_annotation :: Annotation -> [Music] -> [Music]-attach_indirect_annotation _ [] = error "attach_indirect_annotation"-attach_indirect_annotation a (x:xs) =- if allows_indirect_annotation x- then indirect_annotation a x : xs- else x : attach_indirect_annotation a xs---- * Octave---- | Shift the octave of a note element, else identity.-note_edit_octave :: (Integer -> Integer) -> Music -> Music-note_edit_octave fn m =- case m of- Note (Pitch n a o) d xs -> Note (Pitch n a (fn o)) d xs- _ -> m---- | Shift the octave of a note element, else identity.-note_shift_octave :: Integer -> Music -> Music-note_shift_octave i = note_edit_octave (+ i)---- * Beaming---- | Predicate combinators.-p_or, p_and :: (t -> Bool) -> (t -> Bool) -> t -> Bool-p_or p1 p2 = \x -> p1 x || p2 x-p_and p1 p2 = \x -> p1 x && p2 x---- | Variant of 'span' that further spans the reverse of the right--- hand side.------ > span_r (< 0) [-1,-2,1,2,3,-3,-4] == ([-1,-2],[1,2,3],[-3,-4])-span_r :: (a -> Bool) -> [a] -> ([a], [a], [a])-span_r fn xs =- let (o1,o2) = span fn xs- (o3,o4) = span fn (reverse o2)- in (o1,reverse o4, reverse o3)---- | Beam if at least two elements.-perhaps_beam :: [Music] -> [Music]-perhaps_beam xs =- case xs of- [] -> []- [x] -> [x]- _ -> beam' xs---- | Beam interior notes/chords (ie. skip exterior--- non-note/non-chords).-beam_notes :: [Music] -> Music-beam_notes xs =- let (x1,x2,x3) = span_r (not . p_or is_note is_chord) xs- in mconcat (x1 ++ perhaps_beam x2 ++ x3)---- 2.13.29 (Issue #1083)-set_subdivide_beams :: Integer -> Music-set_subdivide_beams i =- let x0 = "\\set subdivideBeams = ##t"- x1 = "\\set baseMoment = #(ly:make-moment 1 " ++ show i ++ ")"- in mconcat [Command (User x0), Command (User x1)]---- * Duration---- | Add 'Duration' to 'Pitch' to make a @Note@ 'Music' element.-(##) :: Pitch -> Duration -> Music-x ## d = Note x (Just d) []---- | Add 'Duration' to either a @Note@ or @Chord@ 'Music' element.-(#) :: Music -> Duration -> Music-x # d =- case x of- Note n _ a -> Note n (Just d) a- Chord n _ a -> Chord n d a- _ -> error ("##: " ++ show x)---- * Chords---- | Construct chord.-chd_p :: [Pitch] -> Duration -> Music-chd_p [] _ = error "chd_p: null elements"-chd_p xs d = Chord (map (\x -> Note x Nothing []) xs) d []--chd :: [Music] -> Duration -> Music-chd [] _ = error "chd: null elements"-chd xs d =- let fn x =- let err msg = error (msg ++ ": " ++ show x)- in case x of- Note _ (Just _) _ -> err "chd: note has duration"- Note _ Nothing _ -> x- _ -> err "chd: non note element"- in Chord (map fn xs) d []---- * Commands---- | Construct bar number check command.-bar_number_check :: Integer -> Music-bar_number_check = Command . BarNumberCheck---- | Change staff.-change :: String -> Music-change x = Command (Change x)---- | Indicate initial partial measure.-partial :: Duration -> Music-partial = Command . Partial---- | Set or unset the @circled-tip@ hairpin attribute.-hairpin_circled_tip :: Bool -> Music-hairpin_circled_tip x =- let c = if x- then "\\override Hairpin #'circled-tip = ##t"- else "\\revert Hairpin #'circled-tip"- in Command (User c)---- | Set or unset the @to-barline@ hairpin attribute.-hairpin_to_barline :: Bool -> Music-hairpin_to_barline x =- let c = if x- then "\\revert Hairpin #'to-barline"- else "\\override Hairpin #'to-barline = ##f"- in Command (User c)---- * Staff and Parts--name_to_id :: Staff_Name -> Staff_ID-name_to_id (x,_) =- case x of- "" -> "no_id"- _ -> "id_" ++ x---- | Construct staff.-staff :: Staff_Name -> [Music] -> Staff-staff nm =- let st = Staff_Settings Normal_Staff (name_to_id nm) 0- in Staff st nm . Part Nothing---- | Construct rhythmic staff.-rhythmic_staff :: Staff_Name -> [Music] -> Staff-rhythmic_staff nm =- let st = Staff_Settings Rhythmic_Staff (name_to_id nm) 0- in Staff st nm . Part Nothing---- | Construct staff with text underlay.-text_staff :: Staff_Name -> String -> [Music] -> Staff-text_staff nm txt =- let st = Staff_Settings Normal_Staff (name_to_id nm) 0- in Staff st nm . Part (Just txt)---- | Construct piano staff. For two staff piano music the staffs have--- identifiers rh and lh.-piano_staff :: Staff_Name -> [[Music]] -> Staff-piano_staff nm [rh,lh] =- let st x = Staff_Settings Normal_Staff x 0- in Staff_Set- PianoStaff- nm- [Staff (st "rh") ("","") (Part Nothing rh)- ,Staff (st "lh") ("","") (Part Nothing lh)]-piano_staff nm xs =- Staff_Set PianoStaff nm (map (staff ("","")) xs)--grand_staff :: Staff_Name -> [[Music]] -> Staff-grand_staff nm = Staff_Set GrandStaff nm . map (staff ("",""))--staff_group :: Staff_Name -> [[Music]] -> Staff-staff_group nm = Staff_Set StaffGroup nm . map (staff ("",""))--rhythmic_grand_staff :: Staff_Name -> [[Music]] -> Staff-rhythmic_grand_staff nm = Staff_Set GrandStaff nm . map (rhythmic_staff ("",""))---- | Variant with names for each staff.-grand_staff' :: Staff_Name -> [Staff_Name] -> [[Music]] -> Staff-grand_staff' nm xs ys = Staff_Set GrandStaff nm (zipWith staff xs ys)--staff_group' :: Staff_Name -> [Staff_Name] -> [[Music]] -> Staff-staff_group' nm xs ys = Staff_Set StaffGroup nm (zipWith staff xs ys)--two_part_staff :: Staff_Name -> ([Music], [Music]) -> Staff-two_part_staff nm (p0, p1) =- let st = Staff_Settings Normal_Staff (name_to_id nm) 0- in Staff st nm (MultipleParts [voice_one:p0- ,voice_two:p1])--instr_name :: Staff_Name -> Staff -> Staff-instr_name nm pt =- case pt of- Staff st _ x -> Staff st nm x- Staff_Set ty _ xs -> Staff_Set ty nm xs--resize_staff :: Int -> Staff -> Staff-resize_staff n st =- case st of- Staff (Staff_Settings ty i sc) nm pt ->- Staff (Staff_Settings ty i (sc + n)) nm pt- Staff_Set ty nm xs ->- Staff_Set ty nm (map (resize_staff n) xs)--score :: [Staff] -> Score-score = Score default_score_settings---- * Aliases--tempo :: Duration -> Integer -> Music-tempo = Tempo--after_grace :: Music -> Music -> Music-after_grace = AfterGrace--grace :: Music -> Music-grace = Grace--tremolo :: (Music, Music) -> Integer -> Music-tremolo = Tremolo---- | Interior polyphony. For two part music on one staff see--- 'two_part_staff'.-polyphony :: Music -> Music -> Music-polyphony = Polyphony--polyphony' :: [Music] -> [Music] -> Music-polyphony' x y = polyphony (mconcat x) (mconcat y)---- * Noteheads---- | Request cross note-heads.-cross_noteheads :: Music-cross_noteheads =- Command (User "\\override NoteHead #'style = #'cross")---- | Revert to standard note-heads.-revert_noteheads :: Music-revert_noteheads =- Command (User "\\revert NoteHead #'style")---- * Rests---- | Joins directly adjacent rest elements.-join_rests :: [Music] -> [Music]-join_rests =- let fn recur xs =- case xs of- [] -> []- Rest d a : Rest d' a' : ys ->- case sum_dur d d' of- Nothing -> let zs = Rest d a : join_rests (Rest d' a' : ys)- in if recur then fn False zs else zs- Just d'' -> join_rests (Rest d'' (a ++ a') : ys)- y:ys -> y : join_rests ys- in fn True
Music/LilyPond/Light/Analysis.hs view
@@ -8,11 +8,11 @@ import Data.Ratio import qualified Music.LilyPond.Light as L import Music.LilyPond.Light.Model-import Music.Theory.Duration+import Music.Theory.Duration {- hmt -} import Music.Theory.Pitch import qualified Music.Theory.Pitch.Spelling as T--type R = Double+import Music.Theory.Tempo_Marking+import Music.Theory.Time_Signature -- * Basic traversal @@ -55,7 +55,7 @@ case m of (Note x _ _) -> [x] (Chord xs _ _) -> concatMap collect_pitches xs- (Skip _) -> []+ (Skip _ _) -> [] (Join xs) -> concatMap collect_pitches xs _ -> error ("collect_pitches_no_grace: " ++ L.ly_music_elem m) @@ -81,41 +81,11 @@ freq_anal :: (Ord a) => [a] -> [(Int,a)] freq_anal = freq_anal_by compare --- * Durations--type TempoMarking = (Duration,Integer)---- | Apply `d' dots to the rational pulse count `n'.-apply_dots :: Rational -> Integer -> Rational-apply_dots n d =- let m = map (\x -> n * (1 / fromInteger (2 ^ x))) [1..d]- in n + sum m---- | Convert a duration to a pulse count in relation to the indicated--- time signature.-dur_pulses :: TimeSignature -> Duration -> Rational-dur_pulses (_, b) (Duration dv dt ml) =- let n = b % dv- in apply_dots n dt * ml---- | The duration, in seconds, of a pulse at the indicated time--- signaure and tempo marking.-pulse_duration :: TimeSignature -> TempoMarking -> R-pulse_duration t (x,i) =- let j = recip (dur_pulses t x)- s = 60 / fromIntegral i- in fromRational j * s---- | The duration, in seconds, of a measure at the indicated time--- signaure and tempo marking.-measure_duration :: TimeSignature -> TempoMarking -> R-measure_duration (n,d) t = pulse_duration (n,d) t * fromIntegral n- -- * Temporal map -type TimeSignature_Map = [(Measure,TimeSignature)]-type TempoMarking_Map = [(Measure,TempoMarking)]-type Temporal_Map = (TimeSignature_Map,TempoMarking_Map)+type Time_Signature_Map = [(Measure,Time_Signature)]+type Tempo_Marking_Map = [(Measure,Tempo_Marking)]+type Temporal_Map = (Time_Signature_Map,Tempo_Marking_Map) temporal_map :: [Music] -> Temporal_Map temporal_map xs =@@ -124,7 +94,7 @@ in (ts_m,tm_m) -- | Return duration (in seconds) and pulse counts for n measures.-mm_durations :: Temporal_Map -> Integer -> [(R,Integer)]+mm_durations :: Temporal_Map -> Integer -> [(Rational,Integer)] mm_durations (ts_m,tm_m) n = let get = map_lookup fn xs i = if i == n@@ -142,17 +112,17 @@ -- | Return start time and duration (in seconds) and pulse counts for -- i measures.-mm_start_times :: Temporal_Map -> Integer -> [(R,R,Integer)]+mm_start_times :: Temporal_Map -> Integer -> [(Rational,Rational,Integer)] mm_start_times tm i = let (x,y) = unzip (mm_durations tm i) in zip3 (0 : integrate x) x y -location_to_rt :: [(R,R,Integer)] -> Location -> R+location_to_rt :: [(Rational,Rational,Integer)] -> Location -> Rational location_to_rt mm l = let (x,y,z) = mm `genericIndex` measure l in x + ((fromRational (pulse l) / fromIntegral z) * y) -locate_rt :: [Music] -> [(R,Music)]+locate_rt :: [Music] -> [(Rational,Music)] locate_rt xs = let l = locate' xs m = temporal_map xs@@ -178,7 +148,7 @@ deriving (Show, Eq, Ord) -- | Convert a location to normal form under given time signature.-location_nf :: TimeSignature -> Location -> Location+location_nf :: Time_Signature -> Location -> Location location_nf ts l = let (Location b p v m) = l (n, _) = ts@@ -188,7 +158,7 @@ else l -- | Type to thread state through location calculations.-type Locate_ST = (TimeSignature, Location)+type Locate_ST = (Time_Signature, Location) -- | Update state part number. st_set_part :: Locate_ST -> Part_ID -> Locate_ST@@ -207,7 +177,7 @@ location_step st d = let (ts, l) = st (Location b p v m) = l- p' = p + dur_pulses ts d+ p' = p + ts_duration_pulses ts d l' = location_nf ts (Location b p' v m) in (ts, l') @@ -225,13 +195,13 @@ this = (l,m) in case m of Note _ (Just d) _ -> (location_step st d, [this])- Note _ _ _ -> error "locate_st: note without duration"+ Note {} -> error "locate_st: note without duration" Chord _ d _ -> (location_step st d, [this]) Tremolo _ _ -> error "locate_st: Tremolo" Rest d _ -> (location_step st d, [this]) MMRest i (j,k) _ -> let d = Duration k 0 ((i * j) % 1) in (location_step st d, [this])- Skip d -> (location_step st d, [this])+ Skip d _ -> (location_step st d, [this]) Repeat _ x -> locate_st st x Tuplet _ _ x -> let st' = (ts, l { mode = LM_In_Tuplet })@@ -244,11 +214,11 @@ Join xs -> let (st', r) = mapAccumL locate_st st xs in (st', concat r)- Clef _ _ -> (st, [this])+ Clef _ -> (st, [this]) Time ts' -> ((ts', l), [this])- Key _ _ _ -> (st, [this])+ Key {} -> (st, [this]) Tempo _ _ -> (st, [this])- Command _ -> (st, [this])+ Command _ _ -> (st, [this]) Polyphony x0 x1 -> let (Location _ _ v _) = l st' = map (st_set_part st) [v ..]@@ -330,39 +300,20 @@ -- * Time-signature structure analysis. --- | Rewrite time signature to indicated denominator.-ts_rewrite :: Integer -> TimeSignature -> TimeSignature-ts_rewrite d' =- let dv i j = let (x,y) = i `divMod` j- in if y == 0 then x else error "ts_rewrite"- go (n,d) = case compare d d' of- EQ -> (n,d)- GT -> go (n `dv` 2, d `dv` 2)- LT -> go (n * 2, d * 2)- in go---- | Sum time signatures (ie. 3/16 and 1/2 sum to 11/16).-ts_sum :: [TimeSignature] -> TimeSignature-ts_sum xs =- let i = maximum (map snd xs)- xs' = map (ts_rewrite i) xs- j = sum (map fst xs')- in (j,i)- measure_diff :: Location -> Location -> Integer measure_diff l1 l2 = measure l2 - measure l1 lv_last_measure :: [LV a] -> Measure lv_last_measure = let fn = compare `on` measure- in measure . last . sortBy fn . map fst+ in measure . maximumBy fn . map fst -time_unpack :: Music -> TimeSignature+time_unpack :: Music -> Time_Signature time_unpack (Time t) = t time_unpack _ = error "time_unpack" -- | Time signature structure of music.-ts_structure :: Music -> [[(TimeSignature, Integer)]]+ts_structure :: Music -> [[(Time_Signature, Integer)]] ts_structure m = let m' = locate m ts = filter (L.is_time . snd) m'@@ -373,7 +324,7 @@ f (l1, t1) (l2, _) = (t1, measure_diff l1 l2) in map (\ys -> zipWith f ys (tail ys) ++ [e ys]) ps -ts_structure' :: [Music] -> [[(TimeSignature, Integer)]]+ts_structure' :: [Music] -> [[(Time_Signature, Integer)]] ts_structure' = ts_structure . mconcat structure_unfold' :: (Integral i) => [(a,i)] -> [a]@@ -386,12 +337,12 @@ let repl = genericReplicate in concatMap (\(x,n) -> Just x : repl (n - 1) Nothing) -lm_ts_map :: [LM] -> TimeSignature_Map+lm_ts_map :: [LM] -> Time_Signature_Map lm_ts_map xs = let xs' = filter (L.is_time . snd) xs in map (measure *** time_unpack) xs' -ts_map :: [Music] -> TimeSignature_Map+ts_map :: [Music] -> Time_Signature_Map ts_map = lm_ts_map . locate' -- | Keys are in ascending order, the value retrieved is the that with@@ -406,22 +357,22 @@ [(j,x)] -> if i >= j then x else error "map_lookup" _ -> fn (error "map_lookup") mp -ts_lookup :: [(Measure,TimeSignature)] -> Measure -> TimeSignature+ts_lookup :: [(Measure,Time_Signature)] -> Measure -> Time_Signature ts_lookup = map_lookup -- * Tempo -lm_tempo_map :: [LM] -> [(Measure,(Duration,Integer))]+lm_tempo_map :: [LM] -> [(Measure,Tempo_Marking)] lm_tempo_map = let f (t,i) = case i of Tempo d x -> Just (measure t,(d,x)) _ -> Nothing in mapMaybe f -tempo_map :: [Music] -> [(Measure,(Duration,Integer))]+tempo_map :: [Music] -> [(Measure,Tempo_Marking)] tempo_map = lm_tempo_map . locate' -tempo_lookup :: [(Measure,(Duration,Integer))] -> Measure -> (Duration,Integer)+tempo_lookup :: [(Measure,Tempo_Marking)] -> Measure -> Tempo_Marking tempo_lookup = map_lookup -- * Key/value utilties@@ -569,9 +520,9 @@ let fn keep ns = case ns of (x:xs) -> let i = if keep then [x] else []- in if i_pr x || (not keep && f_pr x)- then i ++ fn False xs- else i ++ fn True xs+ in i ++ if i_pr x || (not keep && f_pr x)+ then fn False xs+ else fn True xs _ -> ns in fn True @@ -623,4 +574,3 @@ Chord [] _ _ -> ["empty chord"] Chord xs _ _ -> mapMaybe v_chord_note_valid xs _ -> []-
+ Music/LilyPond/Light/Annotation.hs view
@@ -0,0 +1,215 @@+module Music.LilyPond.Light.Annotation where++import Data.Maybe+import Data.Monoid+import Music.LilyPond.Light.Constant+import Music.LilyPond.Light.Model+import Music.LilyPond.Light.Notation+import Music.LilyPond.Light.Output.LilyPond+import Music.Theory.Pitch {- hmt -}++-- | Can a 'Music' element be annotated? 'Skip' and 'Command' do not+-- ordinarily allow annotations, though there are some cases...+allows_annotations :: Music -> Bool+allows_annotations m =+ is_note m ||+ is_chord m ||+ is_rest m ||+ is_mm_rest m+ -- is_skip m ||+ -- is_command m ||++-- | Attempt to add an 'Annotation' to a 'Music' element.+add_annotation :: Annotation -> Music -> Maybe Music+add_annotation a m =+ case m of+ Note n d as -> Just (Note n d (as ++ [a]))+ Chord n d as -> Just (Chord n d (as ++ [a]))+ Rest d as -> Just (Rest d (as ++ [a]))+ Skip d as -> Just (Skip d (as ++ [a]))+ MMRest i j as -> Just (MMRest i j (as ++ [a]))+ Command c as -> Just (Command c (as ++ [a]))+ _ -> Nothing++-- | Add an 'Annotation' to a 'Music' element or 'error'.+add_annotation_err :: Annotation -> Music -> Music+add_annotation_err a m =+ let err = error ("add_annotation: " ++ show (a,ly_music_elem m))+ in fromMaybe err (add_annotation a m)++-- | Infix form of 'add_annotation_err'.+(&) :: Music -> Annotation -> Music+m & a = add_annotation_err a m++-- | Add an 'Annotation' to a 'Pitch'.+(&#) :: Pitch -> Annotation -> Music+x &# y = Note x Nothing [y]++-- | Add an 'Annotation' to a 'Music' element.+perhaps_annotate :: Annotation -> Music -> Music+perhaps_annotate a m = fromMaybe m (add_annotation a m)++bracket_annotation_fn :: (Annotation -> Music -> Music) ->+ (Annotation,Annotation) -> [Music] -> [Music]+bracket_annotation_fn fn (begin, end) xs =+ let x0 = head xs+ xn = last xs+ xs' = drop 1 (reverse (drop 1 (reverse xs)))+ xs_e = show (map ly_music_elem xs)+ in if length xs >= 2+ then [fn begin x0] ++ xs' ++ [fn end xn]+ else error ("bracket_annotation failed: " ++ xs_e)++bracket_annotation :: (Annotation,Annotation) -> [Music] -> [Music]+bracket_annotation = bracket_annotation_fn add_annotation_err++bracket_annotation' :: (Annotation,Annotation) -> [Music] -> [Music]+bracket_annotation' a x =+ case x of+ (_:_:_) -> bracket_annotation_fn perhaps_annotate a x+ _ -> x++beam' :: [Music] -> [Music]+beam' = bracket_annotation (begin_beam, end_beam)++-- | Manual beaming.+beam :: [Music] -> Music+beam = mconcat . beam'++slur' :: [Music] -> [Music]+slur' = bracket_annotation (begin_slur, end_slur)++slur :: [Music] -> Music+slur = mconcat . slur'++phrasing_slur' :: [Music] -> [Music]+phrasing_slur' =+ let a = (begin_phrasing_slur, end_phrasing_slur)+ in bracket_annotation a++phrasing_slur :: [Music] -> Music+phrasing_slur = mconcat . phrasing_slur'++text_above,text_below,text_mark :: String -> Annotation+text_above x = CompositeAnnotation [Place_Above, Text Text_Plain x]+text_below x = CompositeAnnotation [Place_Below, Text Text_Plain x]+text_mark x = CompositeAnnotation [Text_Mark, Text Text_Plain x]++text_above_fmt,text_below_fmt,text_mark_fmt :: String -> Annotation+text_above_fmt x = CompositeAnnotation [Place_Above,Text Text_Markup x]+text_below_fmt x = CompositeAnnotation [Place_Below,Text Text_Markup x]+text_mark_fmt x = CompositeAnnotation [Text_Mark, Text Text_Markup x]++arco,pizz :: Annotation+arco = text_above "arco"+pizz = text_above "pizz."++place_above,place_below :: Annotation -> Annotation+place_above x = CompositeAnnotation [Place_Above, x]+place_below x = CompositeAnnotation [Place_Below, x]++-- | Add an 'Annotation' to a @Note@ 'Music' element, else identity.+note_annotate :: Annotation -> Music -> Music+note_annotate a m =+ case m of+ Note n d xs -> Note n d (xs++[a])+ _ -> m++-- | Annotate the first note/chord element.+initial_note_chord_annotate :: Annotation -> [Music] -> [Music]+initial_note_chord_annotate a m =+ case m of+ [] -> []+ (x:xs) -> if is_note x || is_chord x+ then x & a : xs+ else x : initial_note_chord_annotate a xs++-- * Indirect annotations++allows_indirect_annotation :: Music -> Bool+allows_indirect_annotation m =+ case m of+ Grace x -> allows_indirect_annotation x+ AfterGrace x _ -> allows_indirect_annotation x+ Tuplet _ _ x -> allows_indirect_annotation x+ Join (x:_) -> allows_indirect_annotation x+ _ -> allows_annotations m++indirect_annotation :: Annotation -> Music -> Music+indirect_annotation a m =+ case m of+ Grace x -> Grace (indirect_annotation a x)+ AfterGrace x1 x2 -> AfterGrace (indirect_annotation a x1) x2+ Tuplet tm tt x -> Tuplet tm tt (indirect_annotation a x)+ Join (x:xs) -> Join (indirect_annotation a x : xs)+ _ -> m & a++attach_indirect_annotation :: Annotation -> [Music] -> [Music]+attach_indirect_annotation a m =+ case m of+ [] -> error "attach_indirect_annotation"+ x:xs -> if allows_indirect_annotation x+ then indirect_annotation a x : xs+ else x : attach_indirect_annotation a xs++-- * Pitch++-- | Add reminder accidental to note.+r_acc :: Music -> Music+r_acc x = x &rAcc++-- | Add cautionary accidental to note.+c_acc :: Music -> Music+c_acc x = x &cAcc++-- * Beaming++-- * Beaming++-- | Predicate composition.+p_cmp :: (t1 -> t2 -> t) -> (t3 -> t1) -> (t3 -> t2) -> t3 -> t+p_cmp fn p1 p2 x = p1 x `fn` p2 x++-- | Predicate composition (or).+--+-- > p_or even odd 1 == True+p_or :: (t -> Bool) -> (t -> Bool) -> t -> Bool+p_or = p_cmp (||)++-- | Predicate composition (and).+--+-- > p_and even odd 1 == False+p_and :: (t -> Bool) -> (t -> Bool) -> t -> Bool+p_and = p_cmp (&&)++-- | Variant of 'span' that further spans the reverse of the right+-- hand side.+--+-- > span_r (< 0) [-1,-2,1,2,3,-3,-4] == ([-1,-2],[1,2,3],[-3,-4])+span_r :: (a -> Bool) -> [a] -> ([a], [a], [a])+span_r fn xs =+ let (o1,o2) = span fn xs+ (o3,o4) = span fn (reverse o2)+ in (o1,reverse o4, reverse o3)++-- | Beam if at least two elements.+perhaps_beam :: [Music] -> [Music]+perhaps_beam xs =+ case xs of+ [] -> []+ [x] -> [x]+ _ -> beam' xs++-- | Beam interior notes/chords (ie. skip exterior+-- non-note/non-chords).+beam_notes :: [Music] -> Music+beam_notes xs =+ let (x1,x2,x3) = span_r (not . p_or is_note is_chord) xs+ in mconcat (x1 ++ perhaps_beam x2 ++ x3)++-- 2.13.29 (Issue #1083)+set_subdivide_beams :: Integer -> Music+set_subdivide_beams i =+ let x0 = "\\set subdivideBeams = ##t"+ x1 = "\\set baseMoment = #(ly:make-moment 1 " ++ show i ++ ")"+ in mconcat [Command (User x0) [], Command (User x1) []]
Music/LilyPond/Light/Constant.hs view
@@ -1,30 +1,12 @@+-- | Notation related constants. module Music.LilyPond.Light.Constant where import Music.LilyPond.Light.Model+import qualified Music.Theory.Clef as C {- hmt -}+import Music.Theory.Duration -- * Annotations -pppp,ppp,pp,p,mp,mf,f,ff,fff,ffff,fp,sfz :: Annotation-pppp = Dynamic PPPP-ppp = Dynamic PPP-pp = Dynamic Pianissimo-p = Dynamic Piano-mp = Dynamic MezzoPiano-mf = Dynamic MezzoForte-f = Dynamic Forte-ff = Dynamic Fortissimo-fff = Dynamic FFF-ffff = Dynamic FFFF-fp = Dynamic FP-sfz = Dynamic SFZ--cresc,decr,end_cresc,end_decr,espressivo ::Annotation-cresc = Dynamic Begin_Crescendo-decr = Dynamic Begin_Decrescendo-end_cresc = Dynamic End_Dynamic-end_decr = Dynamic End_Dynamic-espressivo = Dynamic Espressivo- arpeggio,fermata,flageolet,harmonic,laissezVibrer,glissando :: Annotation arpeggio = Articulation Arpeggio fermata = Articulation Fermata@@ -39,63 +21,66 @@ tenuto = Articulation Tenuto accent = Articulation Accent +stem_tremolo :: Integer -> Annotation+stem_tremolo = Articulation . StemTremolo+ -- * Clefs bass_clef,tenor_clef,alto_clef,treble_clef,percussion_clef :: Music-bass_clef = Clef Bass 0-tenor_clef = Clef Tenor 0-alto_clef = Clef Alto 0-treble_clef = Clef Treble 0-percussion_clef = Clef Percussion 0+bass_clef = Clef (C.Clef C.Bass 0)+tenor_clef = Clef (C.Clef C.Tenor 0)+alto_clef = Clef (C.Clef C.Alto 0)+treble_clef = Clef (C.Clef C.Treble 0)+percussion_clef = Clef (C.Clef C.Percussion 0) bass_8vb_clef,treble_8va_clef,treble_8vb_clef,treble_15ma_clef :: Music-bass_8vb_clef = Clef Bass (-1)-treble_8va_clef = Clef Treble 1-treble_8vb_clef = Clef Treble (-1)-treble_15ma_clef = Clef Treble 2+bass_8vb_clef = Clef (C.Clef C.Bass (-1))+treble_8va_clef = Clef (C.Clef C.Treble 1)+treble_8vb_clef = Clef (C.Clef C.Treble (-1))+treble_15ma_clef = Clef (C.Clef C.Treble 2) -- * Commands -l :: Music-l = Command BarlineCheck+bar_line_check :: Music+bar_line_check = Command BarlineCheck [] double_barline,final_barline :: Music-double_barline = Command (Bar DoubleBarline)-final_barline = Command (Bar FinalBarline)+double_barline = Command (Bar DoubleBarline) []+final_barline = Command (Bar FinalBarline) [] system_break,no_system_break :: Music-system_break = Command Break-no_system_break = Command NoBreak+system_break = Command Break []+no_system_break = Command NoBreak [] page_break,no_page_break :: Music-page_break = Command PageBreak-no_page_break = Command NoPageBreak+page_break = Command PageBreak []+no_page_break = Command NoPageBreak [] auto_beam_off :: Music-auto_beam_off = Command AutoBeamOff+auto_beam_off = Command AutoBeamOff [] tuplet_down,tuplet_neutral,tuplet_up :: Music-tuplet_down = Command TupletDown-tuplet_neutral = Command TupletNeutral-tuplet_up = Command TupletUp+tuplet_down = Command TupletDown []+tuplet_neutral = Command TupletNeutral []+tuplet_up = Command TupletUp [] voice_one,voice_two :: Music-voice_one = Command VoiceOne-voice_two = Command VoiceTwo+voice_one = Command VoiceOne []+voice_two = Command VoiceTwo [] stem_down,stem_neutral,stem_up :: Music-stem_down = Command StemDown-stem_neutral = Command StemNeutral-stem_up = Command StemUp+stem_down = Command StemDown []+stem_neutral = Command StemNeutral []+stem_up = Command StemUp [] dynamic_down,dynamic_neutral,dynamic_up :: Music-dynamic_down = Command DynamicDown-dynamic_neutral = Command DynamicNeutral-dynamic_up = Command DynamicUp+dynamic_down = Command DynamicDown []+dynamic_neutral = Command DynamicNeutral []+dynamic_up = Command DynamicUp [] begin_8va,end_8va :: Music-begin_8va = Command (Octavation 1)-end_8va = Command (Octavation 0)+begin_8va = Command (Octavation 1) []+end_8va = Command (Octavation 0) [] -- * Annotations @@ -117,9 +102,9 @@ end_slur = Phrasing End_Slur slur_down,slur_neutral,slur_up :: Music-slur_down = Command (User "\\slurDown")-slur_neutral = Command (User "\\slurNeutral")-slur_up = Command (User "\\slurUp")+slur_down = Command (User "\\slurDown") []+slur_neutral = Command (User "\\slurNeutral") []+slur_up = Command (User "\\slurUp") [] -- | Phrasing slur annotations. begin_phrasing_slur,end_phrasing_slur :: Annotation@@ -135,18 +120,48 @@ set_accidental_style_dodecaphonic :: Music set_accidental_style_dodecaphonic = let x = "#(set-accidental-style 'dodecaphonic)"- in Command (User x)+ in Command (User x) [] set_accidental_style_neo_modern :: Music set_accidental_style_neo_modern = let x = "#(set-accidental-style 'neo-modern)"- in Command (User x)+ in Command (User x) [] set_accidental_style_modern :: Music set_accidental_style_modern = let x = "#(set-accidental-style 'modern)"- in Command (User x)+ in Command (User x) [] +-- * Noteheads++-- | Request particular note-heads.+set_noteheads :: String -> Music+set_noteheads x =+ let u = "\\override NoteHead #'style = #'" ++ x+ in Command (User u) []++-- | Request specific note-heads.+cross_noteheads :: Music+cross_noteheads = set_noteheads "cross"++baroque_noteheads :: Music+baroque_noteheads = set_noteheads "baroque"++neomensural_noteheads,mensural_noteheads,petrucci_noteheads :: Music+neomensural_noteheads = set_noteheads "neomensural"+mensural_noteheads = set_noteheads "mensural"+petrucci_noteheads = set_noteheads "petrucci"++harmonic_noteheads,harmonic_mixed_noteheads,diamond_noteheads :: Music+harmonic_noteheads = set_noteheads "harmonic"+harmonic_mixed_noteheads = set_noteheads "harmonic-mixed"+diamond_noteheads = set_noteheads "diamond"++-- | Revert to standard note-heads.+revert_noteheads :: Music+revert_noteheads =+ Command (User "\\revert NoteHead #'style") []+ -- * Paper a4_paper :: Paper@@ -161,10 +176,12 @@ ,paper_height = Length 297 MM ,ragged_last = False ,ragged_last_bottom = True+ ,ragged_right = False ,right_margin = Length 10 MM ,systems_per_page = Nothing ,top_margin = Length 5 MM- ,two_sided = False}+ ,two_sided = False+ ,print_page_number = True} length_scale :: Double -> Length -> Length length_scale n (Length x u) = Length (n * x) u@@ -187,18 +204,35 @@ ht = paper_height x in x {paper_width = ht, paper_height = wd} --- * Settings+mk_fragment_paper :: Double -> Double -> Paper+mk_fragment_paper w h =+ Paper {binding_offset = Length 0 MM+ ,bottom_margin = Length 0 MM+ ,indent = Length 0 MM+ ,inner_margin = Length 0 MM+ ,left_margin = Length 0 MM+ ,outer_margin = Length 0 MM+ ,paper_width = Length w MM+ ,paper_height = Length h MM+ ,ragged_last = True+ ,ragged_last_bottom = True+ ,ragged_right = True+ ,right_margin = Length 0 MM+ ,systems_per_page = Nothing+ ,top_margin = Length 0 MM+ ,two_sided = False+ ,print_page_number = False} -default_score_settings :: Score_Settings-default_score_settings =- Score_Settings {independent_time_signatures = False}+-- * Aliases --- * Header+tempo :: Duration -> Integer -> Music+tempo d = Tempo d . fromIntegral -default_header :: Header-default_header =- Header {dedication = ""- ,title = ""- ,subtitle = ""- ,composer = ""- ,tagline = ""}+after_grace :: Music -> Music -> Music+after_grace = AfterGrace++grace :: Music -> Music+grace = Grace++tremolo :: (Music, Music) -> Integer -> Music+tremolo = Tremolo
+ Music/LilyPond/Light/Constant/Dynamic.hs view
@@ -0,0 +1,26 @@+-- | Dynamic constants.+module Music.LilyPond.Light.Constant.Dynamic where++import Music.LilyPond.Light.Model+import Music.Theory.Dynamic_Mark {- hmt -}++pppp,ppp,pp,p,mp,mf,f,ff,fff,ffff,fp,sfz :: Annotation+pppp = Dynamic (Dynamic_Mark PPPP)+ppp = Dynamic (Dynamic_Mark PPP)+pp = Dynamic (Dynamic_Mark PP)+p = Dynamic (Dynamic_Mark P)+mp = Dynamic (Dynamic_Mark MP)+mf = Dynamic (Dynamic_Mark MF)+f = Dynamic (Dynamic_Mark F)+ff = Dynamic (Dynamic_Mark FF)+fff = Dynamic (Dynamic_Mark FFF)+ffff = Dynamic (Dynamic_Mark FFFF)+fp = Dynamic (Dynamic_Mark FP)+sfz = Dynamic (Dynamic_Mark SFZ)++cresc,decr,end_cresc,end_decr,espressivo :: Annotation+cresc = Dynamic (Hairpin Crescendo)+decr = Dynamic (Hairpin Diminuendo)+end_cresc = Dynamic (Hairpin End_Hairpin)+end_decr = Dynamic (Hairpin End_Hairpin)+espressivo = Dynamic Espressivo
+ Music/LilyPond/Light/Constant/Note.hs view
@@ -0,0 +1,398 @@+-- | 'Pitch' names lifted to 'Music' values.+module Music.LilyPond.Light.Constant.Note where++import Music.LilyPond.Light.Model+import Music.Theory.Pitch {- hmt -}+import qualified Music.Theory.Pitch.Name as P++-- * Notes++pitch_to_music :: Pitch -> Music+pitch_to_music p = Note p Nothing []++c1,d1,e1,f1,g1,a1,b1 :: Music+c1 = pitch_to_music P.c1+d1 = pitch_to_music P.d1+e1 = pitch_to_music P.e1+f1 = pitch_to_music P.f1+g1 = pitch_to_music P.g1+a1 = pitch_to_music P.a1+b1 = pitch_to_music P.b1++ces1,des1,ees1,fes1,ges1,aes1,bes1 :: Music+ces1 = pitch_to_music P.ces1+des1 = pitch_to_music P.des1+ees1 = pitch_to_music P.ees1+fes1 = pitch_to_music P.fes1+ges1 = pitch_to_music P.ges1+aes1 = pitch_to_music P.aes1+bes1 = pitch_to_music P.bes1++cis1,dis1,eis1,fis1,gis1,ais1,bis1 :: Music+cis1 = pitch_to_music P.cis1+dis1 = pitch_to_music P.dis1+eis1 = pitch_to_music P.eis1+fis1 = pitch_to_music P.fis1+gis1 = pitch_to_music P.gis1+ais1 = pitch_to_music P.ais1+bis1 = pitch_to_music P.bis1++c2,d2,e2,f2,g2,a2,b2 :: Music+c2 = pitch_to_music P.c2+d2 = pitch_to_music P.d2+e2 = pitch_to_music P.e2+f2 = pitch_to_music P.f2+g2 = pitch_to_music P.g2+a2 = pitch_to_music P.a2+b2 = pitch_to_music P.b2++ces2,des2,ees2,fes2,ges2,aes2,bes2 :: Music+ces2 = pitch_to_music P.ces2+des2 = pitch_to_music P.des2+ees2 = pitch_to_music P.ees2+fes2 = pitch_to_music P.fes2+ges2 = pitch_to_music P.ges2+aes2 = pitch_to_music P.aes2+bes2 = pitch_to_music P.bes2++cis2,dis2,eis2,fis2,gis2,ais2,bis2 :: Music+cis2 = pitch_to_music P.cis2+dis2 = pitch_to_music P.dis2+eis2 = pitch_to_music P.eis2+fis2 = pitch_to_music P.fis2+gis2 = pitch_to_music P.gis2+ais2 = pitch_to_music P.ais2+bis2 = pitch_to_music P.bis2++cisis2,disis2,eisis2,fisis2,gisis2,aisis2,bisis2 :: Music+cisis2 = pitch_to_music P.cisis2+disis2 = pitch_to_music P.disis2+eisis2 = pitch_to_music P.eisis2+fisis2 = pitch_to_music P.fisis2+gisis2 = pitch_to_music P.gisis2+aisis2 = pitch_to_music P.aisis2+bisis2 = pitch_to_music P.bisis2++c3,d3,e3,f3,g3,a3,b3 :: Music+c3 = pitch_to_music P.c3+d3 = pitch_to_music P.d3+e3 = pitch_to_music P.e3+f3 = pitch_to_music P.f3+g3 = pitch_to_music P.g3+a3 = pitch_to_music P.a3+b3 = pitch_to_music P.b3++ces3,des3,ees3,fes3,ges3,aes3,bes3 :: Music+ces3 = pitch_to_music P.ces3+des3 = pitch_to_music P.des3+ees3 = pitch_to_music P.ees3+fes3 = pitch_to_music P.fes3+ges3 = pitch_to_music P.ges3+aes3 = pitch_to_music P.aes3+bes3 = pitch_to_music P.bes3++cis3,dis3,eis3,fis3,gis3,ais3,bis3 :: Music+cis3 = pitch_to_music P.cis3+dis3 = pitch_to_music P.dis3+eis3 = pitch_to_music P.eis3+fis3 = pitch_to_music P.fis3+gis3 = pitch_to_music P.gis3+ais3 = pitch_to_music P.ais3+bis3 = pitch_to_music P.bis3++cisis3,disis3,eisis3,fisis3,gisis3,aisis3,bisis3 :: Music+cisis3 = pitch_to_music P.cisis3+disis3 = pitch_to_music P.disis3+eisis3 = pitch_to_music P.eisis3+fisis3 = pitch_to_music P.fisis3+gisis3 = pitch_to_music P.gisis3+aisis3 = pitch_to_music P.aisis3+bisis3 = pitch_to_music P.bisis3++ceseh3,deseh3,eeseh3,feseh3,geseh3,aeseh3,beseh3 :: Music+ceseh3 = pitch_to_music P.ceseh3+deseh3 = pitch_to_music P.deseh3+eeseh3 = pitch_to_music P.eeseh3+feseh3 = pitch_to_music P.feseh3+geseh3 = pitch_to_music P.geseh3+aeseh3 = pitch_to_music P.aeseh3+beseh3 = pitch_to_music P.beseh3++ceh3,deh3,eeh3,feh3,geh3,aeh3,beh3 :: Music+ceh3 = pitch_to_music P.ceh3+deh3 = pitch_to_music P.deh3+eeh3 = pitch_to_music P.eeh3+feh3 = pitch_to_music P.feh3+geh3 = pitch_to_music P.geh3+aeh3 = pitch_to_music P.aeh3+beh3 = pitch_to_music P.beh3++cih3,dih3,eih3,fih3,gih3,aih3,bih3 :: Music+cih3 = pitch_to_music P.cih3+dih3 = pitch_to_music P.dih3+eih3 = pitch_to_music P.eih3+fih3 = pitch_to_music P.fih3+gih3 = pitch_to_music P.gih3+aih3 = pitch_to_music P.aih3+bih3 = pitch_to_music P.bih3++cisih3,disih3,eisih3,fisih3,gisih3,aisih3,bisih3 :: Music+cisih3 = pitch_to_music P.cisih3+disih3 = pitch_to_music P.disih3+eisih3 = pitch_to_music P.eisih3+fisih3 = pitch_to_music P.fisih3+gisih3 = pitch_to_music P.gisih3+aisih3 = pitch_to_music P.aisih3+bisih3 = pitch_to_music P.bisih3++c4,d4,e4,f4,g4,a4,b4 :: Music+c4 = pitch_to_music P.c4+d4 = pitch_to_music P.d4+e4 = pitch_to_music P.e4+f4 = pitch_to_music P.f4+g4 = pitch_to_music P.g4+a4 = pitch_to_music P.a4+b4 = pitch_to_music P.b4++ces4,des4,ees4,fes4,ges4,aes4,bes4 :: Music+ces4 = pitch_to_music P.ces4+des4 = pitch_to_music P.des4+ees4 = pitch_to_music P.ees4+fes4 = pitch_to_music P.fes4+ges4 = pitch_to_music P.ges4+aes4 = pitch_to_music P.aes4+bes4 = pitch_to_music P.bes4++cis4,dis4,eis4,fis4,gis4,ais4,bis4 :: Music+cis4 = pitch_to_music P.cis4+dis4 = pitch_to_music P.dis4+eis4 = pitch_to_music P.eis4+fis4 = pitch_to_music P.fis4+gis4 = pitch_to_music P.gis4+ais4 = pitch_to_music P.ais4+bis4 = pitch_to_music P.bis4++ceses4,deses4,eeses4,feses4,geses4,aeses4,beses4 :: Music+ceses4 = pitch_to_music P.ceses4+deses4 = pitch_to_music P.deses4+eeses4 = pitch_to_music P.eeses4+feses4 = pitch_to_music P.feses4+geses4 = pitch_to_music P.geses4+aeses4 = pitch_to_music P.aeses4+beses4 = pitch_to_music P.beses4++cisis4,disis4,eisis4,fisis4,gisis4,aisis4,bisis4 :: Music+cisis4 = pitch_to_music P.cisis4+disis4 = pitch_to_music P.disis4+eisis4 = pitch_to_music P.eisis4+fisis4 = pitch_to_music P.fisis4+gisis4 = pitch_to_music P.gisis4+aisis4 = pitch_to_music P.aisis4+bisis4 = pitch_to_music P.bisis4++ceseh4,deseh4,eeseh4,feseh4,geseh4,aeseh4,beseh4 :: Music+ceseh4 = pitch_to_music P.ceseh4+deseh4 = pitch_to_music P.deseh4+eeseh4 = pitch_to_music P.eeseh4+feseh4 = pitch_to_music P.feseh4+geseh4 = pitch_to_music P.geseh4+aeseh4 = pitch_to_music P.aeseh4+beseh4 = pitch_to_music P.beseh4++ceh4,deh4,eeh4,feh4,geh4,aeh4,beh4 :: Music+ceh4 = pitch_to_music P.ceh4+deh4 = pitch_to_music P.deh4+eeh4 = pitch_to_music P.eeh4+feh4 = pitch_to_music P.feh4+geh4 = pitch_to_music P.geh4+aeh4 = pitch_to_music P.aeh4+beh4 = pitch_to_music P.beh4++cih4,dih4,eih4,fih4,gih4,aih4,bih4 :: Music+cih4 = pitch_to_music P.cih4+dih4 = pitch_to_music P.dih4+eih4 = pitch_to_music P.eih4+fih4 = pitch_to_music P.fih4+gih4 = pitch_to_music P.gih4+aih4 = pitch_to_music P.aih4+bih4 = pitch_to_music P.bih4++cisih4,disih4,eisih4,fisih4,gisih4,aisih4,bisih4 :: Music+cisih4 = pitch_to_music P.cisih4+disih4 = pitch_to_music P.disih4+eisih4 = pitch_to_music P.eisih4+fisih4 = pitch_to_music P.fisih4+gisih4 = pitch_to_music P.gisih4+aisih4 = pitch_to_music P.aisih4+bisih4 = pitch_to_music P.bisih4++c5,d5,e5,f5,g5,a5,b5 :: Music+c5 = pitch_to_music P.c5+d5 = pitch_to_music P.d5+e5 = pitch_to_music P.e5+f5 = pitch_to_music P.f5+g5 = pitch_to_music P.g5+a5 = pitch_to_music P.a5+b5 = pitch_to_music P.b5++ces5,des5,ees5,fes5,ges5,aes5,bes5 :: Music+ces5 = pitch_to_music P.ces5+des5 = pitch_to_music P.des5+ees5 = pitch_to_music P.ees5+fes5 = pitch_to_music P.fes5+ges5 = pitch_to_music P.ges5+aes5 = pitch_to_music P.aes5+bes5 = pitch_to_music P.bes5++cis5,dis5,eis5,fis5,gis5,ais5,bis5 :: Music+cis5 = pitch_to_music P.cis5+dis5 = pitch_to_music P.dis5+eis5 = pitch_to_music P.eis5+fis5 = pitch_to_music P.fis5+gis5 = pitch_to_music P.gis5+ais5 = pitch_to_music P.ais5+bis5 = pitch_to_music P.bis5++ceses5,deses5,eeses5,feses5,geses5,aeses5,beses5 :: Music+ceses5 = pitch_to_music P.ceses5+deses5 = pitch_to_music P.deses5+eeses5 = pitch_to_music P.eeses5+feses5 = pitch_to_music P.feses5+geses5 = pitch_to_music P.geses5+aeses5 = pitch_to_music P.aeses5+beses5 = pitch_to_music P.beses5++cisis5,disis5,eisis5,fisis5,gisis5,aisis5,bisis5 :: Music+cisis5 = pitch_to_music P.cisis5+disis5 = pitch_to_music P.disis5+eisis5 = pitch_to_music P.eisis5+fisis5 = pitch_to_music P.fisis5+gisis5 = pitch_to_music P.gisis5+aisis5 = pitch_to_music P.aisis5+bisis5 = pitch_to_music P.bisis5++ceseh5,deseh5,eeseh5,feseh5,geseh5,aeseh5,beseh5 :: Music+ceseh5 = pitch_to_music P.ceseh5+deseh5 = pitch_to_music P.deseh5+eeseh5 = pitch_to_music P.eeseh5+feseh5 = pitch_to_music P.feseh5+geseh5 = pitch_to_music P.geseh5+aeseh5 = pitch_to_music P.aeseh5+beseh5 = pitch_to_music P.beseh5++ceh5,deh5,eeh5,feh5,geh5,aeh5,beh5 :: Music+ceh5 = pitch_to_music P.ceh5+deh5 = pitch_to_music P.deh5+eeh5 = pitch_to_music P.eeh5+feh5 = pitch_to_music P.feh5+geh5 = pitch_to_music P.geh5+aeh5 = pitch_to_music P.aeh5+beh5 = pitch_to_music P.beh5++cih5,dih5,eih5,fih5,gih5,aih5,bih5 :: Music+cih5 = pitch_to_music P.cih5+dih5 = pitch_to_music P.dih5+eih5 = pitch_to_music P.eih5+fih5 = pitch_to_music P.fih5+gih5 = pitch_to_music P.gih5+aih5 = pitch_to_music P.aih5+bih5 = pitch_to_music P.bih5++cisih5,disih5,eisih5,fisih5,gisih5,aisih5,bisih5 :: Music+cisih5 = pitch_to_music P.cisih5+disih5 = pitch_to_music P.disih5+eisih5 = pitch_to_music P.eisih5+fisih5 = pitch_to_music P.fisih5+gisih5 = pitch_to_music P.gisih5+aisih5 = pitch_to_music P.aisih5+bisih5 = pitch_to_music P.bisih5++c6,d6,e6,f6,g6,a6,b6 :: Music+c6 = pitch_to_music P.c6+d6 = pitch_to_music P.d6+e6 = pitch_to_music P.e6+f6 = pitch_to_music P.f6+g6 = pitch_to_music P.g6+a6 = pitch_to_music P.a6+b6 = pitch_to_music P.b6++ces6,des6,ees6,fes6,ges6,aes6,bes6 :: Music+ces6 = pitch_to_music P.ces6+des6 = pitch_to_music P.des6+ees6 = pitch_to_music P.ees6+fes6 = pitch_to_music P.fes6+ges6 = pitch_to_music P.ges6+aes6 = pitch_to_music P.aes6+bes6 = pitch_to_music P.bes6++cis6,dis6,eis6,fis6,gis6,ais6,bis6 :: Music+cis6 = pitch_to_music P.cis6+dis6 = pitch_to_music P.dis6+eis6 = pitch_to_music P.eis6+fis6 = pitch_to_music P.fis6+gis6 = pitch_to_music P.gis6+ais6 = pitch_to_music P.ais6+bis6 = pitch_to_music P.bis6++ceseh6,deseh6,eeseh6,feseh6,geseh6,aeseh6,beseh6 :: Music+ceseh6 = pitch_to_music P.ceseh6+deseh6 = pitch_to_music P.deseh6+eeseh6 = pitch_to_music P.eeseh6+feseh6 = pitch_to_music P.feseh6+geseh6 = pitch_to_music P.geseh6+aeseh6 = pitch_to_music P.aeseh6+beseh6 = pitch_to_music P.beseh6++ceh6,deh6,eeh6,feh6,geh6,aeh6,beh6 :: Music+ceh6 = pitch_to_music P.ceh6+deh6 = pitch_to_music P.deh6+eeh6 = pitch_to_music P.eeh6+feh6 = pitch_to_music P.feh6+geh6 = pitch_to_music P.geh6+aeh6 = pitch_to_music P.aeh6+beh6 = pitch_to_music P.beh6++cih6,dih6,eih6,fih6,gih6,aih6,bih6 :: Music+cih6 = pitch_to_music P.cih6+dih6 = pitch_to_music P.dih6+eih6 = pitch_to_music P.eih6+fih6 = pitch_to_music P.fih6+gih6 = pitch_to_music P.gih6+aih6 = pitch_to_music P.aih6+bih6 = pitch_to_music P.bih6++cisih6,disih6,eisih6,fisih6,gisih6,aisih6,bisih6 :: Music+cisih6 = pitch_to_music P.cisih6+disih6 = pitch_to_music P.disih6+eisih6 = pitch_to_music P.eisih6+fisih6 = pitch_to_music P.fisih6+gisih6 = pitch_to_music P.gisih6+aisih6 = pitch_to_music P.aisih6+bisih6 = pitch_to_music P.bisih6++c7,d7,e7,f7,g7,a7,b7 :: Music+c7 = pitch_to_music P.c7+d7 = pitch_to_music P.d7+e7 = pitch_to_music P.e7+f7 = pitch_to_music P.f7+g7 = pitch_to_music P.g7+a7 = pitch_to_music P.a7+b7 = pitch_to_music P.b7++ces7,des7,ees7,fes7,ges7,aes7,bes7 :: Music+ces7 = pitch_to_music P.ces7+des7 = pitch_to_music P.des7+ees7 = pitch_to_music P.ees7+fes7 = pitch_to_music P.fes7+ges7 = pitch_to_music P.ges7+aes7 = pitch_to_music P.aes7+bes7 = pitch_to_music P.bes7++cis7,dis7,eis7,fis7,gis7,ais7,bis7 :: Music+cis7 = pitch_to_music P.cis7+dis7 = pitch_to_music P.dis7+eis7 = pitch_to_music P.eis7+fis7 = pitch_to_music P.fis7+gis7 = pitch_to_music P.gis7+ais7 = pitch_to_music P.ais7+bis7 = pitch_to_music P.bis7
− Music/LilyPond/Light/Constant/NoteName.hs
@@ -1,396 +0,0 @@-module Music.LilyPond.Light.Constant.NoteName where--import Music.LilyPond.Light.Model-import Music.Theory.Pitch---- * Notes--mk_note :: Note_T -> Alteration_T -> Octave -> Music-mk_note n a o = Note (Pitch n a o) Nothing []--c1,d1,e1,f1,g1,a1,b1 :: Music-c1 = mk_note C Natural 1-d1 = mk_note D Natural 1-e1 = mk_note E Natural 1-f1 = mk_note F Natural 1-g1 = mk_note G Natural 1-a1 = mk_note A Natural 1-b1 = mk_note B Natural 1--ces1,des1,ees1,fes1,ges1,aes1,bes1 :: Music-ces1 = mk_note C Flat 1-des1 = mk_note D Flat 1-ees1 = mk_note E Flat 1-fes1 = mk_note F Flat 1-ges1 = mk_note G Flat 1-aes1 = mk_note A Flat 1-bes1 = mk_note B Flat 1--cis1,dis1,eis1,fis1,gis1,ais1,bis1 :: Music-cis1 = mk_note C Sharp 1-dis1 = mk_note D Sharp 1-eis1 = mk_note E Sharp 1-fis1 = mk_note F Sharp 1-gis1 = mk_note G Sharp 1-ais1 = mk_note A Sharp 1-bis1 = mk_note B Sharp 1--c2,d2,e2,f2,g2,a2,b2 :: Music-c2 = mk_note C Natural 2-d2 = mk_note D Natural 2-e2 = mk_note E Natural 2-f2 = mk_note F Natural 2-g2 = mk_note G Natural 2-a2 = mk_note A Natural 2-b2 = mk_note B Natural 2--ces2,des2,ees2,fes2,ges2,aes2,bes2 :: Music-ces2 = mk_note C Flat 2-des2 = mk_note D Flat 2-ees2 = mk_note E Flat 2-fes2 = mk_note F Flat 2-ges2 = mk_note G Flat 2-aes2 = mk_note A Flat 2-bes2 = mk_note B Flat 2--cis2,dis2,eis2,fis2,gis2,ais2,bis2 :: Music-cis2 = mk_note C Sharp 2-dis2 = mk_note D Sharp 2-eis2 = mk_note E Sharp 2-fis2 = mk_note F Sharp 2-gis2 = mk_note G Sharp 2-ais2 = mk_note A Sharp 2-bis2 = mk_note B Sharp 2--cisis2,disis2,eisis2,fisis2,gisis2,aisis2,bisis2 :: Music-cisis2 = mk_note C DoubleSharp 2-disis2 = mk_note D DoubleSharp 2-eisis2 = mk_note E DoubleSharp 2-fisis2 = mk_note F DoubleSharp 2-gisis2 = mk_note G DoubleSharp 2-aisis2 = mk_note A DoubleSharp 2-bisis2 = mk_note B DoubleSharp 2--c3,d3,e3,f3,g3,a3,b3 :: Music-c3 = mk_note C Natural 3-d3 = mk_note D Natural 3-e3 = mk_note E Natural 3-f3 = mk_note F Natural 3-g3 = mk_note G Natural 3-a3 = mk_note A Natural 3-b3 = mk_note B Natural 3--ces3,des3,ees3,fes3,ges3,aes3,bes3 :: Music-ces3 = mk_note C Flat 3-des3 = mk_note D Flat 3-ees3 = mk_note E Flat 3-fes3 = mk_note F Flat 3-ges3 = mk_note G Flat 3-aes3 = mk_note A Flat 3-bes3 = mk_note B Flat 3--cis3,dis3,eis3,fis3,gis3,ais3,bis3 :: Music-cis3 = mk_note C Sharp 3-dis3 = mk_note D Sharp 3-eis3 = mk_note E Sharp 3-fis3 = mk_note F Sharp 3-gis3 = mk_note G Sharp 3-ais3 = mk_note A Sharp 3-bis3 = mk_note B Sharp 3--cisis3,disis3,eisis3,fisis3,gisis3,aisis3,bisis3 :: Music-cisis3 = mk_note C DoubleSharp 3-disis3 = mk_note D DoubleSharp 3-eisis3 = mk_note E DoubleSharp 3-fisis3 = mk_note F DoubleSharp 3-gisis3 = mk_note G DoubleSharp 3-aisis3 = mk_note A DoubleSharp 3-bisis3 = mk_note B DoubleSharp 3--ceseh3,deseh3,eeseh3,feseh3,geseh3,aeseh3,beseh3 :: Music-ceseh3 = mk_note C ThreeQuarterToneFlat 3-deseh3 = mk_note D ThreeQuarterToneFlat 3-eeseh3 = mk_note E ThreeQuarterToneFlat 3-feseh3 = mk_note F ThreeQuarterToneFlat 3-geseh3 = mk_note G ThreeQuarterToneFlat 3-aeseh3 = mk_note A ThreeQuarterToneFlat 3-beseh3 = mk_note B ThreeQuarterToneFlat 3--ceh3,deh3,eeh3,feh3,geh3,aeh3,beh3 :: Music-ceh3 = mk_note C QuarterToneFlat 3-deh3 = mk_note D QuarterToneFlat 3-eeh3 = mk_note E QuarterToneFlat 3-feh3 = mk_note F QuarterToneFlat 3-geh3 = mk_note G QuarterToneFlat 3-aeh3 = mk_note A QuarterToneFlat 3-beh3 = mk_note B QuarterToneFlat 3--cih3,dih3,eih3,fih3,gih3,aih3,bih3 :: Music-cih3 = mk_note C QuarterToneSharp 3-dih3 = mk_note D QuarterToneSharp 3-eih3 = mk_note E QuarterToneSharp 3-fih3 = mk_note F QuarterToneSharp 3-gih3 = mk_note G QuarterToneSharp 3-aih3 = mk_note A QuarterToneSharp 3-bih3 = mk_note B QuarterToneSharp 3--cisih3,disih3,eisih3,fisih3,gisih3,aisih3,bisih3 :: Music-cisih3 = mk_note C ThreeQuarterToneSharp 3-disih3 = mk_note D ThreeQuarterToneSharp 3-eisih3 = mk_note E ThreeQuarterToneSharp 3-fisih3 = mk_note F ThreeQuarterToneSharp 3-gisih3 = mk_note G ThreeQuarterToneSharp 3-aisih3 = mk_note A ThreeQuarterToneSharp 3-bisih3 = mk_note B ThreeQuarterToneSharp 3--c4,d4,e4,f4,g4,a4,b4 :: Music-c4 = mk_note C Natural 4-d4 = mk_note D Natural 4-e4 = mk_note E Natural 4-f4 = mk_note F Natural 4-g4 = mk_note G Natural 4-a4 = mk_note A Natural 4-b4 = mk_note B Natural 4--ces4,des4,ees4,fes4,ges4,aes4,bes4 :: Music-ces4 = mk_note C Flat 4-des4 = mk_note D Flat 4-ees4 = mk_note E Flat 4-fes4 = mk_note F Flat 4-ges4 = mk_note G Flat 4-aes4 = mk_note A Flat 4-bes4 = mk_note B Flat 4--cis4,dis4,eis4,fis4,gis4,ais4,bis4 :: Music-cis4 = mk_note C Sharp 4-dis4 = mk_note D Sharp 4-eis4 = mk_note E Sharp 4-fis4 = mk_note F Sharp 4-gis4 = mk_note G Sharp 4-ais4 = mk_note A Sharp 4-bis4 = mk_note B Sharp 4--ceses4,deses4,eeses4,feses4,geses4,aeses4,beses4 :: Music-ceses4 = mk_note C DoubleFlat 4-deses4 = mk_note D DoubleFlat 4-eeses4 = mk_note E DoubleFlat 4-feses4 = mk_note F DoubleFlat 4-geses4 = mk_note G DoubleFlat 4-aeses4 = mk_note A DoubleFlat 4-beses4 = mk_note B DoubleFlat 4--cisis4,disis4,eisis4,fisis4,gisis4,aisis4,bisis4 :: Music-cisis4 = mk_note C DoubleSharp 4-disis4 = mk_note D DoubleSharp 4-eisis4 = mk_note E DoubleSharp 4-fisis4 = mk_note F DoubleSharp 4-gisis4 = mk_note G DoubleSharp 4-aisis4 = mk_note A DoubleSharp 4-bisis4 = mk_note B DoubleSharp 4--ceseh4,deseh4,eeseh4,feseh4,geseh4,aeseh4,beseh4 :: Music-ceseh4 = mk_note C ThreeQuarterToneFlat 4-deseh4 = mk_note D ThreeQuarterToneFlat 4-eeseh4 = mk_note E ThreeQuarterToneFlat 4-feseh4 = mk_note F ThreeQuarterToneFlat 4-geseh4 = mk_note G ThreeQuarterToneFlat 4-aeseh4 = mk_note A ThreeQuarterToneFlat 4-beseh4 = mk_note B ThreeQuarterToneFlat 4--ceh4,deh4,eeh4,feh4,geh4,aeh4,beh4 :: Music-ceh4 = mk_note C QuarterToneFlat 4-deh4 = mk_note D QuarterToneFlat 4-eeh4 = mk_note E QuarterToneFlat 4-feh4 = mk_note F QuarterToneFlat 4-geh4 = mk_note G QuarterToneFlat 4-aeh4 = mk_note A QuarterToneFlat 4-beh4 = mk_note B QuarterToneFlat 4--cih4,dih4,eih4,fih4,gih4,aih4,bih4 :: Music-cih4 = mk_note C QuarterToneSharp 4-dih4 = mk_note D QuarterToneSharp 4-eih4 = mk_note E QuarterToneSharp 4-fih4 = mk_note F QuarterToneSharp 4-gih4 = mk_note G QuarterToneSharp 4-aih4 = mk_note A QuarterToneSharp 4-bih4 = mk_note B QuarterToneSharp 4--cisih4,disih4,eisih4,fisih4,gisih4,aisih4,bisih4 :: Music-cisih4 = mk_note C ThreeQuarterToneSharp 4-disih4 = mk_note D ThreeQuarterToneSharp 4-eisih4 = mk_note E ThreeQuarterToneSharp 4-fisih4 = mk_note F ThreeQuarterToneSharp 4-gisih4 = mk_note G ThreeQuarterToneSharp 4-aisih4 = mk_note A ThreeQuarterToneSharp 4-bisih4 = mk_note B ThreeQuarterToneSharp 4--c5,d5,e5,f5,g5,a5,b5 :: Music-c5 = mk_note C Natural 5-d5 = mk_note D Natural 5-e5 = mk_note E Natural 5-f5 = mk_note F Natural 5-g5 = mk_note G Natural 5-a5 = mk_note A Natural 5-b5 = mk_note B Natural 5--ces5,des5,ees5,fes5,ges5,aes5,bes5 :: Music-ces5 = mk_note C Flat 5-des5 = mk_note D Flat 5-ees5 = mk_note E Flat 5-fes5 = mk_note F Flat 5-ges5 = mk_note G Flat 5-aes5 = mk_note A Flat 5-bes5 = mk_note B Flat 5--cis5,dis5,eis5,fis5,gis5,ais5,bis5 :: Music-cis5 = mk_note C Sharp 5-dis5 = mk_note D Sharp 5-eis5 = mk_note E Sharp 5-fis5 = mk_note F Sharp 5-gis5 = mk_note G Sharp 5-ais5 = mk_note A Sharp 5-bis5 = mk_note B Sharp 5--ceses5,deses5,eeses5,feses5,geses5,aeses5,beses5 :: Music-ceses5 = mk_note C DoubleFlat 5-deses5 = mk_note D DoubleFlat 5-eeses5 = mk_note E DoubleFlat 5-feses5 = mk_note F DoubleFlat 5-geses5 = mk_note G DoubleFlat 5-aeses5 = mk_note A DoubleFlat 5-beses5 = mk_note B DoubleFlat 5--cisis5,disis5,eisis5,fisis5,gisis5,aisis5,bisis5 :: Music-cisis5 = mk_note C DoubleSharp 5-disis5 = mk_note D DoubleSharp 5-eisis5 = mk_note E DoubleSharp 5-fisis5 = mk_note F DoubleSharp 5-gisis5 = mk_note G DoubleSharp 5-aisis5 = mk_note A DoubleSharp 5-bisis5 = mk_note B DoubleSharp 5--ceseh5,deseh5,eeseh5,feseh5,geseh5,aeseh5,beseh5 :: Music-ceseh5 = mk_note C ThreeQuarterToneFlat 5-deseh5 = mk_note D ThreeQuarterToneFlat 5-eeseh5 = mk_note E ThreeQuarterToneFlat 5-feseh5 = mk_note F ThreeQuarterToneFlat 5-geseh5 = mk_note G ThreeQuarterToneFlat 5-aeseh5 = mk_note A ThreeQuarterToneFlat 5-beseh5 = mk_note B ThreeQuarterToneFlat 5--ceh5,deh5,eeh5,feh5,geh5,aeh5,beh5 :: Music-ceh5 = mk_note C QuarterToneFlat 5-deh5 = mk_note D QuarterToneFlat 5-eeh5 = mk_note E QuarterToneFlat 5-feh5 = mk_note F QuarterToneFlat 5-geh5 = mk_note G QuarterToneFlat 5-aeh5 = mk_note A QuarterToneFlat 5-beh5 = mk_note B QuarterToneFlat 5--cih5,dih5,eih5,fih5,gih5,aih5,bih5 :: Music-cih5 = mk_note C QuarterToneSharp 5-dih5 = mk_note D QuarterToneSharp 5-eih5 = mk_note E QuarterToneSharp 5-fih5 = mk_note F QuarterToneSharp 5-gih5 = mk_note G QuarterToneSharp 5-aih5 = mk_note A QuarterToneSharp 5-bih5 = mk_note B QuarterToneSharp 5--cisih5,disih5,eisih5,fisih5,gisih5,aisih5,bisih5 :: Music-cisih5 = mk_note C ThreeQuarterToneSharp 5-disih5 = mk_note D ThreeQuarterToneSharp 5-eisih5 = mk_note E ThreeQuarterToneSharp 5-fisih5 = mk_note F ThreeQuarterToneSharp 5-gisih5 = mk_note G ThreeQuarterToneSharp 5-aisih5 = mk_note A ThreeQuarterToneSharp 5-bisih5 = mk_note B ThreeQuarterToneSharp 5--c6,d6,e6,f6,g6,a6,b6 :: Music-c6 = mk_note C Natural 6-d6 = mk_note D Natural 6-e6 = mk_note E Natural 6-f6 = mk_note F Natural 6-g6 = mk_note G Natural 6-a6 = mk_note A Natural 6-b6 = mk_note B Natural 6--ces6,des6,ees6,fes6,ges6,aes6,bes6 :: Music-ces6 = mk_note C Flat 6-des6 = mk_note D Flat 6-ees6 = mk_note E Flat 6-fes6 = mk_note F Flat 6-ges6 = mk_note G Flat 6-aes6 = mk_note A Flat 6-bes6 = mk_note B Flat 6--cis6,dis6,eis6,fis6,gis6,ais6,bis6 :: Music-cis6 = mk_note C Sharp 6-dis6 = mk_note D Sharp 6-eis6 = mk_note E Sharp 6-fis6 = mk_note F Sharp 6-gis6 = mk_note G Sharp 6-ais6 = mk_note A Sharp 6-bis6 = mk_note B Sharp 6--ceseh6,deseh6,eeseh6,feseh6,geseh6,aeseh6,beseh6 :: Music-ceseh6 = mk_note C ThreeQuarterToneFlat 6-deseh6 = mk_note D ThreeQuarterToneFlat 6-eeseh6 = mk_note E ThreeQuarterToneFlat 6-feseh6 = mk_note F ThreeQuarterToneFlat 6-geseh6 = mk_note G ThreeQuarterToneFlat 6-aeseh6 = mk_note A ThreeQuarterToneFlat 6-beseh6 = mk_note B ThreeQuarterToneFlat 6--ceh6,deh6,eeh6,feh6,geh6,aeh6,beh6 :: Music-ceh6 = mk_note C QuarterToneFlat 6-deh6 = mk_note D QuarterToneFlat 6-eeh6 = mk_note E QuarterToneFlat 6-feh6 = mk_note F QuarterToneFlat 6-geh6 = mk_note G QuarterToneFlat 6-aeh6 = mk_note A QuarterToneFlat 6-beh6 = mk_note B QuarterToneFlat 6--cih6,dih6,eih6,fih6,gih6,aih6,bih6 :: Music-cih6 = mk_note C QuarterToneSharp 6-dih6 = mk_note D QuarterToneSharp 6-eih6 = mk_note E QuarterToneSharp 6-fih6 = mk_note F QuarterToneSharp 6-gih6 = mk_note G QuarterToneSharp 6-aih6 = mk_note A QuarterToneSharp 6-bih6 = mk_note B QuarterToneSharp 6--cisih6,disih6,eisih6,fisih6,gisih6,aisih6,bisih6 :: Music-cisih6 = mk_note C ThreeQuarterToneSharp 6-disih6 = mk_note D ThreeQuarterToneSharp 6-eisih6 = mk_note E ThreeQuarterToneSharp 6-fisih6 = mk_note F ThreeQuarterToneSharp 6-gisih6 = mk_note G ThreeQuarterToneSharp 6-aisih6 = mk_note A ThreeQuarterToneSharp 6-bisih6 = mk_note B ThreeQuarterToneSharp 6--c7,d7,e7,f7,g7,a7,b7 :: Music-c7 = mk_note C Natural 7-d7 = mk_note D Natural 7-e7 = mk_note E Natural 7-f7 = mk_note F Natural 7-g7 = mk_note G Natural 7-a7 = mk_note A Natural 7-b7 = mk_note B Natural 7--ces7,des7,ees7,fes7,ges7,aes7,bes7 :: Music-ces7 = mk_note C Flat 7-des7 = mk_note D Flat 7-ees7 = mk_note E Flat 7-fes7 = mk_note F Flat 7-ges7 = mk_note G Flat 7-aes7 = mk_note A Flat 7-bes7 = mk_note B Flat 7--cis7,dis7,eis7,fis7,gis7,ais7,bis7 :: Music-cis7 = mk_note C Sharp 7-dis7 = mk_note D Sharp 7-eis7 = mk_note E Sharp 7-fis7 = mk_note F Sharp 7-gis7 = mk_note G Sharp 7-ais7 = mk_note A Sharp 7-bis7 = mk_note B Sharp 7
+ Music/LilyPond/Light/Literal.hs view
@@ -0,0 +1,18 @@+module Music.LilyPond.Light.Literal (l,r,r',module L) where++import Music.LilyPond.Light.Constant+import Music.LilyPond.Light.Constant.Dynamic as L+import Music.LilyPond.Light.Constant.Note as L+import Music.LilyPond.Light.Model+import Music.LilyPond.Light.Notation+import Music.Theory.Duration {- hmt -}+import Music.Theory.Time_Signature++l :: Music+l = bar_line_check++r :: Duration -> Music+r = rest++r' :: Time_Signature -> Music+r' = mm_rest
+ Music/LilyPond/Light/Measure.hs view
@@ -0,0 +1,34 @@+module Music.LilyPond.Light.Measure where++import Music.LilyPond.Light.Model++type M_Annotation = Music+data Measure = Measure [M_Annotation] [Music] deriving (Eq,Show)++m_annotate :: M_Annotation -> Measure -> Measure+m_annotate a (Measure as xs) = Measure (as++[a]) xs++m_annotate' :: [M_Annotation] -> Measure -> Measure+m_annotate' as' (Measure as xs) = Measure (as++as') xs++m_annotate_first' :: [M_Annotation] -> [Measure] -> [Measure]+m_annotate_first' as xs =+ case xs of+ (x:xs') -> m_annotate' as x : xs'+ [] -> error "m_annotate_first'"++m_annotate_last' :: [M_Annotation] -> [Measure] -> [Measure]+m_annotate_last' as xs =+ case xs of+ [] -> []+ [x] -> [m_annotate' as x]+ (x:xs') -> x : m_annotate_last' as xs'++m_append :: [Music] -> Measure -> Measure+m_append c (Measure as xs) = Measure as (xs++c)++m_elements :: Measure -> [Music]+m_elements (Measure as xs) = as ++ xs++mm_elements :: [Measure] -> [Music]+mm_elements = concatMap m_elements
Music/LilyPond/Light/Model.hs view
@@ -1,9 +1,12 @@ module Music.LilyPond.Light.Model where import Data.Monoid+import qualified Music.Theory.Clef as C {- hmt -} import Music.Theory.Pitch import Music.Theory.Duration+import Music.Theory.Dynamic_Mark import Music.Theory.Key+import Music.Theory.Time_Signature data Version = Version String deriving (Eq, Show)@@ -24,10 +27,12 @@ , paper_height :: Length , ragged_last :: Bool , ragged_last_bottom :: Bool+ , ragged_right :: Bool , right_margin :: Length , systems_per_page :: Maybe Integer , top_margin :: Length- , two_sided :: Bool }+ , two_sided :: Bool+ , print_page_number :: Bool } deriving (Eq, Show) data Header = Header { dedication :: String@@ -37,9 +42,6 @@ , tagline :: String } deriving (Eq, Show) -data Clef_T = Bass | Tenor | Alto | Treble | Percussion- deriving (Eq, Ord, Show)- data Articulation_T = Accent | Arpeggio | ArpeggioDown@@ -62,13 +64,9 @@ | UpBow deriving (Eq, Show) -data Dynamic_T = PPPP | PPP | Pianissimo | Piano | MezzoPiano- | MezzoForte | Forte | Fortissimo | FFF | FFFF- | FP | SFZ+data Dynamic_T = Dynamic_Mark Dynamic_Mark_T+ | Hairpin Hairpin_T | Espressivo- | Begin_Crescendo- | Begin_Decrescendo- | End_Dynamic deriving (Eq, Show) data Phrasing_T = Begin_Slur@@ -81,12 +79,15 @@ | SustainOff deriving (Eq, Show) +data Text_T = Text_Plain | Text_Markup+ deriving (Eq, Show)+ data Annotation = Articulation Articulation_T | Dynamic Dynamic_T | Phrasing Phrasing_T | Begin_Tie- | Above | Below- | Text String+ | Place_Above | Place_Below+ | Text_Mark | Text Text_T String | ReminderAccidental | CautionaryAccidental | CompositeAnnotation [Annotation] deriving (Eq, Show)@@ -125,8 +126,6 @@ | VoiceFour deriving (Eq, Show) -type TimeSignature = (Integer, Integer)- type Tuplet_T = (Integer, Integer) data Tuplet_Mode = Normal_Tuplet@@ -155,22 +154,22 @@ music_c :: Music -> Music_C music_c m = case m of- Note _ _ _ -> Note_C- Chord _ _ _ -> Chord_C+ Note {} -> Note_C+ Chord {} -> Chord_C Tremolo _ _ -> Tremolo_C Rest _ _ -> Rest_C- MMRest _ _ _ -> MMRest_C- Skip _ -> Skip_C+ MMRest {} -> MMRest_C+ Skip _ _ -> Skip_C Repeat _ _ -> Repeat_C- Tuplet _ _ _ -> Tuplet_C+ Tuplet {} -> Tuplet_C Grace _ -> Grace_C AfterGrace _ _ -> AfterGrace_C Join _ -> Join_C- Clef _ _ -> Clef_C+ Clef _ -> Clef_C Time _ -> Time_C- Key _ _ _ -> Key_C+ Key {} -> Key_C Tempo _ _ -> Tempo_C- Command _ -> Command_C+ Command _ _ -> Command_C Polyphony _ _ -> Polyphony_C Empty -> Empty_C @@ -182,18 +181,18 @@ , chord_annotations :: [Annotation] } | Tremolo (Music,Music) Integer | Rest Duration [Annotation]- | MMRest Integer TimeSignature [Annotation]- | Skip Duration+ | MMRest Integer Time_Signature [Annotation]+ | Skip Duration [Annotation] | Repeat Integer Music | Tuplet Tuplet_Mode Tuplet_T Music | Grace Music | AfterGrace Music Music | Join [Music]- | Clef Clef_T Int- | Time TimeSignature+ | Clef (C.Clef Int)+ | Time Time_Signature | Key Note_T (Maybe Alteration_T) Mode_T- | Tempo Duration Integer- | Command Command_T+ | Tempo Duration Rational+ | Command Command_T [Annotation] | Polyphony Music Music | Empty deriving (Eq, Show)@@ -232,8 +231,9 @@ deriving (Eq, Show) data Score_Settings =- Score_Settings { independent_time_signatures :: Bool- }+ Score_Settings {independent_time_signatures :: Bool+ ,remove_empty_staves :: Bool+ ,remove_empty_staves_first_system :: Bool} deriving (Eq, Show) data Score = Score Score_Settings [Staff]@@ -244,3 +244,36 @@ , work_header :: Header , work_score :: Score } deriving (Eq, Show)++data Fragment = Fragment { fragment_version :: Version+ , fragment_paper :: Paper+ , fragment_music :: Music }+ deriving (Eq, Show)++data Format = PDF | PS | PNG+ deriving (Enum,Eq,Show)+++-- * Default values++default_version :: Version+default_version = Version "2.14.2"++default_header :: Header+default_header =+ Header {dedication = ""+ ,title = ""+ ,subtitle = ""+ ,composer = ""+ ,tagline = ""}++default_score_settings :: Score_Settings+default_score_settings =+ Score_Settings {independent_time_signatures = False+ ,remove_empty_staves = False+ ,remove_empty_staves_first_system = False}++-- * Translation++ly_bool :: Bool -> String+ly_bool c = if c then "##t" else "##f"
+ Music/LilyPond/Light/Notation.hs view
@@ -0,0 +1,534 @@+module Music.LilyPond.Light.Notation where++import Data.List+import Data.Maybe+import Data.Monoid+import Data.Ratio+import Music.LilyPond.Light.Constant+import Music.LilyPond.Light.Measure+import Music.LilyPond.Light.Model+import Music.LilyPond.Light.Output.LilyPond+import Music.Theory.Duration {- hmt -}+import Music.Theory.Duration.Annotation+import Music.Theory.Key+import Music.Theory.Pitch+import Music.Theory.Pitch.Spelling+import Music.Theory.Time_Signature+import Text.Printf++-- * Music category predicates++is_music_c :: Music_C -> Music -> Bool+is_music_c c = (==) c . music_c++is_note :: Music -> Bool+is_note = is_music_c Note_C++is_chord :: Music -> Bool+is_chord = is_music_c Chord_C++is_rest :: Music -> Bool+is_rest = is_music_c Rest_C++is_skip :: Music -> Bool+is_skip = is_music_c Skip_C++is_mm_rest :: Music -> Bool+is_mm_rest = is_music_c MMRest_C++is_grace :: Music -> Bool+is_grace = is_music_c Grace_C++is_after_grace :: Music -> Bool+is_after_grace = is_music_c AfterGrace_C++-- | These are required to avoid issues in lilypond (see manual)+is_grace_skip :: Music -> Bool+is_grace_skip m =+ case m of+ Grace (Skip _ _) -> True+ _ -> False++is_clef :: Music -> Bool+is_clef = is_music_c Clef_C++is_time :: Music -> Bool+is_time = is_music_c Time_C++is_tempo :: Music -> Bool+is_tempo = is_music_c Tempo_C++is_command :: Music -> Bool+is_command = is_music_c Command_C++is_barlinecheck :: Music -> Bool+is_barlinecheck m =+ case m of+ Command BarlineCheck _ -> True+ _ -> False++is_tied :: Music -> Bool+is_tied m =+ case m of+ Note _ _ xs -> Begin_Tie `elem` xs+ Chord _ _ xs -> Begin_Tie `elem` xs+ _ -> False++is_tuplet :: Music -> Bool+is_tuplet = is_music_c Tuplet_C++-- * Pitch++-- | Remove any reminder or cautionary accidentals at note or chord.+clr_acc :: Music -> Music+clr_acc m =+ let rl = [rAcc,cAcc]+ in case m of+ Note x d a -> Note x d (a \\ rl)+ Chord xs d a -> Chord (map clr_acc xs) d a+ _ -> error ("clr_acc at non-note/chord: " ++ ly_music_elem m)++octpc_to_note :: (Octave, PitchClass) -> Music+octpc_to_note x = Note (octpc_to_pitch pc_spell_ks x) Nothing []++-- * Rests++-- | Construct rests.+rest :: Duration -> Music+rest x = Rest x []++-- | Multi-measure variant of 'r'.+mm_rest :: Time_Signature -> Music+mm_rest x = MMRest 1 x []++-- | Non-printing variant of 'rest'.+skip :: Duration -> Music+skip x = Skip x []++-- | Create an empty measure for the specified time signature.+empty_measure :: Integer -> Integer -> Music+empty_measure n d = mconcat [MMRest 1 (n,d) [], bar_line_check]++-- | Like 'empty_measure', but with an invisible rest.+null_measure :: Integer -> Integer -> Music+null_measure n d =+ let x = Duration d 0 1+ l = [bar_line_check]+ in mconcat (map (\i -> Skip i []) (genericReplicate n x) ++ l)++-- | Like 'empty_measure' but write time signature.+measure_rest :: Integer -> Integer -> Music+measure_rest n d = mconcat [time_signature (n,d), empty_measure n d]++-- | Like 'measure_rest' but write time signature.+measure_null :: Integer -> Integer -> Music+measure_null n d = mconcat [time_signature (n,d), null_measure n d]++-- * Tuplets++-- | Apply a 'Duration' function to a 'Music' node, if it has a duration.+edit_dur :: (Duration -> Duration) -> Music -> Music+edit_dur fn x =+ case x of+ Note _ Nothing _ -> x+ Note n (Just d) a -> Note n (Just (fn d)) a+ Chord n d a -> Chord n (fn d) a+ Rest d a -> Rest (fn d) a+ Skip d a -> Skip (fn d) a+ _ -> x++-- | Temporal scaling of music (tuplets).+tuplet :: Tuplet_T -> [Music] -> Music+tuplet (d,n) =+ let fn x = x { multiplier = n%d }+ in Tuplet Normal_Tuplet (n,d) . mconcat . map (edit_dur fn)++-- | Tuplet variants that set location, and then restore to neutral.+tuplet_above,tuplet_below :: Tuplet_T -> [Music] -> Music+tuplet_above n xs = mconcat [tuplet_up, tuplet n xs, tuplet_neutral]+tuplet_below n xs = mconcat [tuplet_down, tuplet n xs, tuplet_neutral]++-- | Like tuplet but does not annotate music, see also+-- 'ts_set_fraction'.+scale_durations :: Tuplet_T -> [Music] -> Music+scale_durations (n,d) =+ let fn x = x { multiplier = d%n }+ in Tuplet Scale_Durations (n,d) . mconcat . map (edit_dur fn)++-- * Time signatures++-- | Construct time signature.+time_signature :: Time_Signature -> Music+time_signature = Time++-- | Allow proper auto-indenting of multiple measures with the same+-- time signature.+with_time_signature :: Time_Signature -> [Music] -> Music+with_time_signature ts xs = mconcat (time_signature ts : xs)++{-+-- | Make a duration to fill a whole measure.+ts_dur :: Time_Signature -> Duration+ts_dur (n,d) = Duration d 0 (fromIntegral n)+-}++-- | Command to request that @4\/4@ and @2\/2@ etc. are typeset as+-- fractions.+ts_use_fractions :: Music+ts_use_fractions =+ let x = "\\override Staff.TimeSignature #'style = #'()"+ in Command (User x) []++-- | Set the printed time-signature fraction.+ts_set_fraction :: Integer -> Integer -> Music+ts_set_fraction n d =+ let x = "#'(" ++ show n ++ " . " ++ show d ++ ")"+ y = "\\set Staff.timeSignatureFraction = " ++ x+ in Command (User y) []++numeric_time_signature :: Music+numeric_time_signature = Command (User "\\numericTimeSignature") []++ts_parentheses :: Music+ts_parentheses =+ let x = "\\override Staff.TimeSignature #'stencil = #(lambda (grob) (bracketify-stencil (ly:time-signature::print grob) Y 0.1 0.2 0.1))"+ in Command (User x) []++ts_stencil :: Bool -> Music+ts_stencil x =+ let c = "\\override Staff.TimeSignature #'stencil = " ++ ly_bool x+ in Command (User c) []++ts_transparent :: Bool -> Music+ts_transparent x =+ let c = "\\override Staff.TimeSignature #'transparent = " ++ ly_bool x+ in Command (User c) []++ts_all_invisible :: Music+ts_all_invisible =+ let c = "\\override Staff.TimeSignature #'break-visibility = #all-invisible"+ in Command (User c) []++-- * Key signatures++-- | Construct key signature.+key :: Music -> Mode_T -> Music+key m md =+ case m of+ (Note (Pitch n a _) _ _) -> Key n (Just a) md+ _ -> error "key"++-- * Repetition++-- | Construct standard (two times) repeat.+std_repeat :: Integer -> [Music] -> Music+std_repeat n = Repeat n . mconcat++-- * Octave++-- | Shift the octave of a note element, else identity.+note_edit_octave :: (Integer -> Integer) -> Music -> Music+note_edit_octave fn m =+ case m of+ Note (Pitch n a o) d xs -> Note (Pitch n a (fn o)) d xs+ _ -> m++-- | Shift the octave of a note element, else identity.+note_shift_octave :: Integer -> Music -> Music+note_shift_octave i = note_edit_octave (+ i)++-- * Duration++-- > tie_r_ann [Tie_Right] == [Begin_Tie]+tie_r_ann :: [D_Annotation] -> [Annotation]+tie_r_ann a = if any (== Tie_Right) a then [Begin_Tie] else []++-- | Rest of 'Duration_A'.+da_rest :: Duration_A -> Music+da_rest (d,_) = Rest d []++-- | Add 'Duration_A' to 'Pitch' to make a @Note@ 'Music' element.+(##@) :: Pitch -> Duration_A -> Music+x ##@ (d,a) = Note x (Just d) (tie_r_ann a)++-- | Add 'Duration' to 'Pitch' to make a @Note@ 'Music' element.+(##) :: Pitch -> Duration -> Music+x ## d = x ##@ (d,[])++-- | Add 'Duration_A' to either a @Note@ or @Chord@ 'Music' element.+(#@) :: Music -> Duration_A -> Music+x #@ (d,a) =+ case x of+ Note n _ a' -> Note n (Just d) (tie_r_ann a ++ a')+ Chord n _ a' -> Chord n d (tie_r_ann a ++ a')+ _ -> error ("###: " ++ show x)++-- | Add 'Duration' to either a @Note@ or @Chord@ 'Music' element.+(#) :: Music -> Duration -> Music+x # d = x #@ (d,[])++-- * Chords++-- | Construct chord.+chd_p :: [Pitch] -> Duration -> Music+chd_p xs d =+ case xs of+ [] -> error "chd_p: null elements"+ _ -> Chord (map (\x -> Note x Nothing []) xs) d []++chd :: [Music] -> Duration -> Music+chd xs d =+ case xs of+ [] -> error "chd: null elements"+ _ -> let fn x = let err msg = error (msg ++ ": " ++ show x)+ in case x of+ Note _ (Just _) _ -> err "chd: note has duration"+ Note _ Nothing _ -> x+ _ -> err "chd: non note element"+ in Chord (map fn xs) d []++-- * Commands++-- | Construct bar number check command.+bar_number_check :: Integer -> Music+bar_number_check n = Command (BarNumberCheck n) []++-- | Switch bar numbering visibility.+bar_numbering :: Bool -> Music+bar_numbering x =+ let r = if x then "#(#t #t #t)" else "#(#f #f #f)"+ s = "\\override Score.BarNumber #'break-visibility = #'" ++ r+ in Command (User s) []++-- | Change staff.+change :: String -> Music+change x = Command (Change x) []++-- | Indicate initial partial measure.+partial :: Duration -> Music+partial d = Command (Partial d) []++-- | Set or unset the @circled-tip@ hairpin attribute.+hairpin_circled_tip :: Bool -> Music+hairpin_circled_tip x =+ let c = if x+ then "\\override Hairpin #'circled-tip = ##t"+ else "\\revert Hairpin #'circled-tip"+ in Command (User c) []++-- | Set or unset the @to-barline@ hairpin attribute.+hairpin_to_barline :: Bool -> Music+hairpin_to_barline x =+ let c = if x+ then "\\revert Hairpin #'to-barline"+ else "\\override Hairpin #'to-barline = ##f"+ in Command (User c) []++-- | Set or unset the @minimum-length@ hairpin attribute.+hairpin_minimum_length :: Maybe Int -> Music+hairpin_minimum_length x =+ let c = case x of+ Nothing -> "\\revert Hairpin #'minimum-length"+ Just n -> "\\override Hairpin #'minimum-length = #" ++ show n+ in Command (User c) []++-- * Staff and Parts++set_8va_notation :: Music+set_8va_notation = Command (User "\\set Staff.ottavation = #\"8\"") []++name_to_id :: Staff_Name -> Staff_ID+name_to_id (x,_) =+ case x of+ "" -> "no_id"+ _ -> "id_" ++ x++-- | Construct staff.+staff :: Staff_Name -> [Music] -> Staff+staff nm =+ let st = Staff_Settings Normal_Staff (name_to_id nm) 0+ in Staff st nm . Part Nothing++-- | Construct rhythmic staff.+rhythmic_staff :: Staff_Name -> [Music] -> Staff+rhythmic_staff nm =+ let st = Staff_Settings Rhythmic_Staff (name_to_id nm) 0+ in Staff st nm . Part Nothing++-- | Construct staff with text underlay.+text_staff :: Staff_Name -> String -> [Music] -> Staff+text_staff nm txt =+ let st = Staff_Settings Normal_Staff (name_to_id nm) 0+ in Staff st nm . Part (Just txt)++-- | Construct piano staff. For two staff piano music the staffs have+-- identifiers rh and lh.+piano_staff :: Staff_Name -> [[Music]] -> Staff+piano_staff nm xs =+ case xs of+ [rh,lh] ->+ let st x = Staff_Settings Normal_Staff x 0+ in Staff_Set+ PianoStaff+ nm+ [Staff (st "rh") ("","") (Part Nothing rh)+ ,Staff (st "lh") ("","") (Part Nothing lh)]+ _ -> Staff_Set PianoStaff nm (map (staff ("","")) xs)++grand_staff :: Staff_Name -> [[Music]] -> Staff+grand_staff nm = Staff_Set GrandStaff nm . map (staff ("",""))++staff_group :: Staff_Name -> [[Music]] -> Staff+staff_group nm = Staff_Set StaffGroup nm . map (staff ("",""))++rhythmic_grand_staff :: Staff_Name -> [[Music]] -> Staff+rhythmic_grand_staff nm = Staff_Set GrandStaff nm . map (rhythmic_staff ("",""))++-- | Variant with names for each staff.+grand_staff' :: Staff_Name -> [Staff_Name] -> [[Music]] -> Staff+grand_staff' nm xs ys = Staff_Set GrandStaff nm (zipWith staff xs ys)++staff_group' :: Staff_Name -> [Staff_Name] -> [[Music]] -> Staff+staff_group' nm xs ys = Staff_Set StaffGroup nm (zipWith staff xs ys)++two_part_staff :: Staff_Name -> ([Music], [Music]) -> Staff+two_part_staff nm (p0, p1) =+ let st = Staff_Settings Normal_Staff (name_to_id nm) 0+ in Staff st nm (MultipleParts [voice_one:p0+ ,voice_two:p1])++instr_name :: Staff_Name -> Staff -> Staff+instr_name nm pt =+ case pt of+ Staff st _ x -> Staff st nm x+ Staff_Set ty _ xs -> Staff_Set ty nm xs++resize_staff :: Int -> Staff -> Staff+resize_staff n st =+ case st of+ Staff (Staff_Settings ty i sc) nm pt ->+ Staff (Staff_Settings ty i (sc + n)) nm pt+ Staff_Set ty nm xs ->+ Staff_Set ty nm (map (resize_staff n) xs)++score :: [Staff] -> Score+score = Score default_score_settings++-- | Interior polyphony. For two part music on one staff see+-- 'two_part_staff'.+polyphony :: Music -> Music -> Music+polyphony = Polyphony++polyphony' :: [Music] -> [Music] -> Music+polyphony' x y = polyphony (mconcat x) (mconcat y)++-- * Rests++-- | Joins directly adjacent rest elements.+join_rests :: [Music] -> [Music]+join_rests =+ let fn recur xs =+ case xs of+ [] -> []+ Rest d a : Rest d' a' : ys ->+ case sum_dur d d' of+ Nothing -> let zs = Rest d a : join_rests (Rest d' a' : ys)+ in if recur then fn False zs else zs+ Just d'' -> join_rests (Rest d'' (a ++ a') : ys)+ y:ys -> y : join_rests ys+ in fn True++-- * 'Duration_A' functions++-- | Transform ascribed 'Duration_A' value to 'Music'.+type DA_F x = (Duration_A,x) -> Music++-- | Given 'DA_F' transform, transform set of ascribed 'Duration_A'+-- values to 'Music'.+--+-- > import Music.Theory.Duration.Sequence.Notate+-- > import Music.Theory.Duration.RQ.Tied+-- > import Music.Theory.Pitch.Name+-- > import Music.LilyPond.Light.Output.LilyPond+--+-- > let {Just d = m_notate True [[(2/3,_f),(1/3,_t)],[(1,_t)],[(1,_f)]]+-- > ;jn (i,j) = j ##@ i+-- > ;n = ascribe d [c4,d4]+-- > ;r = "\\times 2/3 { c' 4 d' 8 ~ } d' 4 ~ d' 4"}+-- > in ly_music_elem (Join (da_to_music jn n)) == r+da_to_music :: DA_F t -> [(Duration_A,t)] -> [Music]+da_to_music fn x =+ let g = da_group_tuplets_nn (map fst x)+ g' = nn_reshape (,) g (map snd x)+ tr el = case el of+ Left i -> fn i+ Right y -> let (y0,_):_ = y+ (n,d,_) = fromJust (da_begin_tuplet y0)+ in Tuplet Normal_Tuplet (d,n) (Join (map fn y))+ in map tr g'++-- | Variant of 'da_to_music' that operates on sets of measures.+da_to_measures :: DA_F x -> Maybe [Time_Signature] -> [[(Duration_A,x)]] -> [Measure]+da_to_measures fn m_t x =+ let m = map (da_to_music fn) x+ jn i = Measure [i]+ in case m_t of+ Just t -> zipWith jn (map Time t) m+ Nothing -> map (Measure []) m++-- * Fragment++-- | Make a fragment from a list of 'Music' elements. Width and+-- height are in millimeters.+mk_fragment :: (Double, Double) -> [Music] -> Fragment+mk_fragment (w,h) m =+ let pr = mk_fragment_paper w h+ in Fragment default_version pr (Join m)++-- | 'Measure' variant of 'mk_fragment'.+mk_fragment_mm :: (Double, Double) -> [Measure] -> Fragment+mk_fragment_mm d = mk_fragment d . mm_elements++-- * Stem++stem_transparent :: Bool -> Music+stem_transparent x =+ let c = "\\override Stem #'transparent = " ++ ly_bool x+ in Command (User c) []++-- * Text++text_length_on :: Music+text_length_on = Command (User "\\textLengthOn") []++text_outside_staff_priority :: Maybe Double -> Music+text_outside_staff_priority x =+ let pr = case x of+ Nothing -> ly_bool False+ Just n -> '#' : show n+ s = "\\override TextScript #'outside-staff-priority = " ++ pr+ in Command (User s) []++text_extra_spacing_width :: (Double,Double) -> Music+text_extra_spacing_width (i,j) =+ let t = "\\override TextScript #'extra-spacing-width = #'(%f . %f)"+ s = printf t i j+ in Command (User s) []++-- * Measure operations++-- | Delete redundant (repeated) time signatures.+--+-- > let mm = [Measure [Time (3,4)] [],Measure [Time (3,4)] []]+-- > in mm_delete_redundant_ts mm == [Measure [Time (3,4)] [],Measure [] []]+mm_delete_redundant_ts :: [Measure] -> [Measure]+mm_delete_redundant_ts =+ let f st m = let Measure a n = m+ ts = find is_time a+ in case (st,ts) of+ (Just p,Just q) -> if p == q+ then (st,Measure (delete q a) n)+ else (ts,m)+ (_,Just _) -> (ts,m)+ _ -> (st,m)+ in snd . mapAccumL f Nothing
Music/LilyPond/Light/Output/LilyPond.hs view
@@ -1,10 +1,21 @@-module Music.LilyPond.Light.Output.LilyPond (ly_work- ,ly_music_elem) where+module Music.LilyPond.Light.Output.LilyPond+ (ly_work+ ,ly_fragment+ ,ly_music_elem+ ,ly_process,ly_process_cwd+ ,Lilypond(..)) where +import Data.Char import Music.LilyPond.Light.Model+import qualified Music.Theory.Clef as C {- hmt -} import Music.Theory.Pitch import Music.Theory.Duration+import Music.Theory.Dynamic_Mark import Music.Theory.Key+import System.Directory {- directory -}+import System.Exit+import System.FilePath {- filepath -}+import System.Process {- process -} import Text.Printf with_brackets :: (String,String) -> [String] -> [String]@@ -22,10 +33,6 @@ ly_assign :: (String -> String) -> (String,String) -> [String] ly_assign fn (key,value) = [key,"=",fn value] -ly_bool :: Bool -> String-ly_bool True = "##t"-ly_bool False = "##f"- ly_units :: Units -> String ly_units x = case x of@@ -53,9 +60,11 @@ ,("paper-height", ly_length (paper_height p)) ,("ragged-last", ly_bool (ragged_last p)) ,("ragged-last-bottom", ly_bool (ragged_last_bottom p))+ ,("ragged-right", ly_bool (ragged_right p)) ,("systems-per-page", maybe "" show (systems_per_page p)) ,("top-margin", ly_length (top_margin p))- ,("two-sided", ly_bool tw)]+ ,("two-sided", ly_bool tw)+ ,("print-page-number", ly_bool (print_page_number p))] ys = ly_delete_nil_values (xs ++ mg) in "\\paper" : with_braces (concatMap (ly_assign id) ys) @@ -68,17 +77,17 @@ ,("tagline", tagline hdr)] in "\\header" : with_braces (concatMap (ly_assign ly_str) xs) -ly_clef_t :: Clef_T -> String+ly_clef_t :: C.Clef_T -> String ly_clef_t c = case c of- Treble -> "treble"- Alto -> "alto"- Tenor -> "tenor"- Bass -> "bass"- Percussion -> "percussion"+ C.Treble -> "treble"+ C.Alto -> "alto"+ C.Tenor -> "tenor"+ C.Bass -> "bass"+ C.Percussion -> "percussion" -ly_clef :: Clef_T -> Int -> String-ly_clef c o =+ly_clef :: C.Clef Int -> String+ly_clef (C.Clef c o) = let o' = case o of (-2) -> "_15" (-1) -> "_8"@@ -90,31 +99,10 @@ else concat ["\"", ly_clef_t c, o', "\""] ly_note :: Note_T -> String-ly_note n =- case n of- C -> "c"- D -> "d"- E -> "e"- F -> "f"- G -> "g"- A -> "a"- B -> "b"--ly_alteration :: Alteration_T -> String-ly_alteration a =- case a of- DoubleFlat -> "eses"- ThreeQuarterToneFlat -> "eseh"- Flat -> "es"- QuarterToneFlat -> "eh"- Natural -> ""- QuarterToneSharp -> "ih"- Sharp -> "is"- ThreeQuarterToneSharp -> "isih"- DoubleSharp -> "isis"+ly_note = map toLower . show ly_alteration' :: Maybe Alteration_T -> String-ly_alteration' = maybe "" ly_alteration+ly_alteration' = maybe "" alteration_ly_name ly_alteration_rule :: [Annotation] -> String ly_alteration_rule xs@@ -140,7 +128,7 @@ ly_pitch :: [Annotation] -> Pitch -> String ly_pitch xs (Pitch n a o) = ly_note n ++- ly_alteration a +++ alteration_ly_name a ++ ly_octave o ++ ly_alteration_rule xs @@ -168,24 +156,18 @@ Trill -> "\\trill" UpBow -> "\\upbow" +ly_hairpin_t :: Hairpin_T -> String+ly_hairpin_t h =+ case h of+ Crescendo -> "\\<"+ Diminuendo -> "\\>"+ End_Hairpin -> "\\!"+ ly_dynamic :: Dynamic_T -> String ly_dynamic d = case d of- PPPP -> "\\pppp"- PPP -> "\\ppp"- Pianissimo -> "\\pp"- Piano -> "\\p"- MezzoPiano -> "\\mp"- MezzoForte -> "\\mf"- Forte -> "\\f"- Fortissimo -> "\\ff"- FFF -> "\\fff"- FFFF -> "\\ffff"- FP -> "\\fp"- SFZ -> "\\sfz"- Begin_Crescendo -> "\\<"- Begin_Decrescendo -> "\\>"- End_Dynamic -> "\\!"+ Dynamic_Mark m -> '\\' : map toLower (show m)+ Hairpin h -> ly_hairpin_t h Espressivo -> "\\espressivo" ly_fraction :: (Integer,Integer) -> String@@ -217,9 +199,11 @@ Dynamic x -> ly_dynamic x Phrasing x -> ly_phrasing x Begin_Tie -> "~"- Above -> "^"- Below -> "_"- Text x -> ly_str x+ Place_Above -> "^"+ Place_Below -> "_"+ Text_Mark -> "\\mark"+ Text Text_Plain x -> ly_str x+ Text Text_Markup x -> "\\markup {" ++ x ++ "}" CompositeAnnotation xs -> unwords (map ly_annotation xs) ReminderAccidental -> "" -- see ly_pitch CautionaryAccidental -> "" -- see ly_pitch@@ -284,7 +268,7 @@ Rest d aa -> ["r", ly_duration d] ++ map ly_annotation aa MMRest i (j,k) aa -> let d = printf "R %d*%d " k (i*j) in d : map ly_annotation aa- Skip d -> ["\\skip", ly_duration d]+ Skip d aa -> ["\\skip", ly_duration d] ++ map ly_annotation aa Repeat n x -> ["\\repeat", "volta", show n] ++ with_braces (ly_music x) Tuplet o n x -> let (o',n') =@@ -294,13 +278,15 @@ in [o', n'] ++ with_braces (ly_music x) Grace x -> "\\grace" : with_braces (ly_music x) AfterGrace x0 x1 -> "\\afterGrace" : concatMap ly_music [x0, x1]- Clef c o -> ["\\clef", ly_clef c o]+ Clef c -> ["\\clef", ly_clef c] Time n -> ["\\time", ly_fraction n] Key n a md -> ["\\key" ,ly_note n ++ ly_alteration' a ,ly_key_mode md]- Tempo d r -> ["\\tempo", ly_duration d, "=", show r]- Command x -> [ly_command x]+ Tempo d r ->+ let r' = floor r :: Integer+ in ["\\tempo", ly_duration d, "=", show r']+ Command x aa -> ly_command x : map ly_annotation aa Join xs -> concatMap ly_music xs Polyphony x1 x2 -> ["\\simultaneous", "{"] ++ with_braces (ly_music x1) ++@@ -383,6 +369,15 @@ ," \\consists \"Default_bar_line_engraver\"" ," }"] +ly_remove_empty_staves :: Bool -> [String]+ly_remove_empty_staves g =+ ["\\context {"+ ," \\Staff \\RemoveEmptyStaves"+ ,if g+ then " \\override VerticalAxisGroup #'remove-first = ##t"+ else ""+ ,"}"]+ ly_layout :: Score_Settings -> [String] ly_layout x = let mk_i = printf "\\context { \\%s \\consists \"Instrument_name_engraver\"}"@@ -391,6 +386,9 @@ ,if independent_time_signatures x then unlines ly_independent_time_signatures else ""+ ,if remove_empty_staves x+ then unlines (ly_remove_empty_staves (remove_empty_staves_first_system x))+ else "" ,is ,"}"] @@ -400,6 +398,7 @@ xs'' = with_braces ("\\simultaneous" : xs' ++ ly_layout pr) in "\\score" : xs'' +-- | Translate 'Work' to lilypond source code. ly_work :: Work -> String ly_work (Work v p hdr sc) = let xs = ly_version v ++@@ -408,5 +407,39 @@ ly_score sc in unwords xs +-- | Translate 'Music' element to lilypond source code.+--+-- > import Music.LilyPond.Light+-- > import Music.Theory.Duration.Name.Abbreviation+-- > ly_music_elem (Join [c4#q',e4#h]) == "c' 4. e' 2" ly_music_elem :: Music -> String ly_music_elem = unwords . ly_music++ly_fragment :: Fragment -> String+ly_fragment (Fragment v p m) =+ unlines (ly_version v +++ ly_paper p +++ ly_header default_header +++ with_braces [ly_music_elem m])++class Lilypond a where ly_notate :: a -> String+instance Lilypond Score where ly_notate = unlines . ly_score+instance Lilypond Work where ly_notate = ly_work+instance Lilypond Fragment where ly_notate = ly_fragment++-- | Notate 'Lilypond' value, write to file, and run @lilypond@ to+-- generate output in 'Format'.+ly_process :: Lilypond a => FilePath -> Format -> String -> a -> IO ExitCode+ly_process dir fmt nm ly = do+ let fmt' = map toLower (show fmt)+ o_fn = dir </> nm+ ly_fn = o_fn <.> "ly"+ cmd = printf "lilypond --%s -o %s %s" fmt' o_fn ly_fn+ writeFile ly_fn (ly_notate ly)+ system cmd++-- | Variant of 'ly_process' using current working directory.+ly_process_cwd :: Lilypond a => Format -> String -> a -> IO ExitCode+ly_process_cwd fmt nm ly = do+ d <- getCurrentDirectory+ ly_process d fmt nm ly
README view
@@ -1,11 +1,12 @@ hly - minimalist haskell lilypond+--------------------------------- -A very lightweight embedding of the lilypond-typesetting model in haskell+A very lightweight embedding of the [lilypond][ly]+typesetting model in [haskell][hs]. - http://slavepianos.org/rd/?t=hly- http://haskell.org/- http://lilypond.org/+© [rohan drape][rd], 2010-2012, [gpl] -(c) rohan drape, 2010-2011- gpl, http://gnu.org/copyleft/+[ly]: http://lilypond.org/+[hs]: http://haskell.org/+[rd]: http://rd.slavepianos.org/+[gpl]: http://gnu.org/copyleft/
+ help/hly.help.lhs view
@@ -0,0 +1,17 @@+> import Music.Theory.Duration.Sequence.Notate+> import Music.Theory.Duration.Annotation+> import Music.Theory.Duration.RQ.Tied+> import Music.LilyPond.Light++++> let {ts = [(3,4),(2,4),(3,4)]+> ;rq = [2/3,7/3,1,3/5,2/5+1/3,2/3,3/2,1/2]+> ;ps = [c4,d4,e4,f4,g4,a4,b4,c5]+> ;sr = default_rule []+> ;Just n = notate sr ts rq+> ;a = mm_ascribe n ps+> ;jn (i,j) = j #@ i+> ;m = da_to_measures jn ts a+> ;fr = mk_fragment_mm (105,20) m}+> in ly_process_cwd PNG "hly-00" fr
hly.cabal view
@@ -1,31 +1,40 @@ Name: hly-Version: 0.11+Version: 0.12 Synopsis: Haskell LilyPond Description: A very lightweight embedding of the lilypond typesetting model in haskell License: GPL Category: Music-Copyright: (c) Rohan Drape, 2010-2011+Copyright: (c) Rohan Drape, 2010-2012 Author: Rohan Drape Maintainer: rd@slavepianos.org Stability: Experimental-Homepage: http://slavepianos.org/rd/?t=hly-Tested-With: GHC == 7.2.2+Homepage: http://rd.slavepianos.org/?t=hly+Tested-With: GHC == 7.6.1 Build-Type: Simple Cabal-Version: >= 1.8 Data-Files: README+ help/*.help.lhs Library Build-Depends: base==4.*,- hmt==0.11.*+ directory,+ filepath,+ hmt==0.12.*,+ process GHC-Options: -Wall -fwarn-tabs Exposed-modules: Music.LilyPond.Light Music.LilyPond.Light.Analysis+ Music.LilyPond.Light.Annotation Music.LilyPond.Light.Constant- Music.LilyPond.Light.Constant.NoteName+ Music.LilyPond.Light.Constant.Dynamic+ Music.LilyPond.Light.Constant.Note+ Music.LilyPond.Light.Literal+ Music.LilyPond.Light.Measure Music.LilyPond.Light.Model+ Music.LilyPond.Light.Notation Music.LilyPond.Light.Output.LilyPond Source-Repository head Type: darcs- Location: http://slavepianos.org/rd/sw/hly+ Location: http://rd.slavepianos.org/sw/hly