From: Han-Wen Nienhuys Date: Wed, 4 Oct 2006 10:32:27 +0000 (+0000) Subject: * scm/define-grobs.scm (all-grob-descriptions): use callback to X-Git-Tag: cvs/HEAD~21 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=1f6390c76c5bbe70c51789785d4e04ee236340bc;p=lilypond.git * scm/define-grobs.scm (all-grob-descriptions): use callback to calc dot count. * lily/dots-engraver.cc (class Dots_engraver): new engraver: handle dot creation separately. * lily/tab-note-heads-engraver.cc (process_music): idem. * lily/drum-note-engraver.cc (process_music): idem. * lily/note-heads-engraver.cc (process_music): idem. * lily/rest-engraver.cc: don't set duration-log. * scm/output-lib.scm (string-number::calc-text): new function. (note-head::calc-duration-log): new function. * lily/fingering-engraver.cc (make_script): remove 'text setting. * scm/output-lib.scm (fingering::calc-text): new function. --- diff --git a/ChangeLog b/ChangeLog index 7c7ad1a10f..a58c531af6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2006-10-04 Han-Wen Nienhuys + + * scm/define-grobs.scm (all-grob-descriptions): use callback to + calc dot count. + + * lily/dots-engraver.cc (class Dots_engraver): new engraver: + handle dot creation separately. + + * lily/tab-note-heads-engraver.cc (process_music): idem. + + * lily/drum-note-engraver.cc (process_music): idem. + + * lily/note-heads-engraver.cc (process_music): idem. + + * lily/rest-engraver.cc: don't set duration-log. + + * scm/output-lib.scm (string-number::calc-text): new function. + (note-head::calc-duration-log): new function. + + * lily/fingering-engraver.cc (make_script): remove 'text setting. + + * scm/output-lib.scm (fingering::calc-text): new function. + 2006-10-04 Mats Bengtsson * scripts/lilypond-book.py: Fix typo gs-load-font -> gs-load-fonts diff --git a/lily/ambitus-engraver.cc b/lily/ambitus-engraver.cc index 1321c5bf6e..6590b0a1cb 100644 --- a/lily/ambitus-engraver.cc +++ b/lily/ambitus-engraver.cc @@ -184,7 +184,12 @@ Ambitus_engraver::finalize () ADD_ACKNOWLEDGER (Ambitus_engraver, note_head); ADD_TRANSLATOR (Ambitus_engraver, /* doc */ "", - /* create */ "Ambitus AmbitusLine AmbitusNoteHead AmbitusAccidental", + /* create */ + "Ambitus " + "AmbitusLine " + "AmbitusNoteHead " + "AmbitusAccidental", + /* accept */ "", /* read */ "", /* write */ ""); diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index 69cd4b0785..fb67686f96 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -295,7 +295,15 @@ ADD_TRANSLATOR (Completion_heads_engraver, /* doc */ "This engraver replaces " "@code{Note_heads_engraver}. It plays some trickery to " "break long notes and automatically tie them into the next measure.", - /* create */ "NoteHead Dots Tie", + /* create */ + "NoteHead " + "Dots " + "Tie", + /* accept */ "note-event", - /* read */ "middleCPosition measurePosition measureLength", + /* read */ + "middleCPosition " + "measurePosition " + "measureLength", + /* write */ ""); diff --git a/lily/dots-engraver.cc b/lily/dots-engraver.cc new file mode 100644 index 0000000000..1b34354e43 --- /dev/null +++ b/lily/dots-engraver.cc @@ -0,0 +1,65 @@ +/* + dots-engraver.cc -- implement Dots_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2006 Han-Wen Nienhuys + +*/ + +#include "engraver.hh" +#include "duration.hh" +#include "item.hh" +#include "rhythmic-head.hh" +#include "stream-event.hh" + +#include "translator.icc" + + +class Dots_engraver : public Engraver +{ + DECLARE_ACKNOWLEDGER(rhythmic_head); + TRANSLATOR_DECLARATIONS(Dots_engraver); +}; + +Dots_engraver::Dots_engraver () +{ +} + +void +Dots_engraver::acknowledge_rhythmic_head (Grob_info gi) +{ + Stream_event *cause = gi.event_cause (); + if (!cause) + return; + + Grob *note = gi.grob (); + if (unsmob_grob (note->get_object ("dot"))) + return; + + Duration dur = *unsmob_duration (cause->get_property ("duration")); + if (dur.dot_count ()) + { + Item *d = make_item ("Dots", note->self_scm ()); + Rhythmic_head::set_dots (note, d); + d->set_parent (note, Y_AXIS); + } +} + + +ADD_ACKNOWLEDGER(Dots_engraver, rhythmic_head); + +ADD_TRANSLATOR(Dots_engraver, + "Create @ref{Dots} objects for @ref{rhythmic-head-interface}s.", + + /* create */ + "Dots ", + + /*acc*/ + "", + + /*r*/ + "" , + + /*w*/ + ""); diff --git a/lily/drum-note-engraver.cc b/lily/drum-note-engraver.cc index 5adc23d7eb..c9dd52b8e6 100644 --- a/lily/drum-note-engraver.cc +++ b/lily/drum-note-engraver.cc @@ -22,7 +22,6 @@ using namespace std; class Drum_notes_engraver : public Engraver { vector notes_; - vector dots_; vector scripts_; vector events_; @@ -60,24 +59,6 @@ Drum_notes_engraver::process_music () Stream_event *ev = events_[i]; Item *note = make_item ("NoteHead", ev->self_scm ()); - Duration dur = *unsmob_duration (ev->get_property ("duration")); - - note->set_property ("duration-log", scm_from_int (dur.duration_log ())); - - if (dur.dot_count ()) - { - Item *d = make_item ("Dots", ev->self_scm ()); - Rhythmic_head::set_dots (note, d); - - if (dur.dot_count () - != robust_scm2int (d->get_property ("dot-count"), 0)) - d->set_property ("dot-count", scm_from_int (dur.dot_count ())); - - d->set_parent (note, Y_AXIS); - - dots_.push_back (d); - } - SCM drum_type = ev->get_property ("drum-type"); SCM defn = SCM_EOL; @@ -143,7 +124,6 @@ void Drum_notes_engraver::stop_translation_timestep () { notes_.clear (); - dots_.clear (); scripts_.clear (); events_.clear (); @@ -153,7 +133,10 @@ ADD_ACKNOWLEDGER (Drum_notes_engraver, stem); ADD_ACKNOWLEDGER (Drum_notes_engraver, note_column); ADD_TRANSLATOR (Drum_notes_engraver, /* doc */ "Generate noteheads.", - /* create */ "NoteHead Dots Script", + /* create */ + "NoteHead " + "Script", + /* accept */ "note-event", /* read */ "drumStyleTable", /* write */ ""); diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index 8d8e2bce3f..f469df8139 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -111,9 +111,6 @@ Fingering_engraver::make_script (Direction d, Stream_event *r, int i) fingering->set_property ("direction", scm_from_int (RIGHT)); } - SCM dig = r->get_property ("digit"); - fingering->set_property ("text", scm_number_to_string (dig, scm_from_int (10))); - fingerings_.push_back (fingering); } diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index f91e804dde..03eecc480d 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -138,24 +138,12 @@ New_fingering_engraver::add_fingering (Grob *head, Side_position_interface::add_support (ft.script_, head); - int d = scm_to_int (event->get_property ("digit")); - /* TODO: Should add support for thumb. It's a little involved, since the thumb lives in a different font. Maybe it should be moved? - */ - if (d > 5) - { - /* - music for the softenon children? - */ - event->origin ()->warning (_ ("music for the martians.")); - } - SCM sstr = scm_number_to_string (scm_from_int (d), scm_from_int (10)); - ft.script_->set_property ("text", sstr); ft.finger_event_ = event; ft.note_event_ = hevent; @@ -175,11 +163,6 @@ New_fingering_engraver::add_string (Grob *head, Side_position_interface::add_support (ft.script_, head); - int d = scm_to_int (event->get_property ("string-number")); - - SCM sstr = scm_number_to_string (scm_from_int (d), scm_from_int (10)); - ft.script_->set_property ("text", sstr); - ft.finger_event_ = event; ft.note_event_ = hevent; ft.head_ = head; @@ -360,7 +343,13 @@ ADD_TRANSLATOR (New_fingering_engraver, /* doc */ "Create fingering-scripts for notes in a new chord. " "This engraver is ill-named, since it " "also takes care of articulations and harmonic note heads", - /* create */ "Fingering", + /* create */ + "Fingering", /* accept */ "", - /* read */ "fingeringOrientations", + /* read */ + + "fingeringOrientations " + "stringNumberOrientations " + , + /* write */ ""); diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 1d2f32418a..cfd6847799 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -56,23 +56,6 @@ Note_heads_engraver::process_music () Stream_event *ev = note_evs_[i]; Item *note = make_item ("NoteHead", ev->self_scm ()); - Duration dur = *unsmob_duration (ev->get_property ("duration")); - - note->set_property ("duration-log", scm_from_int (dur.duration_log ())); - if (dur.dot_count ()) - { - Item *d = make_item ("Dots", note->self_scm ()); - Rhythmic_head::set_dots (note, d); - - if (dur.dot_count () - != robust_scm2int (d->get_property ("dot-count"), 0)) - d->set_property ("dot-count", scm_from_int (dur.dot_count ())); - - d->set_parent (note, Y_AXIS); - - dots_.push_back (d); - } - Pitch *pit = unsmob_pitch (ev->get_property ("pitch")); #if 0 /* TODO: should have a mechanism to switch off these warnings. */ diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index 95a8d10126..68ec862843 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -55,29 +55,8 @@ Rest_engraver::process_music () if (rest_event_ && !rest_) { rest_ = make_item ("Rest", rest_event_->self_scm ()); - - int durlog = unsmob_duration (rest_event_->get_property ("duration"))->duration_log (); - - rest_->set_property ("duration-log", - scm_from_int (durlog)); - - int dots = unsmob_duration (rest_event_->get_property ("duration"))->dot_count (); - - if (dots) - { - dot_ = make_item ("Dots", SCM_EOL); - - Rhythmic_head::set_dots (rest_, dot_); - dot_->set_parent (rest_, Y_AXIS); - dot_->set_property ("dot-count", scm_from_int (dots)); - } - Pitch *p = unsmob_pitch (rest_event_->get_property ("pitch")); - /* - This is ridiculous -- rests don't have pitch, but we act as if - our nose is bleeding. - */ if (p) { int pos = p->steps (); @@ -99,7 +78,7 @@ Rest_engraver::listen_rest (Stream_event *ev) ADD_TRANSLATOR (Rest_engraver, /* doc */ "", - /* create */ "Rest Dots", + /* create */ "Rest ", /* accept */ "rest-event", /* read */ "middleCPosition", /* write */ ""); diff --git a/lily/tab-note-heads-engraver.cc b/lily/tab-note-heads-engraver.cc index d30c2265c7..d7e3f9bd66 100644 --- a/lily/tab-note-heads-engraver.cc +++ b/lily/tab-note-heads-engraver.cc @@ -31,7 +31,6 @@ class Tab_note_heads_engraver : public Engraver { vector notes_; - vector dots_; vector note_events_; vector tabstring_events_; public: @@ -108,22 +107,6 @@ Tab_note_heads_engraver::process_music () } Duration dur = *unsmob_duration (event->get_property ("duration")); - note->set_property ("duration-log", - scm_from_int (dur.duration_log ())); - - if (dur.dot_count ()) - { - Item *d = make_item ("Dots", event->self_scm ()); - Rhythmic_head::set_dots (note, d); - - if (dur.dot_count () - != scm_to_int (d->get_property ("dot-count"))) - d->set_property ("dot-count", scm_from_int (dur.dot_count ())); - - d->set_parent (note, Y_AXIS); - - dots_.push_back (d); - } SCM scm_pitch = event->get_property ("pitch"); SCM proc = get_property ("tablatureFormat"); @@ -157,15 +140,27 @@ void Tab_note_heads_engraver::stop_translation_timestep () { notes_.clear (); - dots_.clear (); note_events_.clear (); tabstring_events_.clear (); } ADD_TRANSLATOR (Tab_note_heads_engraver, /* doc */ "Generate one or more tablature noteheads from event of type NoteEvent.", - /* create */ "TabNoteHead Dots", - /* accept */ "note-event string-number-event", - /* read */ "middleCPosition stringTunings minimumFret tablatureFormat highStringOne stringOneTopmost", + /* create */ + "TabNoteHead " + , + + /* accept */ + "note-event " + "string-number-event ", + + /* read */ + "middleCPosition " + "stringTunings " + "minimumFret " + "tablatureFormat " + "highStringOne " + "stringOneTopmost ", + /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index dee817c6fe..2959ce7187 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -192,6 +192,7 @@ contained staves are not connected vertically." \consists "Ligature_bracket_engraver" \consists "Breathing_sign_engraver" \consists "Note_heads_engraver" + \consists "Dots_engraver" \consists "Rest_engraver" %% switch on to make stem directions interpolate for the diff --git a/python/lilylib.py b/python/lilylib.py index 56e7b1bcee..e902feb134 100644 --- a/python/lilylib.py +++ b/python/lilylib.py @@ -69,12 +69,11 @@ def command_name (cmd): cmd = re.match ('([\(\)]*)([^\\\ ]*)', cmd).group (2) return os.path.basename (cmd) -def system (cmd, - ignore_error=False, - progress_p=True, - be_verbose=False, - log_file=None): - +def subprocess_system (cmd, + ignore_error=False, + progress_p=True, + be_verbose=False, + log_file=None): import subprocess show_progress= progress_p @@ -124,6 +123,11 @@ def system (cmd, return abs (retval) + + +system = subprocess_system + + def strip_extension (f, ext): (p, e) = os.path.splitext (f) if e == ext: diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index b9a4d32ee3..3d2f9614ee 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -508,7 +508,7 @@ (Dots . ( (stencil . ,ly:dots::print) - (dot-count . 1) + (dot-count . ,dots::calc-dot-count) (meta . ((class . Item) (interfaces . (font-interface staff-symbol-referencer-interface @@ -630,7 +630,7 @@ (stencil . ,ly:text-interface::print) (direction . ,ly:script-interface::calc-direction) - + (text . ,fingering::calc-text) (font-encoding . fetaNumber) (font-size . -5) ; don't overlap when next to heads. (meta . ((class . Item) @@ -1038,6 +1038,7 @@ (NoteHead . ( (stencil . ,ly:note-head::print) + (duration-log . ,note-head::calc-duration-log) (stem-attachment . ,ly:note-head::calc-stem-attachment) (glyph-name . ,note-head::calc-glyph-name) (Y-offset . ,ly:staff-symbol-referencer::callback) @@ -1276,6 +1277,7 @@ (Rest . ( (stencil . ,ly:rest::print) + (duration-log . ,note-head::calc-duration-log) (X-extent . ,ly:rest::width) (Y-extent . ,ly:rest::height) (Y-offset . ,ly:rest::y-offset-callback) @@ -1516,6 +1518,7 @@ (StringNumber . ( (stencil . ,print-circled-text-callback) + (text . ,string-number::calc-text) (padding . 0.5) (staff-padding . 0.5) (self-alignment-X . 0) @@ -1635,6 +1638,7 @@ . ( (stencil . ,ly:text-interface::print) (Y-offset . ,ly:staff-symbol-referencer::callback) + (duration-log . ,note-head::calc-duration-log) (font-size . -2) (stem-attachment . (0.0 . 1.35)) (font-series . bold) diff --git a/scm/lily-library.scm b/scm/lily-library.scm index fca7748bb8..acb29bb853 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -391,6 +391,28 @@ found." ;; + +(define-public (ly:numbers->string lst) + (string-join (map ly:number->string lst) " ")) + +(define (number->octal-string x) + (let* ((n (inexact->exact x)) + (n64 (quotient n 64)) + (n8 (quotient (- n (* n64 64)) 8))) + (string-append + (number->string n64) + (number->string n8) + (number->string (remainder (- n (+ (* n64 64) (* n8 8))) 8))))) + +(define-public (ly:inexact->string x radix) + (let ((n (inexact->exact x))) + (number->string n radix))) + +(define-public (ly:number-pair->string c) + (string-append (ly:number->string (car c)) " " + (ly:number->string (cdr c)))) + + (define-public (write-me message x) "Return X. Display MESSAGE and write X. Handy for debugging, possibly turned off." diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 2071541029..7eeefa3bad 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -6,7 +6,26 @@ ;;;; Han-Wen Nienhuys -;;; Tablature functions, by Jiba (jiba@tuxfamily.org) + +(define-public (event-cause grob) + (let* + ((cause (ly:grob-property grob 'cause))) + + (cond + ((ly:stream-event? cause) cause) + ((ly:grob? cause) (event-cause cause)) + (else #f)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; note heads + +(define-public (note-head::calc-duration-log grob) + (ly:duration-log + (ly:event-property (event-cause grob) 'duration))) + +(define-public (dots::calc-dot-count grob) + (ly:duration-dot-count + (ly:event-property (event-cause grob) 'duration))) ;; The TabNoteHead stem attachment function. (define (note-head::calc-tablature-stem-attachment grob) @@ -83,33 +102,6 @@ layout props (make-circle-markup text)))) circle)) - -;;(define (mm-to-pt x) -;; (* (/ 72.27 25.40) x)) - -;; do nothing in .scm output - -(define-public (ly:numbers->string lst) - (string-join (map ly:number->string lst) " ")) - -(define (number->octal-string x) - (let* ((n (inexact->exact x)) - (n64 (quotient n 64)) - (n8 (quotient (- n (* n64 64)) 8))) - (string-append - (number->string n64) - (number->string n8) - (number->string (remainder (- n (+ (* n64 64) (* n8 8))) 8))))) - -(define-public (ly:inexact->string x radix) - (let ((n (inexact->exact x))) - (number->string n radix))) - -(define-public (ly:number-pair->string c) - (string-append (ly:number->string (car c)) " " - (ly:number->string (cdr c)))) - - ;; silly, use alist? (define-public (note-head::calc-glyph-name grob) (let* @@ -349,7 +341,8 @@ centered, X==1 is at the right, X == -1 is at the left." (left-span (ly:spanner-bound spanner LEFT)) (right-span (ly:spanner-bound spanner RIGHT)) (thickness (* (ly:grob-property spanner 'thickness) - (ly:output-def-lookup (ly:grob-layout spanner) 'line-thickness))) + (ly:output-def-lookup (ly:grob-layout spanner) + 'line-thickness))) (padding (ly:grob-property spanner 'padding 0.5)) (common (ly:grob-common-refpoint right-span (ly:grob-common-refpoint spanner @@ -402,3 +395,27 @@ centered, X==1 is at the right, X == -1 is at the left." (fold moment-min #f (map get-difference (iota (1- (ly:grob-array-length cols))))))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; fingering + +(define-public (fingering::calc-text grob) + (let* + ((event (ly:grob-property grob 'cause)) + (digit (ly:event-property event 'digit))) + + (if (> digit 5) + (ly:input-message (ly:music-property event 'origin) + "Music for the martians")) + + (number->string digit 10) + )) + +(define-public (string-number::calc-text grob) + (let* + ((event (ly:grob-property grob 'cause)) + (digit (ly:event-property event 'string-number))) + + (number->string digit 10) + )) diff --git a/scm/stencil.scm b/scm/stencil.scm index cf810d6bd3..567e0a3099 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -310,14 +310,6 @@ grestore rest)) expr)) - (define (event-cause grob) - (let* - ((cause (ly:grob-property grob 'cause))) - - (cond - ((ly:stream-event? cause) cause) - ((ly:grob? cause) (event-cause cause)) - (else #f)))) (define (pythonic-string expr) "escape quotes and slashes for python consumption"