X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftie-performer.cc;h=1f95023eb6ab0962146dd13b54ce07f08b665717;hb=8659a99f233f5c4684292728e7ad4206669b35b0;hp=77fb9e336df5c90c70f2a30e67379d30ed642b92;hpb=0b544cfb7332615ef809b71b57ab656741311ae1;p=lilypond.git diff --git a/lily/tie-performer.cc b/lily/tie-performer.cc index 77fb9e336d..1f95023eb6 100644 --- a/lily/tie-performer.cc +++ b/lily/tie-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2014 Han-Wen Nienhuys + Copyright (C) 1998--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 @@ -51,17 +51,17 @@ protected: void start_translation_timestep (); virtual void acknowledge_audio_element (Audio_element_info); void process_music (); - DECLARE_TRANSLATOR_LISTENER (tie); + void listen_tie (Stream_event *); public: TRANSLATOR_DECLARATIONS (Tie_performer); }; -Tie_performer::Tie_performer () +Tie_performer::Tie_performer (Context *c) + : Performer (c) { event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer, tie); void Tie_performer::listen_tie (Stream_event *ev) { @@ -113,6 +113,31 @@ Tie_performer::acknowledge_audio_element (Audio_element_info inf) it = heads_to_tie_.erase (it); } } + if (found) + return; + for (it = heads_to_tie_.begin (); + !found && (it != heads_to_tie_.end ()); + it++) + { + Audio_element_info et = (*it).head_; + Audio_note *th = dynamic_cast (et.elem_); + Stream_event *left_mus = et.event_; + + if (!(th && right_mus && left_mus)) + continue; + + SCM p1 = left_mus->get_property ("pitch"); + SCM p2 = right_mus->get_property ("pitch"); + if (unsmob (p1) && unsmob (p2) + && unsmob (p1)->tone_pitch () == unsmob (p2)->tone_pitch ()) + { + found = true; + // (*it).moment_ already stores the end of the tied note! + Moment skip = now_mom () - (*it).end_moment_; + an->tie_to (th, skip); + it = heads_to_tie_.erase (it); + } + } } } @@ -159,6 +184,12 @@ Tie_performer::stop_translation_timestep () now_tied_heads_.clear (); } +void +Tie_performer::boot () +{ + ADD_LISTENER (Tie_performer, tie); +} + ADD_TRANSLATOR (Tie_performer, /* doc */ "Generate ties between note heads of equal pitch.",