+int
+Staff_performer::get_channel (string instrument)
+{
+ SCM channel_per_staff = get_property ("midiChannelPerStaff");
+ map<string, int>& channel_map = (channel_per_staff == SCM_BOOL_T)
+ ? channel_map_
+ : static_channel_map_;
+
+ map<string, int>::const_iterator i = channel_map.find (instrument);
+ if (i != channel_map.end ())
+ return i->second;
+
+ int channel = (channel_per_staff == SCM_BOOL_T)
+ ? channel_count_++
+ :channel_map.size ();
+
+ /* MIDI players tend to ignore instrument settings on channel
+ 10, the percussion channel. */
+ if (channel % 16 == 9)
+ channel_map["percussion"] = channel++;
+
+ if (channel > 15)
+ {
+ warning (_ ("MIDI channel wrapped around"));
+ warning (_ ("remapping modulo 16"));
+ channel = channel % 16;
+ }
+
+ channel_map[instrument] = channel;
+ return channel;
+}
+