X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-performer.cc;h=946b604c00ca1dd262ed0dcb48c2306efd693151;hb=8da6cef580cce3365b219f6aca429b434cb60fcf;hp=be234fcdd11d0ae6e0e9907d47c90513289fda2d;hpb=bdabe71a2bdda41b64c0000da6023771701f4def;p=lilypond.git diff --git a/lily/note-performer.cc b/lily/note-performer.cc index be234fcdd1..946b604c00 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -3,75 +3,116 @@ source file of the GNU LilyPond music typesetter - (c) 1996, 1997 Jan Nieuwenhuizen + (c) 1996--2000 Jan Nieuwenhuizen */ #include "note-performer.hh" -#include "translator.hh" -#include "input-translator.hh" #include "musical-request.hh" #include "audio-item.hh" +#include "audio-column.hh" +#include "global-translator.hh" #include "debug.hh" -IMPLEMENT_IS_TYPE_B1(Note_performer,Performer); -ADD_THIS_PERFORMER(Note_performer); +ADD_THIS_TRANSLATOR (Note_performer); -Note_performer::Note_performer() +Note_performer::Note_performer () { - note_req_l_ = 0; - off_mom_ = 0; } -Note_performer::~Note_performer() + + +void +Note_performer::do_process_music () { + if (note_req_l_arr_.size ()) + { + int transposing_i = 0; + //urg + SCM prop = get_property ("transposing"); + if (gh_number_p(prop)) + transposing_i = gh_scm2int (prop); + + while (note_req_l_arr_.size ()) + { + Note_req* n = note_req_l_arr_.pop (); + Musical_pitch pit = * unsmob_pitch (n->get_mus_property ("pitch")); + Audio_note* p = new Audio_note (pit, n->length_mom (), transposing_i); + Audio_element_info info (p, n); + announce_element (info); + note_p_arr_.push (p); + } + } } -void -Note_performer::do_print() const +void +Note_performer::process_acknowledged () +{ +} + +Global_translator* +Note_performer::global_translator_l () { -#ifndef NPRINT - if ( note_req_l_ ) { - note_req_l_->print(); - mtor << ( off_mom_ ? "on" : "off" ) << "\n"; + Translator *t = this; + Global_translator *global_l =0; + do + { + t = t->daddy_trans_l_ ; + global_l = dynamic_cast (t); } -#endif + while (!global_l); + + return global_l; } -void -Note_performer::process_requests() + +void +Note_performer::do_pre_move_processing () { - // this is _really_ braindead, but it generates some output - if ( !note_req_l_ || !note_req_l_->melodic() || !note_req_l_->rhythmic() ) - return; - - // ugh! Midi specific - Moment mom = get_mom(); - if ( !off_mom_ ) { // start note - off_mom_ = mom + note_req_l_->duration(); - play( new Audio_note( note_req_l_, true ) ); + + // why don't grace notes show up here? + // --> grace notes effectively do not get delayed + Global_translator* global_l = global_translator_l (); + for (int i=0; i < note_p_arr_.size (); i++) + { + Audio_note* n = note_p_arr_[i]; + if (Moment m= n->delayed_until_mom_) + { + global_l->add_moment_to_process (m); + delayed_p_arr_.push (n); + note_p_arr_[i] = 0; + note_p_arr_.del (i); + i--; + } } - else if ( mom == off_mom_ ) { // stop note - play( new Audio_note( note_req_l_, false ) ); - note_req_l_ = 0; - off_mom_ = 0; + + Moment now = now_mom (); + for (int i=0; i < note_p_arr_.size (); i++) + { + play_element (note_p_arr_[i]); + } + note_p_arr_.clear (); + note_req_l_arr_.clear (); + for (int i=0; i < delayed_p_arr_.size (); i++) + { + Audio_note* n = delayed_p_arr_[i]; + if (n->delayed_until_mom_ <= now) + { + play_element (n); + delayed_p_arr_[i] = 0; + delayed_p_arr_.del (i); + i--; + } } } - -bool -Note_performer::do_try_request( Request* req_l ) + +bool +Note_performer::do_try_music (Music* req_l) { - if ( note_req_l_ ) - return false; - - // huh? -// if (req_l->musical() && (req_l->musical()->note() || req_l->musical()->rest())) -// note_req_l_ = req_l->musical()->rhythmic(); - if ( req_l->musical() && req_l->musical()->note() ) -// huh? - note_req_l_ = req_l->musical()->melodic(); - else - return false; - - return true; + if (Note_req *nr = dynamic_cast (req_l)) + { + note_req_l_arr_.push (nr); + return true; + } + return false; }