X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fdefine-event-classes.scm;h=15aaab53df0d40dc1c9ba610bf561839432c0cfa;hb=ee0ef98a35634718033d505deb8a355e05513d6a;hp=c98d603cf646ccbde41ae09a230e3dcc7064bd0b;hpb=e93d8c812c66f040fe997488b4c83e1b89e28e87;p=lilypond.git diff --git a/scm/define-event-classes.scm b/scm/define-event-classes.scm index c98d603cf6..15aaab53df 100644 --- a/scm/define-event-classes.scm +++ b/scm/define-event-classes.scm @@ -1,8 +1,19 @@ -;;;; stream-event-classes.scm -- define the tree of stream-event classes. +;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; source file of the GNU LilyPond music typesetter +;;;; Copyright (C) 2005--2012 Erik Sandberg ;;;; -;;;; (c) 2005-2006 Erik Sandberg +;;;; LilyPond is free software: you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation, either version 3 of the License, or +;;;; (at your option) any later version. +;;;; +;;;; LilyPond is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with LilyPond. If not, see . (use-modules (srfi srfi-1)) @@ -14,50 +25,68 @@ (RemoveContext ChangeParent Override Revert UnsetProperty SetProperty music-event OldMusicEvent CreateContext Prepare OneTimeStep Finish)) - (music-event . (arpeggio-event breathing-event extender-event span-event - rhythmic-event dynamic-event break-event percent-event - key-change-event string-number-event tie-event part-combine-event - metronome-change-event beam-forbid-event script-event + (music-event . (annotate-output-event footnote-event + arpeggio-event breathing-event extender-event span-event + rhythmic-event dynamic-event break-event label-event percent-event + key-change-event string-number-event stroke-finger-event tie-event + part-combine-event part-combine-force-event + beam-forbid-event script-event tempo-change-event tremolo-event bend-after-event fingering-event glissando-event harmonic-event hyphen-event laissez-vibrer-event mark-event multi-measure-text-event note-grouping-event pes-or-flexa-event repeat-tie-event spacing-section-event - layout-instruction-event)) + layout-instruction-event completize-extender-event break-span-event + alternative-event)) + + (layout-instruction-event . (apply-output-event)) (script-event . (articulation-event text-script-event)) - (part-combine-event . (solo1-event solo2-event unisono-event)) + (part-combine-event . (solo-one-event solo-two-event unisono-event)) (break-event . (line-break-event page-break-event page-turn-event)) (dynamic-event . (absolute-dynamic-event)) - (span-event . (span-dynamic-event beam-event ligature-event - pedal-event phrasing-slur-event slur-event staff-span-event - text-span-event trill-span-event tremolo-span-event - tuplet-span-event)) + (span-event . (span-dynamic-event beam-event episema-event ligature-event + measure-counter-event pedal-event + phrasing-slur-event slur-event + staff-span-event text-span-event + trill-span-event tremolo-span-event + tuplet-span-event)) (span-dynamic-event . (decrescendo-event crescendo-event)) + (break-span-event . (break-dynamic-span-event break-slur-event + break-phrasing-slur-event )) (pedal-event . (sostenuto-event sustain-event una-corda-event)) (rhythmic-event . (lyric-event melodic-event multi-measure-rest-event - rest-event skip-event bass-figure-event)) + double-percent-event percent-event + repeat-slash-event rest-event + skip-event bass-figure-event)) (melodic-event . (cluster-note-event note-event)) (() . (Announcement)) (Announcement . (AnnounceNewContext)) )) -;; Maps event-class to a list of ancestors (inclusive) -(define ancestor-lookup (make-hash-table)) +(define-public (event-class-cons class parent classlist) + (let ((lineage (assq parent classlist))) + (if (not lineage) + (begin + (if (not (null? parent)) + (ly:warning (_ "unknown parent class `~a'") parent)) + (set! lineage '()))) + (if (symbol? class) + (acons class lineage classlist) + (fold (lambda (elt alist) + (acons elt lineage alist)) + classlist class)))) ;; Each class will be defined as ;; (class parent grandparent .. ) ;; so that (eq? (cdr class) parent) holds. -(for-each - (lambda (rel) - (for-each - (lambda (type) - (hashq-set! ancestor-lookup type - (cons type (hashq-ref ancestor-lookup (car rel) '())))) - (cdr rel))) - event-classes) -;; TODO: Allow entering more complex classes, by taking unions. -(define-public (ly:make-event-class leaf) - (hashq-ref ancestor-lookup leaf)) +(define-public (ly:in-event-class? ev cl) + "Does event @var{ev} belong to event class @var{cl}?" + (memq cl (ly:event-property ev 'class))) + +(define-public all-event-classes + (fold (lambda (elt classlist) + (event-class-cons (cdr elt) (car elt) classlist)) + '() event-classes)) ;; does this exist in guile already? (define (map-tree f t) @@ -75,12 +104,6 @@ (cons root (map expand-event-tree (cdr children))) root))) -;; All leaf event classes that no translator listens to -;; directly. Avoids printing a warning. -(define unlistened-music-event-classes - '(harmonic-event line-break-event page-break-event page-turn-event - solo1-event solo2-event skip-event unisono-event)) - ;; produce neater representation of music event tree. ;; TODO: switch to this representation for the event-classes list? (define music-event-tree (expand-event-tree 'music-event)) @@ -101,22 +124,6 @@ ;;(use-modules (ice-9 pretty-print)) ;;(pretty-print (cons (car music-event-tree) (sort-tree (cdr music-event-tree)))) -;; check that the music event tree corresponds well with the set of -;; available translators; print warnings otherwise. -(map-tree (lambda (sym) - (if (and (symbol? sym) - (not (ly:is-listened-event-class sym)) - (not (assq sym event-classes)) - (not (memq sym unlistened-music-event-classes))) - (ly:programming-error (_ "event class ~A seems to be unused") sym))) - music-event-tree) - -(map (lambda (sym) - (if (not (pair? (ly:make-event-class sym))) - ;; should be programming-error - (ly:error (_ "translator listens to nonexisting event class ~A") sym))) - (ly:get-listened-event-classes)) - (defmacro-public make-stream-event (expr) (Stream_event::undump (primitive-eval (list 'quasiquote expr)))) @@ -127,14 +134,14 @@ ((pair? e) (cons (simplify (car e)) (simplify (cdr e)))) ((ly:stream-event? e) - (list 'unquote `(make-stream-event ,(simplify (Stream_event::dump e))))) + (list 'unquote (list 'make-stream-event (simplify (Stream_event::dump e))))) ((ly:music? e) (list 'unquote (music->make-music e))) ((ly:moment? e) (list 'unquote `(ly:make-moment ,(ly:moment-main-numerator e) ,(ly:moment-main-denominator e) - . ,(if (eq? 0 (ly:moment-grace-numerator e)) + . ,(if (zero? (ly:moment-grace-numerator e)) '() (list (ly:moment-grace-numerator e) (ly:moment-grace-denominator e)))))) @@ -142,8 +149,7 @@ (list 'unquote `(ly:make-duration ,(ly:duration-log e) ,(ly:duration-dot-count e) - ,(car (ly:duration-factor e)) - ,(cdr (ly:duration-factor e))))) + ,(ly:duration-scale)))) ((ly:pitch? e) (list 'unquote `(ly:make-pitch ,(ly:pitch-octave e) @@ -154,8 +160,4 @@ (#t e))) (define-public (ly:simplify-scheme e) - (list 'quasiquote (simplify e)) -) - -; used by lily/dispatcher.cc -(define-public (car< a b) (< (car a) (car b))) + (list 'quasiquote (simplify e)))