X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-performer.cc;h=3ae1482bec3fb4e4d46662153afc3aebba999594;hb=8cd1548d4177af5d2ca386a4574ce9cbdc97aa96;hp=067a48ca71e173790c9dc91d9f36d3036e244ced;hpb=a6bd229f7fe1dc4a03478e14ccc0c0c66b225061;p=lilypond.git diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc index 067a48ca71..3ae1482bec 100644 --- a/lily/staff-performer.cc +++ b/lily/staff-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2010 Jan Nieuwenhuizen + Copyright (C) 1997--2011 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,6 +17,8 @@ along with LilyPond. If not, see . */ +#include + #include "warn.hh" #include "audio-column.hh" #include "audio-item.hh" @@ -42,6 +44,8 @@ protected: virtual void initialize (); void process_music (); void stop_translation_timestep (); + void set_instrument_name (); + void set_instrument (int channel); private: Audio_staff *audio_staff_; @@ -49,6 +53,7 @@ private: Audio_text *instrument_name_; Audio_text *name_; Audio_tempo *tempo_; + map channel_map_; }; #include "translator.icc" @@ -97,35 +102,38 @@ Staff_performer::process_music () string str = new_instrument_string (); if (str.length ()) { - instrument_name_ = new Audio_text (Audio_text::INSTRUMENT_NAME, str); - announce_element (Audio_element_info (instrument_name_, 0)); - instrument_ = new Audio_instrument (str); - announce_element (Audio_element_info (instrument_, 0)); - - audio_staff_->add_audio_item (instrument_); - audio_staff_->add_audio_item (instrument_name_); - - /* - Have to be here before notes arrive into the staff. - */ + set_instrument (0); + set_instrument_name (); } } +void +Staff_performer::set_instrument (int channel) +{ + instrument_ = new Audio_instrument (instrument_string_); + instrument_->channel_ = channel; + announce_element (Audio_element_info (instrument_, 0)); + audio_staff_->add_audio_item (instrument_); +} + +void +Staff_performer::set_instrument_name () +{ + instrument_name_ = new Audio_text (Audio_text::INSTRUMENT_NAME, + instrument_string_); + announce_element (Audio_element_info (instrument_name_, 0)); + audio_staff_->add_audio_item (instrument_name_); +} + void Staff_performer::stop_translation_timestep () { SCM proc = ly_lily_module_constant ("percussion?"); - SCM drums = scm_call_1 (proc, ly_symbol2scm (instrument_string_.c_str ())); - audio_staff_->channel_ = (drums == SCM_BOOL_T ? 9 : -1); - if (name_) - { - name_ = 0; - } - if (tempo_) - { - tempo_ = 0; - } + audio_staff_->percussion_ = (drums == SCM_BOOL_T); + + name_ = 0; + tempo_ = 0; instrument_name_ = 0; instrument_ = 0; } @@ -155,6 +163,28 @@ void Staff_performer::acknowledge_audio_element (Audio_element_info inf) { if (Audio_item *ai = dynamic_cast (inf.elem_)) - audio_staff_->add_audio_item (ai); + { + /* map each context (voice) to its own channel */ + Context *c = inf.origin_contexts (this)[0]; + string id = c->id_string (); + int channel = channel_map_.size (); + /* MIDI players tend to ignore instrument settings on channel + 10, the percussion channel. */ + if (channel % 16 == 9) + channel_map_[""] = channel++; + + map::const_iterator i = channel_map_.find (id); + if (i != channel_map_.end ()) + channel = i->second; + else + { + channel_map_[id] = channel; + if (channel) + set_instrument (channel); + } + + ai->channel_ = channel; + audio_staff_->add_audio_item (ai); + } }