X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffretboard-engraver.cc;h=28b4bd1931f208e544ee219ee2eb7a65556d10ab;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=f284161a801cb86f4cb73635b6fee4e6f331ac82;hpb=db1b4bee7d0792351e368e776f197b1bca7050cb;p=lilypond.git diff --git a/lily/fretboard-engraver.cc b/lily/fretboard-engraver.cc index f284161a80..28b4bd1931 100644 --- a/lily/fretboard-engraver.cc +++ b/lily/fretboard-engraver.cc @@ -1,13 +1,27 @@ /* - fretboard-engraver.cc -- part of GNU LilyPond + This file is part of LilyPond, the GNU music typesetter. - (c) 2006 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include #include using namespace std; +#include "articulations.hh" #include "context.hh" #include "item.hh" #include "engraver.hh" @@ -23,57 +37,84 @@ using namespace std; 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: - DECLARE_TRANSLATOR_LISTENER (note); - DECLARE_TRANSLATOR_LISTENER (string_number); + void stop_translation_timestep (); void process_music (); + virtual void derived_mark () const; + void listen_note (Stream_event *); + void listen_string_number (Stream_event *); + void listen_fingering (Stream_event *); - void stop_translation_timestep (); +private: + SCM last_placements_; }; -Fretboard_engraver::Fretboard_engraver () +void +Fretboard_engraver::derived_mark () const +{ + scm_gc_mark (last_placements_); +} + +Fretboard_engraver::Fretboard_engraver (Context *c) + : Engraver (c) { fret_board_ = 0; + 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_board_->self_scm (), - - ly_cxx_vector_to_list (note_events_), - ly_cxx_vector_to_list (tabstring_events_)); - } + scm_call_4 (proc, + context ()->self_scm (), + fret_notes, + scm_list_2 (tab_strings, fingers), + fret_board_->self_scm ()); + SCM changes = get_property ("chordChanges"); + 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_placements_ = placements; } void @@ -82,25 +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 */ - "Generate one or more tablature noteheads from event of type" - " @code{NoteEvent}.", + /* doc */ + "Generate fret diagram from one or more events of type" + " @code{NoteEvent}.", - /* create */ - "FretBoard ", + /* create */ + "FretBoard ", - /* read */ - "stringTunings " - "minimumFret " + /* read */ + "chordChanges " + "defaultStrings " + "highStringOne " "maximumFretStretch " - "tablatureFormat " - "highStringOne " - "predefinedDiagramTable", - - /* write */ - "" - ); + "minimumFret " + "noteToFretFunction " + "predefinedDiagramTable " + "stringTunings " + "tablatureFormat ", + + /* write */ + "" + );