X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=ly%2Fevent-listener.ly;h=4627aaa23c2760d87e096a2227aa85426f741f9d;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=9b5a706da4c0431c5cecb52c448e5e62c025a745;hpb=c5b3c95dfb1ceb9c6604ee4d606bbf7ffb8b924c;p=lilypond.git diff --git a/ly/event-listener.ly b/ly/event-listener.ly index 9b5a706da4..4627aaa23c 100644 --- a/ly/event-listener.ly +++ b/ly/event-listener.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2011 Graham Percival +%%%% Copyright (C) 2011--2015 Graham Percival %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -32,18 +32,16 @@ -\version "2.13.57" +\version "2.16.0" %%%% Helper functions -#(define (filename-from-staffname engraver) +#(define (filename-from-staffname context) "Constructs a filename in the form @file{@var{original_filename}-@var{staff_instrument_name}.notes} if the staff has an instrument name. If the staff has no instrument -name, it uses "unnamed-staff" for that part of the filename." - (let* ((inst-name (ly:context-property - (ly:translator-context engraver) - 'instrumentName))) +name, it uses \"unnamed-staff\" for that part of the filename." + (let* ((inst-name (ly:context-property context 'instrumentName))) (string-concatenate (list (substring (object->string (command-line)) ;; filename without .ly part @@ -60,55 +58,54 @@ name, it uses "unnamed-staff" for that part of the filename." (/ (ly:moment-main-numerator moment) (ly:moment-main-denominator moment)))) -#(define (adjust-for-grace moment) - "Adjusts any moment with a grace note by subtracting half of -the grace note duration. For example, an eighth note grace note -which would otherwise occur at score time 0.5 will now occur at -score time 0.375." +#(define (moment-grace->string moment) + "Prints a moment without grace note(s) as a float such as +0.25000. Grace notes are written with the grace duration as a +separate \"dashed\" number, i.e. 0.25000-0.12500. This allows any +program using the output of this function to interpret grace notes +however they want (half duration, quarter duration? before beat, +after beat? etc.)." (if - (eq? 0 (ly:moment-grace-numerator moment)) - moment - ;; get moment including grace note - ;; grace notes have a negative numerator, so add - (ly:moment-add moment - ;; make the "grace duration" half as long - (ly:moment-mul - (ly:make-moment 1 2) + (zero? (ly:moment-grace-numerator moment)) + (ly:format "~a" (format-moment moment)) + ;; grace notes have a negative numerator, so no "-" necessary + (ly:format + "~a~a" + (format-moment moment) + (format-moment (ly:make-moment (ly:moment-grace-numerator moment) (ly:moment-grace-denominator moment)))))) -#(define (get-moment moment) - (format-moment (adjust-for-grace - moment))) - -#(define (make-output-string-line engraver values) +#(define (make-output-string-line context values) "Constructs a tab-separated string beginning with the -score time (derived from the engraver) and then adding all the +score time (derived from the context) and then adding all the values. The string ends with a newline." - (let* ((context (ly:translator-context engraver)) - (moment (ly:context-current-moment context))) + (let* ((moment (ly:context-current-moment context))) (string-append (string-join - (map - (lambda (x) (ly:format "~a" x)) - (append - (list (get-moment moment)) - values)) - "\t") + (append + (list (moment-grace->string moment)) + (map + (lambda (x) (ly:format "~a" x)) + values)) + "\t") "\n"))) -#(define (print-line engraver . values) +#(define (print-line context . values) "Prints the list of values (plus the score time) to a file, and -optionally outputs to the console as well." - (let* ((p (open-file (filename-from-staffname engraver) "a"))) +optionally outputs to the console as well. context may be specified +as an engraver for convenience." + (if (ly:translator? context) + (set! context (ly:translator-context context))) + (let* ((p (open-file (filename-from-staffname context) "a"))) ;; for regtest comparison (if (defined? 'EVENT_LISTENER_CONSOLE_OUTPUT) (ly:progress - (make-output-string-line engraver values))) + (make-output-string-line context values))) (display - (make-output-string-line engraver values) + (make-output-string-line context values) p) (close p))) @@ -119,7 +116,9 @@ optionally outputs to the console as well." (print-line engraver "rest" (ly:duration->string - (ly:event-property event 'duration)))) + (ly:event-property event 'duration)) + (format-moment (ly:duration-length + (ly:event-property event 'duration))))) #(define (format-note engraver event) (let* ((origin (ly:input-file-line-char-column @@ -129,6 +128,8 @@ optionally outputs to the console as well." ;; get a MIDI pitch value. (+ 60 (ly:pitch-semitones (ly:event-property event 'pitch))) + (ly:duration->string + (ly:event-property event 'duration)) (format-moment (ly:duration-length (ly:event-property event 'duration))) ;; point and click info @@ -150,6 +151,14 @@ optionally outputs to the console as well." (print-line engraver "breathe")) +#(define (format-glissando engraver event) + (print-line engraver + "gliss")) + +#(define (format-tie engraver event) + (print-line engraver + "tie")) + #(define (format-articulation engraver event) (print-line engraver "script" @@ -183,8 +192,8 @@ optionally outputs to the console as well." #(define (format-textspan engraver event) (let* ((context (ly:translator-context engraver)) (moment (ly:context-current-moment context)) - (spanner-props (ly:context-property context 'TextSpanner)) - (details (chain-assoc-get 'bound-details spanner-props)) + (spanner-props (ly:context-grob-definition context 'TextSpanner)) + (details (assoc-get 'bound-details spanner-props)) (left-props (assoc-get 'left details '())) (left-text (assoc-get 'text left-props '()))) (print-line engraver @@ -200,20 +209,20 @@ optionally outputs to the console as well." \layout { \context { \Voice - \consists #(list - (cons 'listeners - (list - (cons 'tempo-change-event format-tempo) - (cons 'rest-event format-rest) - (cons 'note-event format-note) - (cons 'articulation-event format-articulation) - (cons 'text-script-event format-text) - (cons 'slur-event format-slur) - (cons 'breathing-event format-breathe) - (cons 'dynamic-event format-dynamic) - (cons 'crescendo-event format-cresc) - (cons 'decrescendo-event format-decresc) - (cons 'text-span-event format-textspan) - ))) + \consists #(make-engraver + (listeners + (tempo-change-event . format-tempo) + (rest-event . format-rest) + (note-event . format-note) + (articulation-event . format-articulation) + (text-script-event . format-text) + (slur-event . format-slur) + (breathing-event . format-breathe) + (dynamic-event . format-dynamic) + (crescendo-event . format-cresc) + (decrescendo-event . format-decresc) + (text-span-event . format-textspan) + (glissando-event . format-glissando) + (tie-event . format-tie))) } }