From 8cd1548d4177af5d2ca386a4574ce9cbdc97aa96 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 11 Mar 2011 21:51:35 +0100 Subject: [PATCH] Midi: set instrument for each voice (on each channel). --- lily/audio-staff.cc | 3 +-- lily/staff-performer.cc | 45 ++++++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index b827b8b377..8de47bf9de 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -37,8 +37,7 @@ Audio_staff::Audio_staff () void Audio_staff::output (Midi_stream &midi_stream, int track) { - Midi_track midi_track; - midi_track.number_ = track; + Midi_track midi_track (track); Midi_walker i (this, &midi_track); for (; i.ok (); i++) diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc index 17de3172df..3ae1482bec 100644 --- a/lily/staff-performer.cc +++ b/lily/staff-performer.cc @@ -44,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_; @@ -100,20 +102,29 @@ 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 () { @@ -121,10 +132,8 @@ Staff_performer::stop_translation_timestep () SCM drums = scm_call_1 (proc, ly_symbol2scm (instrument_string_.c_str ())); audio_staff_->percussion_ = (drums == SCM_BOOL_T); - if (name_) - name_ = 0; - if (tempo_) - tempo_ = 0; + name_ = 0; + tempo_ = 0; instrument_name_ = 0; instrument_ = 0; } @@ -168,7 +177,11 @@ Staff_performer::acknowledge_audio_element (Audio_element_info inf) if (i != channel_map_.end ()) channel = i->second; else - channel_map_[id] = channel; + { + channel_map_[id] = channel; + if (channel) + set_instrument (channel); + } ai->channel_ = channel; audio_staff_->add_audio_item (ai); -- 2.39.2