/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1998--2014 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1998--2015 Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
void stop_translation_timestep ();
void process_music ();
virtual void finalize ();
- DECLARE_TRANSLATOR_LISTENER (note);
- DECLARE_TRANSLATOR_LISTENER (rest);
+ void listen_note (Stream_event *);
+ void listen_rest (Stream_event *);
private:
vector<Stream_event *> notes_;
{
}
-Chord_name_engraver::Chord_name_engraver ()
+Chord_name_engraver::Chord_name_engraver (Context *c)
+ : Engraver (c)
{
rest_event_ = 0;
}
markup = chord_name->get_property ("text");
if (!Text_interface::is_markup (markup))
{
- Stream_event *inversion_event = 0;
for (vsize i = 0; i < notes_.size (); i++)
{
Stream_event *n = notes_[i];
SCM p = n->get_property ("pitch");
- if (!unsmob_pitch (p))
+ if (!unsmob<Pitch> (p))
continue;
- if (n->get_property ("inversion") == SCM_BOOL_T)
- {
- inversion_event = n;
- inversion = p;
- }
- else if (n->get_property ("bass") == SCM_BOOL_T)
+ if (to_boolean (n->get_property ("bass")))
bass = p;
else
- pitches = scm_cons (p, pitches);
- }
-
- if (inversion_event)
- {
- SCM oct = inversion_event->get_property ("octavation");
- if (scm_is_number (oct))
{
- Pitch *p = unsmob_pitch (inversion_event->get_property ("pitch"));
- int octavation = scm_to_int (oct);
- Pitch orig = p->transposed (Pitch (-octavation, 0, 0));
-
- pitches = scm_cons (orig.smobbed_copy (), pitches);
+ SCM oct = n->get_property ("octavation");
+ if (scm_is_number (oct))
+ {
+ Pitch orig = unsmob<Pitch> (p)->transposed (Pitch (-scm_to_int (oct), 0));
+ pitches = scm_cons (orig.smobbed_copy (), pitches);
+ }
+ else
+ pitches = scm_cons (p, pitches);
+ if (to_boolean (n->get_property ("inversion")))
+ {
+ inversion = p;
+ if (!scm_is_number (oct))
+ programming_error ("inversion does not have original pitch");
+ }
}
- else
- programming_error ("inversion does not have original pitch");
}
pitches = scm_sort_list (pitches, Pitch::less_p_proc);
context ()->set_property ("lastChord", markup);
}
-IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note);
void
Chord_name_engraver::listen_note (Stream_event *ev)
{
notes_.push_back (ev);
}
-IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, rest);
void
Chord_name_engraver::listen_rest (Stream_event *ev)
{
The READs description is not strictly accurate:
which properties are read depend on the chord naming function active.
*/
+void
+Chord_name_engraver::boot ()
+{
+ ADD_LISTENER (Chord_name_engraver, note);
+ ADD_LISTENER (Chord_name_engraver, rest);
+}
+
ADD_TRANSLATOR (Chord_name_engraver,
/* doc */
"Catch note and rest events and generate the appropriate chordname.",