%%%% This file is part of LilyPond, the GNU music typesetter.
%%%%
-%%%% Copyright (C) 2011 Graham Percival <graham@percival-music.ca>
+%%%% Copyright (C) 2011--2015 Graham Percival <graham@percival-music.ca>
%%%%
%%%% LilyPond is free software: you can redistribute it and/or modify
%%%% it under the terms of the GNU General Public License as published by
-\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)))
+ (let* ((inst-name (ly:context-property context 'instrumentName)))
(string-concatenate (list
(substring (object->string (command-line))
;; filename without .ly part
(/ (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)))
(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
;; 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
(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"
#(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
\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)))
}
}