X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fchord-name-engraver.cc;h=3a14ff4b07f44168ce5117712d7e99e73812cc91;hb=0943e805fa82ebeb1d1ed32e675070467e340c39;hp=0ca322716fde1e8153034b99028feb95bd7d6257;hpb=dc7cc1e2d4f48c4051de6394a3975b835552cc5d;p=lilypond.git diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index 0ca322716f..3a14ff4b07 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2014 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,8 +39,8 @@ protected: 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 notes_; @@ -92,38 +92,32 @@ Chord_name_engraver::process_music () 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 (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 (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); @@ -149,14 +143,12 @@ Chord_name_engraver::process_music () 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) { @@ -174,6 +166,13 @@ Chord_name_engraver::stop_translation_timestep () 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.",