]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-performer.cc
MIDI: in #'staff mapping mode, keep to one channel. Fixes #1620.
[lilypond.git] / lily / staff-performer.cc
index 3fc26fa45632d826e05345ea2f778aaf47fb6e15..2fd85fe48286920492a440b77fc1e7b4cccf357e 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)
@@ -105,12 +105,18 @@ Audio_staff*
 Staff_performer::new_audio_staff (string voice)
 {
   Audio_staff* audio_staff = new Audio_staff;
-  name_ = new Audio_text (Audio_text::TRACK_NAME, context ()->id_string ()
-                         + ":" + voice);
-  audio_staff->add_audio_item (name_);
+  string track_name = context ()->id_string () + ":" + voice;
+  if (track_name != ":")
+    {
+      name_ = new Audio_text (Audio_text::TRACK_NAME, context ()->id_string ()
+                             + ":" + voice);
+      audio_staff->add_audio_item (name_);
+      announce_element (Audio_element_info (name_, 0));
+    }
   announce_element (Audio_element_info (audio_staff, 0));
-  announce_element (Audio_element_info (name_, 0));
   staff_map_[voice] = audio_staff;
+  if (!instrument_string_.empty ())
+    set_instrument (channel_, voice);
   return audio_staff;
 }
 
@@ -118,7 +124,7 @@ Audio_staff*
 Staff_performer::get_audio_staff (string voice)
 {
   SCM channel_mapping = get_property ("midiChannelMapping");
-  if (channel_mapping == ly_symbol2scm ("voice")
+  if (channel_mapping != ly_symbol2scm ("instrument")
       && staff_map_.size ())
     return staff_map_.begin ()->second;
 
@@ -134,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;
@@ -184,8 +190,6 @@ Staff_performer::finalize ()
 {
   staff_map_.clear ();
   channel_map_.clear ();
-  channel_count_ = 0;
-  static_channel_map_.clear ();
 }
 
 string
@@ -212,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;
@@ -223,7 +231,10 @@ Staff_performer::get_channel (string instrument)
   /* MIDI players tend to ignore instrument settings on channel
      10, the percussion channel.  */
   if (channel % 16 == 9)
-    channel_map["percussion"] = channel++;
+    {
+      channel_map["percussion"] = channel++;
+      channel_count_++;
+    }
 
   if (channel > 15)
     {
@@ -247,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 (str.empty ())
+       channel_ = get_channel (str);
       if (str.length ())
        {
          if (channel_mapping != ly_symbol2scm ("voice"))
@@ -257,13 +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_;
-      if (Audio_dynamic *d = dynamic_cast<Audio_dynamic *> (inf.elem_))
-       dynamic_map_[voice] = d->volume_;
-      if (Real d = get_dynamic (voice))
-       if (Audio_note *n = dynamic_cast<Audio_note *> (inf.elem_))
-         n->volume_ = d;
+      bool encode_dynamics_as_velocity_ = true;
+      if (encode_dynamics_as_velocity_)
+       {
+         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;
+       }
+      Audio_staff* audio_staff = get_audio_staff (voice);
       audio_staff->add_audio_item (ai);
     }
 }