]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/define-grobs.scm (all-grob-descriptions): use callback to
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 4 Oct 2006 10:32:26 +0000 (10:32 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 4 Oct 2006 10:32:26 +0000 (10:32 +0000)
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.

16 files changed:
ChangeLog
lily/ambitus-engraver.cc
lily/completion-note-heads-engraver.cc
lily/dots-engraver.cc [new file with mode: 0644]
lily/drum-note-engraver.cc
lily/fingering-engraver.cc
lily/new-fingering-engraver.cc
lily/note-heads-engraver.cc
lily/rest-engraver.cc
lily/tab-note-heads-engraver.cc
ly/engraver-init.ly
python/lilylib.py
scm/define-grobs.scm
scm/lily-library.scm
scm/output-lib.scm
scm/stencil.scm

index 7c7ad1a10f215f2bb07055713022cd7c3f439b61..a58c531af6b6df45e42deb8b7b22153c97e43f6d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2006-10-04  Han-Wen Nienhuys  <hanwen@lilypond.org>
+
+       * 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  <mabe@drongo.s3.kth.se>
 
        * scripts/lilypond-book.py: Fix typo gs-load-font -> gs-load-fonts
index 1321c5bf6e1858d14a9391d7ed1aa937aa62a2f2..6590b0a1cbf7c5013d209d348125b9ab0f4198eb 100644 (file)
@@ -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 */ "");
index 69cd4b0785c90350a3707f1a103b727ba8d875fc..fb67686f96b945c37e062867507ff6a08c0581f9 100644 (file)
@@ -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 (file)
index 0000000..1b34354
--- /dev/null
@@ -0,0 +1,65 @@
+/* 
+  dots-engraver.cc -- implement Dots_engraver
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2006 Han-Wen Nienhuys <hanwen@lilypond.org>
+  
+*/
+
+#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*/
+              "");
index 5adc23d7ebf1a81d9debc91af82b2e70279acf39..c9dd52b8e6220bf41f8a21909d685c258769cae4 100644 (file)
@@ -22,7 +22,6 @@ using namespace std;
 class Drum_notes_engraver : public Engraver
 {
   vector<Item*> notes_;
-  vector<Item*> dots_;
   vector<Item*> scripts_;
   vector<Stream_event*> 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 */ "");
index 8d8e2bce3f178227e68bd3f7b02be8fadff26b36..f469df8139484e59fa2619ee8ac38bcf5ab8e4f2 100644 (file)
@@ -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);
 }
 
index f91e804dde6d2dce5b3a18a3162a4f867cede8c1..03eecc480d8c128201ad9ecc91939b01dde19c72 100644 (file)
@@ -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 */ "");
index 1d2f32418a2aac5b6da0dcf9513082c80f4acaf1..cfd684779948acdb97a151424b88d58e6d78bd5c 100644 (file)
@@ -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. */
index 95a8d10126e2c5cd2296e5d774d59363b7337f0c..68ec862843dd52cf23e91084aea7e7b2fb01862f 100644 (file)
@@ -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 */ "");
index d30c2265c7da959f81b32e5f1183252eae19d03e..d7e3f9bd66ebc0eb9a292793f954acfb9f89e1d9 100644 (file)
@@ -31,7 +31,6 @@ class Tab_note_heads_engraver : public Engraver
 {
   vector<Item*> notes_;
 
-  vector<Item*> dots_;
   vector<Stream_event*> note_events_;
   vector<Stream_event*> 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 */ "");
 
index dee817c6fea2fe779ba3ddbb6c79d0dba58ef60b..2959ce7187f1fa84f5d5d7009da020657babe211 100644 (file)
@@ -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
index 56e7b1bceee671fcac23f5ebfa08ef389e227a83..e902feb13404926dc2ea83cc81e0c1d15e210671 100644 (file)
@@ -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:
index b9a4d32ee387e41c218a877fc37d61b2280ca2af..3d2f9614ee2c0ba624bbea2e67f10eea949f9350 100644 (file)
     (Dots
      . (
        (stencil . ,ly:dots::print)
-       (dot-count . 1)
+       (dot-count . ,dots::calc-dot-count)
        (meta . ((class . Item)
                 (interfaces . (font-interface
                                staff-symbol-referencer-interface
 
        (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)
     (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)
     (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)
     (StringNumber
      . (
        (stencil . ,print-circled-text-callback)
+       (text . ,string-number::calc-text)
        (padding . 0.5)
        (staff-padding . 0.5)
        (self-alignment-X . 0)
      . (
        (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)
index fca7748bb8f88e384d511949eea24c30d9b3c210..acb29bb8530a25702fbfe01f305d0fb48feeb217 100644 (file)
@@ -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."
index 2071541029972caf8643e8cb9fd9fe9a080f667b..7eeefa3bad4adf6a2cb56f898d32d08e0e6e3141 100644 (file)
@@ -6,7 +6,26 @@
 ;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
 
-;;; 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)
                  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)
+  ))
index cf810d6bd39179ba3e343e837852f4133539c4ac..567e0a3099a9c1bbb63a129b48793834ca7bf73c 100644 (file)
@@ -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"