X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-performer.cc;h=6d51326aa2817ab5d80a6a3a9a6749d16412c194;hb=4b40ecf0af9b4ff3fcf4287ae685ac1a9cc89523;hp=430e33c7c765ff06dfd5c30616dd366b17d29f2a;hpb=50802c7203c8e4a3eea1d7bf23064d60cd0d3ec7;p=lilypond.git diff --git a/lily/note-performer.cc b/lily/note-performer.cc index 430e33c7c7..6d51326aa2 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -1,82 +1,127 @@ /* note-performer.cc -- implement Note_performer - (c) 1996, 1997 Jan Nieuwenhuizen + source file of the GNU LilyPond music typesetter + + (c) 1996--2000 Jan Nieuwenhuizen */ -#include "note-performer.hh" -#include "translator.hh" -#include "input-translator.hh" +#include "performer.hh" #include "musical-request.hh" -#include "midi-item.hh" +#include "audio-item.hh" +#include "audio-column.hh" +#include "global-translator.hh" #include "debug.hh" -IMPLEMENT_IS_TYPE_B1(Note_performer,Performer); +/** +Convert reqs to audio notes. +*/ +class Note_performer : public Performer { +public: + VIRTUAL_COPY_CONS(Translator); + +protected: + virtual bool try_music (Music *req_l) ; -ADD_THIS_PERFORMER(Note_performer); + virtual void stop_translation_timestep (); + virtual void create_grobs (); + Global_translator* global_translator_l (); -Note_performer::Note_performer() -{ - note_req_l_ = 0; - off_mom_ = 0; -} +private: + Array note_req_l_arr_; + Array note_p_arr_; + Array delayed_p_arr_; +}; -Note_performer::~Note_performer() -{ -} +ADD_THIS_TRANSLATOR (Note_performer); void -Note_performer::do_print() const +Note_performer::create_grobs () { -#ifndef NPRINT - if ( note_req_l_ ) - note_req_l_->print(); -#endif + 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 (); + 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); + } + note_req_l_arr_.clear (); + } } -void -Note_performer::process_requests() +Global_translator* +Note_performer::global_translator_l () { -// if ( when() == off_mom_ ) -// play_event( Note_event( current_l_->pitch() ) ); + Translator *t = this; + Global_translator *global_l =0; + do + { + t = t->daddy_trans_l_ ; + global_l = dynamic_cast (t); + } + while (!global_l); + + return global_l; +} -//Midi_note( Melodic_req* melreq_l, int channel_i, bool on_bo ) - // this is _really_ braindead, but it generates some output - if ( !note_req_l_ || !note_req_l_->melodic() || !note_req_l_->rhythmic() ) - return; +void +Note_performer::stop_translation_timestep () +{ + + // 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--; + } + } - // ugh, need to know channel (===track===staff) too - int channel_i = get_track_i(); - Moment mom = get_mom(); - if ( !off_mom_ ) { // start note - off_mom_ = mom + note_req_l_->duration(); - Midi_note n( note_req_l_->melodic(), channel_i, true ); - play_event( &n ); + Moment now = now_mom (); + for (int i=0; i < note_p_arr_.size (); i++) + { + play_element (note_p_arr_[i]); } - else if ( mom == off_mom_ ) { - Midi_note n( note_req_l_->melodic(), channel_i, false ); - play_event( &n ); - note_req_l_ = 0; - off_mom_ = 0; + 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::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; } -