]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-performer.cc
MIDI: #'instrument mode: do not re-initialize channel with empty instrument.
[lilypond.git] / lily / staff-performer.cc
index 3ad276890b7a45765c0b7157cb912c78aebe50f7..502c289e0c9d2ccd943955e9bc7629d5a468ab27 100644 (file)
@@ -50,7 +50,7 @@ private:
   int get_channel (string instrument);
   Audio_staff* get_audio_staff (string voice);
   Audio_staff* new_audio_staff (string voice);
-  Real get_dynamic (string voice);
+  Audio_dynamic* get_dynamic (string voice);
 
   string instrument_string_;
   int channel_;
@@ -60,7 +60,7 @@ private:
   Audio_tempo *tempo_;
   map<string, Audio_staff*> staff_map_;
   map<string, int> channel_map_;
-  map<string, Real> dynamic_map_;
+  map<string, Audio_dynamic*> dynamic_map_;
   static map<string, int> static_channel_map_;
   static int channel_count_;
 };
@@ -84,7 +84,7 @@ ADD_TRANSLATOR (Staff_performer,
                "");
 
 Staff_performer::Staff_performer ()
-  : channel_ (0)
+  : channel_ (-1)
   , instrument_ (0)
   , instrument_name_ (0)
   , name_ (0)
@@ -115,6 +115,8 @@ Staff_performer::new_audio_staff (string voice)
     }
   announce_element (Audio_element_info (audio_staff, 0));
   staff_map_[voice] = audio_staff;
+  if (!instrument_string_.empty ())
+    set_instrument (channel_, voice);
   return audio_staff;
 }
 
@@ -138,10 +140,10 @@ Staff_performer::get_audio_staff (string voice)
   return new_audio_staff (voice);
 }
 
-Real
+Audio_dynamic*
 Staff_performer::get_dynamic (string voice)
 {
-  map<string, Real>::const_iterator i = dynamic_map_.find (voice);
+  map<string, Audio_dynamic*>::const_iterator i = dynamic_map_.find (voice);
   if (i != dynamic_map_.end ())
     return i->second;
   return 0;
@@ -214,6 +216,10 @@ Staff_performer::get_channel (string instrument)
     ? channel_map_
     : static_channel_map_;
 
+  if (channel_mapping == ly_symbol2scm ("staff")
+      && channel_ >= 0)
+    return channel_;
+
   map<string, int>::const_iterator i = channel_map.find (instrument);
   if (i != channel_map.end ())
     return i->second;
@@ -252,9 +258,11 @@ Staff_performer::acknowledge_audio_element (Audio_element_info inf)
       if (c->is_alias (ly_symbol2scm ("Voice")))
        voice = c->id_string ();
       SCM channel_mapping = get_property ("midiChannelMapping");
-      if (channel_mapping == ly_symbol2scm ("voice"))
-       channel_ = get_channel (voice);
       string str = new_instrument_string ();
+      if (channel_mapping != ly_symbol2scm ("instrument"))
+       channel_ = get_channel (voice);
+      else if (channel_ < 0 && str.empty ())
+       channel_ = get_channel (str);
       if (str.length ())
        {
          if (channel_mapping != ly_symbol2scm ("voice"))
@@ -262,17 +270,21 @@ Staff_performer::acknowledge_audio_element (Audio_element_info inf)
          set_instrument (channel_, voice);
          set_instrument_name (voice);
        }
-      Audio_staff* audio_staff = get_audio_staff (voice);
       ai->channel_ = channel_;
-      // Output volume as velocity and disable Midi_dynamic output
-      if (Audio_dynamic *d = dynamic_cast<Audio_dynamic *> (inf.elem_))
+      bool encode_dynamics_as_velocity_ = true;
+      if (encode_dynamics_as_velocity_)
        {
-         dynamic_map_[voice] = d->volume_;
-         d->volume_ = -1;
+         if (Audio_dynamic *d = dynamic_cast<Audio_dynamic *> (inf.elem_))
+           {
+             dynamic_map_[voice] = d;
+             // Output volume as velocity: must disable Midi_dynamic output
+             d->silent_ = true;
+           }
+         if (Audio_dynamic *d = get_dynamic (voice))
+           if (Audio_note *n = dynamic_cast<Audio_note *> (inf.elem_))
+             n->dynamic_ = d;
        }
-      if (Real d = get_dynamic (voice))
-       if (Audio_note *n = dynamic_cast<Audio_note *> (inf.elem_))
-         n->volume_ = d;
+      Audio_staff* audio_staff = get_audio_staff (voice);
       audio_staff->add_audio_item (ai);
     }
 }