X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffretboard-engraver.cc;h=28b4bd1931f208e544ee219ee2eb7a65556d10ab;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=98375a3db77471a2d75c331751548d84eb0c3ec4;hpb=223ad8f5799657a5b628d862dd927f4197486b02;p=lilypond.git diff --git a/lily/fretboard-engraver.cc b/lily/fretboard-engraver.cc index 98375a3db7..28b4bd1931 100644 --- a/lily/fretboard-engraver.cc +++ b/lily/fretboard-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2010 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include using namespace std; +#include "articulations.hh" #include "context.hh" #include "item.hh" #include "engraver.hh" @@ -37,70 +38,83 @@ class Fretboard_engraver : public Engraver { Item *fret_board_; - vector note_events_; - vector tabstring_events_; + vector note_events_; + vector tabstring_events_; + vector fingering_events_; public: TRANSLATOR_DECLARATIONS (Fretboard_engraver); protected: void stop_translation_timestep (); void process_music (); - virtual void derived_mark() const; - DECLARE_TRANSLATOR_LISTENER (note); - DECLARE_TRANSLATOR_LISTENER (string_number); + virtual void derived_mark () const; + void listen_note (Stream_event *); + void listen_string_number (Stream_event *); + void listen_fingering (Stream_event *); private: - SCM last_fret_notes_; + SCM last_placements_; }; - void Fretboard_engraver::derived_mark () const { - scm_gc_mark (last_fret_notes_); + scm_gc_mark (last_placements_); } -Fretboard_engraver::Fretboard_engraver () +Fretboard_engraver::Fretboard_engraver (Context *c) + : Engraver (c) { fret_board_ = 0; - last_fret_notes_ = SCM_EOL; + last_placements_ = SCM_BOOL_F; } -IMPLEMENT_TRANSLATOR_LISTENER (Fretboard_engraver, note); void Fretboard_engraver::listen_note (Stream_event *ev) { note_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Fretboard_engraver, string_number); void Fretboard_engraver::listen_string_number (Stream_event *ev) { tabstring_events_.push_back (ev); } +void +Fretboard_engraver::listen_fingering (Stream_event *ev) +{ + fingering_events_.push_back (ev); +} + void Fretboard_engraver::process_music () { if (!note_events_.size ()) - return ; - + return; + + SCM tab_strings = articulation_list (note_events_, + tabstring_events_, + "string-number-event"); + SCM fingers = articulation_list (note_events_, + fingering_events_, + "fingering-event"); fret_board_ = make_item ("FretBoard", note_events_[0]->self_scm ()); SCM fret_notes = ly_cxx_vector_to_list (note_events_); SCM proc = get_property ("noteToFretFunction"); if (ly_is_procedure (proc)) - scm_call_4 (proc, - context ()->self_scm (), - fret_notes, - ly_cxx_vector_to_list (tabstring_events_), - fret_board_->self_scm ()); + scm_call_4 (proc, + context ()->self_scm (), + fret_notes, + scm_list_2 (tab_strings, fingers), + fret_board_->self_scm ()); SCM changes = get_property ("chordChanges"); - if (to_boolean (changes) && scm_is_pair (last_fret_notes_) - && ly_is_equal (last_fret_notes_, fret_notes)) + SCM placements = fret_board_->get_property ("dot-placement-list"); + if (to_boolean (changes) + && ly_is_equal (last_placements_, placements)) fret_board_->set_property ("begin-of-line-visible", SCM_BOOL_T); - last_fret_notes_ = fret_notes; + last_placements_ = placements; } void @@ -109,27 +123,37 @@ Fretboard_engraver::stop_translation_timestep () fret_board_ = 0; note_events_.clear (); tabstring_events_.clear (); + fingering_events_.clear (); +} + +void +Fretboard_engraver::boot () +{ + ADD_LISTENER (Fretboard_engraver, note); + ADD_LISTENER (Fretboard_engraver, string_number); + ADD_LISTENER (Fretboard_engraver, fingering); } ADD_TRANSLATOR (Fretboard_engraver, - /* doc */ + /* doc */ "Generate fret diagram from one or more events of type" - " @code{NoteEvent}.", + " @code{NoteEvent}.", - /* create */ - "FretBoard ", + /* create */ + "FretBoard ", - /* read */ + /* read */ "chordChanges " - "highStringOne " + "defaultStrings " + "highStringOne " "maximumFretStretch " - "minimumFret " + "minimumFret " "noteToFretFunction " "predefinedDiagramTable " - "stringTunings " + "stringTunings " "tablatureFormat ", - /* write */ - "" - ); + /* write */ + "" + );