/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1998--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1998--2014 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 ();
- virtual void derived_mark () const;
DECLARE_TRANSLATOR_LISTENER (note);
DECLARE_TRANSLATOR_LISTENER (rest);
private:
Item *chord_name_;
vector<Stream_event *> notes_;
- SCM last_chord_;
Stream_event *rest_event_;
};
{
}
-void
-Chord_name_engraver::derived_mark () const
-{
- scm_gc_mark (last_chord_);
-}
-
Chord_name_engraver::Chord_name_engraver ()
{
chord_name_ = 0;
- last_chord_ = SCM_EOL;
rest_event_ = 0;
}
void
Chord_name_engraver::process_music ()
{
+ if (!rest_event_ && !notes_.size ())
+ return;
+
+ chord_name_ = make_item ("ChordName",
+ rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ());
+
+ SCM maybe_markup = chord_name_->get_property_data ("text");
+
+ bool make_markup = !(Text_interface::is_markup (maybe_markup)
+ || ly_is_procedure (maybe_markup));
+
SCM markup;
- SCM bass = SCM_EOL;
- SCM inversion = SCM_EOL;
- SCM pitches = SCM_EOL;
- if (rest_event_)
+ if (rest_event_ && !make_markup) { }
+ else if (rest_event_)
{
SCM no_chord_markup = get_property ("noChordSymbol");
if (!Text_interface::is_markup (no_chord_markup))
}
else
{
- if (!notes_.size ())
- return;
+ SCM bass = SCM_EOL;
+ SCM inversion = SCM_EOL;
+ SCM pitches = SCM_EOL;
Stream_event *inversion_event = 0;
for (vsize i = 0; i < notes_.size (); i++)
pitches = scm_sort_list (pitches, Pitch::less_p_proc);
- SCM capo_proc = ly_lily_module_constant ("capo-handler");
- markup = scm_call_4 (capo_proc, pitches, bass, inversion,
- context ()->self_scm ());
+ SCM name_proc = get_property ("chordNameFunction");
+ if (make_markup)
+ markup = scm_call_4 (name_proc, pitches, bass, inversion,
+ context ()->self_scm ());
}
/*
Ugh.
*/
- SCM chord_as_scm = scm_cons (pitches, scm_cons (bass, inversion));
-
- chord_name_ = make_item ("ChordName",
- rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ());
- chord_name_->set_property ("text", markup);
+ if (make_markup)
+ chord_name_->set_property ("text", markup);
+ else if (Text_interface::is_markup (maybe_markup))
+ markup = maybe_markup;
SCM chord_changes = get_property ("chordChanges");
- if (to_boolean (chord_changes) && scm_is_pair (last_chord_)
- && ly_is_equal (chord_as_scm, last_chord_))
+ SCM last_chord = get_property ("lastChord");
+ if (to_boolean (chord_changes) && scm_is_pair (last_chord)
+ && ly_is_equal (markup, last_chord))
chord_name_->set_property ("begin-of-line-visible", SCM_BOOL_T);
- last_chord_ = chord_as_scm;
+ context ()->set_property ("lastChord", markup);
}
IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note);
"chordNoteNamer "
"chordRootNamer "
"chordNameExceptions "
+ "lastChord "
"majorSevenSymbol "
"noChordSymbol ",
/* write */
- ""
+ "lastChord "
);