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 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
ADD_ACKNOWLEDGER (Ambitus_engraver, note_head);
ADD_TRANSLATOR (Ambitus_engraver,
/* doc */ "",
- /* create */ "Ambitus AmbitusLine AmbitusNoteHead AmbitusAccidental",
+ /* create */
+ "Ambitus "
+ "AmbitusLine "
+ "AmbitusNoteHead "
+ "AmbitusAccidental",
+
/* accept */ "",
/* read */ "",
/* write */ "");
/* 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 */ "");
--- /dev/null
+/*
+ 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*/
+ "");
class Drum_notes_engraver : public Engraver
{
vector<Item*> notes_;
- vector<Item*> dots_;
vector<Item*> scripts_;
vector<Stream_event*> events_;
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;
Drum_notes_engraver::stop_translation_timestep ()
{
notes_.clear ();
- dots_.clear ();
scripts_.clear ();
events_.clear ();
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 */ "");
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);
}
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;
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;
/* 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 */ "");
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. */
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 ();
ADD_TRANSLATOR (Rest_engraver,
/* doc */ "",
- /* create */ "Rest Dots",
+ /* create */ "Rest ",
/* accept */ "rest-event",
/* read */ "middleCPosition",
/* write */ "");
{
vector<Item*> notes_;
- vector<Item*> dots_;
vector<Stream_event*> note_events_;
vector<Stream_event*> tabstring_events_;
public:
}
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");
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 */ "");
\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
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
return abs (retval)
+
+
+system = subprocess_system
+
+
def strip_extension (f, ext):
(p, e) = os.path.splitext (f)
if e == ext:
(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)
;;
+
+(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."
;;;; 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*
(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
(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)
+ ))
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"